📄 devpcdmsyncfldr.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 + -