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

📄 syncsession.cpp

📁 pimserver是syncml_vc开发包的服务器实例
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		pTarget->targetRef =  smlString2Pcdata(pMap->target_locURI);

		SmlSourceRefListPtr_t pSource = (SmlSourceRefListPtr_t)smlLibMalloc(sizeof(SmlSourceRefList_t));
		smlLibMemset(pSource, 0, sizeof(SmlSourceRefList_t));
		status.sourceRefList = pSource;
		pSource->sourceRef =  smlString2Pcdata(pMap->source_locURI);
		
		if(pMap->mapItemList!=NULL)
		{
			CmdMapItemList_s * pcmditemlist = pMap->mapItemList;
			while(pcmditemlist!=NULL)
			{
				CmdMapItem_s *pitem = pcmditemlist->mapItem;
				if(pitem!=NULL)
				{
					char *targetlocURI = pitem->target_locURI;
					char *sourcelocURI = pitem->source_locURI;
					int nlocuri = atoi(targetlocURI);
					char sql [1024];	
					sprintf(sql,"update  pim_contact set locuri='%s' ,updatetime = getdate(),flag = 0 where id=%d ",sourcelocURI,nlocuri);
					XPTDEBUG(("sql=%s\n",sql));
					if(!workdb.ExeSqlDirect(sql))
					{
						char log[1024];
						sprintf(log,"Error : %s ",sql);
					}

				}
				pcmditemlist=pcmditemlist->next;
			}
		}
		status.data = smlString2Pcdata("200");
		smlStatusCmd( id,  &status);
}


void CSyncSession::HandleStatus(InstanceID_t id,CmdStatus_s* pStatus ,CmdSyncHdr_s*pSyncHdr)
{
		char vert[10];
		if(_get_status_datatype(pStatus)==SML_PE_ADD)
		{
			//add操作返回是在map中处理的。
		}
		if(_get_status_datatype(pStatus)==SML_PE_REPLACE)
		{
			//更新标志位
				if(pStatus->targetRefList!=NULL)
				{
					if(pStatus->targetRefList->targetRef!=NULL)
					{
						char* slocuri = pStatus->targetRefList->targetRef;
						char sql [1024];	
						sprintf(sql,"update  pim_contact set updatetime = getdate(),flag = 0 where locuri='%s' and userid='%s' ",slocuri,m_sUser);
						XPTDEBUG(("sql=%s\n",sql));
						if(!workdb.ExeSqlDirect(sql))
						{
							char log[1024];
							sprintf(log,"Error : %s ",sql);
						}
					}
				}
		}
}
void CSyncSession::HandleFinal(InstanceID_t id,	Boolean_t*pfinal,CmdSyncHdr_s* pSyncHdr) 
{
		if(*pfinal)
		{
			if(m_eClientState==Sync_ClientSyncStart)
			{
				XPTDEBUG(("myHandleEndMessage  SET Sync_ClientSyncOK\n"));
				m_eClientState =Sync_ClientSyncOK;//同步结束
			}
		}
		//双向同步都结束后更新
		if(m_eClientState==Sync_ClientSyncOK&&m_eServerState==Sync_ServerSyncOK)
		{
			char sql [10240];	
			sprintf(sql,"update  pim_user set clientanchor ='%s',serveranchor='%s',synctype='%d' ,updatetime = getdate() where userid='%s' ",m_sClientAnchor,m_sServerAnchor,m_nSyncType,m_sUser);
			XPTDEBUG(("sql=%s\n",sql));
			if(!workdb.ExeSqlDirect(sql))
			{
				char log[1024];
				sprintf(log,"Error : %s ",sql);
			}
		}
}
void CSyncSession::HandleAdd(InstanceID_t id,	CmdAdd_s* pAdd,CmdSyncHdr_s* pSyncHdr)
{
		char vert[10];
		CVcard card;
		card.Parse((char*)pAdd->itemList->item->data,smlLibStrlen((char*)(pAdd->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;
				//XPTDEBUG(("Add.Item.Data     = %s\n", item->data));
			 }
		}
		if(pAdd->itemList->item->source_locURI!=NULL)
			 locuri = pAdd->itemList->item->source_locURI;
		if(pAdd->itemList->item->data!=NULL)
			data= (char*)pAdd->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(pAdd->cmdID);
		status.cmd				= smlString2Pcdata("Add");	   
		if(pAdd->itemList!=NULL&&pAdd->itemList->item!=NULL&&pAdd->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(pAdd->itemList->item->target_locURI);
		}
		if(pAdd->itemList!=NULL&&pAdd->itemList->item!=NULL&&pAdd->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(pAdd->itemList->item->source_locURI);
		}
		status.data = smlString2Pcdata("201");
	
		smlStatusCmd( id,  &status);
		
}
void CSyncSession::HandleAlert(InstanceID_t id,	CmdAlert_s* pAlert,CmdSyncHdr_s* pSyncHdr)
{
		int alerttype = 0;
		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(pAlert->cmdID);
		status.cmd				= smlString2Pcdata("Alert");	   
		if(pAlert->itemList!=NULL&&pAlert->itemList->item!=NULL&&pAlert->itemList->item->target_locURI!=NULL)
		{
			SmlTargetRefListPtr_t pTarget = (SmlTargetRefListPtr_t)smlLibMalloc(sizeof(SmlTargetRefList_t));
			smlLibMemset(pTarget, 0, sizeof(SmlTargetRefList_t));
			status.targetRefList = pTarget;
			if(m_sTargetLocURI==NULL)
			{
				m_sTargetLocURI  = (char *)smlLibMalloc(smlLibStrlen(pAlert->itemList->item->target_locURI));
				smlLibStrcpy(m_sTargetLocURI,pAlert->itemList->item->target_locURI);
			}

			pTarget->targetRef =  smlString2Pcdata(pAlert->itemList->item->target_locURI);
		}
		if(pAlert->itemList!=NULL&&pAlert->itemList->item!=NULL&&pAlert->itemList->item->source_locURI!=NULL)
		{
			SmlSourceRefListPtr_t pSource = (SmlSourceRefListPtr_t)smlLibMalloc(sizeof(SmlSourceRefList_t));
			smlLibMemset(pSource, 0, sizeof(SmlSourceRefList_t));
			if(m_sSourceLocURI==NULL)
			{
				m_sSourceLocURI  = (char *)smlLibMalloc(smlLibStrlen(pAlert->itemList->item->source_locURI));
				smlLibStrcpy(m_sSourceLocURI,pAlert->itemList->item->source_locURI);
			}
			status.sourceRefList = pSource;
			pSource->sourceRef =  smlString2Pcdata(pAlert->itemList->item->source_locURI);
		}
		//&&pAlert->itemList->item->meta!=NULL
		if(pAlert->itemList!=NULL&&pAlert->itemList->item!=NULL)
		{
			SmlItemListPtr_t pItemList = (SmlItemListPtr_t)smlLibMalloc(sizeof(SmlItemList_t));
			smlLibMemset(pItemList, 0, sizeof(SmlItemList_t));
			status.itemList = pItemList;
			SmlItemPtr_t pItem = (SmlItemPtr_t)smlLibMalloc(sizeof(SmlItem_t));
			smlLibMemset(pItem, 0, sizeof(SmlItem_t));
			pItemList->item = pItem;
		
			if(pAlert->itemList->item->target_locURI!=NULL)
			{
				pItem->source =  (SmlTargetPtr_t)smlLibMalloc(sizeof(SmlTarget_t));
				pItem->source->locURI =  smlString2Pcdata(pAlert->itemList->item->target_locURI);
				pItem->source->locName =  NULL;
			}
			if(pAlert->itemList->item->source_locURI!=NULL)
			{
				pItem->target =  (SmlSourcePtr_t)smlLibMalloc(sizeof(SmlSource_t));
				pItem->target->locURI =  smlString2Pcdata(pAlert->itemList->item->source_locURI);
				pItem->target->locName =  NULL;
			}
	
			
			///////////////////
			if(pAlert->itemList->item->meta!=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_METINF;
				pItem->data->content =   (SmlMetInfMetInfPtr_t)smlLibMalloc(sizeof(SmlMetInfMetInf_t));
				smlLibMemset(pItem->data->content, 0, sizeof(SmlMetInfMetInf_t));


				SmlMetInfMetInfPtr_t pMeta = (SmlMetInfMetInfPtr_t)(pItem->data->content);
				
				SmlMetInfAnchorPtr_t pAnchor = NULL ;
				pAnchor = (SmlMetInfAnchorPtr_t)smlLibMalloc(sizeof(SmlMetInfAnchor_t));
				smlLibMemset(pAnchor, 0, sizeof(SmlMetInfAnchor_t));
				pMeta->anchor = pAnchor ;
				pMeta->anchor->next  = smlString2Pcdata(pAlert->itemList->item->meta->anchor_next);
			
				int data = atoi(pAlert->data);
				if(data==200)//双向同步
				{
					//如果客户端发起双向同步,检测上次同步的ANCHOR
					//获取上次同步的ANCHOR
					char * last = _database_get_clientanchor(m_sUser);
					//
					if(pAlert->itemList->item->meta->anchor_last==NULL)
					{
						status.data = smlString2Pcdata("508");
						//if(pSess->m_nSyncType==0)
						m_nSyncType = 201;
						data = 201;
						alerttype = 1;
					}
					else
					{
						if(strcmp(pAlert->itemList->item->meta->anchor_last,last)!=0)
						{
							//要求客户端重建慢同步
							data = 201;
							//if(pSess->m_nSyncType==0)
							m_nSyncType = 201;
							status.data = smlString2Pcdata("508");
							alerttype = 1;
						}
						else
						{
							//OK
							status.data = smlString2Pcdata("200");
						}
					}
				}
				else if(data==201) //客户端发起的慢同步
				{
					status.data = smlString2Pcdata("201");
				}
			}
		}
		int data = atoi(pAlert->data);
		if(data==222)
		{
			status.data = smlString2Pcdata("200");
		}

		smlStatusCmd( id,  &status);
		if(data!=222)
		{
			SmlAlert_t alert;
			smlLibMemset(&alert,0,(MemSize_t)sizeof(SmlAlert_t));
			alert.elementType = SML_PE_ALERT;
			sprintf(vert , "%d",m_nCmdID++);
			alert.cmdID			= smlString2Pcdata(vert);
			alert.itemList = (SmlItemListPtr_t)smlLibMalloc(sizeof(SmlItemList_t));
			smlLibMemset(alert.itemList, 0, sizeof(SmlItemList_t));
			if(pAlert->itemList!=NULL&&pAlert->itemList->item!=NULL)
			{
				SmlItemPtr_t pItem = (SmlItemPtr_t)smlLibMalloc(sizeof(SmlItem_t));
				smlLibMemset(pItem, 0, sizeof(SmlItem_t));
				alert.itemList->item  = pItem;
				////
				if(pAlert->itemList->item->target_locURI!=NULL)
				{
					pItem->source =  (SmlTargetPtr_t)smlLibMalloc(sizeof(SmlTarget_t));
					pItem->source->locURI =  smlString2Pcdata(pAlert->itemList->item->target_locURI);
					pItem->source->locName =  NULL;
				}
				if(pAlert->itemList->item->source_locURI!=NULL)
				{
					pItem->target =  (SmlSourcePtr_t)smlLibMalloc(sizeof(SmlSource_t));
					pItem->target->locURI =  smlString2Pcdata(pAlert->itemList->item->source_locURI);
					pItem->target->locName =  NULL;
				}
				pItem->meta  = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t));
				smlLibMemset(pItem->meta, 0, sizeof(SmlPcdata_t));

		
				pItem->meta->contentType=SML_PCDATA_EXTENSION;
				pItem->meta->extension=SML_EXT_METINF;

⌨️ 快捷键说明

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