19784
|
1 /**
|
|
2 * @file contact.c
|
|
3 * get MSN contacts via SOAP request
|
|
4 * created by MaYuan<mayuan2006@gmail.com>
|
|
5 *
|
|
6 * gaim
|
|
7 *
|
|
8 * Gaim is the legal property of its developers, whose names are too numerous
|
|
9 * to list here. Please refer to the COPYRIGHT file distributed with this
|
|
10 * source distribution.
|
|
11 *
|
|
12 * This program is free software; you can redistribute it and/or modify
|
|
13 * it under the terms of the GNU General Public License as published by
|
|
14 * the Free Software Foundation; either version 2 of the License, or
|
|
15 * (at your option) any later version.
|
|
16 *
|
|
17 * This program is distributed in the hope that it will be useful,
|
|
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
20 * GNU General Public License for more details.
|
|
21 *
|
|
22 * You should have received a copy of the GNU General Public License
|
|
23 * along with this program; if not, write to the Free Software
|
|
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
25 */
|
|
26
|
|
27 #include "msn.h"
|
|
28 #include "soap.h"
|
|
29 #include "contact.h"
|
|
30 #include "xmlnode.h"
|
19787
|
31 #include "group.h"
|
19784
|
32
|
19806
|
33 void msn_contact_connect_init(MsnSoapConn *soapconn);
|
|
34
|
19784
|
35 /*new a contact*/
|
|
36 MsnContact *
|
|
37 msn_contact_new(MsnSession *session)
|
|
38 {
|
|
39 MsnContact *contact;
|
|
40
|
|
41 contact = g_new0(MsnContact, 1);
|
|
42 contact->session = session;
|
19785
|
43 contact->soapconn = msn_soap_new(session,contact,1);
|
19784
|
44
|
|
45 return contact;
|
|
46 }
|
|
47
|
|
48 /*destroy the contact*/
|
|
49 void
|
|
50 msn_contact_destroy(MsnContact *contact)
|
|
51 {
|
|
52 msn_soap_destroy(contact->soapconn);
|
|
53 g_free(contact);
|
|
54 }
|
|
55
|
|
56 /*contact SOAP server login error*/
|
|
57 static void
|
|
58 msn_contact_login_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data)
|
|
59 {
|
|
60 MsnSoapConn *soapconn = data;
|
|
61 MsnSession *session;
|
|
62
|
|
63 session = soapconn->session;
|
|
64 g_return_if_fail(session != NULL);
|
|
65
|
|
66 msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to contact server"));
|
|
67 }
|
|
68
|
|
69 /*msn contact SOAP server connect process*/
|
|
70 static void
|
|
71 msn_contact_login_connect_cb(gpointer data, GaimSslConnection *gsc,
|
|
72 GaimInputCondition cond)
|
|
73 {
|
|
74 MsnSoapConn *soapconn = data;
|
|
75 MsnSession * session;
|
|
76 MsnContact *contact;
|
|
77
|
|
78 contact = soapconn->parent;
|
|
79 g_return_if_fail(contact != NULL);
|
|
80
|
|
81 session = contact->session;
|
|
82 g_return_if_fail(session != NULL);
|
|
83
|
|
84 /*login ok!We can retrieve the contact list*/
|
19806
|
85 // msn_get_contact_list(contact);
|
19784
|
86 }
|
|
87
|
19785
|
88 /*get MSN member role utility*/
|
|
89 static int
|
|
90 msn_get_memberrole(char * role)
|
|
91 {
|
|
92 if(!strcmp(role,"Allow")){
|
|
93 return MSN_LIST_AL_OP;
|
|
94 }else if(!strcmp(role,"Block")){
|
|
95 return MSN_LIST_BL_OP;
|
19799
|
96 }else if(!strcmp(role,"Reverse")){
|
|
97 return MSN_LIST_RL_OP;
|
19785
|
98 }
|
|
99 return 0;
|
|
100 }
|
|
101
|
|
102 /*get User Type*/
|
|
103 static int
|
|
104 msn_get_user_type(char * type)
|
|
105 {
|
|
106 if(!strcmp(type,"Regular")){
|
|
107 return 1;
|
|
108 }
|
|
109 return 0;
|
|
110 }
|
|
111
|
|
112 /*parse contact list*/
|
19784
|
113 static void
|
|
114 msn_parse_contact_list(MsnContact * contact)
|
|
115 {
|
19785
|
116 MsnSession * session;
|
|
117 int list_op =0;
|
|
118 char * passport;
|
|
119 xmlnode * node,*body,*response,*result,*services,*service,*memberships;
|
|
120 xmlnode *membershipnode,*members,*member,*passportNode,*role;
|
19784
|
121
|
19785
|
122 session = contact->session;
|
19800
|
123 gaim_debug_misc("xml","parse contact list:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len);
|
19784
|
124 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len);
|
|
125 // node = xmlnode_from_str(contact->soapconn->body, -1);
|
|
126
|
|
127 if(node == NULL){
|
|
128 gaim_debug_misc("xml","parse from str err!\n");
|
|
129 return;
|
|
130 }
|
|
131 gaim_debug_misc("xml","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name);
|
|
132 body = xmlnode_get_child(node,"Body");
|
|
133 gaim_debug_misc("xml","body{%p},name:%s\n",body,body->name);
|
|
134 response = xmlnode_get_child(body,"FindMembershipResponse");
|
|
135 gaim_debug_misc("xml","response{%p},name:%s\n",response,response->name);
|
|
136 result =xmlnode_get_child(response,"FindMembershipResult");
|
|
137 gaim_debug_misc("xml","result{%p},name:%s\n",result,result->name);
|
|
138 services =xmlnode_get_child(result,"Services");
|
|
139 gaim_debug_misc("xml","services{%p},name:%s\n",services,services->name);
|
|
140 service =xmlnode_get_child(services,"Service");
|
|
141 gaim_debug_misc("xml","service{%p},name:%s\n",service,service->name);
|
|
142 memberships =xmlnode_get_child(service,"Memberships");
|
|
143 gaim_debug_misc("xml","memberships{%p},name:%s\n",memberships,memberships->name);
|
|
144 for(membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode;
|
|
145 membershipnode = xmlnode_get_next_twin(membershipnode)){
|
|
146 role = xmlnode_get_child(membershipnode,"MemberRole");
|
19785
|
147 list_op = msn_get_memberrole(xmlnode_get_data(role));
|
|
148 gaim_debug_misc("memberrole","role:%s,list_op:%d\n",xmlnode_get_data(role),list_op);
|
19784
|
149 members = xmlnode_get_child(membershipnode,"Members");
|
19785
|
150 for(member = xmlnode_get_child(members, "Member"); member;
|
|
151 member = xmlnode_get_next_twin(member)){
|
19800
|
152 MsnUser *user;
|
19786
|
153 xmlnode * typeNode;
|
|
154 char * type;
|
|
155
|
|
156 gaim_debug_misc("MaYuan","type:%s\n",xmlnode_get_attrib(member,"type"));
|
|
157 if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PassportMember")){
|
|
158 passportNode = xmlnode_get_child(member,"PassportName");
|
|
159 passport = xmlnode_get_data(passportNode);
|
|
160 typeNode = xmlnode_get_child(member,"Type");
|
|
161 type = xmlnode_get_data(typeNode);
|
|
162 gaim_debug_misc("Passport","name:%s,type:%s\n",passport,type);
|
19800
|
163
|
|
164 user = msn_userlist_find_add_user(session->userlist,passport,NULL);
|
19786
|
165 msn_got_lst_user(session, user, list_op, NULL);
|
19784
|
166 }
|
19786
|
167 if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PhoneMember")){
|
|
168 }
|
|
169 if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"EmailMember")){
|
19800
|
170 xmlnode *emailNode;
|
|
171
|
|
172 emailNode = xmlnode_get_child(member,"Email");
|
|
173 passport = xmlnode_get_data(emailNode);
|
|
174 gaim_debug_info("Email","name:%s,list_op:%d\n",passport,list_op);
|
|
175 user = msn_userlist_find_add_user(session->userlist,passport,NULL);
|
|
176 msn_got_lst_user(session,user,list_op,NULL);
|
19786
|
177 }
|
19785
|
178 }
|
19784
|
179 }
|
|
180
|
|
181 xmlnode_free(node);
|
19785
|
182
|
|
183 msn_get_address_book(contact);
|
19784
|
184 }
|
|
185
|
|
186 static void
|
|
187 msn_get_contact_list_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
188 {
|
|
189 MsnSoapConn * soapconn = data;
|
|
190 MsnContact *contact;
|
|
191 MsnSession *session;
|
|
192
|
|
193 contact = soapconn->parent;
|
|
194 g_return_if_fail(contact != NULL);
|
|
195 session = soapconn->session;
|
|
196 g_return_if_fail(session != NULL);
|
|
197
|
|
198 // gaim_debug_misc("msn", "soap contact server Reply: {%s}\n", soapconn->read_buf);
|
|
199 msn_parse_contact_list(contact);
|
|
200 }
|
|
201
|
|
202 static void
|
19796
|
203 msn_get_contact_written_cb(gpointer data, gint source, GaimInputCondition cond)
|
19784
|
204 {
|
|
205 MsnSoapConn * soapconn = data;
|
|
206
|
|
207 gaim_debug_info("MaYuan","finish contact written\n");
|
|
208 soapconn->read_cb = msn_get_contact_list_cb;
|
|
209 msn_soap_read_cb(data,source,cond);
|
|
210 }
|
|
211
|
|
212 void
|
|
213 msn_get_contact_list(MsnContact * contact)
|
|
214 {
|
19804
|
215 MsnSoapReq *soap_request;
|
|
216
|
19806
|
217 gaim_debug_info("MaYuan","Getting Contact List...\n");
|
19804
|
218 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
|
|
219 MSN_GET_CONTACT_POST_URL,MSN_GET_CONTACT_SOAP_ACTION,
|
|
220 MSN_GET_CONTACT_TEMPLATE,
|
|
221 msn_get_contact_list_cb,
|
|
222 msn_get_contact_written_cb);
|
19806
|
223 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
|
19784
|
224 }
|
|
225
|
19785
|
226 static void
|
|
227 msn_parse_addressbook(MsnContact * contact)
|
19784
|
228 {
|
19785
|
229 MsnSession * session;
|
|
230 xmlnode * node,*body,*response,*result;
|
|
231 xmlnode *groups,*group,*groupname,*groupId,*groupInfo;
|
|
232 xmlnode *contacts,*contactNode,*contactId,*contactInfo,*contactType,*passportName,*displayName,*groupIds,*guid;
|
|
233 xmlnode *ab;
|
19787
|
234 char *group_name,*group_id;
|
19785
|
235
|
|
236 session = contact->session;
|
|
237 gaim_debug_misc("xml","parse addressbook:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len);
|
|
238 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len);
|
|
239
|
|
240 if(node == NULL){
|
|
241 gaim_debug_misc("xml","parse from str err!\n");
|
|
242 return;
|
|
243 }
|
|
244 gaim_debug_misc("xml","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name);
|
|
245 body = xmlnode_get_child(node,"Body");
|
|
246 gaim_debug_misc("xml","body{%p},name:%s\n",body,body->name);
|
|
247 response = xmlnode_get_child(body,"ABFindAllResponse");
|
|
248 gaim_debug_misc("xml","response{%p},name:%s\n",response,response->name);
|
|
249 result =xmlnode_get_child(response,"ABFindAllResult");
|
|
250 gaim_debug_misc("xml","result{%p},name:%s\n",result,result->name);
|
19787
|
251
|
|
252 /*Process Group List*/
|
19785
|
253 groups =xmlnode_get_child(result,"groups");
|
|
254 for(group = xmlnode_get_child(groups, "Group"); group;
|
|
255 group = xmlnode_get_next_twin(group)){
|
19787
|
256 groupId = xmlnode_get_child(group,"groupId");
|
|
257 group_id = xmlnode_get_data(groupId);
|
|
258 groupInfo = xmlnode_get_child(group,"groupInfo");
|
|
259 groupname = xmlnode_get_child(groupInfo,"name");
|
|
260 group_name = xmlnode_get_data(groupname);
|
19785
|
261
|
19787
|
262 msn_group_new(session->userlist, group_id, group_name);
|
|
263
|
|
264 if (group_id == NULL){
|
|
265 /* Group of ungroupped buddies */
|
|
266 continue;
|
|
267 }
|
19785
|
268
|
19787
|
269 gaim_debug_misc("MsnContact","group_id:%s name:%s\n",group_id,group_name);
|
|
270 if ((gaim_find_group(group_name)) == NULL){
|
|
271 GaimGroup *g = gaim_group_new(group_name);
|
|
272 gaim_blist_add_group(g, NULL);
|
|
273 }
|
|
274 }
|
|
275 /*add a default No group to set up the no group Membership*/
|
|
276 group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID);
|
|
277 group_name = g_strdup(MSN_INDIVIDUALS_GROUP_NAME);
|
|
278 msn_group_new(session->userlist,group_id , group_name);
|
|
279 if (group_id != NULL){
|
|
280 gaim_debug_misc("MsnContact","group_id:%s name:%s,value:%d\n",group_id,group_name,*group_name=='\0');
|
|
281 if ((gaim_find_group(group_name)) == NULL){
|
|
282 GaimGroup *g = gaim_group_new(group_name);
|
|
283 gaim_blist_add_group(g, NULL);
|
|
284 }
|
|
285 }
|
|
286 g_free(group_name);
|
|
287 g_free(group_id);
|
19785
|
288
|
19787
|
289 /*add a default No group to set up the no group Membership*/
|
|
290 group_id = g_strdup(MSN_NON_IM_GROUP_ID);
|
|
291 group_name = g_strdup(MSN_NON_IM_GROUP_NAME);
|
|
292 msn_group_new(session->userlist,group_id , group_name);
|
|
293 if (group_id != NULL){
|
|
294 gaim_debug_misc("MsnContact","group_id:%s name:%s,value:%d\n",group_id,group_name,*group_name=='\0');
|
|
295 if ((gaim_find_group(group_name)) == NULL){
|
|
296 GaimGroup *g = gaim_group_new(group_name);
|
|
297 gaim_blist_add_group(g, NULL);
|
|
298 }
|
|
299 }
|
|
300 g_free(group_name);
|
|
301 g_free(group_id);
|
19785
|
302
|
19787
|
303 /*Process contact List*/
|
19785
|
304 contacts =xmlnode_get_child(result,"contacts");
|
|
305 for(contactNode = xmlnode_get_child(contacts, "Contact"); contactNode;
|
|
306 contactNode = xmlnode_get_next_twin(contactNode)){
|
|
307 MsnUser *user;
|
|
308 char *passport,*Name,*uid,*type;
|
|
309
|
|
310 contactId= xmlnode_get_child(contactNode,"contactId");
|
|
311 uid = xmlnode_get_data(contactId);
|
|
312
|
|
313 contactInfo = xmlnode_get_child(contactNode,"contactInfo");
|
|
314 contactType = xmlnode_get_child(contactInfo,"contactType");
|
|
315 type = xmlnode_get_data(contactType);
|
|
316
|
|
317 passportName = xmlnode_get_child(contactInfo,"passportName");
|
19786
|
318 if(passportName == NULL){
|
19800
|
319 xmlnode *emailsNode, *contactEmailNode, *emailNode;
|
|
320 xmlnode *messengerEnabledNode;
|
|
321 char *msnEnabled;
|
|
322
|
19786
|
323 /*TODO: add it to the none-instant Messenger group and recognize as email Membership*/
|
19800
|
324 /*Yahoo User?*/
|
|
325 emailsNode = xmlnode_get_child(contactInfo,"emails");
|
|
326 for(contactEmailNode = xmlnode_get_child(emailsNode,"ContactEmail");contactEmailNode;
|
|
327 contactEmailNode = xmlnode_get_next_twin(contactEmailNode) ){
|
|
328 messengerEnabledNode = xmlnode_get_child(contactEmailNode,"isMessengerEnabled");
|
|
329 msnEnabled = xmlnode_get_data(messengerEnabledNode);
|
|
330 if(!strcmp(msnEnabled,"true")){
|
|
331 emailNode = xmlnode_get_child(contactEmailNode,"email");
|
|
332 passport = xmlnode_get_data(emailNode);
|
|
333 gaim_debug_info("Ma Yuan","Yahoo User %s\n",passport);
|
|
334 break;
|
|
335 }
|
|
336 }
|
|
337 }else{
|
|
338 passport = xmlnode_get_data(passportName);
|
19786
|
339 }
|
19785
|
340
|
|
341 displayName = xmlnode_get_child(contactInfo,"displayName");
|
|
342 Name =xmlnode_get_data(displayName);
|
|
343
|
|
344 gaim_debug_misc("contact","name:%s,Id:{%s},display:{%s}\n",
|
|
345 passport,
|
|
346 xmlnode_get_data(contactId),
|
|
347 Name);
|
|
348
|
19800
|
349 user = msn_userlist_find_add_user(session->userlist, passport,Name);
|
19785
|
350 msn_user_set_uid(user,uid);
|
|
351 msn_user_set_type(user,msn_get_user_type(type));
|
19799
|
352 user->list_op |= MSN_LIST_FL_OP;
|
19785
|
353
|
19787
|
354 gaim_debug_misc("MsnContact","\n");
|
19785
|
355 groupIds = xmlnode_get_child(contactInfo,"groupIds");
|
|
356 if(groupIds){
|
|
357 for(guid = xmlnode_get_child(groupIds, "guid");guid;
|
|
358 guid = xmlnode_get_next_twin(guid)){
|
|
359 group_id = xmlnode_get_data(guid);
|
|
360 msn_user_add_group_id(user,group_id);
|
|
361 gaim_debug_misc("contact","guid:%s\n",group_id);
|
|
362 }
|
|
363 }else{
|
19787
|
364 group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID);
|
|
365 msn_user_add_group_id(user,group_id);
|
|
366 g_free(group_id);
|
|
367 #if 0
|
|
368 /*not in any group,Then set default group*/
|
19786
|
369 char *name,*group_id;
|
|
370
|
|
371 name = g_strdup(MSN_INDIVIDUALS_GROUP_NAME);
|
|
372 group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID);
|
19787
|
373 gaim_debug_misc("MsnContact","group_id:%s name:%s\n",group_id,name);
|
19786
|
374
|
|
375 msn_user_add_group_id(user,group_id);
|
|
376 msn_group_new(session->userlist, group_id, name);
|
|
377
|
19787
|
378 if (group_id != NULL){
|
|
379 gaim_debug_misc("MsnContact","group_id:%s name:%s,value:%d\n",group_id,name,*name=='\0');
|
|
380 if ((gaim_find_group(name)) == NULL){
|
19786
|
381 GaimGroup *g = gaim_group_new(name);
|
|
382 gaim_blist_add_group(g, NULL);
|
19787
|
383 }
|
19786
|
384 }
|
|
385
|
19785
|
386 gaim_debug_misc("contact","guid is NULL\n");
|
19786
|
387 g_free(name);
|
|
388 g_free(group_id);
|
19787
|
389 #endif
|
19785
|
390 }
|
|
391 }
|
|
392
|
|
393 ab =xmlnode_get_child(result,"ab");
|
|
394
|
|
395 xmlnode_free(node);
|
|
396 msn_soap_free_read_buf(contact->soapconn);
|
|
397
|
19796
|
398 msn_notification_dump_contact(session);
|
19786
|
399 msn_set_psm(session);
|
19785
|
400 msn_session_finish_login(session);
|
19784
|
401 }
|
|
402
|
19785
|
403 static void
|
|
404 msn_get_address_cb(gpointer data, gint source, GaimInputCondition cond)
|
19784
|
405 {
|
19785
|
406 MsnSoapConn * soapconn = data;
|
|
407 MsnContact *contact;
|
|
408 MsnSession *session;
|
|
409
|
|
410 contact = soapconn->parent;
|
|
411 g_return_if_fail(contact != NULL);
|
|
412 session = soapconn->session;
|
|
413 g_return_if_fail(session != NULL);
|
|
414
|
|
415 // gaim_debug_misc("msn", "soap contact server Reply: {%s}\n", soapconn->read_buf);
|
|
416 msn_parse_addressbook(contact);
|
|
417 }
|
|
418
|
|
419 /**/
|
|
420 static void
|
|
421 msn_address_written_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
422 {
|
|
423 MsnSoapConn * soapconn = data;
|
|
424
|
|
425 gaim_debug_info("MaYuan","finish contact written\n");
|
|
426 soapconn->read_cb = msn_get_address_cb;
|
|
427 msn_soap_read_cb(data,source,cond);
|
19784
|
428 }
|
|
429
|
19785
|
430 /*get the address book*/
|
|
431 void
|
|
432 msn_get_address_book(MsnContact *contact)
|
19784
|
433 {
|
19804
|
434 MsnSoapReq *soap_request;
|
|
435
|
19785
|
436 gaim_debug_info("MaYuan","msn_get_address_book()...\n");
|
|
437 /*build SOAP and POST it*/
|
19804
|
438 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
|
|
439 MSN_ADDRESS_BOOK_POST_URL,MSN_GET_ADDRESS_SOAP_ACTION,
|
|
440 MSN_GET_ADDRESS_TEMPLATE,
|
|
441 msn_get_address_cb,
|
|
442 msn_address_written_cb);
|
19806
|
443 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
|
19785
|
444 }
|
|
445
|
19796
|
446 static void
|
|
447 msn_add_contact_read_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
448 {
|
|
449 gaim_debug_info("MaYuan","block read done\n");
|
|
450 }
|
|
451
|
|
452 static void
|
|
453 msn_add_contact_written_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
454 {
|
|
455 MsnSoapConn * soapconn = data;
|
|
456
|
|
457 gaim_debug_info("MaYuan","finish unblock written\n");
|
|
458 soapconn->read_cb = msn_add_contact_read_cb;
|
|
459 msn_soap_read_cb(data,source,cond);
|
|
460 }
|
|
461
|
19789
|
462 /*add a Contact */
|
19785
|
463 void
|
19796
|
464 msn_add_contact(MsnContact *contact,const char *passport,char *groupId)
|
19785
|
465 {
|
19804
|
466 MsnSoapReq *soap_request;
|
19794
|
467 char *body = NULL;
|
|
468 char *contact_xml = NULL;
|
19804
|
469 char *soap_action;
|
19794
|
470
|
19790
|
471 gaim_debug_info("MaYuan","msn add a contact...\n");
|
19794
|
472 contact_xml = g_strdup_printf(MSN_CONTACT_XML,passport);
|
19796
|
473 if(groupId == NULL){
|
|
474 body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE,contact_xml);
|
|
475 g_free(contact_xml);
|
|
476 /*build SOAP and POST it*/
|
19804
|
477 soap_action = g_strdup(MSN_CONTACT_ADD_SOAP_ACTION);
|
19796
|
478 }else{
|
|
479 body = g_strdup_printf(MSN_ADD_CONTACT_GROUP_TEMPLATE,groupId,contact_xml);
|
|
480 g_free(contact_xml);
|
|
481 /*build SOAP and POST it*/
|
19804
|
482 soap_action = g_strdup(MSN_ADD_CONTACT_GROUP_SOAP_ACTION);
|
19796
|
483 }
|
19804
|
484 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
|
|
485 MSN_ADDRESS_BOOK_POST_URL,soap_action,
|
|
486 body,
|
|
487 msn_add_contact_read_cb,
|
|
488 msn_add_contact_written_cb);
|
19806
|
489 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
|
19793
|
490
|
19804
|
491 g_free(soap_action);
|
19794
|
492 g_free(body);
|
19784
|
493 }
|
|
494
|
19796
|
495 static void
|
|
496 msn_delete_contact_read_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
497 {
|
|
498 gaim_debug_info("MaYuan","delete contact read done\n");
|
|
499 }
|
|
500
|
|
501 static void
|
|
502 msn_delete_contact_written_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
503 {
|
|
504 MsnSoapConn * soapconn = data;
|
|
505
|
|
506 gaim_debug_info("MaYuan","delete contact written\n");
|
|
507 soapconn->read_cb = msn_delete_contact_read_cb;
|
|
508 msn_soap_read_cb(data,source,cond);
|
|
509 }
|
|
510
|
19789
|
511 /*delete a Contact*/
|
19785
|
512 void
|
19796
|
513 msn_delete_contact(MsnContact *contact,const char *contactId)
|
19785
|
514 {
|
19794
|
515 char *body = NULL;
|
|
516 char *contact_xml = NULL ;
|
19804
|
517 MsnSoapReq *soap_request;
|
19794
|
518
|
19796
|
519 gaim_debug_info("MaYuan","msn delete a contact,contactId:{%s}...\n",contactId);
|
|
520 contact_xml = g_strdup_printf(MSN_CONTACTS_DEL_XML,contactId);
|
19794
|
521 body = g_strdup_printf(MSN_DEL_CONTACT_TEMPLATE,contact_xml);
|
|
522 g_free(contact_xml);
|
19793
|
523 /*build SOAP and POST it*/
|
19804
|
524 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
|
|
525 MSN_ADDRESS_BOOK_POST_URL,MSN_CONTACT_DEL_SOAP_ACTION,
|
|
526 body,
|
|
527 msn_delete_contact_read_cb,
|
|
528 msn_delete_contact_written_cb);
|
19806
|
529 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
|
19804
|
530
|
19794
|
531 g_free(body);
|
19785
|
532 }
|
|
533
|
19796
|
534 static void
|
|
535 msn_block_read_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
536 {
|
|
537 gaim_debug_info("MaYuan","block read done\n");
|
|
538 }
|
|
539
|
|
540 static void
|
|
541 msn_block_written_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
542 {
|
|
543 MsnSoapConn * soapconn = data;
|
|
544
|
|
545 gaim_debug_info("MaYuan","finish unblock written\n");
|
|
546 soapconn->read_cb = msn_block_read_cb;
|
|
547 msn_soap_read_cb(data,source,cond);
|
|
548 }
|
|
549
|
19789
|
550 /*block a Contact*/
|
19785
|
551 void
|
19794
|
552 msn_block_contact(MsnContact *contact,const char* membership_id)
|
|
553 {
|
19804
|
554 MsnSoapReq *soap_request;
|
19794
|
555 char *body = NULL;
|
|
556
|
19790
|
557 gaim_debug_info("MaYuan","msn block a contact...\n");
|
19794
|
558 body = g_strdup_printf(MSN_CONTACT_DELECT_FROM_ALLOW_TEMPLATE,membership_id);
|
19793
|
559 /*build SOAP and POST it*/
|
19804
|
560 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
|
|
561 MSN_SHARE_POST_URL,MSN_CONTACT_BLOCK_SOAP_ACTION,
|
|
562 body,
|
|
563 msn_block_read_cb,
|
|
564 msn_block_written_cb);
|
19806
|
565 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
|
19804
|
566
|
19794
|
567 g_free(body);
|
19785
|
568 }
|
|
569
|
19796
|
570 static void
|
|
571 msn_unblock_read_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
572 {
|
|
573 gaim_debug_info("MaYuan","unblock read done\n");
|
|
574 }
|
|
575
|
|
576 static void
|
|
577 msn_unblock_written_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
578 {
|
|
579 MsnSoapConn * soapconn = data;
|
|
580
|
|
581 gaim_debug_info("MaYuan","finish unblock written\n");
|
|
582 soapconn->read_cb = msn_unblock_read_cb;
|
|
583 msn_soap_read_cb(data,source,cond);
|
|
584 }
|
|
585
|
19789
|
586 /*unblock a contact*/
|
19785
|
587 void
|
19794
|
588 msn_unblock_contact(MsnContact *contact,const char* passport)
|
|
589 {
|
19804
|
590 MsnSoapReq *soap_request;
|
19794
|
591 char *body = NULL;
|
|
592
|
19790
|
593 gaim_debug_info("MaYuan","msn unblock a contact...\n");
|
19794
|
594
|
|
595 body = g_strdup_printf(MSN_UNBLOCK_CONTACT_TEMPLATE,passport);
|
19793
|
596 /*build SOAP and POST it*/
|
19804
|
597 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
|
|
598 MSN_SHARE_POST_URL,MSN_CONTACT_UNBLOCK_SOAP_ACTION,
|
|
599 body,
|
|
600 msn_unblock_read_cb,
|
|
601 msn_unblock_written_cb);
|
19806
|
602 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
|
19804
|
603
|
19794
|
604 g_free(body);
|
19785
|
605 }
|
|
606
|
19796
|
607 static void
|
|
608 msn_gleams_read_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
609 {
|
|
610 gaim_debug_info("MaYuan","Gleams read done\n");
|
|
611 }
|
|
612
|
|
613 static void
|
|
614 msn_gleams_written_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
615 {
|
|
616 MsnSoapConn * soapconn = data;
|
|
617
|
|
618 gaim_debug_info("MaYuan","finish Group written\n");
|
|
619 soapconn->read_cb = msn_gleams_read_cb;
|
|
620 msn_soap_read_cb(data,source,cond);
|
|
621 }
|
|
622
|
19789
|
623 /*get the gleams info*/
|
19785
|
624 void
|
|
625 msn_get_gleams(MsnContact *contact)
|
19784
|
626 {
|
19804
|
627 MsnSoapReq *soap_request;
|
|
628
|
19790
|
629 gaim_debug_info("MaYuan","msn get gleams info...\n");
|
|
630 /*build SOAP and POST it*/
|
19804
|
631 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
|
|
632 MSN_ADDRESS_BOOK_POST_URL,MSN_GET_GLEAMS_SOAP_ACTION,
|
|
633 MSN_GLEAMS_TEMPLATE,
|
|
634 msn_gleams_read_cb,
|
|
635 msn_gleams_written_cb);
|
19806
|
636 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
|
19784
|
637 }
|
|
638
|
19795
|
639 /***************************************************************
|
|
640 * Group Operation
|
|
641 ***************************************************************/
|
|
642 static void
|
|
643 msn_group_read_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
644 {
|
|
645 gaim_debug_info("MaYuan","Group read \n");
|
|
646 }
|
|
647
|
|
648 static void
|
|
649 msn_group_written_cb(gpointer data, gint source, GaimInputCondition cond)
|
|
650 {
|
|
651 MsnSoapConn * soapconn = data;
|
|
652
|
|
653 gaim_debug_info("MaYuan","finish Group written\n");
|
|
654 soapconn->read_cb = msn_group_read_cb;
|
|
655 msn_soap_read_cb(data,source,cond);
|
|
656 }
|
|
657
|
19794
|
658 /*add group*/
|
19795
|
659 void msn_add_group(MsnSession *session,const char* group_name)
|
19793
|
660 {
|
19804
|
661 MsnSoapReq *soap_request;
|
|
662 MsnContact *contact ;
|
19795
|
663 char *body = NULL;
|
|
664
|
|
665 g_return_if_fail(session != NULL);
|
|
666 contact = session->contact;
|
19793
|
667 gaim_debug_info("MaYuan","msn add group...\n");
|
|
668
|
19795
|
669 body = g_strdup_printf(MSN_GROUP_ADD_TEMPLATE,group_name);
|
19793
|
670 /*build SOAP and POST it*/
|
19804
|
671 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
|
|
672 MSN_ADDRESS_BOOK_POST_URL,MSN_GROUP_ADD_SOAP_ACTION,
|
|
673 body,
|
|
674 msn_group_read_cb,
|
|
675 msn_group_written_cb);
|
19806
|
676 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
|
19793
|
677 }
|
|
678
|
19794
|
679 /*delete a group*/
|
19795
|
680 void msn_del_group(MsnSession *session,const char *guid)
|
19793
|
681 {
|
19804
|
682 MsnSoapReq *soap_request;
|
19795
|
683 MsnContact *contact;
|
|
684 char *body = NULL;
|
|
685
|
|
686 g_return_if_fail(session != NULL);
|
|
687 contact = session->contact;
|
19793
|
688 gaim_debug_info("MaYuan","msn del group...\n");
|
|
689
|
19795
|
690 body = g_strdup_printf(MSN_GROUP_DEL_TEMPLATE,guid);
|
19793
|
691 /*build SOAP and POST it*/
|
19804
|
692 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
|
|
693 MSN_ADDRESS_BOOK_POST_URL,MSN_GROUP_DEL_SOAP_ACTION,
|
|
694 body,
|
|
695 msn_group_read_cb,
|
|
696 msn_group_written_cb);
|
19806
|
697 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
|
19804
|
698
|
19795
|
699 g_free(body);
|
19793
|
700 }
|
|
701
|
19784
|
702 void
|
19806
|
703 msn_contact_connect_init(MsnSoapConn *soapconn)
|
19784
|
704 {
|
|
705 /* Authenticate via Windows Live ID. */
|
|
706 gaim_debug_info("MaYuan","msn_contact_connect...\n");
|
|
707
|
19806
|
708 msn_soap_init(soapconn,MSN_CONTACT_SERVER,1,
|
19784
|
709 msn_contact_login_connect_cb,
|
|
710 msn_contact_login_error_cb);
|
|
711 }
|
|
712
|