// AUTHOR: Chris Wild // DATE: July 25, 1997 #include "ListMsgs.h" CListMsgs::CListMsgs(): size(0), head(NULL) { } CListMsgs::CListMsgs(HANDLE listHandle) { ReadListMsgs(listHandle); } CListMsgs::~CListMsgs() { ListPtr temp; while(head != NULL) { temp = head; head = head->next; delete temp; } } bool CListMsgs::AddItem(int position, Item thisItem) { if((position < 1) || (position > size+1)) return FALSE; // bad position ListPtr newPtr = new ListNode; // should test for success newPtr->item = thisItem; if (position == 1) { newPtr->next = head; head = newPtr; } else { ListPtr prev = PtrTo(position-1); newPtr->next = prev->next; prev->next = newPtr; } size++; return TRUE; } bool CListMsgs::DeleteItem(int position) { if((position < 1) || (position > size)) return FALSE; // bad position ListPtr cur; size--; if(position == 1) { cur = head; head = head->next; } else { ListPtr prev = PtrTo(position-1); cur = prev->next; prev->next = cur->next; } return TRUE; } bool CListMsgs::GetItem(int position, Item& thisItem) const { if((position < 1) || (position > size)) return FALSE; // bad position ListPtr cur = PtrTo(position); thisItem = cur->item; return TRUE; } ListPtr CListMsgs::PtrTo(int position) const { if( ( position < 1) || ( position > size)) return NULL; ListPtr trav = head; for(int i = 1; i < position; i++) trav = trav->next; return trav; } //******* // Read list of messages from archive // deletes existing list first // bool CListMsgs::ReadListMsgs(HANDLE messages) { ListPtr cur; ListPtr prev = NULL; DWORD nBytes; while(head != NULL) { cur = head; head = head->next; delete cur; } size = 0; // reset size while (TRUE) { cur = new ListNode; ReadFile(messages, &cur->item, sizeof(cur->item), &nBytes, NULL); if(nBytes == 0) { if (prev != NULL) prev->next = NULL; else head = NULL; delete cur; // always allocates one too many break; } size++; if(prev == NULL) { head = cur; } else { prev->next = cur; } prev = cur; } return TRUE; } bool CListMsgs::WriteListMsgs(HANDLE messages) const { DWORD nBytes; ListPtr trav = head; while(trav != NULL) { if(!WriteFile(messages, &trav->item, sizeof(trav->item), &nBytes, NULL)) return FALSE; trav = trav->next; } return TRUE; } int CListMsgs::length() const { return size; }