(JSON)LibCurl相关文档.docx_第1页
(JSON)LibCurl相关文档.docx_第2页
(JSON)LibCurl相关文档.docx_第3页
(JSON)LibCurl相关文档.docx_第4页
(JSON)LibCurl相关文档.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

相关函数说明(JSON)资源服务器在Sip_global.h定义默认的URLconst char SIP_DEFAULT_RESOURCE_SERVER=59/php/imclient/action.php;由于该网址一般不修改,故在CSipProto类中定义了一个变量保存该变量,如char server_url256;当初始化数据库中,将该URL写入到本地数据库中,每次上显示读写该数据库,保存到server_url中。与资源服务器通信的都是通过该URL。与服务器通信函数:返回数据格式为“success”:true 全部使用此函数与服务器通信,只是里面的body参数不一样。里面用到了JSONC库函数解析JSON格式文件。int CSipProto:SIP_CommunicateWithServer(const char* body)FILE *pfile=NULL;pfile = fopen(./temp_file, wb);if(pfile = NULL)return -1;CURL *curl = NULL;CURLcode res;char url100 = 0;strcpy(url,server_url);/server_url为服务器URL,保存在CSipProto中。curl_global_init(CURL_GLOBAL_ALL);curl = curl_easy_init();curl_easy_setopt(curl, CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);curl_easy_setopt(curl, CURLOPT_URL, url); /*Set URL*/curl_easy_setopt(curl, CURLOPT_POST,TRUE);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response);curl_easy_setopt(curl, CURLOPT_WRITEDATA, pfile);curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body); / 指定post内容/此参数必须是UTF8编码,否则服务器接受不了res = curl_easy_perform(curl);if(res != CURLE_OK)fclose(pfile);curl_easy_cleanup(curl);curl_global_cleanup();return -1;fclose(pfile);curl_easy_cleanup(curl);curl_global_cleanup();json_object *response = json_object_from_file(./temp_file); /该函数直接从JSON文件中获取JSON对象if(is_error(response)return -1;json_object *temp;temp = json_object_object_get(response,success);if(strcmp(true,json_object_to_json_string(temp)return -1;json_object_put(response);/减少引用计数 释放对象TCHAR *tmp;int len=MultiByteToWideChar(CP_ACP,0,./temp_file,-1,NULL,0);tmp=(TCHAR *)calloc(len,sizeof(TCHAR);MultiByteToWideChar(CP_ACP,0,./temp_file,-1,tmp,len);DeleteFile(tmp); /删除临时文件return 0;说明:由于服务器采用UTF8编码,组包发送时必须发送UTF8格式数据,否则服务器接受不了。解析好友列表函数:int Read_FriendsList_json(LinphoneCore* lc,const char* Userfolder);解析好友分组函数:int Read_MyGroups_json(LinphoneCore* lc,const char* Userfolder);求幂次方函数:Int factorial(int n);转换Unicode数字编码为汉字函数:/该函数用来将Unicode数字编码转换成汉字,记得返回值要释放(free),该值为在堆上开辟的空间char* filetostr(const char *filename);一 查找好友:/从服务器查找联系人函数,根据给定查找条件返回联系人JSON文件(1)int CSipProto:SIP_ABFindContact(SEARCHDATA* searchdata)char body1000=0;if(searchdata-flag = 1)sprintf(body,task=friend_detail_info&id=%s,searchdata-searchparam);else if(searchdata-flag = 2 )sprintf(body,task=friend_detail_info&nickname=%s,searchdata-searchparam);else if(searchdata-flag = 3)sprintf(body,task=friend_detail_info&email=%s,searchdata-searchparam);elsereturn -1;/strcpy(body,search=&radio=email&submit=%E6%90%9C%E7%B4%A2);int tag = SIP_DownContactRes(body);if(tag 0)return -1;elsereturn 0; (2)int CSipProto:SIP_DownContactRes(const char* body)该函数从服务器下载JSON文件(3)int CSipProto: Read_ContactList_Json(MSList *&contactlists)解析刚下载的联系人JSON文件,将数据保存到PROTOSEARCHRESULT结构中,采用MSList链表实现,当查询结果返回多个联系人时好方便处理。(4)void CSipProto:FreeContactList(MSList *contactlists).释放刚才分配的联系人链表空间二 添加好友:1.向服务器发送消息函数:/发送message方法,在添加好友、向好友发送修改的个人信息时调用 /*friendtype参数: 0:更新个人信息,比如昵称、头像等 1:表示对方在用户的quasi_friends列表中 2:表示对方在用户的friends列表中*/ /msg参数:需要携带个人信息时,以xml形式添加void linphone_core_send_message(LinphoneCore* lc, LinphoneFriend* fr,int friendtype,const char *msg)2.接收服务器消息函数:sip_core.cpp中更新个人信息(1)static void sip_update_personnelinfo_message(LinphoneCore *lc,const char *from, const char *msg); 对方在用户的quasi_friends列表中(2)static void sip_quasifriend_add_received(LinphoneCore *lc,const char *from, const char *msg); 对方在用户的friends列表中(3)static void sip_friend_add_received(LinphoneCore *lc,const char *from, const char *msg);3/该函数根据sip地址(sip:8801)从数据库文件中查找联系人句柄HANDLE CSipProto:SIP_FindContact(char *from)char *start = strchr(from,);if(end = NULL )end = start + strlen(from);char SipAccount100 = 0;strncpy(SipAccount,start,end - start);HANDLE hContact = ( HANDLE )SIP_CallService( MS_DB_CONTACT_FINDFIRST, 0, 0 );while ( hContact != NULL )if ( SIP_IsMyContact( hContact ) char acc SIP_MAX_ACCOUNT_LEN =0;if ( !getStaticString( hContact, SipAccount, acc, sizeof( acc )if ( !_stricmp( SipAccount, acc )return hContact;hContact = ( HANDLE )SIP_CallService( MS_DB_CONTACT_FINDNEXT, ( WPARAM )hContact, 0 );return NULL;4CSipProto:AddToList ( PROTOSEARCHRESULT*, DWORD flags );修改了该函数,由于需要从Miranda中将分组信息带入到Sip插件中,故将第一个参数换为PROTOSEARCHRESULT(在该结构中添加了几个字段),在其中的group字段带入分组信息。三 分组管理Miranda插件提供了分组管理,我们所要做的就是同步服务器,进入Sip插件后,其入口函数如下,我们主要在此函数中修改:int CSipProto:OnGroupChange(WPARAM wParam,LPARAM lParam)if (!SipLoggedIn) return 0;const HANDLE hContact = (HANDLE)wParam;const CLISTGROUPCHANGE* grpchg = (CLISTGROUPCHANGE*)lParam;if (hContact = NULL)if (grpchg-pszNewName = NULL & grpchg-pszOldName != NULL) /删除组char* szOldName = mir_utf8encodeT(grpchg-pszOldName);LPCSTR szId = SIP_GetGroupByName(szOldName);if (szId != NULL) SIP_DeleteServerGroup(szOldName);mir_free(szOldName);else if (grpchg-pszNewName != NULL & grpchg-pszOldName = NULL) /新建组char* szNewName = w2m(grpchg-pszNewName);/由于Miranda中在组名前面添加了一些空白字符,下面是将组前面的无效字符去掉char *ascgrp = szNewName;int i=0;while(ascgrpi = 5)ascgrp+;i+;char *grp = mir_utf8encode(ascgrp);ServerGroupItem* p = grpList.find(ServerGroupItem*)&grp);if ( p != NULL ) return 0;p = (ServerGroupItem*)mir_alloc(sizeof(ServerGroupItem);p-id = mir_strdup( grp);p-name = mir_strdup( grp);grpList.insert( p );SIP_ABAddGroup(grp);mir_free(grp);free(szNewName);else if (grpchg-pszNewName != NULL & grpchg-pszOldName != NULL)/重命名组char* szNewName = mir_utf8encodeT(grpchg-pszNewName);char* szOldName = mir_utf8encodeT(grpchg-pszOldName);LPCSTR szId = SIP_GetGroupByName(szOldName);if (szId != NULL) SIP_RenameServerGroup(szOldName, szNewName);mir_free(szOldName);mir_free(szNewName);else /联系人移动组if (SIP_IsMyContact(hContact)char* szNewName = grpchg-pszNewName ? mir_utf8encodeT(grpchg-pszNewName) : NULL;SIP_MoveContactToGroup(hContact, szNewName);mir_free(szNewName);return 0;1.新建组char* szNewName = w2m(grpchg-pszNewName);/由于Miranda中在组名前面添加了一些空白字符,下面是将组前面的无效字符去掉char *ascgrp = szNewName;int i=0;while(ascgrpi = 5)ascgrp+;i+;char *grp = mir_utf8encode(ascgrp);ServerGroupItem* p = grpList.find(ServerGroupItem*)&grp);if ( p != NULL ) return 0;p = (ServerGroupItem*)mir_alloc(sizeof(ServerGroupItem);p-id = mir_strdup( grp);p-name = mir_strdup( grp);grpList.insert( p );SIP_ABAddGroup(grp);mir_free(grp);free(szNewName);void CSipProto:SIP_ABAddGroup(const char* szGrpName)该函数同步服务器,在服务器中添加组。2.删除组char* szOldName = mir_utf8encodeT(grpchg-pszOldName);LPCSTR szId = SIP_GetGroupByName(szOldName);if (szId != NULL) SIP_DeleteServerGroup(szOldName);mir_free(szOldName);void CSipProto:SIP_DeleteServerGroup( LPCSTR szId )调用SIP_ABDelContactGroup( szId);bool CSipProto:SIP_ABDelContactGroup( const char* szGrp)该函数同步服务器,在副服务器中删除组。3.重命名组char* szNewName = mir_utf8encodeT(grpchg-pszNewName);char* szOldName = mir_utf8encodeT(grpchg-pszOldName);LPCSTR szId = SIP_GetGroupByName(szOldName);if (szId != NULL) SIP_RenameServerGroup(szOldName, szNewName);mir_free(szOldName);mir_free(szNewName);void CSipProto:SIP_ABRenameGroup(const char* szGrpName, const char* szGrpId)该函数同步服务器,在服务器中重命名组 4. 联系人移动组if (SIP_IsMyContact(hContact)char* szNewName = grpchg-pszNewName ? mir_utf8encodeT(grpchg-pszNewName) : NULL;SIP_MoveContactToGroup(hContact, szNewName);mir_free(szNewName);void CSipProto:SIP_MoveContactToGroup( HANDLE hContact, const char* destgrp )该函数将联系人从一个组移动到另一个组。同时,要考虑到黑名单管理,是否移动到黑名单,或者从黑名单移出,修改相应的隐私隐私规则,同步服务器。四 下载好友列表目前实现为好友每次登陆时下载好友列表,同时将好友信息保存到linphonecore的friends字段中。为下载好友列表信息,在CurlHandler中添加了:int CurlDownloadFriendsList(LinphoneCore *lc, const char* UserFile);来下载好友列表信息。调用:int err = curlhandler-CurlDownloadFriendsList(SipCore-score,User_folder);成功下载返回0,失败返回负数。解析好友列表函数:int Read_FriendsList_json(LinphoneCore* lc,const char* Userfolder);五 下载分组信息目前实现为好友每次登陆时下载好友分组,同时将好友信息保存到linphonecore的groups字段中。为下载好友列表信息,在CurlHandler中添加了:int CurlDownloadMyGroups(LinphoneCore *lc, const char* UserFile);来下载好友列表信息。调用:int err = curlhandler- CurlDownloadMyGroups (SipCore-score,User_folder);成功下载返回0,失败返回负数。解析好友列表函数:int Read_MyGroups_json(LinphoneCore* lc,const char* Userfolder);六 下载头像函数:int CurlDownloadAvatar(LinphoneCore *lc char *sipid,char *friendid,bool flag);参数:LinphoneCore *lc,传入该参数主要用来获取域名和用户名。 char *sipid 该参数表示用户sipid,如8801 char *frinedid 该参数表示好友sipid,如8802bool flag 该参数用来区分下载自己头像或者是联系人头像,TRUE为自己,FALSE为好友int CurlHandler:CurlDownloadAvatar(LinphoneCore *lcore,char *sipid,char *friendid,bool flag)char avatarservername512 = 0;sprintf(avatarservername,%s,sipInstances0.server_url);char AvatarFile256=0; char AvatarFolder256 = 0;char UserFile256 = 0;sprintf(UserFile,%s%s%s,sipInstances0.userFolder,osip_uri_get_host(lcore-default_proxy-reg_idparsed-url),osip_uri_get_username(lcore-default_proxy-reg_idparsed-url);if( !flag )sprintf(AvatarFolder,%s%s,UserFile,Friends_Headers);elsesprintf(AvatarFolder,%s%s,UserFile,MyAvatar);if(UserFile0 = 0)return -3;char FileStore256=0; /保持下载资源的临时文件sprintf(char *)FileStore,%s%s,AvatarFolder,TempAvatarStore);curl_easy_reset(curl);curl_easy_setopt(curl,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);curl_easy_setopt(curl,CURLOPT_USERAGENT,IMClient);FILE *pfile=NULL;pfile = fopen(char *)FileStore, wb);if(pfile = NULL)return -3;curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response);curl_easy_setopt(curl, CURLOPT_WRITEDATA, pfile);curl_easy_setopt(curl,CURLOPT_URL,avatarservername);/curl_easy_setopt(curl,CURLOPT_HEADERFUNCTION, write_header_response);char body256 = 0;if(flag)sprintf(body,task=get_my_head_portrait&id=%s,sipid);elsesprintf(body,task=get_my_friends_head_portrait&id=%s&friend_id=%s,sipid,friendid);curl_easy_setopt(curl, CURLOPT_POSTFIELDS,body); / 指定post内容CURLcode res=curl_easy_perform(curl); /响应码if (res != CURLE_OK) return -2;if(pfile)fclose(pfile);json_object *friend_list_obj = json_object_from_file(FileStore);if(is_error(friend_list_obj)return -1;json_object *temp;temp = json_object_object_get(friend_list_obj,success);if(!temp)return 0;if(strcmp(true,json_object_to_json_string(temp)return -1;temp = json_object_object_get(friend_list_obj,pictrue_format);if(!temp)return 0;const char *picformat = json_object_get_string(temp);temp = json_object_object_get(friend_list_obj,head_portrait);if(!temp)return 0;char *picstr = (char *)json_object_get_string(temp);char sipavatarname100 = 0;if(flag)for(int i=0;istrlen(sipid);i+)if(sipidi = . | sipidi = )sipavatarnamei = _;elsesipavatarnamei = sipidi;sprintf(AvatarFile,%s%s.png,AvatarFolder,sipavatarname);elsefor(int i=0;idefault_proxy-reg_idparsed;if(!me_url)return 0;char avatarname100 = 0;char sipid256 = 0;strcat(sipid,me_url-url-username);strcat(sipid,);char sipusername256 = 0;strcat(sipusername,me_url-url-username);sprintf(avatarname,%s.png,sipusername);char avatarservername512 = 0;sprintf(avatarservername,%s,sipInstances0.server_url);char AvatarFile256=0; /待上传资源的本地文件名char AvatarFolder256 = 0;char UserFile256 = 0;sprintf(UserFile,%s%s%s,sipInstances0.userFolder,osip_uri_get_host(lcore-default_proxy-reg_idparsed-url),osip_uri_get_username(lcore-default_proxy-reg_idparsed-url);if(flag)sprintf(AvatarFolder,%s%s,UserFile,MyAvatar);elsesprintf(AvatarFolder,%s%s,UserFile,Friends_Headers);sprintf(AvatarFile,%s%s,AvatarFolder,avatarname);TCHAR *tmp = sipInstances0.m2w(AvatarFile);TCHAR *imageFile = sipInstances0.m2w(filename);BOOL success = CopyFile(imageFile,tmp,FALSE);if(!success)return -3;SetFileAttributes(tmp,FILE_ATTRIBUTE_NORMAL); /设置文件属性free(imageFile);free(tmp);struct curl_httppost *post=NULL;struct curl_httppost *last=NULL;FILE *pfile=NULL;if(AvatarFile0 != 0 )struct _stat file_info;TCHAR *tmp=CSipProto:m2w(AvatarFile);if(_wstat(tmp,&file_info)score);err =curlhandler-CurlDownloadAvatar(SipCore-score,sipid,friendid,flag);登陆时,首先下载自己头像,如果不存在,则上传自己头像。下载自己头像:err =curlhandler-CurlDownloadAvatar(SipCore-score,sipid,NULL,TRUE);上传自己头像:err = curlhandler-CurlUploadAvatar(SipCore-score,tFileName,TRUE);其中tFileName为要上传的文件名。目前由于上传、下载头像采用Post方法,返回的HTTP头中没有Etag值用于判断上传下载的头像本地头像是否与服务器一致,故采用每次均上传的方法。下载头像时可以利用Etag值来判断是否下载,服务器头像与本地头像相同则不下载,不同则下载。Miranda中设置头像后自动头像文件格式都转化为png头像,故在Miranda注册账号时最好把头像都统一成png头像,并改变到固定尺寸大小以内,不然好友数目达到一定流量后,会很占流量。目前在客服端头像文件命名为将sipid中的 . 和 符号改成 _ 后加扩展名。八 修改函数:(1)CSipProto:SIP_IsMeByContact( HANDLE hContact, char* szEmail )该函数判断是否账号自己是否是操作的联系人,是返回1,否返回0.该函数比较的是Sip地址,如sip:8801,注意前面加了sip:前缀。九 添加修改的数据结构(1)typedef struct LinphoneCore *lc; 全局的LinphoneCore指针。const char *from; 对方Sip地址const char *msg; 对方XML信息int friendType; 消息类型,如上面所说LinphoneFriend *linfriend;AGREETOADDDIGDATA;该结构作为被添加接受时把参数带入对话框的用户自定义数据类型。(2)根据查找条件定义的数据结构其中searchparam为查找输入数据Flag代表查找类型,1按ID查找,2按昵称查找,3按邮箱查找。typedef struct char *searchparam;int flag; /1:id 2:nickname 3:emailSEARCHDATA;(3)查找结果返回数据结构。typedef struct int cbSize;char *nick;char *firstName;char *lastName;char *email;char *account; / lyg addchar *group; / lyg addchar *birthday;/ lyg addint age; / lyg addchar reserved16;/Protocols may extend this structure with extra members at will and supply/a larger cbSize to reflect the new information, but they must not change/any elements above this comment/The reserved field is part of the basic structure, not space to/overwrite with protocol-specific information./If modules do this, they should take steps to ensure that information/they put there will be retained by anyone trying to save this structure. PROTOSEARCHRESULT;注意:1.linphone_core_add_group(lc,group);group指针的空间不能释放,否则有错误。而linphone_friend_set_group(LinphoneFriend *lf, const char* group)中的group则不需要给其分配空间。2.多字节转宽字节时,注意calloc开辟空间的大小,不然产生堆栈错误。3.查找添加联系人时需要将所属组信息插入到xml文件,而Miranda中组信息在Miranda中,因此需要将group信息作为参数带到Sip插

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论