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

📄 devpcdmsyncfldr.cpp

📁 《Windows CE 权威指南》(作者:(美)CHRIS MUENCH
💻 CPP
字号:
//
//	File:
//	=====
//	DevPCDMSyncFldr.cpp: Implementation File
//
//	Description:
//	============
//	This class represents your real-world folder object. Derives
//	from CBaseFolder class. The store object keeps an array of ptrs
//	to objects of this class. To add a new folder to the store
//	derive your new class from CBaseFolder and add it to the store's 
//	list of folder ptrs.
//
#include "DevPCDMSync.h"
#include "DevPCDMSyncObjHand.h"

#include "DevPCDMSyncFldr.h"

//<BOOK_ADDON Chapter=9.3.2> *****************************************************************
void __stdcall _com_issue_error(HRESULT hr)
{
	// Error handling goes here!
}
//</BOOK_ADDON Chapter=9.3.2> *****************************************************************

//
//
// ============================== MEMBERS =================================//
//
CPCDMSyncFolder::CPCDMSyncFolder()
{
	m_uPartner  = 0;
	m_hDataFile = NULL;
}

CPCDMSyncFolder::~CPCDMSyncFolder()
{
}

const LPWSTR CPCDMSyncFolder::GetName()
{
	return _T("PCDMSync");
}

//<BOOK_DELETE Chapter=9.3.2> *****************************************************************
//const LPWSTR CPCDMSyncFolder::GetSyncFileName()
//const LPWSTR CPCDMSyncFolder::GetDataFileName()
//BOOL CPCDMSyncFolder::IsSyncFile(CEOID oid)
//BOOL CPCDMSyncFolder::IsFileDirty()
//</BOOK_DELETE Chapter=9.3.2> *****************************************************************

BOOL CPCDMSyncFolder::SetFileOID(CEOID oid)
{
//<BOOK_ADDON Chapter=9.3.2> *****************************************************************
printf("SetFileOID: OID=<%d>\n\r",oid);
//</BOOK_ADDON Chapter=9.3.2> *****************************************************************
	return TRUE;
}

BOOL CPCDMSyncFolder::UpdateFileTime()
{
//<BOOK_ADDON Chapter=9.3.2> *****************************************************************
printf("UpdateFileTime: (We Did in SetPacket)\n\r");
//</BOOK_ADDON Chapter=9.3.2> *****************************************************************
	
	return TRUE;
}

BOOL CPCDMSyncFolder::UnInitialize()
{
//<BOOK_ADDON Chapter=9.3.2> *****************************************************************
	LocalFree(m_plstCOID2);
	LocalFree(m_plstCOID);
	//comDB.Release();
	::CoUninitialize();
printf("PCDMSync Uninitialized!\n\r");
//</BOOK_ADDON Chapter=9.3.2> *****************************************************************
	return TRUE;
}

BOOL CPCDMSyncFolder::Initialize(IReplObjHandler **ppObjHandler, UINT uPartnerBit)
{
	if(ppObjHandler == NULL)
		return FALSE;

	*ppObjHandler = new CPCDMSyncObjHandler(this);
	if(*ppObjHandler == NULL)
		return FALSE;

	//
	//	Store partner info. Which partner are we 
	//	connected to - first or second partner.
	//
	if(uPartnerBit & 0x01)
		m_uPartner = 0; 
    else if(uPartnerBit & 0x02)
        m_uPartner = 1;

//<BOOK_ADDON Chapter=9.3.2> *****************************************************************
	::CoInitializeEx(NULL,COINIT_MULTITHREADED);
	HRESULT hr=comDB.CreateInstance( __uuidof( PCDMAccessDB ) );
	if (FAILED(hr)) 
	{
		printf("ERR: Could not access the PCDMAccessDB ClassObjectNotify:HasChanged code=<%d>\n\r",hr);
		return TRUE; // Returing False would cancel ActiveSync...
	}
printf("PCDMAccessDB Initialized!\n\r",hr);
	m_bScanned=FALSE;
	m_cntPCDMCDs=ScanDatabase(NULL,SD_JUSTSCAN);
	m_plstCOID=(UINT *)LocalAlloc(LMEM_ZEROINIT,m_cntPCDMCDs*sizeof(UINT));
	m_plstCOID2=(UINT *)LocalAlloc(LMEM_ZEROINIT,m_cntPCDMCDs*sizeof(UINT));
//</BOOK_ADDON Chapter=9.3.2> *****************************************************************

	return TRUE;
}

BOOL CPCDMSyncFolder::GetObjTypeInfo(POBJTYPEINFO pInfo)
{
//</BOOK_ADDON Chapter=9.3.2> *****************************************************************
	::wcscpy(pInfo->szName, TEXT("Record goes here"));
printf("In GetObjTypeInfo...\n\r");
	
	m_cntPCDMCDs=ScanDatabase(NULL,SD_GETALLRECORDS);
	pInfo->cObjects = m_cntPCDMCDs;
	pInfo->cbAllObj = m_cntPCDMCDs*256;			// We are guessing here
printf("GetObjTypeInfo set to <%d>,<%d>\n\r",pInfo->cObjects,pInfo->cbAllObj);
	pInfo->ftLastModified.dwLowDateTime=4321;
    pInfo->ftLastModified.dwHighDateTime=1234;
//</BOOK_ADDON Chapter=9.3.2> *****************************************************************

	return TRUE;
}

//<BOOK_ADDON Chapter=9.3.2> *****************************************************************
long CPCDMSyncFolder::ScanDatabase(void *pNotify,int iScanMode)
{
int cntRec=0;
UINT	OID;
long CRC=0,FieldCnt=0;
long DBHandle=0;
POBJNOTIFY tNO=(POBJNOTIFY)pNotify;
PFINDOBJINFO tFO=(PFINDOBJINFO)pNotify;
VARIANT value,tvalue;

	VariantInit(&value);
	VariantInit(&tvalue);

	switch (iScanMode)
	{
		case SD_NOTIFYOBJ:
			tNO->cOidChg=0;
			tNO->cOidDel=0;
			break;
		case SD_FINDOBJECTS:
			tFO->cChg=0;
			tFO->cUnChg=0;
			break;
		default:
			break;
	}

printf("in ScanDatabase...\n\r");
	HRESULT hr=comDB->OpenTable(TEXT("\\My Documents\\PCDM.cdb"),TEXT("PCDMCDs"),_variant_t((LONG)PCDM_PID_ID),&DBHandle);
	if (hr!=S_OK) 
		return -1;

	while (hr==S_OK)
	{
		hr=comDB->ReadRecord(DBHandle,&FieldCnt);
		if (hr==S_OK && iScanMode!=SD_GETALLRECORDS)
		{
			VariantClear(&value); VariantClear(&tvalue);
			hr=comDB->GetValue(_variant_t((LONG)(PCDM_PID_ID)),&value);
			if (hr==S_OK)
			{
				hr=VariantChangeType(&tvalue,&value,0,VT_I4);
				OID=tvalue.lVal;
				VariantClear(&value); VariantClear(&tvalue);
				hr=comDB->GetValue(_variant_t((LONG)(PCDM_PID_CRC)),&value);
				if (hr==S_OK)
				{
					hr=VariantChangeType(&tvalue,&value,0,VT_I4);
					if (hr!=S_OK)
						CRC=0;
					else
						CRC=tvalue.lVal;
printf("SD: CRC=<%d>, OID=<%d>; Record#:<%d>\n\r",CRC,OID,cntRec);
					switch (iScanMode)
					{
						case SD_NOTIFYOBJ:
							switch (CRC) 
							{
								case 0:
									m_plstCOID[tNO->cOidChg]=OID;
									tNO->cOidChg++;
									cntRec++;
								break;
								case -1:
									m_plstCOID2[tNO->cOidDel]=OID;
									tNO->cOidDel++;
									cntRec++;
								break;
								default:
									break;
							}
						break;
						case SD_FINDOBJECTS:
							if (CRC==0) 
							{
								m_plstCOID2[tFO->cChg]=OID;
								tFO->cChg++;
								cntRec++;
							}
							else
								tFO->cUnChg++;
						break;
						default:
							if (CRC==0)
								cntRec++;
						break;
					}
				}
			}
		}
		if (iScanMode==SD_GETALLRECORDS)
			cntRec++;
		hr=comDB->MoveNext(DBHandle);
	}
	comDB->CloseTable(DBHandle);
	printf("SD: Record <%d> read.\n\r",cntRec);

	switch (iScanMode)
	{
		case SD_FINDOBJECTS:
			memcpy(&m_plstCOID[tFO->cUnChg],m_plstCOID2,tFO->cChg*sizeof(UINT));
			tFO->poid=m_plstCOID;
			break;
		case SD_NOTIFYOBJ:
			memcpy(&m_plstCOID[tNO->cOidChg],m_plstCOID2,tNO->cOidDel*sizeof(UINT));
			tNO->poid=m_plstCOID;
			break;
		default:
			break;
	}

	return cntRec;
}
//<BOOK_ADDON Chapter=9.3.2> *****************************************************************

BOOL CPCDMSyncFolder::ObjectNotify(POBJNOTIFY pNotify)
{
    if(pNotify->cbStruct < sizeof(OBJNOTIFY))
        return FALSE;

    if(::lstrcmpi(GetName(), pNotify->szObjType))	// check folder name
        return FALSE;

    if(pNotify->uFlags & ONF_CLEAR_CHANGE)
        return !UpdateFileTime();	

//<BOOK_ADDON Chapter=9.3.2> *****************************************************************
	if (m_bScanned==TRUE)
		return FALSE;
printf("In ObjectNotify...\n\r");

	m_bScanned=TRUE;
	ScanDatabase(pNotify,SD_NOTIFYOBJ);
printf("ON: ChangedObjs=<%d> Delete=<%d>\n\r",pNotify->cOidChg,pNotify->cOidDel);
	if (pNotify->cOidChg>0) 
		return TRUE;
//<BOOK_ADDON Chapter=9.3.2> *****************************************************************

	return FALSE;
}

BOOL CPCDMSyncFolder::FindObjects(PFINDOBJINFO pFindObjInfo)
{
printf("In FindObjects\n\r");
	ScanDatabase(pFindObjInfo,SD_FINDOBJECTS);
printf("FOB: ChangedObjs=<%d> unchanged=<%d>\n\r",pFindObjInfo->cChg,pFindObjInfo->cUnChg);
	return NOERROR;
}
//</BOOK_ADDON Chapter=9.3.2> *****************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -