www.pudn.com > TongXuLv_Manage.rar > MyAddrBook.cpp


// MyAddrBook.cpp: implementation of the MyAddrBook class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "addr_book.h" 
#include "APeople.h"			// 包函APeople 
#include "MMFile.h" 
#include "MyAddrBook.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
MyAddrBook::MyAddrBook() 
{ 
	pMMFile=NULL; 
	dwSize=sizeof(APeople)*1000+sizeof(short); 
} 
 
MyAddrBook::~MyAddrBook() 
{ 
	CloseFile(); 
} 
 
BOOL MyAddrBook::OpenFile(LPCTSTR FileName) 
{ 
	if(pMMFile) 
	{ 
		MessageBox(NULL,"已经打开,请关闭重试!","系统提示",MB_OK); 
		return FALSE; 
	} 
	pMMFile=new CMMFile(FALSE); 
	if(!pMMFile->OpenMem(FileName,"addr_book_map")) 
		if(!pMMFile->OpenNewMem(FileName,"addr_book_map",dwSize)) 
		{ 
			delete pMMFile; 
			pMMFile=NULL; 
			return FALSE; 
		} 
	if(!LoadData()) 
	{ 
		return FALSE; 
	} 
	return TRUE; 
} 
 
BOOL MyAddrBook::LoadData() 
{ 
	short Count; 
	pMMFile->ReadFromFile(&Count,0,sizeof(short)); 
	int i; 
	APeople *pPeople; 
	pList.RemoveAll(); 
	DWORD dwOffset=sizeof(short); 
	for(i=0;iClear(); 
		pMMFile->ReadFromFile(pPeople,dwOffset,sizeof(APeople)); 
		dwOffset+=sizeof(APeople); 
		pList.AddTail(pPeople); 
	} 
	return TRUE; 
} 
 
BOOL MyAddrBook::UnLoadData() 
{ 
	APeople* pPeople; 
	while(!pList.IsEmpty()) 
	{ 
		pPeople=(APeople*)pList.RemoveHead(); 
		if(pPeople) 
		{ 
			pPeople->Clear(); 
			delete pPeople; 
			pPeople=NULL; 
		} 
	} 
	return TRUE; 
} 
 
void MyAddrBook::CloseFile() 
{ 
	if(!pMMFile) 
	{ 
		return; 
	} 
	UnLoadData(); 
	if(pMMFile) 
	{ 
		pMMFile->CloseMem(); 
		delete pMMFile; 
		pMMFile=NULL; 
	} 
} 
 
BOOL MyAddrBook::Add(APeople *pPeople) 
{ 
	if(!pMMFile) 
	{ 
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK); 
		return FALSE; 
	} 
	if(!pPeople) 
		return FALSE; 
	if(pList.GetCount()>=1000) 
		return FALSE; 
	APeople *pTmpPeople=new APeople(); 
	memcpy(pTmpPeople,pPeople,sizeof(APeople)); 
	pList.AddTail(pTmpPeople); 
	return TRUE; 
} 
 
BOOL MyAddrBook::SaveToFile(LPCTSTR FileName) 
{ 
	if(!pMMFile) 
	{ 
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK); 
		return FALSE; 
	} 
	DWORD sz=sizeof(short)+1000*sizeof(APeople); 
	CMMFile* pmmf=new CMMFile(FALSE); 
	if(!pmmf->OpenNewMem(FileName,"svsfile",sz)) 
	{ 
		delete pmmf; 
		return FALSE; 
	} 
	POSITION pos=pList.GetHeadPosition(); 
	short cn=pList.GetCount(); 
	pmmf->WriteToFile(&cn,0,sizeof(short)); 
	DWORD dwOffset=sizeof(short); 
	APeople *pPeople; 
	while(pos) 
	{ 
		pPeople=(APeople*)pList.GetNext(pos); 
		pmmf->WriteToFile(pPeople,dwOffset,sizeof(APeople)); 
		dwOffset+=sizeof(APeople); 
	} 
	pmmf->CloseMem(); 
	delete pmmf; 
	return TRUE; 
} 
 
BOOL MyAddrBook::Sort(LPCTSTR szFieldName, BOOL bDestSort) 
{ 
	if(!pMMFile) 
	{ 
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK); 
		return FALSE; 
	} 
	POSITION pos,pos1,pos2; 
	pos=pList.GetHeadPosition(); 
	APeople *p1; 
	p1=(APeople*)pList.GetAt(pos); 
	if(!p1->Fields(szFieldName)) 
		return FALSE; 
	APeople n1; 
	CString s1,s2; 
	while(pos) 
	{ 
		pos1=pos; 
		pos2=pos; 
		p1=(APeople*)pList.GetAt(pos); 
		memcpy(&n1,p1,sizeof(APeople)); 
		while(pos1) 
		{ 
			p1=(APeople*)pList.GetAt(pos1); 
			s1=n1.Fields(szFieldName); 
			s2=p1->Fields(szFieldName); 
			if(bDestSort) 
			{ 
				if(s1s2) 
				{ 
					memcpy(&n1,p1,sizeof(APeople)); 
					pos2=pos1; 
				} 
			} 
			pList.GetNext(pos1); 
		} 
		p1=(APeople*)pList.GetAt(pos2); 
		if(pos2!=pos) 
		{ 
			pList.RemoveAt(pos2); 
			pList.InsertBefore(pos,p1); 
		} 
		pos=pos2; 
		pList.GetNext(pos); 
	} 
	return TRUE; 
} 
 
BOOL MyAddrBook::Search(LPCTSTR szFieldName, LPCTSTR szSchValue) 
{ 
	if(!pMMFile) 
	{ 
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK); 
		return FALSE; 
	} 
	APeople* pPeople; 
	while(!pList.IsEmpty()) 
	{ 
		pPeople=(APeople*)pList.RemoveHead(); 
		if(pPeople) 
		{ 
			pPeople->Clear(); 
			delete pPeople; 
			pPeople=NULL; 
		} 
	} 
	short Count; 
	pMMFile->ReadFromFile(&Count,0,sizeof(short)); 
	int i; 
	APeople aPeople; 
	pList.RemoveAll(); 
	CString s; 
	DWORD dwOffset=sizeof(short); 
	for(i=0;iReadFromFile(&aPeople,dwOffset,sizeof(APeople)); 
		s.Format("%s",aPeople.Fields(szFieldName)); 
		if(s.Find(szSchValue)>=0) 
		{ 
			pPeople=new APeople; 
			memcpy(pPeople,&aPeople,sizeof(APeople)); 
			pList.AddTail(pPeople); 
		} 
		dwOffset+=sizeof(APeople); 
	} 
	return TRUE; 
} 
 
BOOL MyAddrBook::Modify(POSITION pos,APeople *pPeople) 
{ 
	if(!pMMFile) 
	{ 
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK); 
		return FALSE; 
	} 
	if(!pPeople) 
		return FALSE; 
	pList.SetAt(pos,pPeople); 
	return TRUE; 
} 
 
BOOL MyAddrBook::Delete(POSITION pos) 
{ 
	if(!pMMFile) 
	{ 
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK); 
		return FALSE; 
	} 
	APeople* pPeople=(APeople*)pList.GetAt(pos); 
	pList.RemoveAt(pos); 
	delete pPeople; 
	return TRUE; 
} 
 
BOOL MyAddrBook::Save() 
{ 
	if(!pMMFile) 
	{ 
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK); 
		return FALSE; 
	} 
	POSITION pos=pList.GetHeadPosition(); 
	short cn=pList.GetCount(); 
	pMMFile->WriteToFile(&cn,0,sizeof(short)); 
	DWORD dwOffset=sizeof(short); 
	APeople *pPeople; 
	while(pos) 
	{ 
		pPeople=(APeople*)pList.GetNext(pos); 
		pMMFile->WriteToFile(pPeople,dwOffset,sizeof(APeople)); 
		dwOffset+=sizeof(APeople); 
	} 
	return TRUE; 
} 
 
POSITION MyAddrBook::GetPositionWithIndex(DWORD nIndex) 
{ 
	if(!pMMFile) 
	{ 
		MessageBox(NULL,"请先打开通讯薄文件!","系统提示",MB_OK); 
		return FALSE; 
	} 
	POSITION pos=pList.GetHeadPosition(); 
	DWORD i; 
	for(i=0;i