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

📄 devpcdmsyncobjhand.cpp

📁 是一本关于
💻 CPP
字号:
//
//	File:
//	=====
//	DevPCDMSyncObjHand.cpp: Implementation file
//
//	Description:
//	============
//	Implements the IReplObjHandler interface. Serializes/de-serializes
//	items from and to the desktop.
//

#include "DevPCDMSync.h"
#include "DevPCDMSyncFldr.h"

#include "DevPCDMSyncObjHand.h"

//<BOOK_ADDON Chapter 9.3.2.2> ***************************************************
#include "..\syncbuffer.h"
//</BOOK_ADDON Chapter 9.3.2.2> ***************************************************
//
// ========================== MEMBERS ================================
//
CPCDMSyncObjHandler::CPCDMSyncObjHandler(CPCDMSyncFolder *pFolder): m_cRef(1)
{
	m_pFolder	  = pFolder;
	m_pWriteSetup = NULL;
	m_pReadSetup  = NULL;
	m_pReadPacket = NULL;
}

CPCDMSyncObjHandler::~CPCDMSyncObjHandler()
{
}

//
// ======================== IUnkown Implementation =======================
//
STDMETHODIMP_(ULONG) CPCDMSyncObjHandler::AddRef()
{
    return ::InterlockedIncrement(&m_cRef);
}

STDMETHODIMP_(ULONG) CPCDMSyncObjHandler::Release()
{
	ULONG urc;
    if ((urc = ::InterlockedDecrement(&m_cRef)) == 0) 
        delete this;

    return urc;
}

STDMETHODIMP CPCDMSyncObjHandler::QueryInterface(const IID& iid, void  **ppv)
{
	if(ppv == NULL)
		return E_INVALIDARG;

    *ppv = static_cast<IUnknown*>(this);
    reinterpret_cast<IUnknown *>(*ppv)->AddRef();

    return S_OK;
}

//
// ======================== IReplObjHandler Implementation =======================
//

STDMETHODIMP CPCDMSyncObjHandler::Setup(PREPLSETUP pSetup)
{
	if(pSetup == NULL)
		return E_INVALIDARG;

	//
	//	TODO: Called before GetPacket() or SetPacket() is called.
	//	We could be reading & writing at the same time, so we
	//	need to store the setup ptr away. Add any initialization
	//	code here, before starting serializing/de-serializing.
	//
 printf("Setup: OID=<%d>, Mode=<%d>\n\r",pSetup->oid,pSetup->fRead);
	if(pSetup->fRead)
	{
        m_pReadSetup = pSetup;
		m_pReadPacket = new BYTE[MAXDATASIZE];		// we can handle upto MAXDATASIZE bytes of data
		if(m_pReadPacket == NULL)
			return E_OUTOFMEMORY;
	}
    else
	{
        m_pWriteSetup = pSetup;
	}

    return S_OK;
}

STDMETHODIMP CPCDMSyncObjHandler::Reset(PREPLSETUP pSetup)
{
	if(pSetup == NULL)
		return E_INVALIDARG;

	//
	//	TODO: Called right after GetPacket() or GetPacket() calls are
	//	completed. Add any clean-up code here.
	//
printf("Reset: OID=<%d>\n\r",pSetup->oid);
	if(m_pReadPacket)
	{
		delete [] m_pReadPacket;
		m_pReadPacket = NULL;
	}
    else
    {
		//
        //	on writing, update the object ID and
		//	time stamp stored in data file
		//
		m_pFolder->SetFileOID(m_pWriteSetup->oidNew);
	    m_pFolder->UpdateFileTime();
    }
	return S_OK;
}

STDMETHODIMP CPCDMSyncObjHandler::DeleteObj(PREPLSETUP pSetup)
{
	if(pSetup == NULL)
		return E_INVALIDARG;

	//
	//	TODO: Called when an object has been deleted on the desktop, the
	//	pSetup->oid member is the id of the object to be deleted. Add
	//	code to delete the object here.
	//
	//	The file has been deleted on the desktop
	//	we need to delete it on the device.
	//
    CEOIDINFO oidInfo;
	::memset(&oidInfo, NULL, sizeof(oidInfo));
printf("DeleteObj: OID=<%d>\n\r",pSetup->oid);

	return S_OK;
}

STDMETHODIMP CPCDMSyncObjHandler::GetPacket(LPBYTE *lppbPacket, DWORD *pcbPacket, DWORD cbRecommend)
{
	if((lppbPacket == NULL)||(pcbPacket == NULL))
		return E_INVALIDARG;

	//
	//	TODO: Active Sync manager calls this function to get the object
	//	(m_pReadSetup->hItem), streamed into the memory location *lppbPacket.
	//	You will need to break up the object into packets of size <= cbRecommend.
	//	It is your responsibility to obtain & free the required memory for each packet.
	//	When done with all the packets return RWRN_LAST_PACKET, else, return
	//	S_OK.
	//
	*lppbPacket = NULL;
	*pcbPacket  = NULL;

	//
	//	We open our sample text file, and stream its data into the buffer
	//	m_pPacketRead.
	//
    CEOIDINFO oidInfo;
	::memset(&oidInfo, NULL, sizeof(oidInfo));

printf("GetPacket: OID=<%d>\n\r",m_pReadSetup->oid);

	TCHAR tStr[1024];
	VARIANT value,tvalue;
	int cntRec=0,i;
	long CRC=0,FieldCnt=0,lCnt=0;
	long DBHandle=0;
	PSYNCBUFFERUP pSync=(PSYNCBUFFERUP)m_pReadPacket;

		::memset(m_pReadPacket,0,MAXDATASIZE);
		::memset(tStr,0,1024*sizeof(TCHAR));
		VariantInit(&value); VariantInit(&tvalue);
		pSync->ID=m_pReadSetup->oid;

		wsprintf(tStr,L"DELETE FROM Titles WHERE TitleID=%d;",m_pReadSetup->oid);
		wcscat(pSync->str,tStr);
		wsprintf(tStr,L"INSERT INTO Titles (TitleID, Artist, Title, Label, ReleaseDate, Copyright) VALUES (%d,",m_pReadSetup->oid);
		wcscat(pSync->str,tStr);
		HRESULT hr=m_pFolder->comDB->OpenTable(TEXT("\\My Documents\\PCDM.cdb"),TEXT("PCDMCDs"),_variant_t((LONG)PCDM_PID_ID),&DBHandle);
		if (hr!=S_OK) 
			return RERR_BAD_OBJECT;
		hr=m_pFolder->comDB->MoveFirst(DBHandle);
		hr=m_pFolder->comDB->FindRecord(DBHandle,_variant_t((LONG)PCDM_PID_ID),_variant_t((long)(m_pReadSetup->oid)));
		if (hr!=S_OK) 
		{
			m_pFolder->comDB->CloseTable(DBHandle);	
			*lppbPacket = (LPBYTE)pSync;
			*pcbPacket  = 0;			
			return RERR_USER_SKIP; //RERR_BAD_OBJECT;
		}
		hr=m_pFolder->comDB->ReadRecord(DBHandle,&FieldCnt);
		if (hr==S_OK)
		{
			for (i=PCDM_PID_AUTHOR;i<PCDM_PID_CRC;i++)
			{
				VariantClear(&value);
				hr=m_pFolder->comDB->GetValue(_variant_t((LONG)(i)),&value);
				if (hr==S_OK)
				{
					if (i!=PCDM_PID_COPYRIGHT)
						wsprintf(tStr,L"'%s',",value.bstrVal);
					else
						wsprintf(tStr,L"'%s');",value.bstrVal);
					wcscat(pSync->str+lCnt,tStr);
				}
			}
		}
		hr=m_pFolder->comDB->SetValue(_variant_t((LONG)(PCDM_PID_CRC)),_variant_t(TEXT("1")));
		hr=m_pFolder->comDB->WriteRecord(DBHandle);
		m_pFolder->comDB->CloseTable(DBHandle);

		wsprintf(tStr,L"DELETE FROM Tracks WHERE TitleID=%d; ",m_pReadSetup->oid);
		wcscat(pSync->str,tStr);
wprintf(TEXT("GP1: Value=<%s>; \n\r"),pSync->str);
		

		hr=m_pFolder->comDB->OpenTable(TEXT("\\My Documents\\PCDM.cdb"),TEXT("PCDMTracks"),_variant_t((LONG)PCDM_PID_TRACKS_ID),&DBHandle);
		while (hr==S_OK)
		{
			hr=m_pFolder->comDB->ReadRecord(DBHandle,&FieldCnt);
			if (hr==S_OK)
			{
				for (i=0;i<FieldCnt;i++)	
				{
					VariantClear(&value); VariantClear(&tvalue);
					hr=m_pFolder->comDB->GetValue(_variant_t((LONG)(i)),&value);
					if (i==PCDM_PID_TRACKS_ID && VariantChangeType(&tvalue,&value,0,VT_I4)==S_OK)
					{
						if (tvalue.lVal!=(long)m_pReadSetup->oid)
							break;
						wcscat(pSync->str,L"INSERT INTO PCDMTracks (TitleID, TrackName,TrackID) VALUES (");
					}
					VariantChangeType(&value,&value,0,VT_BSTR);
					if (i!=PCDM_PID_TRACKS_TRACKNO)
						wsprintf(tStr,L"'%s',",value.bstrVal);
					else
						wsprintf(tStr,L"'%s');",value.bstrVal);
					wcscat(pSync->str+lCnt,tStr);
				}
			}
			hr=m_pFolder->comDB->MoveNext(DBHandle);
		}
		m_pFolder->comDB->CloseTable(DBHandle);
		hr=RWRN_LAST_PACKET;
wprintf(TEXT("GP2: Value=<%s>; \n\r"),pSync->str);
		*lppbPacket = (LPBYTE)pSync;
		*pcbPacket  = ((lstrlen(pSync->str)+1)*sizeof(WCHAR))+sizeof(DWORD);

    return RWRN_LAST_PACKET;
}

STDMETHODIMP CPCDMSyncObjHandler::SetPacket(LPBYTE lpbPacket, DWORD cbPacket)
{
	if(lpbPacket == NULL)
		return E_INVALIDARG;
	//
	//	TODO: Called to de-serialize an object from the desktop. The m_pReadSetup->oid
	//	is the object in question. When Reset() is called, you know that you have
	//	received all the packets.
	//
	//	We create our sample file if it is not already created,
	//	and write the data received to the file.
	//
IPCDMUtilsPtr	  comUtils;

wprintf(L"SetPacket:<%d>:<%s>\n\r",cbPacket,(WCHAR *)lpbPacket);
	HRESULT hr=comUtils.CreateInstance(__uuidof( PCDMUtils ) );
	if (FAILED(hr)) 
		return hr;
	hr=comUtils->AnalyzeURL((WCHAR *)lpbPacket);
wprintf(L"SetPacketOut\n\r");
    return S_OK;
}

⌨️ 快捷键说明

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