📄 syncsession.cpp
字号:
// SyncSession.cpp: implementation of the CSyncSession class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "pimserver.h"
#include "SyncSession.h"
#include "..\\inc\\define.h"
#include "..\\inc\\syncml_tk_prefix_file.h"
#include "..\\inc\\xpttransport.h"
#include "..\\inc\\sml.h"
#include "..\\inc\\smldef.h"
#include "..\\inc\\smldtd.h"
#include "..\\inc\\wbxml.h"
#include "..\\inc\\xpt.h"
#include "..\\inc\\smlmetinfdtd.h"
#include "..\\inc\\smldevinfdtd.h"
#include "mydb.h"
#include "vcard.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
char *_database_get_serveranchor(char *_userid);
char *_database_get_clientanchor(char *_userid);
SmlProtoElement_t _get_status_datatype(CmdStatus_s*pStatus);
int _get_new_anchor(char*_buf);
extern CMydb workdb;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSyncSession::CSyncSession()
{
m_pHead = NULL;
m_pEnd = NULL;
m_eCredState = Cred_NoOffer;//未验证
m_eClientState = Sync_NoSync;
m_eServerState = Sync_NoSync;
//m_nSyncFinish = 0;
m_sTargetLocURI = NULL;
m_sSourceLocURI = NULL;
m_nSyncType = 0;
m_nAddID = 0;
m_nServerNoc = 0;
m_nMaxMsgSize = 2000;
m_nClientSend222 = 0;
}
CSyncSession::~CSyncSession()
{
}
void CSyncSession::HandleGet(InstanceID_t id, CmdGet_s* pGet,CmdSyncHdr_s* pSyncHdr)
{
char vert[10];
SmlStatus_t status;
smlLibMemset(&status,0,(MemSize_t)sizeof(SmlStatus_t));
status.elementType = SML_PE_STATUS;
sprintf(vert , "%d",m_nCmdID++);
status.cmdID = smlString2Pcdata(vert);
status.msgRef = smlString2Pcdata(pSyncHdr->msgID);
status.cmdRef = smlString2Pcdata(pGet->cmdID);
status.cmd = smlString2Pcdata("Get");
if(pGet->itemList!=NULL&&pGet->itemList->item!=NULL&&pGet->itemList->item->target_locURI!=NULL)
{
SmlTargetRefListPtr_t pTarget = (SmlTargetRefListPtr_t)smlLibMalloc(sizeof(SmlTargetRefList_t));
smlLibMemset(pTarget, 0, sizeof(SmlTargetRefList_t));
status.targetRefList = pTarget;
pTarget->targetRef = smlString2Pcdata(pGet->itemList->item->target_locURI);
}
if(pGet->itemList!=NULL&&pGet->itemList->item!=NULL&&pGet->itemList->item->source_locURI!=NULL)
{
SmlSourceRefListPtr_t pSource = (SmlSourceRefListPtr_t)smlLibMalloc(sizeof(SmlSourceRefList_t));
smlLibMemset(pSource, 0, sizeof(SmlSourceRefList_t));
status.sourceRefList = pSource;
pSource->sourceRef = smlString2Pcdata(pGet->itemList->item->source_locURI);
}
status.data = smlString2Pcdata("200");
smlStatusCmd( id, &status);
SmlResults_t result;
smlLibMemset(&result,0,(MemSize_t)sizeof(SmlResults_t));
result.elementType = SML_PE_RESULTS;
sprintf(vert , "%d",m_nCmdID++);
result.cmdID = smlString2Pcdata(vert);
result.msgRef = smlString2Pcdata(pSyncHdr->msgID);
result.cmdRef = smlString2Pcdata(pGet->cmdID);
result.meta = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t));
smlLibMemset(result.meta, 0, sizeof(SmlPcdata_t));
result.meta->contentType=SML_PCDATA_EXTENSION;
result.meta->extension=SML_EXT_METINF;
result.meta->content = (SmlMetInfMetInfPtr_t)smlLibMalloc(sizeof(SmlMetInfMetInf_t));
smlLibMemset(result.meta->content, 0, sizeof(SmlMetInfMetInf_t));
SmlMetInfMetInfPtr_t pMeta = (SmlMetInfMetInfPtr_t)(result.meta->content);
pMeta->type = smlString2Pcdata("application/vnd.syncml-devinf+wbxml");
SmlItemListPtr_t pItemList = (SmlItemListPtr_t)smlLibMalloc(sizeof(SmlItemList_t));
smlLibMemset(pItemList, 0, sizeof(SmlItemList_t));
result.itemList = pItemList;
SmlItemPtr_t pItem = (SmlItemPtr_t)smlLibMalloc(sizeof(SmlItem_t));
smlLibMemset(pItem, 0, sizeof(SmlItem_t));
pItemList->item = pItem;
pItem->source = (SmlSourcePtr_t)smlLibMalloc(sizeof(SmlSource_t));
pItem->source->locURI = smlString2Pcdata("./devinf11");
pItem->source->locName=NULL;
pItem->data = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t));
smlLibMemset(pItem->data, 0, sizeof(SmlPcdata_t));
pItem->data->contentType=SML_PCDATA_EXTENSION;
pItem->data->extension=SML_EXT_DEVINF;
pItem->data->content = (SmlDevInfDevInfPtr_t)smlLibMalloc(sizeof(SmlDevInfDevInf_t));
//smlLibMemset(pItem->data, 0, sizeof(SmlPcdata_t));
smlLibMemset(pItem->data->content, 0, sizeof(SmlDevInfDevInf_t));
SmlDevInfDevInfPtr_t pDev = (SmlDevInfDevInfPtr_t)(pItem->data->content);
pDev->verdtd = smlString2Pcdata("1.1");
pDev->man = smlString2Pcdata("Trasin");
pDev->mod = smlString2Pcdata("PIM SERVER");
pDev->swv = smlString2Pcdata("1.0");
pDev->devid = smlString2Pcdata("TRASIN PIM SERVER");
pDev->devtyp= smlString2Pcdata("SERVER");
pDev->oem = smlString2Pcdata("-");
pDev->fwv = smlString2Pcdata("-");
pDev->hwv = smlString2Pcdata("-");
// pDev->utc = smlString2Pcdata("");
pDev->datastore = (SmlDevInfDatastoreListPtr_t)smlLibMalloc(sizeof(SmlDevInfDatastoreList_t));
smlLibMemset(pDev->datastore, 0, sizeof(SmlDevInfDatastoreList_t));
pDev->datastore->data = (SmlDevInfDatastorePtr_t)smlLibMalloc(sizeof(SmlDevInfDatastore_t));
smlLibMemset(pDev->datastore->data, 0, sizeof(SmlDevInfDatastore_t));
pDev->datastore->data->sourceref = smlString2Pcdata("content");
pDev->datastore->data->displayname = smlString2Pcdata("content");
pDev->datastore->data->maxguidsize = smlString2Pcdata("32");
pDev->datastore->data->rxpref = (SmlDevInfXmitPtr_t)smlLibMalloc(sizeof(SmlDevInfXmit_t));
pDev->datastore->data->txpref = (SmlDevInfXmitPtr_t)smlLibMalloc(sizeof(SmlDevInfXmit_t));
pDev->datastore->data->rxpref->cttype = smlString2Pcdata("text/x-vcard");
pDev->datastore->data->txpref->cttype = smlString2Pcdata("text/x-vcard");
pDev->datastore->data->rxpref->verct = smlString2Pcdata("2.1");
pDev->datastore->data->txpref->verct = smlString2Pcdata("2.1");
pDev->datastore->data->synccap = (SmlDevInfSyncCapPtr_t)smlLibMalloc(sizeof(SmlDevInfSyncCap_t));
pDev->datastore->data->synccap->synctype = (SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t));
pDev->datastore->data->synccap->synctype->data=smlString2Pcdata("1");
pDev->datastore->data->synccap->synctype->next=(SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t));
pDev->datastore->data->synccap->synctype->next->data=smlString2Pcdata("2");
pDev->datastore->data->synccap->synctype->next->next=(SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t));
pDev->datastore->data->synccap->synctype->next->next->data=smlString2Pcdata("3");
pDev->datastore->data->synccap->synctype->next->next->next=(SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t));
pDev->datastore->data->synccap->synctype->next->next->next->data=smlString2Pcdata("4");
pDev->datastore->data->synccap->synctype->next->next->next->next=(SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t));
pDev->datastore->data->synccap->synctype->next->next->next->next->data=smlString2Pcdata("5");
pDev->datastore->data->synccap->synctype->next->next->next->next->next=(SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t));
pDev->datastore->data->synccap->synctype->next->next->next->next->next->data=smlString2Pcdata("6");
pDev->datastore->data->synccap->synctype->next->next->next->next->next->next=(SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t));
pDev->datastore->data->synccap->synctype->next->next->next->next->next->next->data=smlString2Pcdata("7");
pDev->datastore->data->synccap->synctype->next->next->next->next->next->next->next=NULL;
//SmlDevInfDatastorePtr_t
smlResultsCmd( id, &result);
}
void CSyncSession::HandlePut(InstanceID_t id, CmdPut_s* pPut,CmdSyncHdr_s* pSyncHdr)
{
SmlStatus_t status;
char vert[10];
smlLibMemset(&status,0,(MemSize_t)sizeof(SmlStatus_t));
status.elementType = SML_PE_STATUS;
sprintf(vert , "%d",m_nCmdID++);
status.cmdID = smlString2Pcdata(vert);
status.msgRef = smlString2Pcdata(pSyncHdr->msgID);
status.cmdRef = smlString2Pcdata(pPut->cmdID);
status.cmd = smlString2Pcdata("Put");
if(pPut->itemList!=NULL&&pPut->itemList->item!=NULL&&pPut->itemList->item->target_locURI!=NULL)
{
SmlTargetRefListPtr_t pTarget = (SmlTargetRefListPtr_t)smlLibMalloc(sizeof(SmlTargetRefList_t));
smlLibMemset(pTarget, 0, sizeof(SmlTargetRefList_t));
status.targetRefList = pTarget;
pTarget->targetRef = smlString2Pcdata(pPut->itemList->item->target_locURI);
}
if(pPut->itemList!=NULL&&pPut->itemList->item!=NULL&&pPut->itemList->item->source_locURI!=NULL)
{
SmlSourceRefListPtr_t pSource = (SmlSourceRefListPtr_t)smlLibMalloc(sizeof(SmlSourceRefList_t));
smlLibMemset(pSource, 0, sizeof(SmlSourceRefList_t));
status.sourceRefList = pSource;
pSource->sourceRef = smlString2Pcdata(pPut->itemList->item->source_locURI);
}
status.data = smlString2Pcdata("200");
smlStatusCmd( id, &status);
}
void CSyncSession::HandleSyncStart(InstanceID_t id, CmdSync_s* pSync,CmdSyncHdr_s* pSyncHdr)
{
char vert[10];
SmlStatus_t status;
m_eClientState = Sync_ClientSyncStart;
smlLibMemset(&status,0,(MemSize_t)sizeof(SmlStatus_t));
status.elementType = SML_PE_STATUS;
sprintf(vert , "%d",m_nCmdID++);
status.cmdID = smlString2Pcdata(vert);
status.msgRef = smlString2Pcdata(pSyncHdr->msgID);
status.cmdRef = smlString2Pcdata(pSync->cmdID);
status.cmd = smlString2Pcdata("Sync");
if(pSync->target_locURI!=NULL)
{
SmlTargetRefListPtr_t pTarget = (SmlTargetRefListPtr_t)smlLibMalloc(sizeof(SmlTargetRefList_t));
smlLibMemset(pTarget, 0, sizeof(SmlTargetRefList_t));
status.targetRefList = pTarget;
pTarget->targetRef = smlString2Pcdata(pSync->target_locURI);
}
if(pSync->source_locURI!=NULL)
{
SmlSourceRefListPtr_t pSource = (SmlSourceRefListPtr_t)smlLibMalloc(sizeof(SmlSourceRefList_t));
smlLibMemset(pSource, 0, sizeof(SmlSourceRefList_t));
status.sourceRefList = pSource;
pSource->sourceRef = smlString2Pcdata(pSync->source_locURI);
}
status.data = smlString2Pcdata("200");
smlStatusCmd( id, &status);
}
void CSyncSession::HandleReplace(InstanceID_t id,CmdReplace_s* pReplace,CmdSyncHdr_s*pSyncHdr)
{
char vert[10];
CVcard card;
card.Parse((char*)pReplace->itemList->item->data,smlLibStrlen((char*)(pReplace->itemList->item->data)));
card.CheckCards();
VItem*item = card.GetItem(N);
char *tmp = "";
char *data =tmp;
char * name = tmp;
char * locuri = tmp;
char * rev = tmp;
char * tell = tmp;
if(item!=NULL)
{
if(item->data!=NULL)
{
name = item->data;
}
}
item = card.GetItem(TEL);
if(item!=NULL)
{
if(item->data!=NULL)
{
tell = item->data;
}
}
if(pReplace->itemList->item->source_locURI!=NULL)
locuri = pReplace->itemList->item->source_locURI;
if(pReplace->itemList->item->data!=NULL)
data= (char*)pReplace->itemList->item->data;
char sql [10240];
sprintf(sql,"select count(*) from pim_contact where userid='%s' and locuri='%s'",m_sUser,locuri);
CMySet set;
if(workdb.PrepareSql(sql, set)==FALSE)
{
XPTDEBUG(("sql=%s error=%s\n",sql,workdb.GetSqlError()));
}
else
{
if(workdb.FetchData())
{
int nCnt = atoi(set.GetFieldValue(0));
XPTDEBUG(("sql=%s Count=%d\n",sql,nCnt));
if(nCnt==0)
{
sprintf(sql,"insert into pim_contact(userid,locuri,contact_cell,contact_name,data) values('%s' , '%s','%s','%s','%s')",m_sUser,locuri,tell,name,data);
XPTDEBUG(("sql=%s\n",sql));
if(!workdb.ExeSqlDirect(sql))
{
char log[1024];
sprintf(log,"Error : %s ",sql);
}
}
else
{
}
}
}
card.Free();
SmlStatus_t status;
smlLibMemset(&status,0,(MemSize_t)sizeof(SmlStatus_t));
status.elementType = SML_PE_STATUS;
sprintf(vert , "%d",m_nCmdID++);
status.cmdID = smlString2Pcdata(vert);
status.msgRef = smlString2Pcdata(pSyncHdr->msgID);
status.cmdRef = smlString2Pcdata(pReplace->cmdID);
status.cmd = smlString2Pcdata("Replace");
if(pReplace->itemList!=NULL&&pReplace->itemList->item!=NULL&&pReplace->itemList->item->target_locURI!=NULL)
{
SmlTargetRefListPtr_t pTarget = (SmlTargetRefListPtr_t)smlLibMalloc(sizeof(SmlTargetRefList_t));
smlLibMemset(pTarget, 0, sizeof(SmlTargetRefList_t));
status.targetRefList = pTarget;
pTarget->targetRef = smlString2Pcdata(pReplace->itemList->item->target_locURI);
}
if(pReplace->itemList!=NULL&&pReplace->itemList->item!=NULL&&pReplace->itemList->item->source_locURI!=NULL)
{
SmlSourceRefListPtr_t pSource = (SmlSourceRefListPtr_t)smlLibMalloc(sizeof(SmlSourceRefList_t));
smlLibMemset(pSource, 0, sizeof(SmlSourceRefList_t));
status.sourceRefList = pSource;
pSource->sourceRef = smlString2Pcdata(pReplace->itemList->item->source_locURI);
}
status.data = smlString2Pcdata("201");
smlStatusCmd( id, &status);
}
void CSyncSession::HandleMap(InstanceID_t id,CmdMap_s* pMap,CmdSyncHdr_s*pSyncHdr)
{
char vert[10];
SmlStatus_t status;
smlLibMemset(&status,0,(MemSize_t)sizeof(SmlStatus_t));
status.elementType = SML_PE_STATUS;
sprintf(vert , "%d",m_nCmdID++);
status.cmdID = smlString2Pcdata(vert);
status.msgRef = smlString2Pcdata(pSyncHdr->msgID);
status.cmdRef = smlString2Pcdata(pMap->cmdID);
status.cmd = smlString2Pcdata("Map");
SmlTargetRefListPtr_t pTarget = (SmlTargetRefListPtr_t)smlLibMalloc(sizeof(SmlTargetRefList_t));
smlLibMemset(pTarget, 0, sizeof(SmlTargetRefList_t));
status.targetRefList = pTarget;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -