📄 pimserver.cpp
字号:
// pimserver.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "pimserver.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/* Include header files required in any SyncML session */
#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 "..\\inc\\tml\\define.h"
#include "..\\inc\\tml\\tml.h"
#include "..\\inc\\tml\\tmldef.h"
#include "..\\inc\\tml\\tmldtd.h"
#include "vcard.h"
#include "mydb.h"
#include "builder_wrapper.h"
#include "wbxml2xml.h"
#include "sessionmgr.h"
#include "tmlsessmgr.h"
#include "mydb.h"
#include "b64.h"
#include "ccharcode.h"
CWinApp theApp;
CMydb workdb;
using namespace std;
CSessionMgr smgr;
CTmlSessMgr tmgr;
FILE*stream;
char* _get_nowtime();
int base64decode(char *src, int src_len, char *dst);
/**
* Receive the SyncML document from the transport layer
*
* @param id instance ID
* @param serviceID transport service ID
* @see xptReceiveData
*/
int myGetReplace(InstanceID_t id,CSyncSession*pSess);
int myGetAdd(InstanceID_t id,CSyncSession*pSess);
int _get_new_anchor(char*_buf)
{
SYSTEMTIME _systemTime;
char _datebuf[256];
int _datebufSize = 256;
char _msbuf[5];
int _length = 0;
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",localtime (&_timeInSeconds));
sprintf(_msbuf, "%3.3ld", long(_tv.tv_usec / 1000));
strcat(_datebuf,_msbuf);
_length = strlen(_datebuf);
if(IsBadWritePtr(_buf,_length)){
return 0;
}
else{
strcpy(_buf,_datebuf);
return 1;
}
}
int _get_new_locuri(char*_buf)
{
SYSTEMTIME _systemTime;
char _datebuf[256];
int _datebufSize = 256;
char _msbuf[5];
int _length = 0;
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",localtime (&_timeInSeconds));
sprintf(_msbuf, "%3.3ld", long(_tv.tv_usec / 1000));
strcat(_datebuf,_msbuf);
_length = strlen(_datebuf);
if(IsBadWritePtr(_buf,_length)){
return 0;
}
else{
strcpy(_buf,_datebuf);
return 1;
}
}
int _get_filelength(char*_filepath)
{
XPTDEBUG(("_get_filelength=%s\n",_filepath));
if(_filepath==NULL)
return 0;
FILE*_fp = fopen(_filepath,"rb");
if(_fp==NULL)
return 0;
fseek (_fp , 0 , SEEK_END );
int _length = ftell(_fp);
XPTDEBUG(("_get_filelength='%d'\n",_length));
fclose(_fp);
return _length;
}
char *_database_get_clientanchor(char *_userid)
{
char _sql[1024];
CMySet _set;
sprintf(_sql,"select clientanchor from pim_user where userid='%s'",_userid);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
char * _anchor = _set.GetFieldValue(0);
XPTDEBUG(("SQL=%s anchor=%s\n",_sql,_anchor));
return _anchor;
}
}
return NULL;
}
char *_database_get_serveranchor(char *_userid)
{
char _sql [1024];
CMySet _set;
sprintf(_sql,"select serveranchor from pim_user where userid='%s'",_userid);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
char * _anchor = _set.GetFieldValue(0);
XPTDEBUG(("SQL='%s' serveranchor='%s'\n",_sql,_anchor));
return _anchor;
}
}
return NULL;
}
char *_database_get_filepath(char *_locuri,char*_userid)
{
char _sql [1024];
CMySet _set;
int _count=0;
char* _filepath;
sprintf(_sql,"select count(*) from pim_resource where userid='%s' and locuri='%s'",_userid,_userid);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
_count = atoi(_set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' _count='%d'\n",_sql,_count));
}
}
if(_count>0)
{
sprintf(_sql,"select filepath from pim_resource where userid='%s' and locuri='%s'",_userid,_userid);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
_filepath = _set.GetFieldValue(0);
XPTDEBUG(("SQL='%s' filepath='%s'\n",_sql,_filepath));
return _filepath;
}
}
}
return NULL;
}
int _database_get_numberofchange(CSyncSession*_pSess)
{
char _sql[1024];
CMySet _set;
if(_pSess->m_nSyncType==201){
sprintf(_sql,"update pim_contact set flag = 3 where userid='%s' and flag = 0 ",_pSess->m_sUser);
XPTDEBUG(("SQL='%s'\n",_sql));
if(!workdb.ExeSqlDirect(_sql)){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
}
if(_pSess->m_nSyncType==200){
sprintf(_sql,"select count(*) from pim_contact where userid='%s' and flag!=0 ",_pSess->m_sUser);
}
else if(_pSess->m_nSyncType==201) {
sprintf(_sql,"select count(*) from pim_contact where userid='%s' ",_pSess->m_sUser);
}
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
char _noc[100];
strcpy(_noc , _set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' noc='%s'\n",_sql,_noc));
return atoi(_noc);
}
}
return 0;
}
int _database_get_txlnumberofdownload(CTmlSession*_pSess)
{
char _sql[1024];
CMySet _set;
if(_pSess->m_nTxlFlag==1)
{
sprintf(_sql,"select count(*) from pim_contact where userid='%s' ",_pSess->m_sUser);
}
else
{
sprintf(_sql,"select count(*) from pim_contact where userid='%s' and syncid!='%s' ",_pSess->m_sUser,_pSess->m_sSyncID);
}
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
char _noc[100];
strcpy(_noc , _set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' noc='%s'\n",_sql,_noc));
return atoi(_noc);
}
}
return 0;
}
int _database_get_txlnumber(CTmlSession*_pSess)
{
char _sql[1024];
CMySet _set;
sprintf(_sql,"select count(*) from pim_contact where userid='%s' ",_pSess->m_sUser);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
char _noc[100];
strcpy(_noc , _set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' noc='%s'\n",_sql,_noc));
return atoi(_noc);
}
}
return 0;
}
int _database_get_contactflag(CTmlSession*_pSess,TmlCmdContact_s*pCont)
{
char _sql[1024];
CMySet _set;
int c = 0;
sprintf(_sql,"select count(*) from pim_contact where userid='%s' and cmobile ='%s' and locuri='%s' ",_pSess->m_sUser,pCont->cmobile,pCont->locuri);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
char _noc[100];
strcpy(_noc , _set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' count='%s'\n",_sql,_noc));
c = atoi(_noc);
}
}
if(c==0)
return -1;
sprintf(_sql,"select flag from pim_contact where userid='%s' and cmobile ='%s' and locuri='%s' ",_pSess->m_sUser,pCont->cmobile,pCont->locuri);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
char _noc[100];
strcpy(_noc , _set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' flag='%s'\n",_sql,_noc));
return atoi(_noc);
}
}
return -1;
}
int _database_get_nextcontact(CTmlSession*_pSess,TmlCmdContact_s*pCont,int item)
{
char _sql[1024];
CMySet _set;
int c = 0;
sprintf(_sql,"select locuri,cmobile,cname,flag from pim_contact where userid='%s' order by id desc ",_pSess->m_sUser);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
int i = 0;
while(workdb.FetchData()){
if(i++==item)
{
char _noc[100];
strcpy(pCont->locuri , _set.GetFieldValue(0));
strcpy(pCont->cmobile, _set.GetFieldValue(1));
strcpy(pCont->cname, _set.GetFieldValue(2));
strcpy(pCont->op, _set.GetFieldValue(3));
return 1;
}
}
}
return -1;
}
int _get_usedsize(InstanceID_t id)
{
MemPtr_t _writeBuffer; // current Position from to which to write
MemSize_t _usedSize;
smlLockReadBuffer(id, &_writeBuffer, &_usedSize);
smlUnlockWriteBuffer(id, (MemSize_t)0);
return _usedSize;
}
int _get_remainbytes(InstanceID_t id,CSyncSession*pSess)
{
int _usedsize = _get_usedsize(id);
XPTDEBUG(("_get_remainbytes : maxsize %d usedsize %d\n", pSess->m_nMaxMsgSize,_usedsize));
if(pSess->m_nMaxMsgSize-_usedsize>500){
return 1;
}
else{
return 0;
}
}
SmlProtoElement_t _get_status_datatype(CmdStatus_s*pStatus)
{
if(strcmp(pStatus->cmd,"Add")==0){
return SML_PE_ADD;
}
if(strcmp(pStatus->cmd,"Replace")==0){
return SML_PE_REPLACE;
}
return SML_PE_UNDEF;
}
int _search_locuri_pimupfile(CTmlSession*pSess,char*curLocuri)
{
char _sql[1024];
int _count = 0;
CMySet _set;
sprintf(_sql,"select count(*) from pim_upfile where pimsession='%s' and locuri='%s'",pSess->m_sSessID,curLocuri);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
_count = atoi(_set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' count=%d\n",_sql,_count));
}
}
if(_count==0){
return _count ;
}
sprintf(_sql,"select revok from pim_upfile where pimsession='%s' and locuri='%s'",pSess->m_sSessID,curLocuri);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
_count = atoi(_set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' revok=%d\n",_sql,_count));
}
}
if(_count==0){
return 1;
}
else{
return 2;
}
}
int _search_locuri_pimmagicmmsfile(CTmlSession*pSess,char*curLocuri)
{
char _sql[1024];
int _count = 0;
CMySet _set;
sprintf(_sql,"select count(*) from pim_magicmmsdownfile where pimsession='%s' and locuri='%s'",pSess->m_sSessID,curLocuri);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
_count = atoi(_set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' count=%d\n",_sql,_count));
}
}
if(_count==0){
return _count ;
}
sprintf(_sql,"select sendok from pim_magicmmsdownfile where pimsession='%s' and locuri='%s'",pSess->m_sSessID,curLocuri);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
_count = atoi(_set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' revok=%d\n",_sql,_count));
}
}
if(_count==0){
return 1;
}
else{
return 2;
}
}
int _load_pimresource(CTmlSession*pSess,char*locuri)
{
char _sql[1024];
int _count=0;
CMySet _set;
char * _filepath=NULL;
char * _locuri=NULL;
char * _rtype =NULL;
char * _rname=NULL;
char * _path =NULL;
int _length;
sprintf(_sql,"select count(*) from pim_resource where userid='%s' and locuri='%s'",pSess->m_sUser,locuri);
XPTDEBUG(("SQL='%s' \n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
_count = atoi(_set.GetFieldValue(0));
XPTDEBUG(("SQL='%s' count=%d\n",_sql,_count));
}
}
if(_count==0){
return _count;
}
sprintf(_sql,"select rtype,rname,path from pim_resource where userid='%s' and locuri='%s'",pSess->m_sUser,locuri);
XPTDEBUG(("SQL='%s'\n",_sql));
if(workdb.PrepareSql(_sql, _set)==FALSE){
XPTDEBUG(("SQL='%s' error='%s'\n",_sql,workdb.GetSqlError()));
}
else{
if(workdb.FetchData()){
_rtype = _set.GetFieldValue(0);
_length = tmlLibStrlen(_rtype);
pSess->m_sRType=(String_t)tmlLibMalloc(_length);
tmlLibMemset(pSess->m_sRType,0,_length);
tmlLibStrcpy(pSess->m_sRType,_rtype);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -