📄 contactsmanager.cpp
字号:
// ContactsManager.cpp: implementation of the CContactsManager class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ContactsManager.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CContactsManager g_contactmanager;
CContactsManager::CContactsManager()
{
m_hdb = NULL;
}
CContactsManager::~CContactsManager()
{
}
BOOL CContactsManager::MountVolumeAndCreate(LPWSTR lpszVol)
{
if(lpszVol == NULL)
{
CREATE_SYSTEMGUID (&m_ceguid);
}
else
{
if(CeMountDBVol (&m_ceguid,lpszVol,OPEN_ALWAYS) == FALSE)
return FALSE;
}
if(DataBaseExist())
return TRUE;
CEDBASEINFO dbinfo;
dbinfo.dwFlags = CEDB_VALIDNAME|CEDB_VALIDTYPE|CEDB_VALIDSORTSPEC;
lstrcpy(dbinfo.szDbaseName,CONTACT_DATABASE_NAME);
dbinfo.dwDbaseType = CONTACT_DATABASE_TYPE;
dbinfo.wNumSortOrder = CONTACT_NUM_SORT;
dbinfo.rgSortSpecs[0].propid = ID_MAILADDRESS;
dbinfo.rgSortSpecs[0].dwFlags = 0;
dbinfo.rgSortSpecs[1].propid = ID_NAME;
dbinfo.rgSortSpecs[1].dwFlags = 0;
dbinfo.rgSortSpecs[2].propid = ID_GROUP;
dbinfo.rgSortSpecs[2].dwFlags = 0;
if(CeCreateDatabaseEx(&m_ceguid,&dbinfo) == NULL)
{
DWORD error = GetLastError();
if(error == ERROR_DUP_NAME)
return TRUE;
return FALSE;
}
return TRUE;
}
BOOL CContactsManager::UnmountVolume()
{
CloseHandle (m_hdb);
BOOL res = CeUnmountDBVol(&m_ceguid);
int id = GetLastError();
return res;
}
BOOL CContactsManager::DataBaseExist()
{
HANDLE hDBList;
CEOID oidDB;
CEOIDINFO dbinfo;
hDBList = CeFindFirstDatabaseEx(&m_ceguid,CONTACT_DATABASE_TYPE);
if (hDBList != INVALID_HANDLE_VALUE)
{
oidDB = CeFindNextDatabaseEx(hDBList,&m_ceguid);
while (oidDB)
{
CeOidGetInfoEx(&m_ceguid,oidDB,&dbinfo);
if(dbinfo.wObjType == OBJTYPE_DATABASE)
{
if(lstrcmp(dbinfo.infDatabase.szDbaseName,CONTACT_DATABASE_NAME) == 0)
return TRUE;
}
oidDB = CeFindNextDatabaseEx(hDBList,&m_ceguid);
}
CloseHandle (hDBList);
}
return FALSE;
}
BOOL CContactsManager::EditContact(CContacts &contacts)
{
CEPROPVAL pro[4];
pro[0].propid = ID_MAILADDRESS;
pro[0].wFlags = 0;
pro[0].val.lpwstr = contacts.m_mailaddress;
pro[1].propid = ID_NAME;
pro[1].wFlags = 0;
pro[1].val.lpwstr = contacts.m_name;
pro[2].propid = ID_GROUP;
pro[2].wFlags = 0;
pro[2].val.lVal = contacts.m_group;
pro[3].propid = ID_DES;
pro[3].wFlags = 0;
pro[3].val.lpwstr = contacts.m_des;
if(CeWriteRecordProps(m_hdb,contacts.m_oidRecord,4,pro) == 0)
return FALSE;
return TRUE;
}
BOOL CContactsManager::OpenDataBase(CEPROPID proid)
{
CEOID id = 0;
CloseHandle (m_hdb);
m_hdb = CeOpenDatabaseEx(&m_ceguid,&id,CONTACT_DATABASE_NAME,proid,0,NULL);
if(m_hdb == INVALID_HANDLE_VALUE )
{
DWORD dw = GetLastError();
return FALSE;
}
return TRUE;
}
BOOL CContactsManager::ReadContactRecord(CContacts &contact)
{
WORD wProps;
CEOID oid;
PCEPROPVAL pRecord;
PBYTE pBuff;
DWORD dwRecSize;
int i;
// Read all properties for the record.
pBuff = 0; // Let the function allocate the buffer.
oid = CeReadRecordProps(m_hdb, CEDB_ALLOWREALLOC, &wProps, NULL,
&(LPBYTE)pBuff, &dwRecSize);
// Failure on read.
if (oid == 0)
return FALSE;
// Copy the data from the record to the structure. The order
// of the array is not defined.
memset (&contact, 0 , sizeof (CContacts)); // Zero return struct
contact.m_oidRecord = oid;
pRecord = (PCEPROPVAL)pBuff; // Point to CEPROPVAL
// array.
for (i = 0; i < wProps; i++)
{
switch (pRecord->propid)
{
case ID_MAILADDRESS:
lstrcpy (contact.m_mailaddress, pRecord->val.lpwstr);
break;
case ID_NAME:
lstrcpy (contact.m_name, pRecord->val.lpwstr);
break;
case ID_GROUP:
contact.m_group = pRecord->val.lVal;
break;
case ID_DES:
lstrcpy (contact.m_des, pRecord->val.lpwstr);
break;
}
pRecord++;
}
LocalFree (pBuff);
return TRUE;
}
int CContactsManager::GetNumRecord()
{
HANDLE hDBList;
CEOID oidDB;
CEOIDINFO dbinfo;
hDBList = CeFindFirstDatabaseEx (&m_ceguid,CONTACT_DATABASE_TYPE);
if (hDBList != INVALID_HANDLE_VALUE)
{
oidDB = CeFindNextDatabaseEx (hDBList,&m_ceguid);
while (oidDB)
{
CeOidGetInfoEx(&m_ceguid,oidDB,&dbinfo);
if(dbinfo.wObjType == OBJTYPE_DATABASE)
{
if(lstrcmp(dbinfo.infDatabase.szDbaseName,CONTACT_DATABASE_NAME) == 0)
return dbinfo.infDatabase.wNumRecords;
}
oidDB = CeFindNextDatabaseEx (hDBList,&m_ceguid);
}
CloseHandle (hDBList);
}
return -1;
}
BOOL CContactsManager::SeekToPos(int index,CContacts& contacts,CEPROPVAL* proval,int num)
{
if(proval == NULL || num <= 0||proval->propid == 0)
{
contacts.m_oidRecord = CeSeekDatabaseEx(m_hdb,CEDB_SEEK_BEGINNING,index,0,NULL);
if(contacts.m_oidRecord == 0)
return FALSE;
return TRUE;
}
int x = 1;
contacts.m_oidRecord = CeSeekDatabaseEx(m_hdb,CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)(proval),1,NULL);
if(contacts.m_oidRecord == 0)
{
return FALSE;
}
if(index == 0)
return TRUE;
contacts.m_oidRecord = CeSeekDatabaseEx(m_hdb,CEDB_SEEK_CURRENT,index,0,NULL);
if(contacts.m_oidRecord == 0)
return FALSE;
return TRUE;
}
int CContactsManager::GetNumDisplay(CEPROPVAL* proval,int num)
{
if(proval == NULL||num <= 0||proval->propid == 0)
return GetNumRecord();
CeSeekDatabaseEx(m_hdb,CEDB_SEEK_BEGINNING,0,0,NULL);
int res = 0;
if(CeSeekDatabaseEx(m_hdb,CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)(proval),1,NULL) != 0)
res = 1;
else
{
return 0;
}
while(CeSeekDatabaseEx(m_hdb,CEDB_SEEK_VALUENEXTEQUAL,(DWORD)(proval),1,NULL) != 0)
res++;
return res;
}
BOOL CContactsManager::DeleteRecord(CContacts &contact)
{
return CeDeleteRecord(m_hdb,contact.m_oidRecord);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -