⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maildate.cpp

📁 这个基于嵌入式平台SMART PHONE电子邮件收发管理系统(MAIL MAN是一个电子邮件客户端软件。它以很小的体积
💻 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 + -