diff options
author | Ma Yuan <mayuan2006@gmail.com> | 2006-08-16 16:20:25 +0000 |
---|---|---|
committer | Ma Yuan <mayuan2006@gmail.com> | 2006-08-16 16:20:25 +0000 |
commit | eee3545bbc63fca0a579c74a3b1a2b2fe8b8ee82 (patch) | |
tree | d41c2fa18ada2fe20d1fff2a320d93fbf32499b7 | |
parent | eec5e1782c52e9c224e957870a14cff87541ebac (diff) | |
download | pidgin-eee3545bbc63fca0a579c74a3b1a2b2fe8b8ee82.tar.gz |
[gaim-migrate @ 16790]
SOAP implementation rewrite.
use Queue to buffer the SOAP request.
Warning:Middle stage,Never Use it
committed by Ma Yuan<mayuan2006@gmail.com>
committer: Ethan Blanton <elb@pidgin.im>
-rw-r--r-- | src/protocols/msn/contact.c | 109 | ||||
-rw-r--r-- | src/protocols/msn/oim.c | 23 | ||||
-rw-r--r-- | src/protocols/msn/soap.c | 126 | ||||
-rw-r--r-- | src/protocols/msn/soap.h | 32 |
4 files changed, 231 insertions, 59 deletions
diff --git a/src/protocols/msn/contact.c b/src/protocols/msn/contact.c index 32bc0f15ca..7fbc9fc638 100644 --- a/src/protocols/msn/contact.c +++ b/src/protocols/msn/contact.c @@ -210,10 +210,14 @@ msn_get_contact_written_cb(gpointer data, gint source, GaimInputCondition cond) void msn_get_contact_list(MsnContact * contact) { - gaim_debug_info("MaYuan","msn_get_contact_list()...\n"); - contact->soapconn->login_path = g_strdup(MSN_GET_CONTACT_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_GET_CONTACT_SOAP_ACTION); - msn_soap_post(contact->soapconn,MSN_GET_CONTACT_TEMPLATE,msn_get_contact_written_cb); + MsnSoapReq *soap_request; + + soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, + MSN_GET_CONTACT_POST_URL,MSN_GET_CONTACT_SOAP_ACTION, + MSN_GET_CONTACT_TEMPLATE, + msn_get_contact_list_cb, + msn_get_contact_written_cb); + msn_soap_post(contact->soapconn,soap_request); } static void @@ -424,11 +428,16 @@ msn_address_written_cb(gpointer data, gint source, GaimInputCondition cond) void msn_get_address_book(MsnContact *contact) { + MsnSoapReq *soap_request; + gaim_debug_info("MaYuan","msn_get_address_book()...\n"); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_ADDRESS_BOOK_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_GET_ADDRESS_SOAP_ACTION); - msn_soap_post(contact->soapconn,MSN_GET_ADDRESS_TEMPLATE,msn_address_written_cb); + soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, + MSN_ADDRESS_BOOK_POST_URL,MSN_GET_ADDRESS_SOAP_ACTION, + MSN_GET_ADDRESS_TEMPLATE, + msn_get_address_cb, + msn_address_written_cb); + msn_soap_post(contact->soapconn,soap_request); } static void @@ -451,8 +460,10 @@ msn_add_contact_written_cb(gpointer data, gint source, GaimInputCondition cond) void msn_add_contact(MsnContact *contact,const char *passport,char *groupId) { + MsnSoapReq *soap_request; char *body = NULL; char *contact_xml = NULL; + char *soap_action; gaim_debug_info("MaYuan","msn add a contact...\n"); contact_xml = g_strdup_printf(MSN_CONTACT_XML,passport); @@ -460,17 +471,21 @@ msn_add_contact(MsnContact *contact,const char *passport,char *groupId) body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE,contact_xml); g_free(contact_xml); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_ADDRESS_BOOK_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_CONTACT_ADD_SOAP_ACTION); + soap_action = g_strdup(MSN_CONTACT_ADD_SOAP_ACTION); }else{ body = g_strdup_printf(MSN_ADD_CONTACT_GROUP_TEMPLATE,groupId,contact_xml); g_free(contact_xml); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_ADDRESS_BOOK_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_ADD_CONTACT_GROUP_SOAP_ACTION); + soap_action = g_strdup(MSN_ADD_CONTACT_GROUP_SOAP_ACTION); } - msn_soap_post(contact->soapconn,body,msn_add_contact_written_cb); - + soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, + MSN_ADDRESS_BOOK_POST_URL,soap_action, + body, + msn_add_contact_read_cb, + msn_add_contact_written_cb); + msn_soap_post(contact->soapconn,soap_request); + + g_free(soap_action); g_free(body); } @@ -496,15 +511,20 @@ msn_delete_contact(MsnContact *contact,const char *contactId) { char *body = NULL; char *contact_xml = NULL ; + MsnSoapReq *soap_request; gaim_debug_info("MaYuan","msn delete a contact,contactId:{%s}...\n",contactId); contact_xml = g_strdup_printf(MSN_CONTACTS_DEL_XML,contactId); body = g_strdup_printf(MSN_DEL_CONTACT_TEMPLATE,contact_xml); g_free(contact_xml); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_ADDRESS_BOOK_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_CONTACT_DEL_SOAP_ACTION); - msn_soap_post(contact->soapconn,body,msn_delete_contact_written_cb); + soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, + MSN_ADDRESS_BOOK_POST_URL,MSN_CONTACT_DEL_SOAP_ACTION, + body, + msn_delete_contact_read_cb, + msn_delete_contact_written_cb); + msn_soap_post(contact->soapconn,soap_request); + g_free(body); } @@ -528,14 +548,19 @@ msn_block_written_cb(gpointer data, gint source, GaimInputCondition cond) void msn_block_contact(MsnContact *contact,const char* membership_id) { + MsnSoapReq *soap_request; char *body = NULL; gaim_debug_info("MaYuan","msn block a contact...\n"); body = g_strdup_printf(MSN_CONTACT_DELECT_FROM_ALLOW_TEMPLATE,membership_id); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_SHARE_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_CONTACT_BLOCK_SOAP_ACTION); - msn_soap_post(contact->soapconn,body,msn_block_written_cb); + soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, + MSN_SHARE_POST_URL,MSN_CONTACT_BLOCK_SOAP_ACTION, + body, + msn_block_read_cb, + msn_block_written_cb); + msn_soap_post(contact->soapconn,soap_request); + g_free(body); } @@ -559,15 +584,20 @@ msn_unblock_written_cb(gpointer data, gint source, GaimInputCondition cond) void msn_unblock_contact(MsnContact *contact,const char* passport) { + MsnSoapReq *soap_request; char *body = NULL; gaim_debug_info("MaYuan","msn unblock a contact...\n"); body = g_strdup_printf(MSN_UNBLOCK_CONTACT_TEMPLATE,passport); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_SHARE_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_CONTACT_UNBLOCK_SOAP_ACTION); - msn_soap_post(contact->soapconn,body,msn_unblock_written_cb); + soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, + MSN_SHARE_POST_URL,MSN_CONTACT_UNBLOCK_SOAP_ACTION, + body, + msn_unblock_read_cb, + msn_unblock_written_cb); + msn_soap_post(contact->soapconn,soap_request); + g_free(body); } @@ -591,11 +621,16 @@ msn_gleams_written_cb(gpointer data, gint source, GaimInputCondition cond) void msn_get_gleams(MsnContact *contact) { + MsnSoapReq *soap_request; + gaim_debug_info("MaYuan","msn get gleams info...\n"); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_ADDRESS_BOOK_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_GET_GLEAMS_SOAP_ACTION); - msn_soap_post(contact->soapconn,MSN_GLEAMS_TEMPLATE,msn_gleams_written_cb); + soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, + MSN_ADDRESS_BOOK_POST_URL,MSN_GET_GLEAMS_SOAP_ACTION, + MSN_GLEAMS_TEMPLATE, + msn_gleams_read_cb, + msn_gleams_written_cb); + msn_soap_post(contact->soapconn,soap_request); } /*************************************************************** @@ -620,8 +655,9 @@ msn_group_written_cb(gpointer data, gint source, GaimInputCondition cond) /*add group*/ void msn_add_group(MsnSession *session,const char* group_name) { - char *body = NULL; + MsnSoapReq *soap_request; MsnContact *contact ; + char *body = NULL; g_return_if_fail(session != NULL); contact = session->contact; @@ -629,15 +665,18 @@ void msn_add_group(MsnSession *session,const char* group_name) body = g_strdup_printf(MSN_GROUP_ADD_TEMPLATE,group_name); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_ADDRESS_BOOK_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_GROUP_ADD_SOAP_ACTION); - msn_soap_post(contact->soapconn,body,msn_group_written_cb); - g_free(body); + soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, + MSN_ADDRESS_BOOK_POST_URL,MSN_GROUP_ADD_SOAP_ACTION, + body, + msn_group_read_cb, + msn_group_written_cb); + msn_soap_post(contact->soapconn,soap_request); } /*delete a group*/ void msn_del_group(MsnSession *session,const char *guid) { + MsnSoapReq *soap_request; MsnContact *contact; char *body = NULL; @@ -647,9 +686,13 @@ void msn_del_group(MsnSession *session,const char *guid) body = g_strdup_printf(MSN_GROUP_DEL_TEMPLATE,guid); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_ADDRESS_BOOK_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_GROUP_DEL_SOAP_ACTION); - msn_soap_post(contact->soapconn,body,msn_group_written_cb); + soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, + MSN_ADDRESS_BOOK_POST_URL,MSN_GROUP_DEL_SOAP_ACTION, + body, + msn_group_read_cb, + msn_group_written_cb); + msn_soap_post(contact->soapconn,soap_request); + g_free(body); } diff --git a/src/protocols/msn/oim.c b/src/protocols/msn/oim.c index 7e790d55b8..44e5a12da9 100644 --- a/src/protocols/msn/oim.c +++ b/src/protocols/msn/oim.c @@ -109,7 +109,8 @@ msn_oim_send_written_cb(gpointer data, gint source, GaimInputCondition cond) void msn_oim_send_single_msg(MsnOim *oim,char * msg) { - const char *oimsoapbody,*t,*p; + MsnSoapReq *soap_request; + const char *soap_body,*t,*p; gaim_debug_info("MaYuan","send single OIM Message\n"); oim->sendconn->login_path = g_strdup(MSN_OIM_SEND_URL); @@ -128,8 +129,12 @@ msn_oim_send_single_msg(MsnOim *oim,char * msg) msg ); #endif - msn_soap_post(oim->retrieveconn, oimsoapbody, msn_oim_send_written_cb); - + soap_request = msn_soap_request_new(MSN_OIM_SEND_HOST, + MSN_OIM_SEND_URL,MSN_OIM_SEND_SOAP_ACTION, + soap_body, + msn_oim_send_read_cb, + msn_oim_send_written_cb); + msn_soap_post(oim->sendconn,soap_request); } void msn_oim_send_msg(MsnOim *oim,char *msg) @@ -234,7 +239,8 @@ msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg) static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid) { - const char *oimsoapbody,*t,*p; + MsnSoapReq *soap_request; + const char *soap_body,*t,*p; gaim_debug_info("MaYuan","Get single OIM Message\n"); oim->retrieveconn->login_path = g_strdup(MSN_OIM_RETRIEVE__URL); @@ -242,12 +248,17 @@ static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid) t = oim->session->passport_info.t; p = oim->session->passport_info.p; - oimsoapbody = g_strdup_printf(MSN_OIM_GET_TEMPLATE, + soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE, t, p, msgid ); - msn_soap_post(oim->retrieveconn, oimsoapbody, msn_oim_get_written_cb); + soap_request = msn_soap_request_new(MSN_OIM_SEND_HOST, + MSN_OIM_SEND_URL,MSN_OIM_SEND_SOAP_ACTION, + soap_body, + msn_oim_get_read_cb, + msn_oim_get_written_cb); + msn_soap_post(oim->retrieveconn,soap_request); } /*MSN OIM get SOAP request*/ diff --git a/src/protocols/msn/soap.c b/src/protocols/msn/soap.c index 7ee6f299d5..ee03e288b1 100644 --- a/src/protocols/msn/soap.c +++ b/src/protocols/msn/soap.c @@ -41,6 +41,8 @@ msn_soap_new(MsnSession *session,gpointer data,int sslconn) soapconn->gsc = NULL; soapconn->input_handler = -1; soapconn->output_handler = -1; + + soapconn->soap_queue = g_queue_new(); return soapconn; } @@ -65,6 +67,9 @@ msn_soap_connect_cb(gpointer data, GaimSslConnection *gsc, if(soapconn->connect_cb != NULL){ soapconn->connect_cb(data,gsc,cond); } + + /*we do the SOAP request here*/ + msn_soap_post_head_request(soapconn); } /*ssl soap error callback*/ @@ -90,6 +95,11 @@ msn_soap_init(MsnSoapConn *soapconn,char * host,int ssl, soapconn->ssl_conn = ssl; soapconn->connect_cb = connect_cb; soapconn->error_cb = error_cb; +} + +void +msn_soap_connect(MsnSoapConn *soapconn) +{ if(soapconn->ssl_conn){ gaim_ssl_connect(soapconn->session->account, soapconn->login_host, GAIM_SSL_DEFAULT_PORT, msn_soap_connect_cb, msn_soap_error_cb, @@ -98,10 +108,24 @@ msn_soap_init(MsnSoapConn *soapconn,char * host,int ssl, } } +void +msn_soap_close(MsnSoapConn *soapconn) +{ + if(soapconn->ssl_conn){ + if(soapconn->gsc != NULL){ + gaim_ssl_close(soapconn->gsc); + soapconn->gsc = NULL; + } + }else{ + } +} + /*destroy the soap connection*/ void msn_soap_destroy(MsnSoapConn *soapconn) { + MsnSoapReq *request; + if(soapconn->login_host) g_free(soapconn->login_host); @@ -120,11 +144,12 @@ msn_soap_destroy(MsnSoapConn *soapconn) msn_soap_free_write_buf(soapconn); /*close ssl connection*/ - if(soapconn->gsc != NULL){ - gaim_ssl_close(soapconn->gsc); - } - soapconn->gsc = NULL; + msn_soap_close(soapconn); + while ((request = g_queue_pop_head(soapconn->soap_queue)) != NULL){ + msn_soap_request_free(request); + } + g_queue_free(soapconn->soap_queue); g_free(soapconn); } @@ -290,7 +315,7 @@ msn_soap_read_cb(gpointer data, gint source, GaimInputCondition cond) gaim_debug_misc("MaYuan","SOAP Read length :%d,body len:%d\n",soapconn->read_len,soapconn->body_len); if(soapconn->read_len < body_start - soapconn->read_buf + soapconn->body_len){ - return; + return; } g_free(body_len); @@ -302,8 +327,12 @@ msn_soap_read_cb(gpointer data, gint source, GaimInputCondition cond) /*call the read callback*/ if(soapconn->read_cb != NULL){ - soapconn->read_cb(soapconn,source,0); + soapconn->read_cb(soapconn,source,0); } + + /*Process the next queued SOAP request*/ + msn_soap_post_head_request(soapconn); + #if 0 /*clear the read buffer*/ msn_soap_free_read_buf(soapconn); @@ -404,16 +433,78 @@ msn_soap_write(MsnSoapConn * soapconn, char *write_buf, GaimInputFunction writte msn_soap_write_cb(soapconn, soapconn->gsc->fd, GAIM_INPUT_WRITE); } -/*Post the soap action*/ +/* New a soap request*/ +MsnSoapReq * +msn_soap_request_new(const char *host,const char *post_url,const char *soap_action, + const char *body, + GaimInputFunction read_cb,GaimInputFunction written_cb) +{ + MsnSoapReq *request; + + request = g_new0(MsnSoapReq, 1); + request->id = 0; + + request->login_host = g_strdup(host); + request->login_path = g_strdup(post_url); + request->soap_action = g_strdup(soap_action); + request->body = g_strdup(body); + request->read_cb = read_cb; + request->written_cb = written_cb; + + return request; +} + +/*free a soap request*/ +void +msn_soap_request_free(MsnSoapReq *request) +{ + g_return_if_fail(request != NULL); + + g_free(request->login_host); + g_free(request->login_path); + g_free(request->soap_action); + g_free(request->body); + request->read_cb = NULL; + request->written_cb = NULL; + + g_free(request); +} + +void +msn_soap_post_head_request(MsnSoapConn *soapconn) +{ + if(!g_queue_is_empty(soapconn->soap_queue)){ + MsnSoapReq *request; + + if((request = g_queue_pop_head(soapconn->soap_queue)) != NULL){ + msn_soap_post_request(soapconn,request); + } + } +} + +void +msn_soap_post(MsnSoapConn *soapconn,MsnSoapReq *request) +{ + g_queue_push_tail(soapconn->soap_queue, request); + if(!msn_soap_connected(soapconn)){ + /*not connected?connect it first*/ + msn_soap_connect(soapconn); + return; + } + /*if connected, what we only needed to do is to queue the request, + * when SOAP request in the queue processed done, will do this command. + * we just waiting... + */ +} + +/*Post the soap request action*/ void -msn_soap_post(MsnSoapConn *soapconn,const char * body,GaimInputFunction written_cb) +msn_soap_post_request(MsnSoapConn *soapconn,MsnSoapReq *request) { char * soap_head = NULL; - char * soap_body = NULL; char * request_str = NULL; gaim_debug_info("MaYuan","msn_soap_post()...\n"); - soap_body = g_strdup_printf(body); soap_head = g_strdup_printf( "POST %s HTTP/1.1\r\n" "SOAPAction: %s\r\n" @@ -425,21 +516,18 @@ msn_soap_post(MsnSoapConn *soapconn,const char * body,GaimInputFunction written_ "Content-Length: %d\r\n" "Connection: Keep-Alive\r\n" "Cache-Control: no-cache\r\n\r\n", - soapconn->login_path, - soapconn->soap_action, + request->login_path, + request->soap_action, soapconn->session->passport_info.mspauth, - soapconn->login_host, - strlen(soap_body) + request->login_host, + strlen(request->body) ); - request_str = g_strdup_printf("%s%s", soap_head,soap_body); - g_free(soapconn->login_path); - g_free(soapconn->soap_action); + request_str = g_strdup_printf("%s%s", soap_head,request->body); g_free(soap_head); - g_free(soap_body); /*free read buffer*/ msn_soap_free_read_buf(soapconn); gaim_debug_info("MaYuan","send to server{%s}\n",request_str); - msn_soap_write(soapconn,request_str,written_cb); + msn_soap_write(soapconn,request_str,request->written_cb); } diff --git a/src/protocols/msn/soap.h b/src/protocols/msn/soap.h index 307adff4da..92c4e3dc99 100644 --- a/src/protocols/msn/soap.h +++ b/src/protocols/msn/soap.h @@ -28,9 +28,26 @@ #define MSN_SOAP_READ_BUFF_SIZE 8192 +/*MSN SoapRequest structure*/ +typedef struct _MsnSoapReq MsnSoapReq; + /*MSN Https connection structure*/ typedef struct _MsnSoapConn MsnSoapConn; +struct _MsnSoapReq{ + /*request sequence*/ + int id; + + char *login_host; + char *login_path; + char *soap_action; + + char *body; + + GaimInputFunction read_cb; + GaimInputFunction written_cb; +}; + struct _MsnSoapConn{ MsnSession *session; gpointer parent; @@ -55,6 +72,10 @@ struct _MsnSoapConn{ /*write handler*/ guint output_handler; + /*Queue of SOAP request to send*/ + int soap_id; + GQueue *soap_queue; + /*write buffer*/ char *write_buf; gsize written_len; @@ -71,6 +92,15 @@ struct _MsnSoapConn{ }; /*Function Prototype*/ +/*Soap Request Function */ +MsnSoapReq * +msn_soap_request_new(const char *host,const char *post_url,const char *soap_action, + const char *body, + GaimInputFunction read_cb,GaimInputFunction written_cb); +void msn_soap_request_free(MsnSoapReq *request); +void msn_soap_post_request(MsnSoapConn *soapconn,MsnSoapReq *request); +void msn_soap_post_head_request(MsnSoapConn *soapconn); + /*new a soap conneciton */ MsnSoapConn *msn_soap_new(MsnSession *session,gpointer data,int sslconn); @@ -82,7 +112,7 @@ void msn_soap_init(MsnSoapConn *soapconn,char * host,int ssl,GaimSslInputFunctio /*write to soap*/ void msn_soap_write(MsnSoapConn * soapconn, char *write_buf, GaimInputFunction written_cb); -void msn_soap_post(MsnSoapConn *soapconn,const char * body,GaimInputFunction written_cb); +void msn_soap_post(MsnSoapConn *soapconn,MsnSoapReq *request); void msn_soap_free_read_buf(MsnSoapConn *soapconn); void msn_soap_free_write_buf(MsnSoapConn *soapconn); |