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

📄 callback_handler.cpp

📁 pimserver是syncml_vc开发包的服务器实例
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/** * @file Callback implementations */
#include "stdafx.h"
#include "..\\inc\\sml.h"#include "callback_handler.h"#include "..\\inc\\syncml_tk_prefix_file.h"
#include "..\\inc\\xpttransport.h"
#include "..\\inc\\wbxml.h"#include <stdio.h>#include "..\\inc\\xpttransport.h"#include "..\\inc\\smlmetinfdtd.h"#include "..\\inc\\smldevinfdtd.h"#include "..\\inc\\mgrutil.h"
#include "b64.h"
#include "vcard.h"
#include "sessionmgr.h"
#include "tmlsessmgr.h"
extern CTmlSessMgr tmgr;
extern CSessionMgr smgr;
/**
 * Callback handling <Add> command
 *
 * @param id instance ID
 * @param pSync pointer containing infomation about <Add> command
 * @return SML_ERR_OK(=0)
 * @see smlInitInstance
 */
char* _get_nowtime()
{
	SYSTEMTIME systemTime;

	char* datebuf  = (char *)smlLibMalloc(256);
	const unsigned int datebufSize = 256;
	struct { int tv_sec; int tv_usec; } tv = {0,0};
	time((time_t *)(&tv.tv_sec));
	GetLocalTime(&systemTime);
	tv.tv_usec = systemTime.wMilliseconds * 1000; 

	const time_t timeInSeconds = (time_t) tv.tv_sec;
    strftime (datebuf,
                datebufSize,
                "%Y%m%d-%H%M%S", /* guaranteed to fit in 256 chars,
                                    hence don't check return code */
                localtime (&timeInSeconds));

	char msbuf[5];
   /* Dividing (without remainder) by 1000 rounds the microseconds
      measure to the nearest millisecond. */
	sprintf(msbuf, ".%3.3ld", long(tv.tv_usec / 1000));

	int datebufCharsRemaining = datebufSize - strlen (datebuf);
	strncat (datebuf, msbuf, datebufCharsRemaining - 1);

	datebuf[datebufSize - 1] = '\0'; /* Just in case strncat truncated msbuf,
                                        thereby leaving its last character at
                                        the end, instead of a null terminator */
    //XPTDEBUG(("_get_nowtime %s\n",datebuf));
	return datebuf;
}

void base64encode(char *src, int src_len, char *dst)
{
        int i = 0, j = 0;
        char base64_map[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        for (; i < src_len - src_len % 3; i += 3) {
                dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
                dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
                dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) & 0x3)];
                dst[j++] = base64_map[src[i + 2] & 0x3F];
        }
        if (src_len % 3 == 1) {
                 dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
                 dst[j++] = base64_map[(src[i] << 4) & 0x30];
                 dst[j++] = '=';
                 dst[j++] = '=';
        }
        else if (src_len % 3 == 2) {
                dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
                dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
                dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C];
                dst[j++] = '=';
        }
        dst[j] = '\0';
}
int base64decode(char *src, int src_len, char *dst)
{
        int i = 0, j = 0;
        int base64_decode_map[256] = {
             255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
             255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
             255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
             255, 0, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
             15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 26, 27, 28,
             29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
             49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
             255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
             255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
             255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
             255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
             255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
             255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};
        for (; i < src_len; i += 4) {
                 dst[j++] = base64_decode_map[src[i]] << 2 |
                 base64_decode_map[src[i + 1]] >> 4;
                 dst[j++] = base64_decode_map[src[i + 1]] << 4 |
                 base64_decode_map[src[i + 2]] >> 2;
			     dst[j++] = base64_decode_map[src[i + 2]] << 6 |
                 base64_decode_map[src[i + 3]];
        }
        dst[j] = '\0';
		return j;
}

Ret_t myHandleAdd(InstanceID_t id, VoidPtr_t userData, SmlAddPtr_t pAdd)
{
    XPTDEBUG(("Calling %s() at %s:%d\n", "myHandleAdd", __FILE__, __LINE__));
	char * sessionID = (char*)userData ;
	CSyncSession * pSess =NULL;
	pSess = smgr.GetSession(sessionID);
	CmdAdd_s *pCmd = (CmdAdd_s *)smlLibMalloc(sizeof(CmdAdd_s));
	smlLibMemset(pCmd,0,(MemSize_t)sizeof(CmdAdd_s));
	//add.cmdid
	char * cmdID = smlPcdata2String(pAdd->cmdID);
	if( cmdID!=NULL)
	{
	  XPTDEBUG(("Add.CmdID	      = %s\n", cmdID));
	  pCmd->cmdID  = (char *)smlLibMalloc(smlLibStrlen(cmdID));
	  smlLibStrcpy(pCmd->cmdID,cmdID);
	}
	pCmd->flags = pAdd->flags;
	XPTDEBUG(("Add.Flags = %d\n", pAdd->flags));
    //add.cred
	if(pAdd->cred!=NULL&&pAdd->cred->meta!=NULL)	{
		XPTDEBUG(("..............NOT SUPPORTED!!!.....ADD.CRED.META..........." ));
	}
	if(pAdd->cred!=NULL&&pAdd->cred->data!=NULL){
		char *cred_data = smlPcdata2String(pAdd->cred->data);
		XPTDEBUG(("Add.Cred.Data     = %s\n", cred_data));
		pCmd->cred_data  = (char *)smlLibMalloc(smlLibStrlen(cred_data));
	    smlLibStrcpy(pCmd->cred_data,cred_data);
	}

	if(pAdd->meta!=NULL){
		 //当作METINF处理
		 pCmd->meta  = (MetInf_s *)smlLibMalloc(sizeof(MetInf_s));
		 smlLibMemset(pCmd->meta,0,(MemSize_t)sizeof(MetInf_s));
		 SmlMetInfMetInfPtr_t pMeta = (SmlMetInfMetInfPtr_t )pAdd->meta->content;
		 char * maxmsgsize = smlPcdata2String(pMeta->maxmsgsize);
		 if(maxmsgsize!=NULL){
			XPTDEBUG(("Add.Meta.MaxMsgSize          = %s\n",maxmsgsize ));
			pCmd->meta->maxmsgsize  = (char *)smlLibMalloc(smlLibStrlen(maxmsgsize));
			smlLibStrcpy(pCmd->meta->maxmsgsize,maxmsgsize);
		 }
		 char * format = smlPcdata2String(pMeta->format);
		 if(format!=NULL){
			XPTDEBUG(("Add.Meta.Format          = %s\n",format ));
			pCmd->meta->format  = (char *)smlLibMalloc(smlLibStrlen(format));
			smlLibStrcpy(pCmd->meta->format,format);
		 }

		 char * mark = smlPcdata2String(pMeta->mark);
		 if(mark!=NULL){
			XPTDEBUG(("Add.Meta.Mark          = %s\n",mark ));
			pCmd->meta->mark  = (char *)smlLibMalloc(smlLibStrlen(mark));
			smlLibStrcpy(pCmd->meta->mark,mark);
		 }

		 char * maxobjsize = smlPcdata2String(pMeta->maxobjsize);
		 if(maxobjsize!=NULL) {
			XPTDEBUG(("Add.Meta.MaxObjSize          = %s\n",maxobjsize ));
			pCmd->meta->maxobjsize  = (char *)smlLibMalloc(smlLibStrlen(maxobjsize));
			smlLibStrcpy(pCmd->meta->maxobjsize,maxobjsize);
		 }
		 if(pMeta->mem!=NULL){
			 char * mem_free = smlPcdata2String(pMeta->mem->free);
			 if(mem_free!=NULL){
				XPTDEBUG(("Add.Meta.Mem.Free          = %s\n",mem_free ));
				pCmd->meta->mem_free  = (char *)smlLibMalloc(smlLibStrlen(mem_free));
				smlLibStrcpy(pCmd->meta->mem_free,mem_free);
			 }
			 char * mem_freeid = smlPcdata2String(pMeta->mem->freeid);
			 if(mem_freeid!=NULL) {
				XPTDEBUG(("Add.Meta.Mem.FreeID          = %s\n",mem_freeid ));
				pCmd->meta->mem_freeid  = (char *)smlLibMalloc(smlLibStrlen(mem_freeid));
				smlLibStrcpy(pCmd->meta->mem_freeid,mem_freeid);
			 }
			 char * mem_shared = smlPcdata2String(pMeta->mem->shared);
			 if(mem_shared!=NULL) {
				XPTDEBUG(("Add.Meta.Mem.Shared          = %s\n",mem_shared ));
				pCmd->meta->mem_shared  = (char *)smlLibMalloc(smlLibStrlen(mem_shared));
				smlLibStrcpy(pCmd->meta->mem_shared,mem_shared);
			 }
		 }

		 char * nextnonce = smlPcdata2String(pMeta->nextnonce);
		 if(nextnonce!=NULL){
			XPTDEBUG(("Add.Meta.NextNonce          = %s\n",nextnonce ));
			pCmd->meta->nextnonce  = (char *)smlLibMalloc(smlLibStrlen(nextnonce));
			smlLibStrcpy(pCmd->meta->nextnonce,nextnonce);
		 }

		 char * size = smlPcdata2String(pMeta->nextnonce);
		 if(size!=NULL) {
			XPTDEBUG(("Add.Meta.Size          = %s\n",size ));
			pCmd->meta->size  = (char *)smlLibMalloc(smlLibStrlen(size));
			smlLibStrcpy(pCmd->meta->size,size);
		 }

		 char * type = smlPcdata2String(pMeta->type);
		 if(type!=NULL) {
			XPTDEBUG(("Add.Meta.Type          = %s\n",type ));
			pCmd->meta->type  = (char *)smlLibMalloc(smlLibStrlen(type));
			smlLibStrcpy(pCmd->meta->type,type);
		 }

		 char * version = smlPcdata2String(pMeta->version);
		 if(version!=NULL) {
			XPTDEBUG(("Add.Meta.Version          = %s\n",version ));
			pCmd->meta->version  = (char *)smlLibMalloc(smlLibStrlen(version));
			smlLibStrcpy(pCmd->meta->version,version);
		 }


		if(pMeta->emi!=NULL){
			 //暂时只处理一个
			 pCmd->meta->emi  = (PcdataList_s *)smlLibMalloc(sizeof(PcdataList_s));
			 smlLibMemset(pCmd->meta->emi,0,(MemSize_t)sizeof(PcdataList_s));
			 char * data = smlPcdata2String(pMeta->emi->data);
			 if(data!=NULL) {
				XPTDEBUG(("Add.Meta.Emi.Data          = %s\n",data ));
				pCmd->meta->emi->data  = (char *)smlLibMalloc(smlLibStrlen(data));
				smlLibStrcpy(pCmd->meta->emi->data,data);
			 }
		}
		if(pMeta->anchor!=NULL){
			 char * anchor_last = smlPcdata2String(pMeta->anchor->last);
			 if(anchor_last!=NULL){
				XPTDEBUG(("Add.Meta.Anchor.Last          = %s\n",anchor_last ));
				pCmd->meta->anchor_last  = (char *)smlLibMalloc(smlLibStrlen(anchor_last));
				smlLibStrcpy(pCmd->meta->anchor_last,anchor_last);
			 }
			 char * anchor_next = smlPcdata2String(pMeta->anchor->next);
			 if(anchor_next!=NULL) {
				XPTDEBUG(("Add.Meta.Anchor.Next          = %s\n",anchor_next ));
				pCmd->meta->anchor_next  = (char *)smlLibMalloc(smlLibStrlen(anchor_next));
				smlLibStrcpy(pCmd->meta->anchor_next,anchor_next);
			 }
		}
	}

	if(pAdd->itemList!=NULL){
		SmlItemListPtr_t psmlitemlist = pAdd->itemList;
		CmdItemList_s * pcmditemlist = NULL; 
        //连接指针用
		int flag = 0;
		while(psmlitemlist!=NULL){
			//alert.item
			if(psmlitemlist->item!=NULL){
				//申请链表节点,第一个需特殊处理
				CmdItemList_s * pf = pcmditemlist;
				pcmditemlist = (CmdItemList_s *)smlLibMalloc(sizeof(CmdItemList_s));
				smlLibMemset(pcmditemlist,0,(MemSize_t)sizeof(CmdItemList_s));
				if(flag==0){
					flag = 1;
					pCmd->itemList = pcmditemlist;
				}
				else{
					pf->next = pcmditemlist;
				}
				
				//申请一个ITEM对象
				pcmditemlist->item = (CmdItem_s *)smlLibMalloc(sizeof(CmdItem_s));
				smlLibMemset(pcmditemlist->item,0,(MemSize_t)sizeof(CmdItem_s));
				//alert.item.target
				if(psmlitemlist->item->target!=NULL){
					//alert.item.target.locuri
					char*target_locURI = smlPcdata2String(psmlitemlist->item->target->locURI);
					if(target_locURI!=NULL){
					 	 XPTDEBUG(("Add.Item.Target.locURI     = %s\n", target_locURI));
						 pcmditemlist->item->target_locURI  = (char *)smlLibMalloc(smlLibStrlen(target_locURI));
						 smlLibStrcpy( pcmditemlist->item->target_locURI,target_locURI);
					}
					//alert.item.target.locname
					char*target_locName = smlPcdata2String(psmlitemlist->item->target->locName);
					if(target_locName!=NULL)	{
						 XPTDEBUG(("Add.Item.Target.locName     = %s\n", target_locName));
						 pcmditemlist->item->target_locName  = (char *)smlLibMalloc(smlLibStrlen(target_locName));
						 smlLibStrcpy( pcmditemlist->item->target_locName,target_locName);
					}
				}
				//alert.item.source
				if(psmlitemlist->item->source!=NULL){
					//alert.item.source.locuri
					char*source_locURI = smlPcdata2String(psmlitemlist->item->source->locURI);
					if(source_locURI!=NULL){
						 XPTDEBUG(("Add.Item.Source.locURI     = %s\n", source_locURI));
						 pcmditemlist->item->source_locURI  = (char *)smlLibMalloc(smlLibStrlen(source_locURI));
						 smlLibStrcpy( pcmditemlist->item->source_locURI,source_locURI);
					}
					//alert.item.source.locname
					char*source_locName = smlPcdata2String(psmlitemlist->item->source->locName);
					if(source_locName!=NULL)	{

⌨️ 快捷键说明

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