📄 maildate.cpp
字号:
// MailDate.cpp: implementation of the CeMailDate class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MailDate.h"
#include "MailInfoDB.h"
#include "Mail.h"
#include "Segment.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CeMailDate::CeMailDate()
{
}
CeMailDate::~CeMailDate()
{
}
BOOL CeMailDate::CreateDirectory(TCHAR* lpPathName)
{
BOOL a = ::CreateDirectory(lpPathName, NULL);
return TRUE;
}
HANDLE CeMailDate::CreateMailFile(TCHAR* lpFileName)
{
HANDLE hFile = NULL;
hFile = CreateFile (lpFileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
DWORD error = GetLastError();
return NULL;
}
return hFile;
}
BOOL CeMailDate::WriteMailFile(HANDLE hFile, char* lpBuffer, int nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,BOOL FLAG)
{
BOOL result = FALSE;
SetFilePointer(hFile,0,NULL,FILE_END);
result = WriteFile (hFile, lpBuffer,nNumberOfBytesToWrite,lpNumberOfBytesWritten,NULL);
if(result == FALSE)
return FALSE;
if(FLAG == TRUE && result == TRUE)
{
//CloseHandle(hFile);
return TRUE;
}
if(FLAG == FALSE && result == TRUE)
{
return TRUE;
}
return TRUE;
}
BOOL CeMailDate::ReadMailFile(HANDLE hFile,LPVOID lpBuffer, int nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead)
{
BOOL result = FALSE;
result = ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL);
CloseHandle(hFile);
return result;
}
BOOL CeMailDate::CloseMailFile(HANDLE hFile)
{
return CloseHandle(hFile);
}
BOOL CeMailDate::CreateMailInfoDB(TCHAR *lpszName)
{
CEOID g_oidDB = 0;
CEDBASEINFO dbm;
dbm.dwFlags = CEDB_VALIDNAME|CEDB_VALIDTYPE|CEDB_VALIDSORTSPEC;
dbm.dwDbaseType = DATABASE_TYPE;
dbm.wNumSortOrder = 4;
dbm.rgSortSpecs[0].propid = PID_DATE;
dbm.rgSortSpecs[0].dwFlags = 0;
dbm.rgSortSpecs[1].propid = PID_FROM;;
dbm.rgSortSpecs[1].dwFlags = 0;
dbm.rgSortSpecs[2].propid = PID_SIZE;
dbm.rgSortSpecs[2].dwFlags = 0;
dbm.rgSortSpecs[3].propid = PID_READED;
dbm.rgSortSpecs[3].dwFlags = 0;
lstrcpy(dbm.szDbaseName,lpszName);
g_oidDB = CeCreateDatabaseEx(&m_ceguid,&dbm);
if (g_oidDB == 0) {
TCHAR szErr[128];
wsprintf (szErr, TEXT ("Database create failed. \
rc %d"), GetLastError());
MessageBox (NULL, szErr, L"Error", MB_OK|MB_ICONERROR);
return FALSE;
}
return TRUE;
}
BOOL CeMailDate::OpenMailInfoDB(PCEOID poid, TCHAR *lpszName,CEPROPID proid)
{
CEOID g_oidDB = 0;
CloseHandle(m_hdb);
m_hdb = CeOpenDatabaseEx(&m_ceguid,&g_oidDB,lpszName, proid, 0, NULL);
if (m_hdb == INVALID_HANDLE_VALUE)
{
DWORD Error = GetLastError();
return FALSE;
}
return TRUE;
}
BOOL CeMailDate::WriteMailInfoDB(MailInfoDB& pDB)
{
MailInfoDB record = pDB;
CEPROPVAL pRecPtr[9];
pRecPtr[0].propid = PID_FROM;
pRecPtr[0].wFlags = 0;
pRecPtr[0].val.lpwstr = record.m_From;
pRecPtr[1].propid = PID_TO;
pRecPtr[1].wFlags = 0;
pRecPtr[1].val.lpwstr = record.m_To;
pRecPtr[2].propid = PID_FILENAME;
pRecPtr[2].wFlags = 0;
pRecPtr[2].val.lpwstr = record.m_Filename;
pRecPtr[3].propid = PID_SUBJECT;
pRecPtr[3].wFlags = 0;
pRecPtr[3].val.lpwstr = record.m_Subject;
FILETIME date;
SystemTimeToFileTime(&record.m_Date,&date);
pRecPtr[4].propid = PID_DATE;
pRecPtr[4].wFlags = 0;
pRecPtr[4].val.filetime = date;
pRecPtr[5].propid = PID_SIZE;
pRecPtr[5].wFlags = 0;
pRecPtr[5].val.lVal = record.m_Size;
pRecPtr[6].propid = PID_READED;
pRecPtr[6].wFlags = 0;
pRecPtr[6].val.lVal = record.m_IsReaded;
pRecPtr[7].propid = PID_DELETED;
pRecPtr[7].wFlags = 0;
pRecPtr[7].val.lVal = record.m_IsDeleted;
pRecPtr[8].propid = PID_UIDL;
pRecPtr[8].wFlags = 0;
pRecPtr[8].val.lpwstr = record.m_uidl;
CEOID oid= CeWriteRecordProps(m_hdb,pDB.m_ceoid,9,pRecPtr);
if(oid == 0)
{
int error = GetLastError();
return FALSE;
}
return TRUE;
}
BOOL CeMailDate::ReadMailInfoDBRecord(MailInfoDB& pData)
{
WORD wProps;
CEOID oid;
PCEPROPVAL pRecord;
PBYTE pBuff;
DWORD dwRecSize;
int i;
pBuff = 0;
oid = CeReadRecordProps (m_hdb, CEDB_ALLOWREALLOC, &wProps, NULL,
&(LPBYTE)pBuff, &dwRecSize);
if (oid == 0)
return 0;
pRecord = (PCEPROPVAL)pBuff;
pData.m_ceoid = oid;
//memset(&pData, 0 , sizeof(MailInfoDB));
for (i = 0; i < wProps; i++)
{
switch (pRecord->propid) {
case PID_FROM:
lstrcpy(pData.m_From, pRecord->val.lpwstr);
break;
case PID_TO:
lstrcpy(pData.m_To, pRecord->val.lpwstr);
break;
case PID_FILENAME:
lstrcpy(pData.m_Filename, pRecord->val.lpwstr);
break;
case PID_SUBJECT:
lstrcpy(pData.m_Subject, pRecord->val.lpwstr);
break;
case PID_DATE:
SYSTEMTIME date;
FileTimeToSystemTime(&pRecord->val.filetime,&date);
pData.m_Date = date;
break;
case PID_SIZE:
pData.m_Size = pRecord->val.lVal;
break;
case PID_READED:
pData.m_IsReaded = pRecord->val.lVal;
break;
case PID_DELETED:
pData.m_IsDeleted = pRecord->val.lVal;
break;
case PID_UIDL:
lstrcpy(pData.m_uidl, pRecord->val.lpwstr);
break;
default:
break;
}
pRecord++;
}
LocalFree (pBuff);
return TRUE;
}
BOOL CeMailDate::ReadMailInfoDB(int NumRecord, MailInfoDB *pDB)
{
CEOID oid;
DWORD dwIndex;
for(int i = 0;i<NumRecord;i++)
{
oid = CeSeekDatabaseEx(m_hdb, CEDB_SEEK_BEGINNING, i+1,0, &dwIndex);
if (oid == 0)
{
return FALSE;
}
else
{
this->ReadMailInfoDBRecord(pDB[i]);
}
}
return TRUE;
}
int CeMailDate::GetDBRecordsNum(TCHAR* DBName)
{
HANDLE hDBList;
CEOID oidDB;
CEOIDINFO dbinfo;
hDBList = CeFindFirstDatabaseEx (&m_ceguid,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,DBName) == 0)
return dbinfo.infDatabase.wNumRecords;
}
oidDB = CeFindNextDatabaseEx (hDBList,&m_ceguid);
}
CloseHandle (hDBList);
}
return 0;
}
CEOID CeMailDate::FindDatebase(TCHAR name[], DWORD kind)
{
HANDLE hdb;
CEOID id;
CEOIDINFO imf;
hdb = ::CeFindFirstDatabaseEx(&m_ceguid,kind);
if(hdb != INVALID_HANDLE_VALUE)
{
id = ::CeFindNextDatabaseEx(hdb,&m_ceguid);
while(id)
{
CeOidGetInfoEx(&m_ceguid,id,&imf);
if(wcscmp(imf.infDatabase.szDbaseName,name)==0)
return id;
id = ::CeFindNextDatabaseEx(hdb,&m_ceguid);
}
}
return NULL;
}
BOOL CeMailDate::MountVolume(LPWSTR lpszVol)
{
if(lpszVol == NULL)
{
CREATE_SYSTEMGUID(&m_ceguid);
}
else
{
if(CeMountDBVol(&m_ceguid,lpszVol,OPEN_ALWAYS) == FALSE)
return FALSE;
}
return TRUE;
}
BOOL CeMailDate::UnmountVolume()
{
CloseHandle (m_hdb);
BOOL res = CeUnmountDBVol(&m_ceguid);
int id = GetLastError();
return res;
}
BOOL CeMailDate::CloseDBHandle()
{
return CloseHandle(m_hdb);
}
BOOL CeMailDate::ReadAllMailInfo(TCHAR *DBName)
{
this->OpenMailInfoDB(NULL,DBName,PID_DATE);
CeSeekDatabase(m_hdb, CEDB_SEEK_BEGINNING, 0, NULL);
return TRUE;
}
BOOL CeMailDate::ReadNewMailInfo(TCHAR *DBName)
{
this->OpenMailInfoDB(NULL,DBName,PID_READED);
CEPROPVAL proval;
proval.propid = PID_READED; // Set property to search.
proval.wFlags = 0; // No flags to set
proval.val.lVal = 0; // Data for property
CeSeekDatabase(m_hdb, CEDB_SEEK_BEGINNING, 0, NULL);
return SeekToPos(0,&proval);
}
BOOL CeMailDate::ReadMailInfoByAddress(TCHAR *DBName,TCHAR* Address)
{
this->OpenMailInfoDB(NULL,DBName,PID_FROM);
CEPROPVAL proval;
proval.propid = PID_FROM; // Set property to search.
proval.wFlags = 0; // No flags to set
proval.val.lpwstr = Address; // Data for property
CeSeekDatabase(m_hdb, CEDB_SEEK_BEGINNING, 0, NULL);
return SeekToPos(0,&proval);
}
BOOL CeMailDate::SeekToPos(int index, CEPROPVAL* proval)
{
CEOID resid;
if(proval == NULL || proval->propid == 0)
{
if(CeSeekDatabaseEx(m_hdb,CEDB_SEEK_BEGINNING,index,0,NULL))
return TRUE;
return FALSE;
}
resid = CeSeekDatabaseEx(m_hdb,CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)(proval),1,NULL);
if(resid == 0)
{
return FALSE;
}
if(index == 0)
return TRUE;
resid = CeSeekDatabaseEx(m_hdb,CEDB_SEEK_CURRENT,index,0,NULL);
if(resid == 0)
return FALSE;
return TRUE;
}
int CeMailDate::GetNumDisplay(TCHAR* DBName,CEPROPVAL *proval, int num)
{
if(proval == NULL||num <= 0||proval->propid == 0)
return GetDBRecordsNum(DBName);
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 CeMailDate::FindDBVolume(TCHAR *DBName,CEGUID &ceguid)
{
CEGUID guid;
TCHAR szVolume[MAX_PATH];
INT nCnt = 0;
CREATE_INVALIDGUID (&guid);
while (CeEnumDBVolumes(&guid, szVolume, sizeof(szVolume)))
{
if(lstrcmp(DBName,szVolume) == 0)
{
ceguid = guid;
return TRUE;
}
}
return FALSE;
}
BOOL CeMailDate::GetMailDetails(TCHAR *filename, CMail &mail)
{
PBYTE process_buff = (PBYTE)LocalAlloc (LPTR, BUFFSIZE);
if (!process_buff) {
MessageBox (NULL, TEXT ("Not enough memory"),
TEXT ("Error"), MB_OK|MB_ICONERROR);
}
HANDLE hFile = this->CreateMailFile(filename);
int nNumberOfByteToRead = (int)GetFileSize(hFile,NULL);
DWORD lpNumberOfBytesRead;
this->ReadMailFile(hFile,process_buff,nNumberOfByteToRead,&lpNumberOfBytesRead);
CloseHandle(hFile);
mail.m_Body = (char*)process_buff;
mail.ParseEnd();
mail.m_mainseg = new Segment;
mail.m_mainseg->m_body = mail.m_Body;
mail.Parse(mail.m_mainseg);
mail.GetTextPlain();
LocalFree(process_buff);
return TRUE;
}
BOOL CeMailDate::DeleteMailInfoDBRecord(MailInfoDB& pData)
{
return CeDeleteRecord(m_hdb,pData.m_ceoid);
}
BOOL CeMailDate::DeleteDB(TCHAR *DBName)
{
CEOID id = NULL;
id = this->FindDatebase(DBName,DATABASE_TYPE);
if(id == NULL)
return FALSE;
else
return CeDeleteDatabaseEx(&m_ceguid,id);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -