From: <may...@us...> - 2006-06-24 12:05:04
|
Revision: 16329 Author: mayuan2006 Date: 2006-06-24 05:04:32 -0700 (Sat, 24 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16329&view=rev Log Message: ----------- change it to windows Live Messenger Basic TWN authentication OK now Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c branches/soc-2006-msnp13/src/protocols/msn/command.c branches/soc-2006-msnp13/src/protocols/msn/msn.c branches/soc-2006-msnp13/src/protocols/msn/msn.h branches/soc-2006-msnp13/src/protocols/msn/nexus.c branches/soc-2006-msnp13/src/protocols/msn/nexus.h branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/servconn.c branches/soc-2006-msnp13/src/protocols/msn/session.c branches/soc-2006-msnp13/src/protocols/msn/sync.c Modified: branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-06-24 12:04:32 UTC (rev 16329) @@ -228,8 +228,7 @@ { MsnMsgTypeCb cb; - if (msn_message_get_content_type(msg) == NULL) - { + if (msn_message_get_content_type(msg) == NULL){ gaim_debug_misc("msn", "failed to find message content\n"); return; } @@ -237,8 +236,7 @@ cb = g_hash_table_lookup(cmdproc->cbs_table->msgs, msn_message_get_content_type(msg)); - if (cb == NULL) - { + if (cb == NULL){ gaim_debug_warning("msn", "Unhandled content-type '%s'\n", msn_message_get_content_type(msg)); Modified: branches/soc-2006-msnp13/src/protocols/msn/command.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-06-24 12:04:32 UTC (rev 16329) @@ -36,12 +36,67 @@ return TRUE; } +/* + * check the command is the command with payload content + * if it is return TRUE + * else return FALSE + */ +static gboolean +isPayloadCmd(char *str) +{ + if( (!strcmp(str,"ADL")) || + (!strcmp(str,"GCF")) || + (!strcmp(str,"MSG")) || + (!strcmp(str,"QRY")) || + (!strcmp(str,"RML")) || + (!strcmp(str,"UBX")) || + (!strcmp(str,"UBN")) || + (!strcmp(str,"UUN")) || + (!strcmp(str,"UUX"))){ + return TRUE; + } + + return FALSE; +} + +/*get the payload positon*/ +int getPayloadPosition(char *str) +{ + /*because MSG has "MSG hotmail hotmail [payload length]"*/ + if(!(strcmp(str,"MSG"))){ + return 2; + } + return 1; +} +/* + * set command Payload length + */ +int +setPayloadLen(MsnCommand *cmd) +{ + char * param; + + if(isPayloadCmd(cmd->command)){ + if(!(strcmp(cmd->command,"MSG"))){ + param = cmd->params[2]; + }else{ + param = cmd->params[1]; + } + cmd->payload_len = is_num(param) ? atoi(param) : 0; + }else{ + cmd->payload_len = 0; + } + return 0; +} + MsnCommand * msn_command_from_string(const char *string) { MsnCommand *cmd; char *tmp; char *param_start; + char *param; + int c; g_return_val_if_fail(string != NULL, NULL); @@ -51,11 +106,7 @@ cmd = g_new0(MsnCommand, 1); cmd->command = tmp; - if (param_start) - { - char *param; - int c; - + if (param_start){ *param_start++ = '\0'; cmd->params = g_strsplit(param_start, " ", 0); @@ -65,10 +116,14 @@ param = cmd->params[0]; cmd->trId = is_num(param) ? atoi(param) : 0; + }else{ + cmd->trId = 0; } - else - cmd->trId = 0; + /*add payload Length checking*/ + setPayloadLen(cmd); + gaim_debug_info("MaYuan","get payload len:%d\n",cmd->payload_len); + msn_command_ref(cmd); return cmd; Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-06-24 12:04:32 UTC (rev 16329) @@ -2025,10 +2025,10 @@ "MSN", /**< name */ VERSION, /**< version */ /** summary */ - N_("MSN Protocol Plugin"), + N_("Windows Live Messenger Protocol Plugin"), /** description */ - N_("MSN Protocol Plugin"), - "Christian Hammond <ch...@gn...>", /**< author */ + N_("Windows Live Messenger Protocol Plugin"), + "MaYuan <may...@gm...>", /**< author */ GAIM_WEBSITE, /**< homepage */ msn_load, /**< load */ @@ -2047,11 +2047,11 @@ GaimAccountOption *option; option = gaim_account_option_string_new(_("Server"), "server", - MSN_SERVER); + WLM_SERVER); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - option = gaim_account_option_int_new(_("Port"), "port", 1863); + option = gaim_account_option_int_new(_("Port"), "port", WLM_PORT); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-06-24 12:04:32 UTC (rev 16329) @@ -62,6 +62,12 @@ #define USEROPT_MSNPORT 4 #define MSN_PORT 1863 +/* Windows Live Messenger Server*/ +#define WLM_SERVER "muser.messenger.hotmail.com" +#define WLM_PORT 1863 +#define WLM_PROT_VER 13 +#define WLM_MIN_PROTOCOL 13 + #define MSN_TYPING_RECV_TIMEOUT 6 #define MSN_TYPING_SEND_TIMEOUT 4 Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-06-24 12:04:32 UTC (rev 16329) @@ -68,19 +68,25 @@ msn_ssl_read(MsnNexus *nexus) { gssize len; + gssize total_len = 0; char temp_buf[4096]; - if ((len = gaim_ssl_read(nexus->gsc, temp_buf, + if((len = gaim_ssl_read(nexus->gsc, temp_buf, sizeof(temp_buf))) > 0) { +#if 0 + g_string_append(nexus->read_buf,temp_buf); +#else + total_len += len; nexus->read_buf = g_realloc(nexus->read_buf, nexus->read_len + len + 1); strncpy(nexus->read_buf + nexus->read_len, temp_buf, len); nexus->read_len += len; nexus->read_buf[nexus->read_len] = '\0'; +#endif } - - return len; +// gaim_debug_info("MaYuan","nexus ssl read:{%s}\n",nexus->read_buf); + return total_len; } static void @@ -91,6 +97,10 @@ total_len = strlen(nexus->write_buf); + /* + * write the content to SSL server, + * We use SOAP to request Windows Live ID authentication + */ len = gaim_ssl_write(nexus->gsc, nexus->write_buf + nexus->written_len, total_len - nexus->written_len); @@ -157,12 +167,11 @@ nexus->input_handler = gaim_input_add(nexus->gsc->fd, GAIM_INPUT_READ, nexus_login_written_cb, nexus); - + /*read the request header*/ len = msn_ssl_read(nexus); - - if (len < 0 && errno == EAGAIN) + if (len < 0 && errno == EAGAIN){ return; - else if (len < 0) { + }else if (len < 0) { gaim_input_remove(nexus->input_handler); nexus->input_handler = -1; g_free(nexus->read_buf); @@ -172,20 +181,22 @@ return; } + if(nexus->read_buf == NULL){ + return; + } if (g_strstr_len(nexus->read_buf, nexus->read_len, - "\r\n\r\n") == NULL) + "</S:Envelope>") == NULL){ return; + } gaim_input_remove(nexus->input_handler); nexus->input_handler = -1; - gaim_ssl_close(nexus->gsc); nexus->gsc = NULL; - gaim_debug_misc("msn", "ssl buffer: {%s}", nexus->read_buf); +// gaim_debug_misc("msn", "TWN Server Reply: {%s}", nexus->read_buf); - if (strstr(nexus->read_buf, "HTTP/1.1 302") != NULL) - { + if (strstr(nexus->read_buf, "HTTP/1.1 302") != NULL){ /* Redirect. */ char *location, *c; @@ -221,15 +232,11 @@ gaim_ssl_connect(session->account, nexus->login_host, GAIM_SSL_DEFAULT_PORT, login_connect_cb, login_error_cb, nexus); - } - else if (strstr(nexus->read_buf, "HTTP/1.1 401 Unauthorized") != NULL) - { + }else if (strstr(nexus->read_buf, "HTTP/1.1 401 Unauthorized") != NULL){ const char *error; - if ((error = strstr(nexus->read_buf, "WWW-Authenticate")) != NULL) - { - if ((error = strstr(error, "cbtxt=")) != NULL) - { + if ((error = strstr(nexus->read_buf, "WWW-Authenticate")) != NULL) { + if ((error = strstr(error, "cbtxt=")) != NULL){ const char *c; char *temp; @@ -243,45 +250,60 @@ g_free(temp); } } - msn_session_set_error(session, MSN_ERROR_AUTH, error); - } - else if (strstr(nexus->read_buf, "HTTP/1.1 200 OK")) - { + }else if (strstr(nexus->read_buf, "HTTP/1.1 200 OK")){ + /*reply OK, we should process the SOAP body*/ char *base, *c; char *login_params; + char *length_start,*length_end,*body_len; + char **elems, **cur, **tokens; + const char * cert_str; + + gaim_debug_info("MaYuan","Receive 200\n"); #if 0 - /* All your base are belong to us. */ - base = buffer; + length_start = strstr(nexus->read_buf, "Content-Length: "); + length_start += strlen("Content-Length: "); + length_end = strstr(length_start, "\r\n"); + body_len = g_strndup(length_start,length_end - length_start); +// gaim_debug_info("MaYuan","body length is :%s\n",body_len); - /* For great cookie! */ - while ((base = strstr(base, "Set-Cookie: ")) != NULL) - { - base += strlen("Set-Cookie: "); - - c = strchr(base, ';'); - - session->login_cookies = - g_list_append(session->login_cookies, - g_strndup(base, c - base)); - } + g_free(body_len); +// g_return_if_fail(body_len != NULL); #endif + //TODO: we should parse it using XML + base = strstr(base, TWN_START_TOKEN); + base += strlen(TWN_START_TOKEN); +// gaim_debug_info("MaYuan","base is :%s\n",base); + c = strstr(base, TWN_END_TOKEN); +// gaim_debug_info("MaYuan","c is :%s\n",c); +// gaim_debug_info("MaYuan","len is :%d\n",c-base); + login_params = g_strndup(base, c - base); - base = strstr(nexus->read_buf, "Authentication-Info: "); + gaim_debug_info("msn", "TWN Cert: {%s}\n", login_params); - g_return_if_fail(base != NULL); + /* Parse the challenge data. */ + elems = g_strsplit(login_params, "&", 0); - base = strstr(base, "from-PP='"); - base += strlen("from-PP='"); - c = strchr(base, '\''); + for (cur = elems; *cur != NULL; cur++){ + tokens = g_strsplit(*cur, "=", 2); + g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]); + /* Don't free each of the tokens, only the array. */ + g_free(tokens); + } - login_params = g_strndup(base, c - base); + g_strfreev(elems); - msn_got_login_params(session, login_params); + cert_str = g_strdup_printf("t=%s&p=%s", + (char *)g_hash_table_lookup(nexus->challenge_data, "t"), + (char *)g_hash_table_lookup(nexus->challenge_data, "p") + ); + msn_got_login_params(session, cert_str); + g_free(cert_str); +// g_free(body_len); g_free(login_params); - +// return; msn_nexus_destroy(nexus); session->nexus = NULL; return; @@ -290,7 +312,6 @@ g_free(nexus->read_buf); nexus->read_buf = NULL; nexus->read_len = 0; - } @@ -301,10 +322,11 @@ MsnNexus *nexus; MsnSession *session; char *username, *password; - char *request_str, *head, *tail; + char *request_str, *head, *tail,*challenge_str; char *buffer = NULL; guint32 ctint; + gaim_debug_info("MaYuan","starting Windows Live ID authentication\n"); nexus = data; g_return_if_fail(nexus != NULL); @@ -315,44 +337,44 @@ msn_session_set_login_step(session, MSN_LOGIN_STEP_GET_COOKIE); - username = - g_strdup(gaim_url_encode(gaim_account_get_username(session->account))); + username = g_strdup(gaim_account_get_username(session->account)); - password = - g_strdup(gaim_url_encode(gaim_connection_get_password(session->account->gc))); + password = g_strdup(gaim_connection_get_password(session->account->gc)); +// g_strdup(gaim_url_encode(gaim_connection_get_password(session->account->gc))); - ctint = strtoul((char *)g_hash_table_lookup(nexus->challenge_data, "ct"), NULL, 10) + 200; - - head = g_strdup_printf( - "GET %s HTTP/1.1\r\n" - "Authorization: Passport1.4 OrgVerb=GET,OrgURL=%s,sign-in=%s", - nexus->login_path, - (char *)g_hash_table_lookup(nexus->challenge_data, "ru"), - username); - - tail = g_strdup_printf( - "lc=%s,id=%s,tw=%s,fs=%s,ru=%s,ct=%" G_GUINT32_FORMAT ",kpp=%s,kv=%s,ver=%s,tpf=%s\r\n" - "User-Agent: MSMSGS\r\n" - "Host: %s\r\n" - "Connection: Keep-Alive\r\n" - "Cache-Control: no-cache\r\n", + challenge_str = g_strdup_printf( + "lc=%s&id=%s&tw=%s&fs=%s&ru=%s&ct=%s&kpp=%s&kv=%s&ver=%s&rn=%s&tpf=%s\r\n", (char *)g_hash_table_lookup(nexus->challenge_data, "lc"), (char *)g_hash_table_lookup(nexus->challenge_data, "id"), (char *)g_hash_table_lookup(nexus->challenge_data, "tw"), (char *)g_hash_table_lookup(nexus->challenge_data, "fs"), (char *)g_hash_table_lookup(nexus->challenge_data, "ru"), - ctint, + (char *)g_hash_table_lookup(nexus->challenge_data, "ct"), (char *)g_hash_table_lookup(nexus->challenge_data, "kpp"), (char *)g_hash_table_lookup(nexus->challenge_data, "kv"), (char *)g_hash_table_lookup(nexus->challenge_data, "ver"), - (char *)g_hash_table_lookup(nexus->challenge_data, "tpf"), - nexus->login_host); + (char *)g_hash_table_lookup(nexus->challenge_data, "rn"), + (char *)g_hash_table_lookup(nexus->challenge_data, "tpf") + ); - buffer = g_strdup_printf("%s,pwd=XXXXXXXX,%s\r\n", head, tail); - request_str = g_strdup_printf("%s,pwd=%s,%s\r\n", head, password, tail); + /*build the SOAP windows Live ID XML body */ + tail = g_strdup_printf(TWN_ENVELOP_TEMPLATE,username,password,challenge_str ); - gaim_debug_misc("msn", "Sending: {%s}\n", buffer); + nexus->login_path = g_strdup(TWN_POST_URL); + head = g_strdup_printf( + "POST %s HTTP/1.1\r\n" + "Accept: text/*\r\n" + "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n" + "Host: %s\r\n" + "Content-Length: %d\r\n" + "Connection: Keep-Alive\r\n" + "Cache-Control: no-cache\r\n\r\n", + nexus->login_path,nexus->login_host,strlen(tail)); + request_str = g_strdup_printf("%s%s", head,tail); +// gaim_debug_misc("msn", "TWN Sending: {%s}\n", request_str); + +// g_free(nexus->login_path); g_free(buffer); g_free(head); g_free(tail); @@ -372,123 +394,18 @@ nexus_write_cb(nexus, gsc->fd, GAIM_INPUT_WRITE); return; - - } -static void -nexus_connect_written_cb(gpointer data, gint source, GaimInputCondition cond) -{ - MsnNexus *nexus = data; - int len; - char *da_login; - char *base, *c; - - if (nexus->input_handler == -1) - nexus->input_handler = gaim_input_add(nexus->gsc->fd, - GAIM_INPUT_READ, nexus_connect_written_cb, nexus); - - /* Get the PassportURLs line. */ - len = msn_ssl_read(nexus); - - if (len < 0 && errno == EAGAIN) - return; - else if (len < 0) { - gaim_input_remove(nexus->input_handler); - nexus->input_handler = -1; - g_free(nexus->read_buf); - nexus->read_buf = NULL; - nexus->read_len = 0; - /* TODO: error handling */ - return; - } - - if (g_strstr_len(nexus->read_buf, nexus->read_len, - "\r\n\r\n") == NULL) - return; - - gaim_input_remove(nexus->input_handler); - nexus->input_handler = -1; - - base = strstr(nexus->read_buf, "PassportURLs"); - - if (base == NULL) - { - g_free(nexus->read_buf); - nexus->read_buf = NULL; - nexus->read_len = 0; - return; - } - - if ((da_login = strstr(base, "DALogin=")) != NULL) - { - if ((da_login = strchr(da_login, '=')) != NULL) - da_login++; - - if ((c = strchr(da_login, ',')) != NULL) - *c = '\0'; - - if ((c = strchr(da_login, '/')) != NULL) - { - nexus->login_path = g_strdup(c); - *c = '\0'; - } - - nexus->login_host = g_strdup(da_login); - } - - g_free(nexus->read_buf); - nexus->read_buf = NULL; - nexus->read_len = 0; - - gaim_ssl_close(nexus->gsc); - nexus->gsc = NULL; - - /* Now begin the connection to the login server. */ - gaim_ssl_connect(nexus->session->account, nexus->login_host, - GAIM_SSL_DEFAULT_PORT, login_connect_cb, login_error_cb, - nexus); -} - - /************************************************************************** * Connect **************************************************************************/ - -static void -nexus_connect_cb(gpointer data, GaimSslConnection *gsc, - GaimInputCondition cond) -{ - MsnNexus *nexus; - MsnSession *session; - - nexus = data; - g_return_if_fail(nexus != NULL); - - session = nexus->session; - g_return_if_fail(session != NULL); - - nexus->gsc = gsc; - - msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH); - - nexus->write_buf = g_strdup("GET /rdr/pprdr.asp\r\n\r\n"); - nexus->written_len = 0; - - nexus->read_len = 0; - - nexus->written_cb = nexus_connect_written_cb; - - nexus->input_handler = gaim_input_add(gsc->fd, GAIM_INPUT_WRITE, - nexus_write_cb, nexus); - - nexus_write_cb(nexus, gsc->fd, GAIM_INPUT_WRITE); -} - void msn_nexus_connect(MsnNexus *nexus) { - gaim_ssl_connect(nexus->session->account, "nexus.passport.com", - GAIM_SSL_DEFAULT_PORT, nexus_connect_cb, - login_error_cb, nexus); + /* Authenticate via Windows Live ID. */ + gaim_debug_info("MaYuan","msn_nexus_connect...\n"); + nexus->login_host = g_strdup(TWN_SERVER); + gaim_ssl_connect(nexus->session->account, nexus->login_host, + GAIM_SSL_DEFAULT_PORT, login_connect_cb, login_error_cb, + nexus); } Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.h 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.h 2006-06-24 12:04:32 UTC (rev 16329) @@ -24,6 +24,52 @@ #ifndef _MSN_NEXUS_H_ #define _MSN_NEXUS_H_ +#define TWN_SERVER "loginnet.passport.com" + +#define TWN_START_TOKEN "<wsse:BinarySecurityToken Id=\"PPToken1\">" +#define TWN_END_TOKEN "</wsse:BinarySecurityToken>" + +#define TWN_POST_URL "/RST.srf" +#define TWN_ENVELOP_TEMPLATE "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"\ + "<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2003/06/secext\" xmlns:saml=\"urn:oasis:names:tc:SAML:1.0:assertion\" xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2002/12/policy\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/03/addressing\" xmlns:wssc=\"http://schemas.xmlsoap.org/ws/2004/04/sc\" xmlns:wst=\"http://schemas.xmlsoap.org/ws/2004/04/trust\">"\ + "<Header>"\ + "<ps:AuthInfo xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\" Id=\"PPAuthInfo\">"\ + "<ps:HostingApp>{3:B}</ps:HostingApp>"\ + "<ps:BinaryVersion>4</ps:BinaryVersion>"\ + "<ps:UIVersion>1</ps:UIVersion>"\ + "<ps:Cookies></ps:Cookies>"\ + "<ps:RequestParams>AQAAAAIAAABsYwQAAAAzMDg0</ps:RequestParams>"\ + "</ps:AuthInfo>"\ + "<wsse:Security>"\ + "<wsse:UsernameToken Id=\"user\">"\ + "<wsse:Username>%s</wsse:Username>"\ + "<wsse:Password>%s</wsse:Password>"\ + "</wsse:UsernameToken>"\ + "</wsse:Security>"\ + "</Header><Body>"\ + "<ps:RequestMultipleSecurityTokens xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\" Id=\"RSTS\">"\ + "<wst:RequestSecurityToken Id=\"RST0\">"\ + "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\ + "<wsp:AppliesTo>"\ + "<wsa:EndpointReference>"\ + "<wsa:Address>http://Passport.NET/tb</wsa:Address>"\ + "</wsa:EndpointReference>"\ + "</wsp:AppliesTo>"\ + "</wst:RequestSecurityToken>"\ + "<wst:RequestSecurityToken Id=\"RST1\">"\ + "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\ + "<wsp:AppliesTo>"\ + "<wsa:EndpointReference>"\ + "<wsa:Address>messenger.msn.com</wsa:Address>"\ + "</wsa:EndpointReference>"\ + "</wsp:AppliesTo>"\ + "<wsse:PolicyReference URI=\"?%s\">"\ + "</wsse:PolicyReference>"\ + "</wst:RequestSecurityToken>"\ + "</ps:RequestMultipleSecurityTokens>"\ + "</Body>"\ + "</Envelope>" + typedef struct _MsnNexus MsnNexus; struct _MsnNexus Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-06-24 12:04:32 UTC (rev 16329) @@ -102,9 +102,9 @@ account = session->account; /* Allocate an array for CVR0, NULL, and all the versions */ - a = c = g_new0(char *, session->protocol_ver - 8 + 3); + a = c = g_new0(char *, session->protocol_ver - WLM_MIN_PROTOCOL + 3); - for (i = session->protocol_ver; i >= 8; i--) + for (i = session->protocol_ver; i >= WLM_MIN_PROTOCOL; i--) *c++ = g_strdup_printf("MSNP%d", i); *c++ = g_strdup("CVR0"); @@ -230,9 +230,8 @@ account = session->account; gc = gaim_account_get_connection(account); - if (!g_ascii_strcasecmp(cmd->params[1], "OK")) - { - /* OK */ + if (!g_ascii_strcasecmp(cmd->params[1], "OK")){ + /* authenticate OK */ const char *friendly = gaim_url_decode(cmd->params[3]); gaim_connection_set_display_name(gc, friendly); @@ -240,9 +239,7 @@ msn_session_set_login_step(session, MSN_LOGIN_STEP_SYN); msn_cmdproc_send(cmdproc, "SYN", "%s", "0"); - } - else if (!g_ascii_strcasecmp(cmd->params[1], "TWN")) - { + }else if (!g_ascii_strcasecmp(cmd->params[1], "TWN")){ /* Passport authentication */ char **elems, **cur, **tokens; @@ -252,8 +249,7 @@ elems = g_strsplit(cmd->params[3], ",", 0); - for (cur = elems; *cur != NULL; cur++) - { + for (cur = elems; *cur != NULL; cur++){ tokens = g_strsplit(*cur, "=", 2); g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]); /* Don't free each of the tokens, only the array. */ @@ -322,8 +318,12 @@ return; } + /* + * Windows Live Messenger 8.0 + * Notice :CVR String discriminate! + */ msn_cmdproc_send(cmdproc, "CVR", - "0x0409 winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS %s", + "0x0409 winnt 5.1 i386 MSG80BETA 8.0.0689 msmsgs %s", gaim_account_get_username(account)); } @@ -379,16 +379,16 @@ static void msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { + gaim_debug_info("MaYuan","Processing MSG... \n"); + if(cmd->payload_len == 0){ + return; + } /* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued * command and we are processing it */ - - if (cmd->payload == NULL) - { + if (cmd->payload == NULL){ cmdproc->last_cmd->payload_cb = msg_cmd_post; cmdproc->servconn->payload_len = atoi(cmd->params[2]); - } - else - { + }else{ g_return_if_fail(cmd->payload_cb != NULL); cmd->payload_cb(cmdproc, cmd, cmd->payload, cmd->payload_len); @@ -1118,6 +1118,27 @@ g_free(host); } +static void +gcf_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + gaim_debug_info("MaYuan","Processing GCF... \n"); + if(cmd->payload_len == 0){ +// cmd->payload_len = is_num(cmd->params[1]) ? atoi(cmd->params[1]) : 0; + return; + } + /*get the payload content*/ +} + +static void +sbs_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + gaim_debug_info("MaYuan","Processing SBS... \n"); + if(cmd->payload_len == 0){ + return; + } + /*get the payload content*/ +} + /************************************************************************** * Message Types **************************************************************************/ @@ -1387,6 +1408,7 @@ msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd); msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); msn_table_add_cmd(cbs_table, "USR", "XFR", xfr_cmd); + msn_table_add_cmd(cbs_table, "USR", "GCF", gcf_cmd); msn_table_add_cmd(cbs_table, "SYN", "SYN", syn_cmd); msn_table_add_cmd(cbs_table, "CVR", "CVR", cvr_cmd); msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd); @@ -1402,6 +1424,8 @@ /* Asynchronous */ msn_table_add_cmd(cbs_table, NULL, "IPG", ipg_cmd); msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); + msn_table_add_cmd(cbs_table, NULL, "GCF", gcf_cmd); + msn_table_add_cmd(cbs_table, NULL, "SBS", sbs_cmd); msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd); msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd); Modified: branches/soc-2006-msnp13/src/protocols/msn/servconn.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/servconn.c 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/servconn.c 2006-06-24 12:04:32 UTC (rev 16329) @@ -428,14 +428,12 @@ servconn->rx_len -= cur_len; - if (servconn->payload_len) - { + if (servconn->payload_len){ msn_cmdproc_process_payload(servconn->cmdproc, cur, cur_len); servconn->payload_len = 0; - } - else - { + }else{ msn_cmdproc_process_cmd_text(servconn->cmdproc, cur); + servconn->payload_len = servconn->cmdproc->last_cmd->payload_len; } } while (servconn->connected && !servconn->wasted && servconn->rx_len > 0); Modified: branches/soc-2006-msnp13/src/protocols/msn/session.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-06-24 12:04:32 UTC (rev 16329) @@ -43,7 +43,7 @@ session->user = msn_user_new(session->userlist, gaim_account_get_username(account), NULL); - session->protocol_ver = 9; + session->protocol_ver = WLM_PROT_VER; session->conv_seq = 1; return session; Modified: branches/soc-2006-msnp13/src/protocols/msn/sync.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/sync.c 2006-06-24 10:10:53 UTC (rev 16328) +++ branches/soc-2006-msnp13/src/protocols/msn/sync.c 2006-06-24 12:04:32 UTC (rev 16329) @@ -35,8 +35,7 @@ list_name = cmd->params[0]; - if (!g_ascii_strcasecmp(list_name, "AL")) - { + if (!g_ascii_strcasecmp(list_name, "AL")){ /* * If the current setting is AL, messages from users who * are not in BL will be delivered. @@ -44,9 +43,7 @@ * In other words, deny some. */ gc->account->perm_deny = GAIM_PRIVACY_DENY_USERS; - } - else - { + }else{ /* If the current setting is BL, only messages from people * who are in the AL will be delivered. * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-07-09 16:50:34
|
Revision: 16473 Author: mayuan2006 Date: 2006-07-09 09:48:25 -0700 (Sun, 09 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16473&view=rev Log Message: ----------- add the Framework of SOAP request Now can retrieve the Contact via SOAP Request. so many bug still exist! commited by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/Makefile.am branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c branches/soc-2006-msnp13/src/protocols/msn/command.c branches/soc-2006-msnp13/src/protocols/msn/msg.c branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c branches/soc-2006-msnp13/src/protocols/msn/msn.c branches/soc-2006-msnp13/src/protocols/msn/nexus.c branches/soc-2006-msnp13/src/protocols/msn/nexus.h branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/notification.h branches/soc-2006-msnp13/src/protocols/msn/session.c branches/soc-2006-msnp13/src/protocols/msn/session.h branches/soc-2006-msnp13/src/protocols/msn/table.c Added Paths: ----------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/contact.h branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/soap.h Property Changed: ---------------- branches/soc-2006-msnp13/src/protocols/msn/Makefile.am branches/soc-2006-msnp13/src/protocols/msn/Makefile.mingw branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c branches/soc-2006-msnp13/src/protocols/msn/cmdproc.h branches/soc-2006-msnp13/src/protocols/msn/command.c branches/soc-2006-msnp13/src/protocols/msn/command.h branches/soc-2006-msnp13/src/protocols/msn/dialog.c branches/soc-2006-msnp13/src/protocols/msn/dialog.h branches/soc-2006-msnp13/src/protocols/msn/directconn.c branches/soc-2006-msnp13/src/protocols/msn/directconn.h branches/soc-2006-msnp13/src/protocols/msn/error.c branches/soc-2006-msnp13/src/protocols/msn/error.h branches/soc-2006-msnp13/src/protocols/msn/group.c branches/soc-2006-msnp13/src/protocols/msn/group.h branches/soc-2006-msnp13/src/protocols/msn/history.c branches/soc-2006-msnp13/src/protocols/msn/history.h branches/soc-2006-msnp13/src/protocols/msn/httpconn.c branches/soc-2006-msnp13/src/protocols/msn/httpconn.h branches/soc-2006-msnp13/src/protocols/msn/msg.c branches/soc-2006-msnp13/src/protocols/msn/msg.h branches/soc-2006-msnp13/src/protocols/msn/msn.c branches/soc-2006-msnp13/src/protocols/msn/msn.h branches/soc-2006-msnp13/src/protocols/msn/nexus.c branches/soc-2006-msnp13/src/protocols/msn/nexus.h branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/notification.h branches/soc-2006-msnp13/src/protocols/msn/object.c branches/soc-2006-msnp13/src/protocols/msn/object.h branches/soc-2006-msnp13/src/protocols/msn/page.c branches/soc-2006-msnp13/src/protocols/msn/page.h branches/soc-2006-msnp13/src/protocols/msn/servconn.c branches/soc-2006-msnp13/src/protocols/msn/servconn.h branches/soc-2006-msnp13/src/protocols/msn/session.c branches/soc-2006-msnp13/src/protocols/msn/session.h branches/soc-2006-msnp13/src/protocols/msn/slp.c branches/soc-2006-msnp13/src/protocols/msn/slp.h branches/soc-2006-msnp13/src/protocols/msn/slpcall.c branches/soc-2006-msnp13/src/protocols/msn/slpcall.h branches/soc-2006-msnp13/src/protocols/msn/slplink.c branches/soc-2006-msnp13/src/protocols/msn/slplink.h branches/soc-2006-msnp13/src/protocols/msn/slpmsg.c branches/soc-2006-msnp13/src/protocols/msn/slpmsg.h branches/soc-2006-msnp13/src/protocols/msn/slpsession.c branches/soc-2006-msnp13/src/protocols/msn/slpsession.h branches/soc-2006-msnp13/src/protocols/msn/state.c branches/soc-2006-msnp13/src/protocols/msn/state.h branches/soc-2006-msnp13/src/protocols/msn/switchboard.c branches/soc-2006-msnp13/src/protocols/msn/switchboard.h branches/soc-2006-msnp13/src/protocols/msn/sync.c branches/soc-2006-msnp13/src/protocols/msn/sync.h branches/soc-2006-msnp13/src/protocols/msn/table.c branches/soc-2006-msnp13/src/protocols/msn/table.h branches/soc-2006-msnp13/src/protocols/msn/transaction.c branches/soc-2006-msnp13/src/protocols/msn/transaction.h branches/soc-2006-msnp13/src/protocols/msn/user.c branches/soc-2006-msnp13/src/protocols/msn/user.h branches/soc-2006-msnp13/src/protocols/msn/userlist.c branches/soc-2006-msnp13/src/protocols/msn/userlist.h Modified: branches/soc-2006-msnp13/src/protocols/msn/Makefile.am =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/Makefile.am 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/Makefile.am 2006-07-09 16:48:25 UTC (rev 16473) @@ -8,6 +8,8 @@ cmdproc.h \ command.c \ command.h \ + contact.c\ + contact.h\ dialog.c \ dialog.h \ directconn.c \ @@ -46,6 +48,8 @@ slpmsg.h \ slpsession.c \ slpsession.h \ + soap.c\ + soap.h\ state.c \ state.h \ switchboard.c \ Property changes on: branches/soc-2006-msnp13/src/protocols/msn/Makefile.am ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/Makefile.mingw ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -127,8 +127,7 @@ trans->callbacks = g_hash_table_lookup(cmdproc->cbs_table->cmds, trans->command); - if (trans->payload != NULL) - { + if (trans->payload != NULL){ data = g_realloc(data, len + trans->payload_len); memcpy(data + len, trans->payload, trans->payload_len); len += trans->payload_len; Property changes on: branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/cmdproc.h ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/command.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -42,7 +42,7 @@ * else return FALSE */ static gboolean -isPayloadCmd(char *str) +msn_check_payload_cmd(char *str) { if( (!strcmp(str,"ADL")) || (!strcmp(str,"GCF")) || @@ -60,7 +60,7 @@ } /*get the payload positon*/ -int getPayloadPosition(char *str) +int msn_get_payload_position(char *str) { /*because MSG has "MSG hotmail hotmail [payload length]"*/ if(!(strcmp(str,"MSG"))){ @@ -72,11 +72,11 @@ * set command Payload length */ int -setPayloadLen(MsnCommand *cmd) +msn_set_payload_len(MsnCommand *cmd) { char * param; - if(isPayloadCmd(cmd->command)){ + if(msn_check_payload_cmd(cmd->command)){ if(!(strcmp(cmd->command,"MSG"))){ param = cmd->params[2]; }else{ @@ -121,7 +121,7 @@ } /*add payload Length checking*/ - setPayloadLen(cmd); + msn_set_payload_len(cmd); gaim_debug_info("MaYuan","get payload len:%d\n",cmd->payload_len); msn_command_ref(cmd); Property changes on: branches/soc-2006-msnp13/src/protocols/msn/command.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/command.h ___________________________________________________________________ Name: svn:mime-type + text/plain Added: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c (rev 0) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -0,0 +1,220 @@ +/** + * @file contact.c + * get MSN contacts via SOAP request + * created by MaYuan<may...@gm...> + * + * gaim + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "msn.h" +#include "soap.h" +#include "contact.h" +#include "xmlnode.h" + +/*new a contact*/ +MsnContact * +msn_contact_new(MsnSession *session) +{ + MsnContact *contact; + + contact = g_new0(MsnContact, 1); + contact->session = session; + contact->soapconn = msn_soap_new(session); + contact->soapconn->parent = contact; + contact->soapconn->ssl_conn = 1; + + return contact; +} + +/*destroy the contact*/ +void +msn_contact_destroy(MsnContact *contact) +{ + msn_soap_destroy(contact->soapconn); + g_free(contact); +} + +/*contact SOAP server login error*/ +static void +msn_contact_login_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) +{ + MsnSoapConn *soapconn = data; + MsnSession *session; + + session = soapconn->session; + g_return_if_fail(session != NULL); + + msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to contact server")); +} + +/*msn contact SOAP server connect process*/ +static void +msn_contact_login_connect_cb(gpointer data, GaimSslConnection *gsc, + GaimInputCondition cond) +{ + MsnSoapConn *soapconn = data; + MsnSession * session; + MsnContact *contact; + + contact = soapconn->parent; + g_return_if_fail(contact != NULL); + + session = contact->session; + g_return_if_fail(session != NULL); + + /*login ok!We can retrieve the contact list*/ + msn_get_contact_list(contact); +} + +static void +msn_parse_contact_list(MsnContact * contact) +{ + xmlnode * node,*envelop,*body,*response,*result,*services,*service,*memberships; + xmlnode *membershipnode,*members,*member,*passport,*role; + int len; + + gaim_debug_misc("xml","parse contact list:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); + node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); +// node = xmlnode_from_str(contact->soapconn->body, -1); + + if(node == NULL){ + gaim_debug_misc("xml","parse from str err!\n"); + return; + } + gaim_debug_misc("xml","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name); + body = xmlnode_get_child(node,"Body"); + gaim_debug_misc("xml","body{%p},name:%s\n",body,body->name); + response = xmlnode_get_child(body,"FindMembershipResponse"); + gaim_debug_misc("xml","response{%p},name:%s\n",response,response->name); + result =xmlnode_get_child(response,"FindMembershipResult"); + gaim_debug_misc("xml","result{%p},name:%s\n",result,result->name); + services =xmlnode_get_child(result,"Services"); + gaim_debug_misc("xml","services{%p},name:%s\n",services,services->name); + service =xmlnode_get_child(services,"Service"); + gaim_debug_misc("xml","service{%p},name:%s\n",service,service->name); + memberships =xmlnode_get_child(service,"Memberships"); + gaim_debug_misc("xml","memberships{%p},name:%s\n",memberships,memberships->name); + for(membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode; + membershipnode = xmlnode_get_next_twin(membershipnode)){ + role = xmlnode_get_child(membershipnode,"MemberRole"); + gaim_debug_misc("memberrole","role:%s\n",xmlnode_get_data(role)); + members = xmlnode_get_child(membershipnode,"Members"); + for(member = xmlnode_get_child(members, "Member"); member; + member = xmlnode_get_next_twin(member)){ + passport = xmlnode_get_child(member,"PassportName"); + gaim_debug_misc("Passport","name:%s\n",xmlnode_get_data(passport)); + } + } + + xmlnode_free(node); +} + +static void +msn_get_contact_list_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + MsnContact *contact; + MsnSession *session; + + contact = soapconn->parent; + g_return_if_fail(contact != NULL); + session = soapconn->session; + g_return_if_fail(session != NULL); + +// gaim_debug_misc("msn", "soap contact server Reply: {%s}\n", soapconn->read_buf); + msn_parse_contact_list(contact); +} + +static void +msn_contact_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + gaim_debug_info("MaYuan","finish contact written\n"); + soapconn->read_cb = msn_get_contact_list_cb; + msn_soap_read_cb(data,source,cond); +} + +void +msn_get_contact_list(MsnContact * contact) +{ + char * soap_head = NULL; + char * soap_body = NULL; + char * request_str = NULL; + + gaim_debug_info("MaYuan","msn_get_contact_list()...\n"); + contact->soapconn->login_path = g_strdup(MSN_GET_CONTACT_POST_URL); + soap_body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE); + soap_head = g_strdup_printf( + "POST %s HTTP/1.1\r\n" + "SOAPAction: http://www.msn.com/webservices/AddressBook/FindMembership\r\n" + "Content-Type:text/xml; charset=utf-8\r\n" + "Cookie: MSPAuth=%s\r\n" + "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n" + "Accept: text/*\r\n" + "Host: %s\r\n" + "Content-Length: %d\r\n" + "Connection: Keep-Alive\r\n" + "Cache-Control: no-cache\r\n\r\n", + contact->soapconn->login_path, + contact->session->passport_info.mspauth, + contact->soapconn->login_host, + strlen(soap_body) + ); + request_str = g_strdup_printf("%s%s", soap_head,soap_body); + g_free(soap_head); + g_free(soap_body); + +// gaim_debug_info("MaYuan","send to contact server{%s}\n",request_str); + msn_soap_write(contact->soapconn,request_str,msn_contact_written_cb); +} + +msn_add_contact() +{ +} + +msn_delete_contact() +{ +} + +msn_block_contact() +{ +} + +msn_unblock_contact() +{ +} + +msn_get_gleams() +{ +} + +void +msn_contact_connect(MsnContact *contact) +{ + /* Authenticate via Windows Live ID. */ + gaim_debug_info("MaYuan","msn_contact_connect...\n"); + + msn_soap_init(contact->soapconn,MSN_CONTACT_SERVER,1, + msn_contact_login_connect_cb, + msn_contact_login_error_cb); +} + Property changes on: branches/soc-2006-msnp13/src/protocols/msn/contact.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: branches/soc-2006-msnp13/src/protocols/msn/contact.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.h (rev 0) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-07-09 16:48:25 UTC (rev 16473) @@ -0,0 +1,118 @@ +/** + * @file contact.h Header file for contact.c + * Author + * MaYuan<may...@gm...> + * gaim + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef _MSN_CONTACT_H_ +#define _MSN_CONTACT_H_ + +#define MSN_CONTACT_SERVER "contacts.msn.com" + +#define MSN_GET_CONTACT_POST_URL "/abservice/SharingService.asmx" +#define MSN_GET_CONTACT_TEMPLATE "<?xml version='1.0' encoding='utf-8'?>"\ +"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\ + "<soap:Header xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\ + "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<ApplicationId xmlns=\"http://www.msn.com/webservices/AddressBook\">09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\ + "<IsMigration xmlns=\"http://www.msn.com/webservices/AddressBook\">false</IsMigration>"\ + "<PartnerScenario xmlns=\"http://www.msn.com/webservices/AddressBook\">Initial</PartnerScenario>"\ + "</ABApplicationHeader>"\ + "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<ManagedGroupRequest xmlns=\"http://www.msn.com/webservices/AddressBook\">false</ManagedGroupRequest>"\ + "</ABAuthHeader>"\ + "</soap:Header>"\ + "<soap:Body xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\ + "<FindMembership xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<serviceFilter xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<Types xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">Messenger</ServiceType>"\ + "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">Invitation</ServiceType>"\ + "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">SocialNetwork</ServiceType>"\ + "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">Space</ServiceType>"\ + "<ServiceType xmlns=\"http://www.msn.com/webservices/AddressBook\">Profile</ServiceType>"\ + "</Types>"\ + "</serviceFilter>"\ + "</FindMembership>"\ + "</soap:Body>"\ +"</soap:Envelope>" + +#define MSN_ADDRESS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ +"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\ + "<soap:Header>"\ + "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\ + "<IsMigration>false</IsMigration>"\ + "<PartnerScenario>Initial</PartnerScenario>"\ + "</ABApplicationHeader>"\ + "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<ManagedGroupRequest>false</ManagedGroupRequest>"\ + "</ABAuthHeader>"\ + "</soap:Header>"\ + "<soap:Body>"\ + "<ABFindAll xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<abId>00000000-0000-0000-0000-000000000000</abId>"\ + "<abView>Full</abView>"\ + "</ABFindAll>"\ + "</soap:Body>"\ +"</soap:Envelope>" + +#define MSN_GLEAMS_TEMPLATE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ +"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\ + "<soap:Header>"\ + "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\ + "<IsMigration>false</IsMigration>"\ + "<PartnerScenario>Initial</PartnerScenario>"\ + "</ABApplicationHeader>"\ + "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<ManagedGroupRequest>false</ManagedGroupRequest>"\ + "</ABAuthHeader>"\ + "</soap:Header>"\ + "<soap:Body>"\ + "<ABFindAll xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ + "<abId>00000000-0000-0000-0000-000000000000</abId>"\ + "<abView>Full</abView>"\ + "<dynamicItemView>Gleam</dynamicItemView>"\ + "<dynamicItemLastChange>0001-01-01T00:00:00.0000000-08:00</dynamicItemLastChange>"\ + "</ABFindAll>"\ + "</soap:Body>"\ +"</soap:Envelope>" + +typedef struct _MsnContact MsnContact; + +struct _MsnContact +{ + MsnSession *session; + + MsnSoapConn *soapconn; +}; + +/*function prototype*/ +MsnContact * msn_contact_new(MsnSession *session); +void msn_get_contact_list(MsnContact * contact); +void msn_contact_connect(MsnContact *contact); + +void msn_contact_destroy(MsnContact *contact); +void msn_get_contact_list(MsnContact * contact); + +#endif/* _MSN_CMDPROC_H_*/ + Property changes on: branches/soc-2006-msnp13/src/protocols/msn/contact.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Property changes on: branches/soc-2006-msnp13/src/protocols/msn/dialog.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/dialog.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/directconn.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/directconn.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/error.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/error.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/group.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/group.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/history.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/history.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/httpconn.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/httpconn.h ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/msg.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -231,8 +231,7 @@ elems = g_strsplit(tmp, "\r\n", 0); - for (cur = elems; *cur != NULL; cur++) - { + for (cur = elems; *cur != NULL; cur++){ const char *key, *value; tokens = g_strsplit(*cur, ": ", 2); @@ -240,20 +239,17 @@ key = tokens[0]; value = tokens[1]; - if (!strcmp(key, "MIME-Version")) - { + /*if not MIME content ,then return*/ + if (!strcmp(key, "MIME-Version")){ g_strfreev(tokens); continue; } - if (!strcmp(key, "Content-Type")) - { + if (!strcmp(key, "Content-Type")){ char *charset, *c; - if ((c = strchr(value, ';')) != NULL) - { - if ((charset = strchr(c, '=')) != NULL) - { + if ((c = strchr(value, ';')) != NULL){ + if ((charset = strchr(c, '=')) != NULL) { charset++; msn_message_set_charset(msg, charset); } @@ -262,9 +258,7 @@ } msn_message_set_content_type(msg, value); - } - else - { + }else{ msn_message_set_attr(msg, key, value); } @@ -280,8 +274,7 @@ content_type = msn_message_get_content_type(msg); if (content_type != NULL && - !strcmp(content_type, "application/x-msnmsgrp2p")) - { + !strcmp(content_type, "application/x-msnmsgrp2p")){ MsnSlpHeader header; MsnSlpFooter footer; int body_len; @@ -323,9 +316,7 @@ tmp += sizeof(footer); msg->msnslp_footer.value = GUINT32_FROM_BE(footer.value); } - } - else - { + }else{ if (payload_len - (tmp - tmp_base) > 0) { msg->body_len = payload_len - (tmp - tmp_base); msg->body = g_malloc0(msg->body_len + 1); @@ -785,3 +776,4 @@ g_string_free(str, TRUE); } + Property changes on: branches/soc-2006-msnp13/src/protocols/msn/msg.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/msg.h ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -351,14 +351,14 @@ host = g_strdup(str); - if ((c = strchr(host, ':')) != NULL) - { + if ((c = strchr(host, ':')) != NULL){ *c = '\0'; port = atoi(c + 1); + }else{ + port = 1863; } - else - port = 1863; *ret_host = host; *ret_port = port; } + Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -892,8 +892,7 @@ gc = gaim_account_get_connection(account); - if (gc != NULL) - { + if (gc != NULL){ session = gc->proto_data; msn_change_status(session); } Property changes on: branches/soc-2006-msnp13/src/protocols/msn/msn.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/msn.h ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -22,6 +22,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "msn.h" +#include "soap.h" #include "nexus.h" #include "notification.h" @@ -36,6 +37,10 @@ nexus = g_new0(MsnNexus, 1); nexus->session = session; + nexus->soapconn = msn_soap_new(session); + nexus->soapconn->parent = nexus; + /*we must use SSL connection to do Windows Live ID authentication*/ + nexus->soapconn->ssl_conn = 1; nexus->challenge_data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); @@ -45,90 +50,14 @@ void msn_nexus_destroy(MsnNexus *nexus) { - g_free(nexus->login_host); - - g_free(nexus->login_path); - if (nexus->challenge_data != NULL) g_hash_table_destroy(nexus->challenge_data); - if (nexus->input_handler > 0) - gaim_input_remove(nexus->input_handler); - g_free(nexus->write_buf); - g_free(nexus->read_buf); - + msn_soap_destroy(nexus->soapconn); g_free(nexus); } /************************************************************************** - * Util - **************************************************************************/ - -static gssize -msn_ssl_read(MsnNexus *nexus) -{ - gssize len; - gssize total_len = 0; - char temp_buf[4096]; - - if((len = gaim_ssl_read(nexus->gsc, temp_buf, - sizeof(temp_buf))) > 0) - { -#if 0 - g_string_append(nexus->read_buf,temp_buf); -#else - total_len += len; - nexus->read_buf = g_realloc(nexus->read_buf, - nexus->read_len + len + 1); - strncpy(nexus->read_buf + nexus->read_len, temp_buf, len); - nexus->read_len += len; - nexus->read_buf[nexus->read_len] = '\0'; -#endif - } -// gaim_debug_info("MaYuan","nexus ssl read:{%s}\n",nexus->read_buf); - return total_len; -} - -static void -nexus_write_cb(gpointer data, gint source, GaimInputCondition cond) -{ - MsnNexus *nexus = data; - int len, total_len; - - total_len = strlen(nexus->write_buf); - - /* - * write the content to SSL server, - * We use SOAP to request Windows Live ID authentication - */ - len = gaim_ssl_write(nexus->gsc, - nexus->write_buf + nexus->written_len, - total_len - nexus->written_len); - - if (len < 0 && errno == EAGAIN) - return; - else if (len <= 0) { - gaim_input_remove(nexus->input_handler); - nexus->input_handler = -1; - /* TODO: notify of the error */ - return; - } - nexus->written_len += len; - - if (nexus->written_len < total_len) - return; - - gaim_input_remove(nexus->input_handler); - nexus->input_handler = -1; - - g_free(nexus->write_buf); - nexus->write_buf = NULL; - nexus->written_len = 0; - - nexus->written_cb(nexus, source, 0); -} - -/************************************************************************** * Login **************************************************************************/ @@ -139,74 +68,38 @@ static void login_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) { - MsnNexus *nexus; + MsnSoapConn * soapconn = data; MsnSession *session; - nexus = data; - g_return_if_fail(nexus != NULL); - - session = nexus->session; + session = soapconn->session; g_return_if_fail(session != NULL); - msn_session_set_error(session, MSN_ERROR_AUTH, _("Unable to connect")); + msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication:Unable to connect")); /* the above line will result in nexus being destroyed, so we don't want * to destroy it here, or we'd crash */ } static void -nexus_login_written_cb(gpointer data, gint source, GaimInputCondition cond) +nexus_login_read_cb(gpointer data, gint source, GaimInputCondition cond) { - MsnNexus *nexus = data; + MsnSoapConn * soapconn = data; + MsnNexus *nexus; MsnSession *session; - int len; + nexus = soapconn->parent; + g_return_if_fail(nexus != NULL); session = nexus->session; g_return_if_fail(session != NULL); - if (nexus->input_handler == -1) - nexus->input_handler = gaim_input_add(nexus->gsc->fd, - GAIM_INPUT_READ, nexus_login_written_cb, nexus); + gaim_debug_misc("msn", "TWN Server Reply: {%s}\n", soapconn->read_buf); - /*read the request header*/ - len = msn_ssl_read(nexus); - if (len < 0 && errno == EAGAIN){ - return; - }else if (len < 0) { - gaim_input_remove(nexus->input_handler); - nexus->input_handler = -1; - g_free(nexus->read_buf); - nexus->read_buf = NULL; - nexus->read_len = 0; - /* TODO: error handling */ - return; - } - - if(nexus->read_buf == NULL){ - return; - } - if (g_strstr_len(nexus->read_buf, nexus->read_len, - "</S:Envelope>") == NULL){ - return; - } - - gaim_input_remove(nexus->input_handler); - nexus->input_handler = -1; - gaim_ssl_close(nexus->gsc); - nexus->gsc = NULL; - -// gaim_debug_misc("msn", "TWN Server Reply: {%s}", nexus->read_buf); - - if (strstr(nexus->read_buf, "HTTP/1.1 302") != NULL){ + if (strstr(soapconn->read_buf, "HTTP/1.1 302") != NULL){ /* Redirect. */ char *location, *c; - location = strstr(nexus->read_buf, "Location: "); - if (location == NULL) - { - g_free(nexus->read_buf); - nexus->read_buf = NULL; - nexus->read_len = 0; - + location = strstr(soapconn->read_buf, "Location: "); + if (location == NULL){ + msn_soap_free_read_buf(soapconn); return; } location = strchr(location, ' ') + 1; @@ -218,24 +111,19 @@ if ((c = strchr(location, '/')) != NULL) location = c + 2; - if ((c = strchr(location, '/')) != NULL) - { - g_free(nexus->login_path); - nexus->login_path = g_strdup(c); + if ((c = strchr(location, '/')) != NULL){ + g_free(soapconn->login_path); + soapconn->login_path = g_strdup(c); *c = '\0'; } + g_free(soapconn->login_host); - g_free(nexus->login_host); - nexus->login_host = g_strdup(location); - - gaim_ssl_connect(session->account, nexus->login_host, - GAIM_SSL_DEFAULT_PORT, login_connect_cb, - login_error_cb, nexus); - }else if (strstr(nexus->read_buf, "HTTP/1.1 401 Unauthorized") != NULL){ + msn_soap_init(soapconn,location,1,login_connect_cb,login_error_cb); + }else if (strstr(soapconn->read_buf, "HTTP/1.1 401 Unauthorized") != NULL){ const char *error; - if ((error = strstr(nexus->read_buf, "WWW-Authenticate")) != NULL) { + if ((error = strstr(soapconn->read_buf, "WWW-Authenticate")) != NULL) { if ((error = strstr(error, "cbtxt=")) != NULL){ const char *c; char *temp; @@ -251,67 +139,70 @@ } } msn_session_set_error(session, MSN_ERROR_AUTH, error); - }else if (strstr(nexus->read_buf, "HTTP/1.1 200 OK")){ + }else if (strstr(soapconn->read_buf, "HTTP/1.1 200 OK")){ /*reply OK, we should process the SOAP body*/ char *base, *c; + char *msn_twn_t,*msn_twn_p; char *login_params; - char *length_start,*length_end,*body_len; char **elems, **cur, **tokens; - const char * cert_str; + char * cert_str; - gaim_debug_info("MaYuan","Receive 200\n"); -#if 0 - length_start = strstr(nexus->read_buf, "Content-Length: "); - length_start += strlen("Content-Length: "); - length_end = strstr(length_start, "\r\n"); - body_len = g_strndup(length_start,length_end - length_start); -// gaim_debug_info("MaYuan","body length is :%s\n",body_len); + gaim_debug_info("MaYuan","Windows Live ID Reply OK!\n"); - g_free(body_len); -// g_return_if_fail(body_len != NULL); -#endif //TODO: we should parse it using XML - base = strstr(base, TWN_START_TOKEN); + base = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_START_TOKEN); base += strlen(TWN_START_TOKEN); -// gaim_debug_info("MaYuan","base is :%s\n",base); - c = strstr(base, TWN_END_TOKEN); -// gaim_debug_info("MaYuan","c is :%s\n",c); -// gaim_debug_info("MaYuan","len is :%d\n",c-base); + c = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_END_TOKEN); login_params = g_strndup(base, c - base); - gaim_debug_info("msn", "TWN Cert: {%s}\n", login_params); +// gaim_debug_info("msn", "TWN Cert: {%s}\n", login_params); /* Parse the challenge data. */ elems = g_strsplit(login_params, "&", 0); for (cur = elems; *cur != NULL; cur++){ tokens = g_strsplit(*cur, "=", 2); - g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]); + g_hash_table_insert(nexus->challenge_data, tokens[0], tokens[1]); /* Don't free each of the tokens, only the array. */ g_free(tokens); } g_strfreev(elems); - cert_str = g_strdup_printf("t=%s&p=%s", - (char *)g_hash_table_lookup(nexus->challenge_data, "t"), - (char *)g_hash_table_lookup(nexus->challenge_data, "p") - ); + msn_twn_t = (char *)g_hash_table_lookup(nexus->challenge_data, "t"); + msn_twn_p = (char *)g_hash_table_lookup(nexus->challenge_data, "p"); + + /*setup the t and p parameter for session*/ + if (session->passport_info.t != NULL){ + g_free(session->passport_info.t); + } + session->passport_info.t = g_strdup(msn_twn_t); + + if (session->passport_info.p != NULL) + g_free(session->passport_info.p); + session->passport_info.p = g_strdup(msn_twn_p); + + cert_str = g_strdup_printf("t=%s&p=%s",msn_twn_t,msn_twn_p); msn_got_login_params(session, cert_str); + gaim_debug_info("MaYuan","close nexus connection! \n"); g_free(cert_str); -// g_free(body_len); g_free(login_params); -// return; msn_nexus_destroy(nexus); session->nexus = NULL; return; } + msn_soap_free_read_buf(soapconn); +} - g_free(nexus->read_buf); - nexus->read_buf = NULL; - nexus->read_len = 0; +static void +nexus_login_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + soapconn->read_cb = nexus_login_read_cb; + msn_soap_read_cb(data,source,cond); } @@ -319,26 +210,27 @@ login_connect_cb(gpointer data, GaimSslConnection *gsc, GaimInputCondition cond) { - MsnNexus *nexus; + MsnSoapConn *soapconn; + MsnNexus * nexus; MsnSession *session; char *username, *password; char *request_str, *head, *tail,*challenge_str; - char *buffer = NULL; - guint32 ctint; gaim_debug_info("MaYuan","starting Windows Live ID authentication\n"); - nexus = data; + + soapconn = data; + g_return_if_fail(soapconn != NULL); + + nexus = soapconn->parent; g_return_if_fail(nexus != NULL); - session = nexus->session; + session = soapconn->session; g_return_if_fail(session != NULL); - nexus->gsc = gsc; - msn_session_set_login_step(session, MSN_LOGIN_STEP_GET_COOKIE); + /*prepare the Windows Live ID authentication token*/ username = g_strdup(gaim_account_get_username(session->account)); - password = g_strdup(gaim_connection_get_password(session->account->gc)); // g_strdup(gaim_url_encode(gaim_connection_get_password(session->account->gc))); @@ -360,7 +252,7 @@ /*build the SOAP windows Live ID XML body */ tail = g_strdup_printf(TWN_ENVELOP_TEMPLATE,username,password,challenge_str ); - nexus->login_path = g_strdup(TWN_POST_URL); + soapconn->login_path = g_strdup(TWN_POST_URL); head = g_strdup_printf( "POST %s HTTP/1.1\r\n" "Accept: text/*\r\n" @@ -369,30 +261,19 @@ "Content-Length: %d\r\n" "Connection: Keep-Alive\r\n" "Cache-Control: no-cache\r\n\r\n", - nexus->login_path,nexus->login_host,strlen(tail)); + soapconn->login_path,soapconn->login_host,strlen(tail)); request_str = g_strdup_printf("%s%s", head,tail); -// gaim_debug_misc("msn", "TWN Sending: {%s}\n", request_str); + gaim_debug_misc("msn", "TWN Sending: {%s}\n", request_str); -// g_free(nexus->login_path); - g_free(buffer); g_free(head); g_free(tail); g_free(username); g_free(password); - nexus->write_buf = request_str; - nexus->written_len = 0; + /*prepare to send the SOAP request*/ + msn_soap_write(soapconn,request_str,nexus_login_written_cb); - nexus->read_len = 0; - - nexus->written_cb = nexus_login_written_cb; - - nexus->input_handler = gaim_input_add(gsc->fd, GAIM_INPUT_WRITE, - nexus_write_cb, nexus); - - nexus_write_cb(nexus, gsc->fd, GAIM_INPUT_WRITE); - return; } @@ -404,8 +285,7 @@ { /* Authenticate via Windows Live ID. */ gaim_debug_info("MaYuan","msn_nexus_connect...\n"); - nexus->login_host = g_strdup(TWN_SERVER); - gaim_ssl_connect(nexus->session->account, nexus->login_host, - GAIM_SSL_DEFAULT_PORT, login_connect_cb, login_error_cb, - nexus); + + msn_soap_init(nexus->soapconn,MSN_TWN_SERVER,1,login_connect_cb,login_error_cb); } + Property changes on: branches/soc-2006-msnp13/src/protocols/msn/nexus.c ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.h 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.h 2006-07-09 16:48:25 UTC (rev 16473) @@ -24,8 +24,10 @@ #ifndef _MSN_NEXUS_H_ #define _MSN_NEXUS_H_ -#define TWN_SERVER "loginnet.passport.com" +#include "soap.h" +#define MSN_TWN_SERVER "loginnet.passport.com" + #define TWN_START_TOKEN "<wsse:BinarySecurityToken Id=\"PPToken1\">" #define TWN_END_TOKEN "</wsse:BinarySecurityToken>" @@ -75,20 +77,8 @@ struct _MsnNexus { MsnSession *session; - - char *login_host; - char *login_path; + MsnSoapConn *soapconn; GHashTable *challenge_data; - GaimSslConnection *gsc; - - guint input_handler; - - char *write_buf; - gsize written_len; - GaimInputFunction written_cb; - - char *read_buf; - gsize read_len; }; void msn_nexus_connect(MsnNexus *nexus); Property changes on: branches/soc-2006-msnp13/src/protocols/msn/nexus.h ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -238,7 +238,8 @@ msn_session_set_login_step(session, MSN_LOGIN_STEP_SYN); - msn_cmdproc_send(cmdproc, "SYN", "%s", "0"); +// msn_cmdproc_send(cmdproc, "SYN", "%s", "0"); + //TODO we should use SOAP contact to fetch contact list }else if (!g_ascii_strcasecmp(cmd->params[1], "TWN")){ /* Passport authentication */ char **elems, **cur, **tokens; @@ -397,8 +398,8 @@ /************************************************************************** * Challenges + * we use MD5 to caculate the Chanllenges **************************************************************************/ - static void chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { @@ -416,7 +417,7 @@ gaim_cipher_context_append(context, (const guchar *)cmd->params[1], strlen(cmd->params[1])); - challenge_resp = "VT6PX?UQTM4WM%YR"; + challenge_resp = MSNP13_WLM_PRODUCT_KEY; gaim_cipher_context_append(context, (const guchar *)challenge_resp, strlen(challenge_resp)); @@ -426,7 +427,7 @@ for (i = 0; i < 16; i++) g_snprintf(buf + (i*2), 3, "%02x", digest[i]); - trans = msn_transaction_new(cmdproc, "QRY", "%s 32", "PROD0038W!61ZTF9"); + trans = msn_transaction_new(cmdproc, "QRY", "%s 32", MSNP13_WLM_PRODUCT_ID); msn_transaction_set_payload(trans, buf, 32); @@ -436,7 +437,6 @@ /************************************************************************** * Buddy Lists **************************************************************************/ - static void add_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { @@ -554,6 +554,10 @@ g_strfreev(params); } +static void adl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ +} + static void adg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { @@ -1100,12 +1104,9 @@ msn_parse_socket(cmd->params[2], &host, &port); - if (!strcmp(cmd->params[1], "SB")) - { + if (!strcmp(cmd->params[1], "SB")){ gaim_debug_error("msn", "This shouldn't be handled here.\n"); - } - else if (!strcmp(cmd->params[1], "NS")) - { + }else if (!strcmp(cmd->params[1], "NS")){ MsnSession *session; session = cmdproc->session; @@ -1123,7 +1124,6 @@ { gaim_debug_info("MaYuan","Processing GCF... \n"); if(cmd->payload_len == 0){ -// cmd->payload_len = is_num(cmd->params[1]) ? atoi(cmd->params[1]) : 0; return; } /*get the payload content*/ @@ -1149,49 +1149,53 @@ MsnSession *session; const char *value; + gaim_debug_info("MaYuan","profile_msg... \n"); session = cmdproc->session; if (strcmp(msg->remote_user, "Hotmail")) /* This isn't an official message. */ return; - if ((value = msn_message_get_attr(msg, "kv")) != NULL) - { + if ((value = msn_message_get_attr(msg, "kv")) != NULL){ if (session->passport_info.kv != NULL) g_free(session->passport_info.kv); session->passport_info.kv = g_strdup(value); } - if ((value = msn_message_get_attr(msg, "sid")) != NULL) - { + if ((value = msn_message_get_attr(msg, "sid")) != NULL){ if (session->passport_info.sid != NULL) g_free(session->passport_info.sid); session->passport_info.sid = g_strdup(value); } - if ((value = msn_message_get_attr(msg, "MSPAuth")) != NULL) - { + if ((value = msn_message_get_attr(msg, "MSPAuth")) != NULL){ if (session->passport_info.mspauth != NULL) g_free(session->passport_info.mspauth); + gaim_debug_info("MaYuan","MSPAuth:%s\n",value); session->passport_info.mspauth = g_strdup(value); } - if ((value = msn_message_get_attr(msg, "ClientIP")) != NULL) - { + if ((value = msn_message_get_attr(msg, "ClientIP")) != NULL){ if (session->passport_info.client_ip != NULL) g_free(session->passport_info.client_ip); session->passport_info.client_ip = g_strdup(value); } - if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL) + if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL){ session->passport_info.client_port = ntohs(atoi(value)); + } if ((value = msn_message_get_attr(msg, "LoginTime")) != NULL) session->passport_info.sl = atol(value); + + /*starting retrieve the contact list*/ + session->contact = msn_contact_new(session); + msn_contact_connect(session->contact); + } static void Property changes on: branches/soc-2006-msnp13/src/protocols/msn/notification.c ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-07-09 16:48:25 UTC (rev 16473) @@ -24,6 +24,14 @@ #ifndef _MSN_NOTIFICATION_H_ #define _MSN_NOTIFICATION_H_ +/*MSN protocol challenge info*/ +/*MSNP13 challenge*/ +#define MSNP13_WLM_PRODUCT_KEY "O4BG@C7BWLYQX?5G" +#define MSNP13_WLM_PRODUCT_ID "PROD01065C%ZFN6F" + +#define MSNP10_PRODUCT_KEY "VT6PX?UQTM4WM%YR" +#define MSNP10_PRODUCT_ID "PROD0038W!61ZTF9" + typedef struct _MsnNotification MsnNotification; #include "session.h" Property changes on: branches/soc-2006-msnp13/src/protocols/msn/notification.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/object.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/object.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/page.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/page.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/servconn.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/servconn.h ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/session.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -70,6 +70,8 @@ msn_userlist_destroy(session->userlist); + g_free(session->passport_info.t); + g_free(session->passport_info.p); g_free(session->passport_info.kv); g_free(session->passport_info.sid); g_free(session->passport_info.mspauth); Property changes on: branches/soc-2006-msnp13/src/protocols/msn/session.c ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: branches/soc-2006-msnp13/src/protocols/msn/session.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.h 2006-07-09 07:24:14 UTC (rev 16472) +++ branches/soc-2006-msnp13/src/protocols/msn/session.h 2006-07-09 16:48:25 UTC (rev 16473) @@ -38,6 +38,7 @@ #include "cmdproc.h" #include "nexus.h" #include "httpconn.h" +#include "contact.h" #include "userlist.h" #include "sync.h" @@ -94,6 +95,7 @@ MsnNotification *notification; MsnNexus *nexus; + MsnContact *contact; MsnSync *sync; MsnUserList *userlist; @@ -107,6 +109,10 @@ struct { + /*t and p, get via USR TWN*/ + char *t; + char *p; + char *kv; char *sid; char *mspauth; @@ -114,7 +120,6 @@ char *file; char *client_ip; int client_port; - } passport_info; }; Property changes on: branches/soc-2006-msnp13/src/protocols/msn/session.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slp.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slp.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slpcall.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slpcall.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slplink.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slplink.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slpmsg.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slpmsg.h ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slpsession.c ___________________________________________________________________ Name: svn:mime-type + text/plain Property changes on: branches/soc-2006-msnp13/src/protocols/msn/slpsession.h ___________________________________________________________________ Name: svn:mime-type + text/plain Added: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c (rev 0) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-07-09 16:48:25 UTC (rev 16473) @@ -0,0 +1,302 @@ +/** + * @file soap.c + * SOAP connection related process + * Author + * MaYuan<may...@gm...> + * gaim + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include "msn.h" +#include "soap.h" + +/*new a soap connection*/ +MsnSoapConn * +msn_soap_new(MsnSession *session) +{ + MsnSoapConn *soapconn; + + soapconn = g_new0(MsnSoapConn, 1); + soapconn->session = session; + soapconn->input_handler = -1; + soapconn->output_handler = -1; + return soapconn; +} + +/*ssl soap connect callback*/ +void +msn_soap_connect_cb(gpointer data, GaimSslConnection *gsc, + GaimInputCondition cond) +{ + MsnSoapConn * soapconn; + MsnSession *session; + + gaim_debug_info("MaYuan","Soap connection connected!\n"); + soapconn = data; + g_return_if_fail(soapconn != NULL); + + session = soapconn->session; + g_return_if_fail(session != NULL); + + soapconn->gsc = gsc; + + /*connection callback*/ + if(soapconn->connect_cb != NULL){ + soapconn->connect_cb(data,gsc,cond); + } +} + +/*ssl soap error callback*/ +static void +msn_soap_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) +{ + MsnSoapConn * soapconn = data; + g_return_if_fail(data != NULL); + gaim_debug_info("MaYuan","Soap connection error!\n"); + /*error callback*/ + if(soapconn->error_cb != NULL){ + soapconn->error_cb(gsc,error,data); + } +} + +/*init the soap connection*/ +void +msn_soap_init(MsnSoapConn *soapconn,char * host,int ssl, + GaimSslInputFunction connect_cb, + GaimSslErrorFunction error_cb) +{ + soapconn->login_host = g_strdup(host); + soapconn->ssl_conn = ssl; + soapconn->connect_cb = connect_cb; + soapconn->error_cb = error_cb; + 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, + soapconn); + }else{ + } +} + +/*destroy the soap connection*/ +void +msn_soap_destroy(MsnSoapConn *soapconn) +{ + g_free(soapconn->login_host); + g_free(soapconn->login_path); + + /*remove the write handler*/ + if (soapconn->output_handler > 0){ + gaim_input_remove(soapconn->output_handler); + } + /*remove the read handler*/ + if (soapconn->input_handler > 0){ + gaim_input_remove(soapconn->input_handler); + } + msn_soap_free_read_buf(soapconn); + msn_soap_free_write_buf(soapconn); + + /*close ssl connection*/ + gaim_ssl_close(soapconn->gsc); + soapconn->gsc = NULL; + + g_free(soapconn); +} + +/*read and append the content to the buffer*/ +static gssize +msn_soap_read(MsnSoapConn *soapconn) +{ + gssize len; + gssize total_len = 0; + char temp_buf[10240]; + + if(soapconn->ssl_conn){ + len = gaim_ssl_read(soapconn->gsc, temp_buf,sizeof(temp_buf)); + }else{ + len = read(soapconn->fd, temp_buf,sizeof(temp_buf)); + } + if(len >0){ + total_len += len; + soapconn->read_buf = g_realloc(soapconn->read_buf, + soapconn->read_len + len + 1); +// strncpy(soapconn->read_buf + soapconn->read_len, temp_buf, len); + memcpy(soapconn->read_buf + soapconn->read_len, temp_buf, len); + soapconn->read_len += len; + soapconn->read_buf[soapconn->read_len] = '\0'; + } +// gaim_debug_info("MaYuan","nexus ssl read:{%s}\n",soapconn->read_buf); + return total_len; +} + +/*read the whole SOAP server response*/ +void +msn_soap_read_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn *soapconn = data; + MsnSession *session; + int len; + char * body_start,*body_len; + char *length_start,*length_end; + + gaim_debug_misc("MaYuan", "soap read cb\n"); + session = soapconn->session; + g_return_if_fail(session != NULL); + + if (soapconn->input_handler == -1){ + soapconn->input_handler = gaim_input_add(soapconn->gsc->fd, + GAIM_INPUT_READ, msn_soap_read_cb, soapconn); + } + + /*read the request header*/ + len = msn_soap_read(soapconn); + if (len < 0 && errno == EAGAIN){ + return; + }else if (len < 0) { + gaim_debug_error("msn", "read Error!len:%d\n",len); + gaim_input_remove(soapconn->input_handler); + soapconn->input_handler = -1; + g_free(soapconn->read_buf); + soapconn->read_buf = NULL; + soapconn->read_len = 0; + /* TODO: error handling */ + return; + } + + if(soapconn->read_buf == NULL){ + return; + } + + body_start = (char *)g_strstr_len(soapconn->read_buf, soapconn->read_len,"\r\n\r\n"); + if(!body_start){ + return; + } + body_start += 4; + +// gaim_debug_misc("msn", "Soap Read: {%s}\n", soapconn->read_buf); + + /* we read the content-length*/ + length_start = strstr(soapconn->read_buf, "Content-Length: "); + length_start += strlen("Content-Length: "); + length_end = strstr(length_start, "\r\n"); + body_len = g_strndup(length_start,length_end - length_start); + + /*setup the conn body */ + soapconn->body = body_start; + soapconn->body_len = atoi(body_len); +// gaim_debug_misc("MaYuan","content length :%d",soapconn->body_len); + + if(soapconn->read_len < body_start - soapconn->read_buf + atoi(body_len)){ + return; + } + + g_free(body_len); + + /*call the read callback*/ + if(soapconn->read_cb != NULL){ + soapconn->read_cb(soapconn,source,0); + } +#if 0 + /*clear the read buffer*/ + msn_soap_free_read_buf(soapconn); + + /*remove the read handler*/ + gaim_input_remove(soapconn->input_handler); + soapconn->input_handler = -1; + gaim_ssl_close(soapconn->gsc); + soapconn->gsc = NULL; +#endif +} + +void +msn_soap_free_read_buf(MsnSoapConn *soapconn) +{ + if(soapconn->read_buf){ + g_free(soapconn->read_buf); + } + soapconn->read_buf = NULL; + soapconn->read_len = 0; +} + +void +msn_soap_free_write_buf(MsnSoapConn *soapconn) +{ + if(soapconn->write_buf){ + g_free(soapconn->write_buf); + } + soapconn->write_buf = NULL; + soapconn->written_len = 0; +} + +/*Soap write process func*/ +static void +msn_soap_write_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn *soapconn = data; + int len, total_len; + + total_len = strlen(soapconn->write_buf); + + /* + * write the content to SSL server, + */ + len = gaim_ssl_write(soapconn->gsc, + soapconn->write_buf + soapconn->written_len, + total_len - soapconn->written_len); + + if (len < 0 && errno == EAGAIN) + return; + else if (len <= 0){ + /*SSL write error!*/ + gaim_input_remove(soapconn->output_handler); + soapconn->output_handler = -1; + /* TODO: notify of the error */ + return; + } + soapconn->written_len += len; + + if (soapconn->written_len < total_len) + return; + + gaim_input_remove(soapconn->output_handler); + soapconn->output_handler = -1; + + /*clear the write buff*/ + msn_soap_free_write_buf(soapconn); + + /* Write finish! + * callback for write done + */ + if(soapconn->written_cb != NULL){ + soapconn->written_cb(soapconn, source, 0); + } +} + +/*write the buffer to SOAP connection*/ +void +msn_soap_write(MsnSoapConn * soapconn, char *write_buf, GaimInputFunction written_cb) +{ + soapconn->write_buf = write_buf; + soapconn->written_len = 0; + soapconn->written_cb = written_cb; + /*start the write*/ + soapconn->output_handler = gaim_input_add(soapconn->gsc->fd, GAIM_INPUT_WRITE, + msn_soap_write_cb, soapconn); + msn_soap_write_cb(soapconn, soapconn->gsc->fd, GAIM_INPUT_WRITE); +} + Property changes on: branches/soc-2006-msnp13/src/protocols/msn/soap.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: branches/soc-2006-msnp13/src/protocols/msn/soap.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.h (rev 0) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-07-09 16:48:25 UTC (rev 16473) @@ -0,0 +1,87 @@ +/** + * @file soap.h + * header file for SOAP connection related process + * Author + * MaYuan<may...@gm...> + * gaim + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COP... [truncated message content] |
From: <may...@us...> - 2006-07-17 12:23:09
|
Revision: 16507 Author: mayuan2006 Date: 2006-07-17 05:22:37 -0700 (Mon, 17 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16507&view=rev Log Message: ----------- add the contact list retrieve and dump contact list to server currently can do chanllenge successfully But can't get the buddy list done by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/Makefile.am branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c branches/soc-2006-msnp13/src/protocols/msn/command.c branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/contact.h branches/soc-2006-msnp13/src/protocols/msn/dialog.c branches/soc-2006-msnp13/src/protocols/msn/group.c branches/soc-2006-msnp13/src/protocols/msn/group.h branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c branches/soc-2006-msnp13/src/protocols/msn/msn-utils.h branches/soc-2006-msnp13/src/protocols/msn/msn.h branches/soc-2006-msnp13/src/protocols/msn/nexus.c branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/notification.h branches/soc-2006-msnp13/src/protocols/msn/object.c branches/soc-2006-msnp13/src/protocols/msn/session.c branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/soap.h branches/soc-2006-msnp13/src/protocols/msn/user.c branches/soc-2006-msnp13/src/protocols/msn/user.h branches/soc-2006-msnp13/src/protocols/msn/userlist.c branches/soc-2006-msnp13/src/protocols/msn/userlist.h Added Paths: ----------- branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/oim.h Modified: branches/soc-2006-msnp13/src/protocols/msn/Makefile.am =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/Makefile.am 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/Makefile.am 2006-07-17 12:22:37 UTC (rev 16507) @@ -32,6 +32,8 @@ notification.h \ object.c \ object.h \ + oim.c\ + oim.h\ page.c \ page.h \ servconn.c \ Modified: branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -134,6 +134,7 @@ } msn_servconn_write(servconn, data, len); + gaim_debug_info("<<","%s",data); g_free(data); } Modified: branches/soc-2006-msnp13/src/protocols/msn/command.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -47,7 +47,6 @@ if( (!strcmp(str,"ADL")) || (!strcmp(str,"GCF")) || (!strcmp(str,"MSG")) || - (!strcmp(str,"QRY")) || (!strcmp(str,"RML")) || (!strcmp(str,"UBX")) || (!strcmp(str,"UBN")) || Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -37,9 +37,7 @@ contact = g_new0(MsnContact, 1); contact->session = session; - contact->soapconn = msn_soap_new(session); - contact->soapconn->parent = contact; - contact->soapconn->ssl_conn = 1; + contact->soapconn = msn_soap_new(session,contact,1); return contact; } @@ -84,13 +82,44 @@ msn_get_contact_list(contact); } +/*get MSN member role utility*/ +static int +msn_get_memberrole(char * role) +{ + if(!strcmp(role,"Allow")){ + return MSN_LIST_AL_OP; + }else if(!strcmp(role,"Block")){ + return MSN_LIST_BL_OP; + }else if(!strcmp(role,"Reverse")){ + return MSN_LIST_RL_OP; + }else if(!strcmp(role,"Forward")){ + return MSN_LIST_FL_OP; + } + return 0; +} + +/*get User Type*/ +static int +msn_get_user_type(char * type) +{ + if(!strcmp(type,"Regular")){ + return 1; + } + return 0; +} + +/*parse contact list*/ static void msn_parse_contact_list(MsnContact * contact) { - xmlnode * node,*envelop,*body,*response,*result,*services,*service,*memberships; - xmlnode *membershipnode,*members,*member,*passport,*role; - int len; + MsnSession * session; + MsnUser *user; + int list_op =0; + char * passport; + xmlnode * node,*body,*response,*result,*services,*service,*memberships; + xmlnode *membershipnode,*members,*member,*passportNode,*role; + session = contact->session; gaim_debug_misc("xml","parse contact list:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); // node = xmlnode_from_str(contact->soapconn->body, -1); @@ -115,16 +144,28 @@ for(membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode; membershipnode = xmlnode_get_next_twin(membershipnode)){ role = xmlnode_get_child(membershipnode,"MemberRole"); - gaim_debug_misc("memberrole","role:%s\n",xmlnode_get_data(role)); + // gaim_debug_misc("memberrole","role:%s\n",xmlnode_get_data(role)); + list_op = msn_get_memberrole(xmlnode_get_data(role)); + gaim_debug_misc("memberrole","role:%s,list_op:%d\n",xmlnode_get_data(role),list_op); members = xmlnode_get_child(membershipnode,"Members"); - for(member = xmlnode_get_child(members, "Member"); member; - member = xmlnode_get_next_twin(member)){ - passport = xmlnode_get_child(member,"PassportName"); - gaim_debug_misc("Passport","name:%s\n",xmlnode_get_data(passport)); + for(member = xmlnode_get_child(members, "Member"); member; + member = xmlnode_get_next_twin(member)){ + passportNode = xmlnode_get_child(member,"PassportName"); + passport = xmlnode_get_data(passportNode); + gaim_debug_misc("Passport","name:%s\n",passport); + user = msn_userlist_find_user(session->userlist, passport); + if (user == NULL){ + user = msn_user_new(session->userlist, passport, ""); + msn_userlist_add_user(session->userlist, user); } +// user->list_op |= list_op; + msn_got_lst_user(session, user, list_op, NULL); + } } xmlnode_free(node); + + msn_get_address_book(contact); } static void @@ -156,55 +197,182 @@ void msn_get_contact_list(MsnContact * contact) { - char * soap_head = NULL; - char * soap_body = NULL; - char * request_str = NULL; - gaim_debug_info("MaYuan","msn_get_contact_list()...\n"); contact->soapconn->login_path = g_strdup(MSN_GET_CONTACT_POST_URL); - soap_body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE); - soap_head = g_strdup_printf( - "POST %s HTTP/1.1\r\n" - "SOAPAction: http://www.msn.com/webservices/AddressBook/FindMembership\r\n" - "Content-Type:text/xml; charset=utf-8\r\n" - "Cookie: MSPAuth=%s\r\n" - "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n" - "Accept: text/*\r\n" - "Host: %s\r\n" - "Content-Length: %d\r\n" - "Connection: Keep-Alive\r\n" - "Cache-Control: no-cache\r\n\r\n", - contact->soapconn->login_path, - contact->session->passport_info.mspauth, - contact->soapconn->login_host, - strlen(soap_body) - ); - request_str = g_strdup_printf("%s%s", soap_head,soap_body); - g_free(soap_head); - g_free(soap_body); + contact->soapconn->soap_action = g_strdup(MSN_GET_CONTACT_SOAP_ACTION); + msn_soap_post(contact->soapconn,MSN_GET_CONTACT_TEMPLATE,msn_contact_written_cb); +} -// gaim_debug_info("MaYuan","send to contact server{%s}\n",request_str); - msn_soap_write(contact->soapconn,request_str,msn_contact_written_cb); +static void +msn_parse_addressbook(MsnContact * contact) +{ + MsnSession * session; + xmlnode * node,*body,*response,*result; + xmlnode *groups,*group,*groupname,*groupId,*groupInfo; + xmlnode *contacts,*contactNode,*contactId,*contactInfo,*contactType,*passportName,*displayName,*groupIds,*guid; + xmlnode *ab; + + session = contact->session; + gaim_debug_misc("xml","parse addressbook:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); + node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); + + if(node == NULL){ + gaim_debug_misc("xml","parse from str err!\n"); + return; + } + gaim_debug_misc("xml","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name); + body = xmlnode_get_child(node,"Body"); + gaim_debug_misc("xml","body{%p},name:%s\n",body,body->name); + response = xmlnode_get_child(body,"ABFindAllResponse"); + gaim_debug_misc("xml","response{%p},name:%s\n",response,response->name); + result =xmlnode_get_child(response,"ABFindAllResult"); + gaim_debug_misc("xml","result{%p},name:%s\n",result,result->name); + groups =xmlnode_get_child(result,"groups"); + for(group = xmlnode_get_child(groups, "Group"); group; + group = xmlnode_get_next_twin(group)){ + char * name,*group_id; + groupId = xmlnode_get_child(group,"groupId"); + group_id = xmlnode_get_data(groupId); + groupInfo = xmlnode_get_child(group,"groupInfo"); + groupname = xmlnode_get_child(groupInfo,"name"); + name = xmlnode_get_data(groupname); + + msn_group_new(session->userlist, group_id, name); + + if (group_id == NULL) + /* Group of ungroupped buddies */ + continue; + + if ((gaim_find_group(name)) == NULL){ + GaimGroup *g = gaim_group_new(name); + gaim_blist_add_group(g, NULL); + } + + gaim_debug_misc("group","name:%s,Id:{%s}\n",name,group_id); + } + + contacts =xmlnode_get_child(result,"contacts"); + for(contactNode = xmlnode_get_child(contacts, "Contact"); contactNode; + contactNode = xmlnode_get_next_twin(contactNode)){ + MsnUser *user; + char *passport,*Name,*uid,*type; + + contactId= xmlnode_get_child(contactNode,"contactId"); + uid = xmlnode_get_data(contactId); + + contactInfo = xmlnode_get_child(contactNode,"contactInfo"); + contactType = xmlnode_get_child(contactInfo,"contactType"); + type = xmlnode_get_data(contactType); + + passportName = xmlnode_get_child(contactInfo,"passportName"); + passport = xmlnode_get_data(passportName); + + displayName = xmlnode_get_child(contactInfo,"displayName"); + Name =xmlnode_get_data(displayName); + + gaim_debug_misc("contact","name:%s,Id:{%s},display:{%s}\n", + passport, + xmlnode_get_data(contactId), + Name); + + user = msn_userlist_find_user(session->userlist, passport); + if (user == NULL){ + user = msn_user_new(session->userlist, passport, Name); + msn_userlist_add_user(session->userlist, user); + } + msn_user_set_uid(user,uid); + msn_user_set_type(user,msn_get_user_type(type)); + + groupIds = xmlnode_get_child(contactInfo,"groupIds"); + if(groupIds){ + for(guid = xmlnode_get_child(groupIds, "guid");guid; + guid = xmlnode_get_next_twin(guid)){ + char * group_id; + + group_id = xmlnode_get_data(guid); + msn_user_add_group_id(user,group_id); + gaim_debug_misc("contact","guid:%s\n",group_id); + } + }else{ + gaim_debug_misc("contact","guid is NULL\n"); + } + } + + ab =xmlnode_get_child(result,"ab"); + + xmlnode_free(node); + msn_soap_free_read_buf(contact->soapconn); + + dump_adl_cmd(session); + msn_session_finish_login(session); } -msn_add_contact() +static void +msn_get_address_cb(gpointer data, gint source, GaimInputCondition cond) { + MsnSoapConn * soapconn = data; + MsnContact *contact; + MsnSession *session; + + contact = soapconn->parent; + g_return_if_fail(contact != NULL); + session = soapconn->session; + g_return_if_fail(session != NULL); + +// gaim_debug_misc("msn", "soap contact server Reply: {%s}\n", soapconn->read_buf); + msn_parse_addressbook(contact); } -msn_delete_contact() +/**/ +static void +msn_address_written_cb(gpointer data, gint source, GaimInputCondition cond) { + MsnSoapConn * soapconn = data; + + gaim_debug_info("MaYuan","finish contact written\n"); + soapconn->read_cb = msn_get_address_cb; + msn_soap_read_cb(data,source,cond); } -msn_block_contact() +/*get the address book*/ +void +msn_get_address_book(MsnContact *contact) { + gaim_debug_info("MaYuan","msn_get_address_book()...\n"); + /*build SOAP and POST it*/ + contact->soapconn->login_path = g_strdup(MSN_GET_ADDRESS_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); } -msn_unblock_contact() +void +msn_add_contact(MsnContact *contact) { + } -msn_get_gleams() +void +msn_delete_contact(MsnContact *contact) +{ + +} + +void +msn_block_contact(MsnContact *contact) +{ + +} + +void +msn_unblock_contact(MsnContact *contact) +{ + +} + +void +msn_get_gleams(MsnContact *contact) { + } void Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-07-17 12:22:37 UTC (rev 16507) @@ -28,6 +28,7 @@ #define MSN_CONTACT_SERVER "contacts.msn.com" #define MSN_GET_CONTACT_POST_URL "/abservice/SharingService.asmx" +#define MSN_GET_CONTACT_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/FindMembership" #define MSN_GET_CONTACT_TEMPLATE "<?xml version='1.0' encoding='utf-8'?>"\ "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\ "<soap:Header xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\ @@ -55,7 +56,9 @@ "</soap:Body>"\ "</soap:Envelope>" -#define MSN_ADDRESS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ +#define MSN_GET_ADDRESS_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABFindAll" +#define MSN_GET_ADDRESS_POST_URL "/abservice/abservice.asmx" +#define MSN_GET_ADDRESS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\ "<soap:Header>"\ "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ @@ -97,6 +100,25 @@ "</soap:Body>"\ "</soap:Envelope>" +#define MSN_CONTACT_ADD_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactAdd" +#define MSN_CONTACT_XML "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\"><contactInfo><contactType>LivePending</contactType><passportName>%s</passportName><isMessengerUser>true</isMessengerUser></contactInfo></Contact>" + +#define MSN_ADD_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>ContactSave</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABContactAdd xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><contacts>%s</contacts><options><EnableAllowListManagement>true</EnableAllowListManagement></options></ABContactAdd></soap:Body></soap:Envelope>" + +#define MSN_CONTACT_DEL_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactDelete" +#define MSN_CONTACTS_DEL "<Contact><contactId>5e8a2e64-c271-443f-ac86-2429f3ffd18a</contactId></Contact>" +#define MSN_DEL_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><contacts>%s</contacts></ABContactDelete></soap:Body></soap:Envelope>" + +#define MSN_MEMBER_TEMPLATE "<Member xsi:type=\"PassportMember\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Type>Passport</Type><State>Accepted</State><PassportName>%s</PassportName></Member>" + +/*block means add contact to block list*/ +#define MSN_CONTACT_BLOCK_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/AddMember" +#define MSN_BLOCK_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>BlockUnblock</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><AddMember xmlns=\"http://www.msn.com/webservices/AddressBook\"><serviceHandle><Id>0</Id><Type>Messenger</Type><ForeignId></ForeignId></serviceHandle><memberships><Membership><MemberRole>Block</MemberRole><Members>%s</Members></Membership></memberships></AddMember></soap:Body></soap:Envelope>" + +/*unblock means delete contact to block list*/ +#define MSN_CONTACT_UNBLOCK_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/DeleteMember" +#define MSN_UNBLOCK_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>BlockUnblock</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><DeleteMember xmlns=\"http://www.msn.com/webservices/AddressBook\"><serviceHandle><Id>0</Id><Type>Messenger</Type><ForeignId></ForeignId></serviceHandle><memberships><Membership><MemberRole>Block</MemberRole><Members>%s</Members></Membership></memberships></DeleteMember></soap:Body></soap:Envelope>" + typedef struct _MsnContact MsnContact; struct _MsnContact @@ -108,11 +130,11 @@ /*function prototype*/ MsnContact * msn_contact_new(MsnSession *session); -void msn_get_contact_list(MsnContact * contact); +void msn_contact_destroy(MsnContact *contact); + void msn_contact_connect(MsnContact *contact); - -void msn_contact_destroy(MsnContact *contact); void msn_get_contact_list(MsnContact * contact); +void msn_get_address_book(MsnContact *contact); #endif/* _MSN_CMDPROC_H_*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/dialog.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/dialog.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/dialog.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -93,16 +93,13 @@ gaim_account_get_username(account), gaim_account_get_protocol_name(account)); - if (group_name != NULL) - { + if (group_name != NULL){ reason = g_strdup_printf(_("%s on the local list is " "inside the group \"%s\" but not on " "the server list. " "Do you want this buddy to be added?"), passport, group_name); - } - else - { + }else{ reason = g_strdup_printf(_("%s is on the local list but " "not on the server list. " "Do you want this buddy to be added?"), Modified: branches/soc-2006-msnp13/src/protocols/msn/group.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/group.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/group.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -25,18 +25,18 @@ #include "group.h" MsnGroup * -msn_group_new(MsnUserList *userlist, int id, const char *name) +msn_group_new(MsnUserList *userlist, const char *id, const char *name) { MsnGroup *group; - g_return_val_if_fail(id >= 0, NULL); + g_return_val_if_fail(id != NULL, NULL); g_return_val_if_fail(name != NULL, NULL); group = g_new0(MsnGroup, 1); msn_userlist_add_group(userlist, group); - group->id = id; + group->id = g_strdup(id); group->name = g_strdup(name); return group; @@ -47,17 +47,18 @@ { g_return_if_fail(group != NULL); + g_free(group->id); g_free(group->name); g_free(group); } void -msn_group_set_id(MsnGroup *group, int id) +msn_group_set_id(MsnGroup *group, const char *id) { g_return_if_fail(group != NULL); - g_return_if_fail(id >= 0); + g_return_if_fail(id != NULL); - group->id = id; + group->id = g_strdup(id); } void @@ -72,7 +73,7 @@ group->name = g_strdup(name); } -int +char* msn_group_get_id(const MsnGroup *group) { g_return_val_if_fail(group != NULL, -1); @@ -87,3 +88,4 @@ return group->name; } + Modified: branches/soc-2006-msnp13/src/protocols/msn/group.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/group.h 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/group.h 2006-07-17 12:22:37 UTC (rev 16507) @@ -30,17 +30,25 @@ #include "session.h" #include "user.h" - +#include "soap.h" #include "userlist.h" +#define MSN_ADD_GROUPS "<GroupInfo><name>test111</name><groupType>C8529CE2-6EAD-434d-881F-341E17DB3FF8</groupType><fMessenger>false</fMessenger><annotations><Annotation><Name>MSN.IM.Display</Name><Value>1</Value></Annotation></annotations></GroupInfo>" + +#define MSN_ADD_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>GroupSave</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupAdd xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupAddOptions><fRenameOnMsgrConflict>false</fRenameOnMsgrConflict></groupAddOptions><groupInfo>%s</groupInfo></ABGroupAdd></soap:Body></soap:Envelope>" + +#define MSN_GROUP_IDS "<guid>9e57e654-59f0-44d1-aedc-0a7500b7e51f</guid>" +#define MSN_DELETE_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupFilter><groupIds>%s</groupIds></groupFilter></ABGroupDelete></soap:Body></soap:Envelope>" + /** * A group. */ struct _MsnGroup { MsnSession *session; /**< The MSN session. */ + MsnSoapConn *soapconn; - int id; /**< The group ID. */ + char *id; /**< The group ID. */ char *name; /**< The name of the group. */ }; @@ -58,7 +66,7 @@ * * @return A new group structure. */ -MsnGroup *msn_group_new(MsnUserList *userlist, int id, const char *name); +MsnGroup *msn_group_new(MsnUserList *userlist, const char *id, const char *name); /** * Destroys a group structure. @@ -73,7 +81,7 @@ * @param group The group. * @param id The ID. */ -void msn_group_set_id(MsnGroup *group, int id); +void msn_group_set_id(MsnGroup *group, const char *id); /** * Sets the name for a group. @@ -90,7 +98,7 @@ * * @return The ID. */ -int msn_group_get_id(const MsnGroup *group); +char* msn_group_get_id(const MsnGroup *group); /** * Returns the name for a group. Modified: branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -23,6 +23,7 @@ */ #include "msn.h" #include "msn-utils.h" +//#include <openssl/md5.h> void msn_parse_format(const char *mime, char **pre_ret, char **post_ret) @@ -362,3 +363,122 @@ *ret_port = port; } +/*check the edian of system*/ +int +isBigEndian(void) +{ + short int word = 0x0100; + char *byte = (char *)&word; + + return(byte[0]); +} + +/*swap utility*/ +unsigned int +swapInt(unsigned int dw) +{ + unsigned int tmp; + tmp = (dw & 0x000000FF); + tmp = ((dw & 0x0000FF00) >> 0x08) | (tmp << 0x08); + tmp = ((dw & 0x00FF0000) >> 0x10) | (tmp << 0x08); + tmp = ((dw & 0xFF000000) >> 0x18) | (tmp << 0x08); + return(tmp); +} + +/* + * handle MSN Chanllege computation + *This algorithm reference with http://msnpiki.msnfanatic.com/index.php/MSNP11:Challenges + */ +#define BUFSIZE 256 +void +msn_handle_chl(char *input, char *output) +{ + GaimCipher *cipher; + GaimCipherContext *context; + char *productKey = MSNP13_WLM_PRODUCT_KEY, + *productID = MSNP13_WLM_PRODUCT_ID, + *hexChars = "0123456789abcdef", + buf[BUFSIZE]; + unsigned char md5Hash[16], *newHash; + unsigned int *md5Parts, *chlStringParts, newHashParts[5]; + + long long nHigh=0, nLow=0; + + int i, bigEndian; + + /* Determine our endianess */ + bigEndian = isBigEndian(); + + /* Create the MD5 hash by using Gaim MD5 algorithm*/ + cipher = gaim_ciphers_find_cipher("md5"); + context = gaim_cipher_context_new(cipher, NULL); + + gaim_cipher_context_append(context, (const guchar *)input, + strlen(input)); + gaim_cipher_context_append(context, (const guchar *)productKey, + strlen(productKey)); + gaim_cipher_context_digest(context, sizeof(md5Hash), md5Hash, NULL); + gaim_cipher_context_destroy(context); + + /* Split it into four integers */ + md5Parts = (unsigned int *)md5Hash; + for(i=0; i<4; i++){ + /* check for endianess */ + if(bigEndian) + md5Parts[i] = swapInt(md5Parts[i]); + + /* & each integer with 0x7FFFFFFF */ + /* and save one unmodified array for later */ + newHashParts[i] = md5Parts[i]; + md5Parts[i] &= 0x7FFFFFFF; + } + + /* make a new string and pad with '0' */ + snprintf(buf, BUFSIZE-5, "%s%s", input, productID); + i = strlen(buf); + memset(&buf[i], '0', 8 - (i % 8)); + buf[i + (8 - (i % 8))]='\0'; + + /* split into integers */ + chlStringParts = (unsigned int *)buf; + + /* this is magic */ + for (i=0; i<(strlen(buf)/4)-1; i+=2){ + long long temp; + + if(bigEndian){ + chlStringParts[i] = swapInt(chlStringParts[i]); + chlStringParts[i+1] = swapInt(chlStringParts[i+1]); + } + + temp=(md5Parts[0] * (((0x0E79A9C1 * (long long)chlStringParts[i]) % 0x7FFFFFFF)+nHigh) + md5Parts[1])%0x7FFFFFFF; + nHigh=(md5Parts[2] * (((long long)chlStringParts[i+1]+temp) % 0x7FFFFFFF) + md5Parts[3]) % 0x7FFFFFFF; + nLow=nLow + nHigh + temp; + } + nHigh=(nHigh+md5Parts[1]) % 0x7FFFFFFF; + nLow=(nLow+md5Parts[3]) % 0x7FFFFFFF; + + newHashParts[0]^=nHigh; + newHashParts[1]^=nLow; + newHashParts[2]^=nHigh; + newHashParts[3]^=nLow; + + /* swap more bytes if big endian */ + for(i=0; i<4 && bigEndian; i++) + newHashParts[i] = swapInt(newHashParts[i]); + + /* make a string of the parts */ + newHash = (unsigned char *)newHashParts; + + /* convert to hexadecimal */ + for (i=0; i<16; i++) + { + output[i*2]=hexChars[(newHash[i]>>4)&0xF]; + output[(i*2)+1]=hexChars[newHash[i]&0xF]; + } + + output[32]='\0'; + +// gaim_debug_info("MaYuan","chl output{%s}\n",output); +} + Modified: branches/soc-2006-msnp13/src/protocols/msn/msn-utils.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn-utils.h 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/msn-utils.h 2006-07-17 12:22:37 UTC (rev 16507) @@ -47,5 +47,9 @@ void msn_import_html(const char *html, char **attributes, char **message); void msn_parse_socket(const char *str, char **ret_host, int *ret_port); +void msn_handle_chl(char *input, char *output); +int isBigEndian(void); +unsigned int swapInt(unsigned int dw); + #endif /* _MSN_UTILS_H_ */ Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-07-17 12:22:37 UTC (rev 16507) @@ -66,6 +66,7 @@ #define WLM_SERVER "muser.messenger.hotmail.com" #define WLM_PORT 1863 #define WLM_PROT_VER 13 +#define WLM_MAX_PROTOCOL 14 #define WLM_MIN_PROTOCOL 13 #define MSN_TYPING_RECV_TIMEOUT 6 Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -37,10 +37,9 @@ nexus = g_new0(MsnNexus, 1); nexus->session = session; - nexus->soapconn = msn_soap_new(session); - nexus->soapconn->parent = nexus; /*we must use SSL connection to do Windows Live ID authentication*/ - nexus->soapconn->ssl_conn = 1; + nexus->soapconn = msn_soap_new(session,nexus,1); + nexus->challenge_data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -102,9 +102,11 @@ account = session->account; /* Allocate an array for CVR0, NULL, and all the versions */ - a = c = g_new0(char *, session->protocol_ver - WLM_MIN_PROTOCOL + 3); +// a = c = g_new0(char *, session->protocol_ver - WLM_MIN_PROTOCOL + 3); + a = c = g_new0(char *, WLM_MAX_PROTOCOL - WLM_MIN_PROTOCOL + 3); - for (i = session->protocol_ver; i >= WLM_MIN_PROTOCOL; i--) +// for (i = session->protocol_ver; i >= WLM_MIN_PROTOCOL; i--) + for (i = WLM_MAX_PROTOCOL; i >= WLM_MIN_PROTOCOL; i--) *c++ = g_strdup_printf("MSNP%d", i); *c++ = g_strdup("CVR0"); @@ -163,24 +165,16 @@ account = session->account; gc = gaim_account_get_connection(account); - if (error == 224) - { - if (group_id == 0) - { + if (error == 224){ + if (group_id == 0){ return; - } - else - { + }else{ const char *group_name; - group_name = - msn_userlist_find_group_name(session->userlist, - group_id); + group_name = msn_userlist_find_group_name(session->userlist,group_id); reason = g_strdup_printf(_("%s is not a valid group."), group_name); } - } - else - { + }else{ reason = g_strdup(_("Unknown error.")); } @@ -214,7 +208,6 @@ GaimAccount *account; account = cmdproc->session->account; - msn_cmdproc_send(cmdproc, "USR", "TWN I %s", gaim_account_get_username(account)); } @@ -303,17 +296,15 @@ g_snprintf(proto_str, sizeof(proto_str), "MSNP%d", session->protocol_ver); - for (i = 1; i < cmd->param_count; i++) - { - if (!strcmp(cmd->params[i], proto_str)) - { + for (i = 1; i < cmd->param_count; i++){ +// gaim_debug_info("MaYuan","%s\,proto_str:%s\n",cmd->params[i],proto_str); + if (!strcmp(cmd->params[i], proto_str)) { protocol_supported = TRUE; break; } } - if (!protocol_supported) - { + if (!protocol_supported){ msn_session_set_error(session, MSN_ERROR_UNSUPPORTED_PROTOCOL, NULL); return; @@ -324,7 +315,8 @@ * Notice :CVR String discriminate! */ msn_cmdproc_send(cmdproc, "CVR", - "0x0409 winnt 5.1 i386 MSG80BETA 8.0.0689 msmsgs %s", +// "0x0409 winnt 5.1 i386 MSG80BETA 8.0.0689 msmsgs %s", + "0x0804 winnt 5.1 i386 MSNMSGR 8.0.0792 msmsgs %s", gaim_account_get_username(account)); } @@ -405,18 +397,12 @@ { MsnTransaction *trans; char buf[33]; - const char *challenge_resp; - GaimCipher *cipher; - GaimCipherContext *context; - guchar digest[16]; - int i; +#if 0 cipher = gaim_ciphers_find_cipher("md5"); context = gaim_cipher_context_new(cipher, NULL); - gaim_cipher_context_append(context, (const guchar *)cmd->params[1], strlen(cmd->params[1])); - challenge_resp = MSNP13_WLM_PRODUCT_KEY; gaim_cipher_context_append(context, (const guchar *)challenge_resp, @@ -424,9 +410,13 @@ gaim_cipher_context_digest(context, sizeof(digest), digest, NULL); gaim_cipher_context_destroy(context); - for (i = 0; i < 16; i++) + for (i = 0; i < 16; i++){ g_snprintf(buf + (i*2), 3, "%02x", digest[i]); - + } +#else + msn_handle_chl(cmd->params[1], buf); +#endif + gaim_debug_info("MaYuan","<<challenge:{%s}:{%s}\n",cmd->params[1],buf); trans = msn_transaction_new(cmdproc, "QRY", "%s 32", MSNP13_WLM_PRODUCT_ID); msn_transaction_set_payload(trans, buf, 32); @@ -437,7 +427,103 @@ /************************************************************************** * Buddy Lists **************************************************************************/ +void +dump_adl_cmd(MsnSession *session) +{ + MsnCmdProc *cmdproc; + MsnTransaction *trans; + MsnUserList *userlist; + MsnUser *user; + GList *l; + xmlnode *adl_node,*d_node,*c_node; + char **tokens; + char *email,*domain; + char * payload,*attr; + char *list_op,*type; + int payload_len; + + cmdproc = session->notification->cmdproc; + userlist = session->userlist; + adl_node = xmlnode_new("ml"); + adl_node->child = NULL; + xmlnode_set_attrib(adl_node, "l", "1"); + + /*get the userlist*/ + for (l = userlist->users; l != NULL; l = l->next){ + user = l->data; + + gaim_debug_info("MaYuan","passport:%s\n",user->passport); + tokens = g_strsplit(user->passport, "@", 2); + email = tokens[0]; + domain = tokens[1]; + + /*find a domain node*/ + for(d_node = xmlnode_get_child(adl_node,"d"); d_node; d_node = xmlnode_get_next_twin(d_node)){ + gaim_debug_info("MaYuan","d_node:%s\n",d_node->name); + attr = xmlnode_get_attrib(d_node,"n"); + if(attr == NULL){ + continue; + } + if(!strcmp(attr,domain)){ + break; + } + } + if(d_node == NULL){ + gaim_debug_info("MaYuan","get No d_node\n"); + d_node = xmlnode_new("d"); + xmlnode_set_attrib(d_node,"n",domain); + xmlnode_insert_child(adl_node,d_node); + } + + /*create contact node*/ + c_node = xmlnode_new("c"); + xmlnode_set_attrib(c_node,"n",email); + + list_op = g_strdup_printf("%d",user->list_op); + gaim_debug_info("MaYuan","list_op:%d\n",user->list_op); + xmlnode_set_attrib(c_node,"l",list_op); +#if 1 + type = g_strdup_printf("%d",user->type); + xmlnode_set_attrib(c_node,"t",type); +#else + xmlnode_set_attrib(c_node,"t","1"); +#endif + xmlnode_insert_child(d_node, c_node); + + g_free(list_op); + g_free(type); + } + + payload = xmlnode_to_str(adl_node,payload_len); + + gaim_debug_info("MaYuan","ADL{%s}\n",payload); + trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload)); + + msn_transaction_set_payload(trans, payload, strlen(payload)); + + msn_cmdproc_send_trans(cmdproc, trans); +} + static void +adl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + +} + +static void +rml_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnTransaction *trans; + char * payload; + + trans = msn_transaction_new(cmdproc, "RML",""); + + msn_transaction_set_payload(trans, payload, strlen(payload)); + + msn_cmdproc_send_trans(cmdproc, trans); +} + +static void add_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnSession *session; @@ -456,13 +542,12 @@ user = msn_userlist_find_user(session->userlist, passport); - if (user == NULL) - { + if (user == NULL){ user = msn_user_new(session->userlist, passport, friendly); msn_userlist_add_user(session->userlist, user); + }else{ + msn_user_set_friendly_name(user, friendly); } - else - msn_user_set_friendly_name(user, friendly); list_id = msn_get_list_id(list); @@ -554,10 +639,6 @@ g_strfreev(params); } -static void adl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) -{ -} - static void adg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { @@ -634,8 +715,7 @@ msn_user_set_friendly_name(user, friendly); - if (session->protocol_ver >= 9 && cmd->param_count == 6) - { + if (session->protocol_ver >= 9 && cmd->param_count == 6){ msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[5])); msn_user_set_object(user, msnobj); } @@ -684,16 +764,12 @@ msn_user_set_friendly_name(user, friendly); - if (session->protocol_ver >= 9) - { - if (cmd->param_count == 5) - { + if (session->protocol_ver >= 9){ + if (cmd->param_count == 5){ msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[4])); msn_user_set_object(user, msnobj); - } - else - { + }else{ msn_user_set_object(user, NULL); } } @@ -1195,7 +1271,6 @@ /*starting retrieve the contact list*/ session->contact = msn_contact_new(session); msn_contact_connect(session->contact); - } static void @@ -1252,6 +1327,12 @@ } static void +initial_mdata_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + gaim_debug_info("MaYuan","mdata...{%s} \n",msg->body); +} + +static void email_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { MsnSession *session; @@ -1458,6 +1539,9 @@ "text/x-msmsgsprofile", profile_msg); msn_table_add_msg_type(cbs_table, + "text/x-msmsgsinitialmdatanotification", + initial_mdata_msg); + msn_table_add_msg_type(cbs_table, "text/x-msmsgsinitialemailnotification", initial_email_msg); msn_table_add_msg_type(cbs_table, Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-07-17 12:22:37 UTC (rev 16507) @@ -63,6 +63,7 @@ gboolean msn_notification_connect(MsnNotification *notification, const char *host, int port); void msn_notification_disconnect(MsnNotification *notification); +void dump_adl_cmd(MsnSession *session); /** * Closes a notification. Modified: branches/soc-2006-msnp13/src/protocols/msn/object.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/object.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/object.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -283,8 +283,7 @@ g_return_val_if_fail(sha1c != NULL, NULL); - for (l = local_objs; l != NULL; l = l->next) - { + for (l = local_objs; l != NULL; l = l->next){ MsnObject *local_obj = l->data; if (!strcmp(msn_object_get_sha1c(local_obj), sha1c)) @@ -333,3 +332,4 @@ return NULL; } + Added: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c (rev 0) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -0,0 +1,103 @@ +/** + * @file oim.c + * get and send MSN offline Instant Message via SOAP request + * Author + * MaYuan<may...@gm...> + * gaim + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include "msn.h" +#include "soap.h" +#include "oim.h" + +/*new a OIM object*/ +MsnOim * +msn_oim_new(MsnSession *session) +{ + MsnOim *oim; + + oim = g_new0(MsnOim, 1); + oim->session = session; + oim->retrieveconn = msn_soap_new(session,oim,1); + oim->sendconn = msn_soap_new(session,oim,1); + + return oim; +} + +/*destroy the oim object*/ +void +msn_oim_destroy(MsnOim *oim) +{ + msn_soap_destroy(oim->retrieveconn); + msn_soap_destroy(oim->sendconn); + g_free(oim); +} + +/*oim SOAP server login error*/ +static void +msn_oim_login_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) +{ + MsnSoapConn *soapconn = data; + MsnSession *session; + + session = soapconn->session; + g_return_if_fail(session != NULL); + + msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server")); +} + +/*msn oim SOAP server connect process*/ +static void +msn_oim_login_connect_cb(gpointer data, GaimSslConnection *gsc, + GaimInputCondition cond) +{ + MsnSoapConn *soapconn = data; + MsnSession * session; + MsnOim *oim; + + oim = soapconn->parent; + g_return_if_fail(oim != NULL); + + session = oim->session; + g_return_if_fail(session != NULL); +} + +void msn_oim_send_msg(MsnOim *oim,char * msg) +{ + if(msn_soap_connected(oim->sendconn) == -1){ + msn_soap_init(oim->sendconn,MSN_OIM_SEND_HOST,1, + msn_oim_login_connect_cb, + msn_oim_login_error_cb); + } + +} + +/*msn oim server connect*/ +void +msn_oim_connect(MsnOim *oim) +{ + gaim_debug_info("MaYuan","msn_oim_connect...\n"); + + msn_soap_init(oim->retrieveconn,MSN_OIM_RETRIEVE_HOST,1, + msn_oim_login_connect_cb, + msn_oim_login_error_cb); +} + +/*endof oim.c*/ Property changes on: branches/soc-2006-msnp13/src/protocols/msn/oim.c ___________________________________________________________________ Name: svn:eol-type:native + Name: svn:mime-type + text/plain Name: svn:eol-style + native Added: branches/soc-2006-msnp13/src/protocols/msn/oim.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.h (rev 0) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-07-17 12:22:37 UTC (rev 16507) @@ -0,0 +1,103 @@ +/** + * @file oim.h Header file for oim.c + * Author + * MaYuan<may...@gm...> + * gaim + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef _MSN_OIM_H_ +#define _MSN_OIM_H_ + +#define MSN_OIM_RETRIEVE_HOST "rsi.hotmail.com" +#define MSN_OIM_RETRIEVE__URL "/rsi/rsi.asmx" +#define MSN_OIM_GET_SOAP_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage" +#define MSN_OIM_DEL_SOAP_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/DeleteMessages" + +#define MSN_OIM_GET_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\ + "<soap:Header>"\ + "<PassportCookie xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\ + "<t>%s</t>"\ + "<p>%s</p>"\ + "</PassportCookie>"\ + "</soap:Header>"\ + "<soap:Body>"\ + "<GetMessage xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\ + "<messageId>%s</messageId>"\ + "<alsoMarkAsRead>false</alsoMarkAsRead>"\ + "</GetMessage>"\ + "</soap:Body>"\ +"</soap:Envelope>" + +#define MSN_OIM_DEL_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\ + "<soap:Header>"\ + "<PassportCookie xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\ + "<t>%s</t>"\ + " <p>%s</p>"\ + "</PassportCookie>"\ + "</soap:Header>"\ + "<soap:Body>"\ + "<DeleteMessages xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\ + "<messageIds>"\ + "<messageId>%s</messageId>"\ + "</messageIds>"\ + "</DeleteMessages>"\ + "</soap:Body>"\ +"</soap:Envelope>" + +#define MSN_OIM_SEND_HOST "ows.messenger.msn.com" +#define MSN_OIM_SEND_URL "/OimWS/oim.asmx" +#define MSN_OIM_SEND_SOAP_ACTION "http://messenger.msn.com/ws/2004/09/oim/Store" +#define MSN_OIM_SEND_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\ + "<soap:Header>"\ + "<From memberName=\"%s\" friendlyName=\"%s\" xml:lang=\"en-US\" proxy=\"MSNMSGR\" xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\" msnpVer=\"MSNP13\" buildVer=\"8.0.0689\"/>"\ + "<To memberName=\"%s\" xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\"/>"\ + "<Ticket passport=\"%s\" appid=\"%s\" lockkey=\"%s\" xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\"/>"\ + "<Sequence xmlns=\"http://schemas.xmlsoap.org/ws/2003/03/rm\">"\ + "<Identifier xmlns=\"http://schemas.xmlsoap.org/ws/2002/07/utility\">http://messenger.msn.com</Identifier>"\ + "<MessageNumber>%s</MessageNumber>"\ + "</Sequence>"\ + "</soap:Header>"\ + "<soap:Body>"\ + "<MessageType xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\">text</MessageType>"\ + "<Content xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\">%s</Content>"\ + "</soap:Body>"\ +"</soap:Envelope>" + +typedef struct _MsnOim MsnOim; + +struct _MsnOim +{ + MsnSession *session; + + MsnSoapConn *retrieveconn; + + MsnSoapConn *sendconn; + gint LockKeyChallenge; +}; + +/*function prototype*/ +MsnOim * msn_oim_new(MsnSession *session); +void msn_oim_destroy(MsnOim *oim); + +#endif/* _MSN_OIM_H_*/ +/*endof oim.h*/ Property changes on: branches/soc-2006-msnp13/src/protocols/msn/oim.h ___________________________________________________________________ Name: svn:eol-type:native + Name: svn:mime-type + text/plain Name: svn:eol-style + native Modified: branches/soc-2006-msnp13/src/protocols/msn/session.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -252,18 +252,15 @@ remote_user = msn_userlist_find_user(session->userlist, b->name); - if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP)) - { + if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP)){ int group_id; GList *l; group_id = msn_userlist_find_group_id(remote_user->userlist, group_name); - for (l = remote_user->group_ids; l != NULL; l = l->next) - { - if (group_id == GPOINTER_TO_INT(l->data)) - { + for (l = remote_user->group_ids; l != NULL; l = l->next){ + if (group_id == GPOINTER_TO_INT(l->data)){ found = TRUE; break; } @@ -271,8 +268,7 @@ } - if (!found) - { + if (!found){ /* The user was not on the server list or not in that group * on the server list */ msn_show_sync_issue(session, b->name, group_name); @@ -407,3 +403,4 @@ /* Sync users */ msn_session_sync_users(session); } + Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -26,14 +26,19 @@ #include "msn.h" #include "soap.h" +//msn_soap_new(MsnSession *session,gpointer data,int sslconn) /*new a soap connection*/ MsnSoapConn * -msn_soap_new(MsnSession *session) +msn_soap_new(MsnSession *session,gpointer data,int sslconn) { MsnSoapConn *soapconn; soapconn = g_new0(MsnSoapConn, 1); soapconn->session = session; + soapconn->parent = data; + soapconn->ssl_conn = sslconn; + + soapconn->gsc = NULL; soapconn->input_handler = -1; soapconn->output_handler = -1; return soapconn; @@ -118,6 +123,18 @@ g_free(soapconn); } +/*check the soap is connected? + * if connected return 0 + */ +int +msn_soap_connected(MsnSoapConn *soapconn) +{ + if(soapconn->ssl_conn){ + return (soapconn->gsc == NULL? -1 : 0); + } + return(soapconn->fd>0? 0 : -1); +} + /*read and append the content to the buffer*/ static gssize msn_soap_read(MsnSoapConn *soapconn) @@ -154,7 +171,7 @@ char * body_start,*body_len; char *length_start,*length_end; - gaim_debug_misc("MaYuan", "soap read cb\n"); +// gaim_debug_misc("MaYuan", "soap read cb\n"); session = soapconn->session; g_return_if_fail(session != NULL); @@ -207,6 +224,12 @@ g_free(body_len); +#if 1 + /*remove the read handler*/ + gaim_input_remove(soapconn->input_handler); + soapconn->input_handler = -1; +#endif + /*call the read callback*/ if(soapconn->read_cb != NULL){ soapconn->read_cb(soapconn,source,0); @@ -218,8 +241,8 @@ /*remove the read handler*/ gaim_input_remove(soapconn->input_handler); soapconn->input_handler = -1; - gaim_ssl_close(soapconn->gsc); - soapconn->gsc = NULL; +// gaim_ssl_close(soapconn->gsc); +// soapconn->gsc = NULL; #endif } @@ -294,9 +317,50 @@ soapconn->write_buf = write_buf; soapconn->written_len = 0; soapconn->written_cb = written_cb; + + /*clear the read buffer first*/ /*start the write*/ soapconn->output_handler = gaim_input_add(soapconn->gsc->fd, GAIM_INPUT_WRITE, msn_soap_write_cb, soapconn); msn_soap_write_cb(soapconn, soapconn->gsc->fd, GAIM_INPUT_WRITE); } +/*Post the soap action*/ +void +msn_soap_post(MsnSoapConn *soapconn,const char * body,GaimInputFunction written_cb) +{ + char * soap_head = NULL; + char * soap_body = NULL; + char * request_str = NULL; + + gaim_debug_info("MaYuan","msn_get_address_book()...\n"); + soap_body = g_strdup_printf(body); + soap_head = g_strdup_printf( + "POST %s HTTP/1.1\r\n" + "SOAPAction: %s\r\n" + "Content-Type:text/xml; charset=utf-8\r\n" + "Cookie: MSPAuth=%s\r\n" + "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n" + "Accept: text/*\r\n" + "Host: %s\r\n" + "Content-Length: %d\r\n" + "Connection: Keep-Alive\r\n" + "Cache-Control: no-cache\r\n\r\n", + soapconn->login_path, + soapconn->soap_action, + soapconn->session->passport_info.mspauth, + soapconn->login_host, + strlen(soap_body) + ); + request_str = g_strdup_printf("%s%s", soap_head,soap_body); + g_free(soapconn->login_path); + g_free(soapconn->soap_action); + g_free(soap_head); + g_free(soap_body); + + /*free read buffer*/ + msn_soap_free_read_buf(soapconn); +// gaim_debug_info("MaYuan","send to contact server{%s}\n",request_str); + msn_soap_write(soapconn,request_str,written_cb); +} + Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-07-17 12:22:37 UTC (rev 16507) @@ -35,6 +35,7 @@ char *login_host; char *login_path; + char *soap_action; /*ssl connection?*/ guint ssl_conn; @@ -69,7 +70,8 @@ /*Function Prototype*/ /*new a soap conneciton */ -MsnSoapConn *msn_soap_new(MsnSession *session); +MsnSoapConn *msn_soap_new(MsnSession *session,gpointer data,int sslconn); + /*destroy */ void msn_soap_destroy(MsnSoapConn *soapconn); @@ -78,10 +80,15 @@ /*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_free_read_buf(MsnSoapConn *soapconn); void msn_soap_free_write_buf(MsnSoapConn *soapconn); void msn_soap_connect_cb(gpointer data, GaimSslConnection *gsc, GaimInputCondition cond); void msn_soap_read_cb(gpointer data, gint source, GaimInputCondition cond); +/*check if the soap connection is connected*/ +int msn_soap_connected(MsnSoapConn *soapconn); + #endif/*_MSN_SOAP_H_*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/user.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/user.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/user.c 2006-07-17 12:22:37 UTC (rev 16507) @@ -25,6 +25,7 @@ #include "user.h" #include "slp.h" +/*new a user object*/ MsnUser * msn_user_new(MsnUserList *userlist, const char *passport, const char *store_name) @@ -50,6 +51,7 @@ return user; } +/*destroy a user object*/ void msn_user_destroy(MsnUser *user) { @@ -67,6 +69,7 @@ g_free(user->passport); g_free(user->friendly_name); g_free(user->store_name); + g_free(user->uid); g_free(user->phone.home); g_free(user->phone.work); g_free(user->phone.mobile); @@ -144,6 +147,23 @@ } void +msn_user_set_uid(MsnUser *user, const char *uid) +{ + g_return_if_fail(user != NULL); + + g_free(user->uid); + user->uid = g_strdup(uid); +} + +void +msn_user_set_type(MsnUser *user,int type) +{ + g_return_if_fail(user != NULL); + + user->type = type; +} + +void msn_user_set_buddy_icon(MsnUser *user, const char *filename) { struct stat st; @@ -152,20 +172,16 @@ g_return_if_fail(user != NULL); - if (filename == NULL || g_stat(filename, &st) == -1) - { + if (filename == NULL || g_stat(filename, &st) == -1){ msn_user_set_object(user, NULL); - } - else if ((fp = g_fopen(filename, "rb")) != NULL) - { + }else if ((fp = g_fopen(filename, "rb")) != NULL){ GaimCipherContext *ctx; char *buf; gsize len; char *base64; unsigned char digest[20]; - if (msnobj == NULL) - { + if (msnobj == NULL) { msnobj = msn_object_new(); msn_object_set_local(msnobj); msn_object_set_type(msnobj, MSN_OBJECT_USERTILE); @@ -217,16 +233,15 @@ base64 = gaim_base64_encode(digest, sizeof(digest)); msn_object_set_sha1c(msnobj, base64); g_free(base64); - } - else - { + }else{ gaim_debug_error("msn", "Unable to open buddy icon %s!\n", filename); msn_user_set_object(user, NULL); } } +/*add group id to User object*/ void -msn_user_add_group_id(MsnUser *user, int id) +msn_user_add_group_id(MsnUser *user, const char* id) { MsnUserList *userlist; GaimAccount *account; @@ -236,9 +251,9 @@ const char *group_name; g_return_if_fail(user != NULL); - g_return_if_fail(id >= 0); + g_return_if_fail(id != NULL); - user->group_ids = g_list_append(user->group_ids, GINT_TO_POINTER(id)); + user->group_ids = g_list_append(user->group_ids,id); userlist = user->userlist; account = userlist->session->account; @@ -248,16 +263,14 @@ g = gaim_find_group(group_name); - if ((id == 0) && (g == NULL)) - { + if ((id == 0) && (g == NULL)){ g = gaim_group_new(group_name); gaim_blist_add_group(g, NULL); } b = gaim_find_buddy_in_group(account, passport, g); - if (b == NULL) - { + if (b == NULL){ b = gaim_buddy_new(account, passport, NULL); gaim_blist_add_buddy(b, NULL, g, NULL); @@ -267,12 +280,12 @@ } void -msn_user_remove_group_id(MsnUser *user, int id) +msn_user_remove_group_id(MsnUser *user, const char * id) { g_return_if_fail(user != NULL); - g_return_if_fail(id >= 0); + g_return_if_fail(id != NULL); - user->group_ids = g_list_remove(user->group_ids, GINT_TO_POINTER(id)); + user->group_ids = g_list_remove(user->group_ids, id); } void Modified: branches/soc-2006-msnp13/src/protocols/msn/user.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/user.h 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/user.h 2006-07-17 12:22:37 UTC (rev 16507) @@ -45,6 +45,8 @@ char *store_name; /**< The name stored in the server. */ char *friendly_name; /**< The friendly name. */ + char * uid; /*< User Id */ + const char *status; /**< The state of the user. */ gboolean idle; /**< The idle state of the user. */ @@ -65,6 +67,7 @@ GHashTable *clientcaps; /**< The client's capabilities. */ + int type; int list_op; }; @@ -156,7 +159,7 @@ * @param user The user. * @param id The group ID. */ -void msn_user_add_group_id(MsnUser *user, int id); +void msn_user_add_group_id(MsnUser *user, const char * id); /** * Removes the group ID from a user. @@ -164,7 +167,7 @@ * @param user The user. * @param id The group ID. */ -void msn_user_remove_group_id(MsnUser *user, int id); +void msn_user_remove_group_id(MsnUser *user, const char * id); /** * Sets the home phone number for a user. @@ -182,6 +185,9 @@ */ void msn_user_set_work_phone(MsnUser *user, const char *number); +void msn_user_set_uid(MsnUser *user, const char *uid); +void msn_user_set_type(MsnUser *user,int type); + /** * Sets the mobile phone number for a user. * Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-07-17 06:22:09 UTC (rev 16506) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.c ... [truncated message content] |
From: <may...@us...> - 2006-07-23 09:19:29
|
Revision: 16546 Author: mayuan2006 Date: 2006-07-23 02:19:12 -0700 (Sun, 23 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16546&view=rev Log Message: ----------- can login sucessfully Other's can see the online status Can chat with gaim. Some bug exist! will crash Some Problem existed on group management committed by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c branches/soc-2006-msnp13/src/protocols/msn/command.c branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/group.h branches/soc-2006-msnp13/src/protocols/msn/msn.c branches/soc-2006-msnp13/src/protocols/msn/msn.h branches/soc-2006-msnp13/src/protocols/msn/nexus.c branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/notification.h branches/soc-2006-msnp13/src/protocols/msn/session.c branches/soc-2006-msnp13/src/protocols/msn/session.h branches/soc-2006-msnp13/src/protocols/msn/state.c branches/soc-2006-msnp13/src/protocols/msn/state.h branches/soc-2006-msnp13/src/protocols/msn/userlist.c Modified: branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-07-23 09:19:12 UTC (rev 16546) @@ -89,8 +89,7 @@ tmp = (incoming) ? 'S' : 'C'; - if ((show[len - 1] == '\n') && (show[len - 2] == '\r')) - { + if ((show[len - 1] == '\n') && (show[len - 2] == '\r')){ show[len - 2] = '\0'; } @@ -134,7 +133,7 @@ } msn_servconn_write(servconn, data, len); - gaim_debug_info("<<","%s",data); + gaim_debug_info("<<","%s\n",data); g_free(data); } Modified: branches/soc-2006-msnp13/src/protocols/msn/command.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-07-23 09:19:12 UTC (rev 16546) @@ -46,6 +46,7 @@ { if( (!strcmp(str,"ADL")) || (!strcmp(str,"GCF")) || + (!strcmp(str,"SG")) || (!strcmp(str,"MSG")) || (!strcmp(str,"RML")) || (!strcmp(str,"UBX")) || @@ -62,11 +63,13 @@ int msn_get_payload_position(char *str) { /*because MSG has "MSG hotmail hotmail [payload length]"*/ - if(!(strcmp(str,"MSG"))){ + if(!(strcmp(str,"MSG"))|| (!strcmp(str,"UBX")) ){ return 2; } + return 1; } + /* * set command Payload length */ @@ -76,11 +79,14 @@ char * param; if(msn_check_payload_cmd(cmd->command)){ + param = cmd->params[msn_get_payload_position(cmd->command)]; +#if 0 if(!(strcmp(cmd->command,"MSG"))){ param = cmd->params[2]; }else{ param = cmd->params[1]; } +#endif cmd->payload_len = is_num(param) ? atoi(param) : 0; }else{ cmd->payload_len = 0; Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-07-23 09:19:12 UTC (rev 16546) @@ -90,10 +90,8 @@ return MSN_LIST_AL_OP; }else if(!strcmp(role,"Block")){ return MSN_LIST_BL_OP; - }else if(!strcmp(role,"Reverse")){ - return MSN_LIST_RL_OP; - }else if(!strcmp(role,"Forward")){ - return MSN_LIST_FL_OP; +// }else if(!strcmp(role,"Reverse")){ +// return MSN_LIST_RL_OP; } return 0; } @@ -120,7 +118,7 @@ xmlnode *membershipnode,*members,*member,*passportNode,*role; session = contact->session; - gaim_debug_misc("xml","parse contact list:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); +// gaim_debug_misc("xml","parse contact list:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); // node = xmlnode_from_str(contact->soapconn->body, -1); @@ -144,22 +142,33 @@ for(membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode; membershipnode = xmlnode_get_next_twin(membershipnode)){ role = xmlnode_get_child(membershipnode,"MemberRole"); - // gaim_debug_misc("memberrole","role:%s\n",xmlnode_get_data(role)); list_op = msn_get_memberrole(xmlnode_get_data(role)); gaim_debug_misc("memberrole","role:%s,list_op:%d\n",xmlnode_get_data(role),list_op); members = xmlnode_get_child(membershipnode,"Members"); for(member = xmlnode_get_child(members, "Member"); member; member = xmlnode_get_next_twin(member)){ - passportNode = xmlnode_get_child(member,"PassportName"); - passport = xmlnode_get_data(passportNode); - gaim_debug_misc("Passport","name:%s\n",passport); - user = msn_userlist_find_user(session->userlist, passport); - if (user == NULL){ - user = msn_user_new(session->userlist, passport, ""); - msn_userlist_add_user(session->userlist, user); + xmlnode * typeNode; + char * type; + + gaim_debug_misc("MaYuan","type:%s\n",xmlnode_get_attrib(member,"type")); + if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PassportMember")){ + passportNode = xmlnode_get_child(member,"PassportName"); + passport = xmlnode_get_data(passportNode); + typeNode = xmlnode_get_child(member,"Type"); + type = xmlnode_get_data(typeNode); + gaim_debug_misc("Passport","name:%s,type:%s\n",passport,type); + user = msn_userlist_find_user(session->userlist, passport); + if (user == NULL){ + user = msn_user_new(session->userlist, passport, ""); + msn_userlist_add_user(session->userlist, user); + } +// user->list_op |= list_op; + msn_got_lst_user(session, user, list_op, NULL); } -// user->list_op |= list_op; - msn_got_lst_user(session, user, list_op, NULL); + if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PhoneMember")){ + } + if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"EmailMember")){ + } } } @@ -255,8 +264,16 @@ for(contactNode = xmlnode_get_child(contacts, "Contact"); contactNode; contactNode = xmlnode_get_next_twin(contactNode)){ MsnUser *user; + xmlnode *messengerEnableNode; char *passport,*Name,*uid,*type; + char *messengerEnable; + messengerEnableNode = xmlnode_get_child(contactNode,"isMessengerEnabled"); + messengerEnable = xmlnode_get_data(messengerEnableNode); + if(!g_strcasecmp(messengerEnable,"false")){ + continue; + } + contactId= xmlnode_get_child(contactNode,"contactId"); uid = xmlnode_get_data(contactId); @@ -265,6 +282,10 @@ type = xmlnode_get_data(contactType); passportName = xmlnode_get_child(contactInfo,"passportName"); + if(passportName == NULL){ + /*TODO: add it to the none-instant Messenger group and recognize as email Membership*/ + continue; + } passport = xmlnode_get_data(passportName); displayName = xmlnode_get_child(contactInfo,"displayName"); @@ -282,19 +303,40 @@ } msn_user_set_uid(user,uid); msn_user_set_type(user,msn_get_user_type(type)); + user->list_op |= 1; groupIds = xmlnode_get_child(contactInfo,"groupIds"); if(groupIds){ for(guid = xmlnode_get_child(groupIds, "guid");guid; guid = xmlnode_get_next_twin(guid)){ - char * group_id; + char *group_id; group_id = xmlnode_get_data(guid); msn_user_add_group_id(user,group_id); gaim_debug_misc("contact","guid:%s\n",group_id); } }else{ + char *name,*group_id; + + name = g_strdup(MSN_INDIVIDUALS_GROUP_NAME); + group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID); + + msn_user_add_group_id(user,group_id); + msn_group_new(session->userlist, group_id, name); + + if (group_id == NULL) + /* Group of ungroupped buddies */ + continue; + + if ((gaim_find_group(name)) == NULL){ + GaimGroup *g = gaim_group_new(name); + gaim_blist_add_group(g, NULL); + } + gaim_debug_misc("contact","guid is NULL\n"); + g_free(name); + g_free(group_id); + } } @@ -304,6 +346,7 @@ msn_soap_free_read_buf(contact->soapconn); dump_adl_cmd(session); + msn_set_psm(session); msn_session_finish_login(session); } Modified: branches/soc-2006-msnp13/src/protocols/msn/group.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/group.h 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/group.h 2006-07-23 09:19:12 UTC (rev 16546) @@ -40,6 +40,9 @@ #define MSN_GROUP_IDS "<guid>9e57e654-59f0-44d1-aedc-0a7500b7e51f</guid>" #define MSN_DELETE_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupFilter><groupIds>%s</groupIds></groupFilter></ABGroupDelete></soap:Body></soap:Envelope>" +#define MSN_INDIVIDUALS_GROUP_ID "0" +#define MSN_INDIVIDUALS_GROUP_NAME "Other Contacts" + /** * A group. */ Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-07-23 09:19:12 UTC (rev 16546) @@ -1116,12 +1116,9 @@ cmdproc = session->notification->cmdproc; if (account->perm_deny == GAIM_PRIVACY_ALLOW_ALL || - account->perm_deny == GAIM_PRIVACY_DENY_USERS) - { + account->perm_deny == GAIM_PRIVACY_DENY_USERS){ msn_cmdproc_send(cmdproc, "BLP", "%s", "AL"); - } - else - { + }else{ msn_cmdproc_send(cmdproc, "BLP", "%s", "BL"); } } @@ -1261,7 +1258,7 @@ { MsnSession *session; MsnCmdProc *cmdproc; - int old_gid; + const char *old_gid; const char *enc_new_group_name; session = gc->proto_data; @@ -1270,13 +1267,12 @@ old_gid = msn_userlist_find_group_id(session->userlist, old_name); - if (old_gid >= 0) - { + if (old_gid != NULL){ + /*find a Group*/ msn_cmdproc_send(cmdproc, "REG", "%d %s 0", old_gid, enc_new_group_name); - } - else - { + }else{ + /*not found*/ msn_cmdproc_send(cmdproc, "ADG", "%s 0", enc_new_group_name); } } @@ -1332,13 +1328,13 @@ { MsnSession *session; MsnCmdProc *cmdproc; - int group_id; + const char *group_id; session = gc->proto_data; cmdproc = session->notification->cmdproc; - if ((group_id = msn_userlist_find_group_id(session->userlist, group->name)) >= 0) - { + group_id = msn_userlist_find_group_id(session->userlist, group->name); + if (group_id != NULL){ msn_cmdproc_send(cmdproc, "RMG", "%d", group_id); } } @@ -1354,20 +1350,17 @@ b = gaim_find_buddy(gaim_connection_get_account(info_data->gc), info_data->name); - if (b) - { + if (b){ GString *str = g_string_new(""); char *tmp; - if (b->alias && b->alias[0]) - { + if (b->alias && b->alias[0]){ char *aliastext = g_markup_escape_text(b->alias, -1); g_string_append_printf(s, _("<b>Alias:</b> %s<br>"), aliastext); g_free(aliastext); } - if (b->server_alias) - { + if (b->server_alias){ char *nicktext = g_markup_escape_text(b->server_alias, -1); g_string_append_printf(s, _("<b>%s:</b> "), _("Nickname")); g_string_append_printf(s, "<font sml=\"msn\">%s</font><br>", @@ -1976,7 +1969,7 @@ msn_add_deny, /* add_deny */ msn_rem_permit, /* rem_permit */ msn_rem_deny, /* rem_deny */ - msn_set_permit_deny, /* set_permit_deny */ + msn_set_permit_deny, /* set_permit_deny */ NULL, /* join_chat */ NULL, /* reject chat invite */ NULL, /* get_chat_name */ Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-07-23 09:19:12 UTC (rev 16546) @@ -66,6 +66,9 @@ #define WLM_SERVER "muser.messenger.hotmail.com" #define WLM_PORT 1863 #define WLM_PROT_VER 13 +/*This MSNP14 Support chat with Yahoo Messenger*/ +#define WLM_YAHOO_PROT_VER 14 + #define WLM_MAX_PROTOCOL 14 #define WLM_MIN_PROTOCOL 13 Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-07-23 09:19:12 UTC (rev 16546) @@ -90,7 +90,7 @@ session = nexus->session; g_return_if_fail(session != NULL); - gaim_debug_misc("msn", "TWN Server Reply: {%s}\n", soapconn->read_buf); +// gaim_debug_misc("msn", "TWN Server Reply: {%s}\n", soapconn->read_buf); if (strstr(soapconn->read_buf, "HTTP/1.1 302") != NULL){ /* Redirect. */ @@ -263,7 +263,7 @@ soapconn->login_path,soapconn->login_host,strlen(tail)); request_str = g_strdup_printf("%s%s", head,tail); - gaim_debug_misc("msn", "TWN Sending: {%s}\n", request_str); +// gaim_debug_misc("msn", "TWN Sending: {%s}\n", request_str); g_free(head); g_free(tail); Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-23 09:19:12 UTC (rev 16546) @@ -113,10 +113,11 @@ vers = g_strjoinv(" ", a); - if (session->login_step == MSN_LOGIN_STEP_START) + if (session->login_step == MSN_LOGIN_STEP_START){ msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE); - else + }else{ msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE2); + } msn_cmdproc_send(cmdproc, "VER", "%s", vers); @@ -244,10 +245,13 @@ elems = g_strsplit(cmd->params[3], ",", 0); for (cur = elems; *cur != NULL; cur++){ - tokens = g_strsplit(*cur, "=", 2); + tokens = g_strsplit(*cur, "=", 2); +// gaim_debug_info("MaYuan","challenge %p,key:%s,value:%s\n", +// session->nexus->challenge_data,tokens[0],tokens[1]); + if(tokens[0]&&tokens[1]) g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]); - /* Don't free each of the tokens, only the array. */ - g_free(tokens); + /* Don't free each of the tokens, only the array. */ + g_free(tokens); } g_strfreev(elems); @@ -296,9 +300,9 @@ g_snprintf(proto_str, sizeof(proto_str), "MSNP%d", session->protocol_ver); - for (i = 1; i < cmd->param_count; i++){ -// gaim_debug_info("MaYuan","%s\,proto_str:%s\n",cmd->params[i],proto_str); - if (!strcmp(cmd->params[i], proto_str)) { + for (i = 1; i < cmd->param_count -1; i++){ + gaim_debug_info("MaYuan","%s\,proto_str:%s\n",cmd->params[i],proto_str); + if (strcmp(cmd->params[i], proto_str) >= 0) { protocol_supported = TRUE; break; } @@ -313,6 +317,8 @@ /* * Windows Live Messenger 8.0 * Notice :CVR String discriminate! + * reference of http://www.microsoft.com/globaldev/reference/oslocversion.mspx + * to see the Local ID */ msn_cmdproc_send(cmdproc, "CVR", // "0x0409 winnt 5.1 i386 MSG80BETA 8.0.0689 msmsgs %s", @@ -416,7 +422,7 @@ #else msn_handle_chl(cmd->params[1], buf); #endif - gaim_debug_info("MaYuan","<<challenge:{%s}:{%s}\n",cmd->params[1],buf); +// gaim_debug_info("MaYuan","<<challenge:{%s}:{%s}\n",cmd->params[1],buf); trans = msn_transaction_new(cmdproc, "QRY", "%s 32", MSNP13_WLM_PRODUCT_ID); msn_transaction_set_payload(trans, buf, 32); @@ -438,7 +444,7 @@ xmlnode *adl_node,*d_node,*c_node; char **tokens; char *email,*domain; - char * payload,*attr; + char *payload; char *list_op,*type; int payload_len; @@ -459,6 +465,7 @@ /*find a domain node*/ for(d_node = xmlnode_get_child(adl_node,"d"); d_node; d_node = xmlnode_get_next_twin(d_node)){ + const char * attr = NULL; gaim_debug_info("MaYuan","d_node:%s\n",d_node->name); attr = xmlnode_get_attrib(d_node,"n"); if(attr == NULL){ @@ -482,11 +489,12 @@ list_op = g_strdup_printf("%d",user->list_op); gaim_debug_info("MaYuan","list_op:%d\n",user->list_op); xmlnode_set_attrib(c_node,"l",list_op); -#if 1 +#if 0 type = g_strdup_printf("%d",user->type); xmlnode_set_attrib(c_node,"t",type); #else - xmlnode_set_attrib(c_node,"t","1"); + type = g_strdup_printf("1"); + xmlnode_set_attrib(c_node,"t",type); #endif xmlnode_insert_child(d_node, c_node); @@ -494,7 +502,7 @@ g_free(type); } - payload = xmlnode_to_str(adl_node,payload_len); + payload = xmlnode_to_str(adl_node,&payload_len); gaim_debug_info("MaYuan","ADL{%s}\n",payload); trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload)); @@ -505,9 +513,15 @@ } static void +blp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + gaim_debug_info("MaYuan","Process BLP\n"); +} + +static void adl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - + gaim_debug_info("MaYuan","Process ADL\n"); } static void @@ -766,8 +780,7 @@ if (session->protocol_ver >= 9){ if (cmd->param_count == 5){ - msnobj = - msn_object_new_from_string(gaim_url_decode(cmd->params[4])); + msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[4])); msn_user_set_object(user, msnobj); }else{ msn_user_set_object(user, NULL); @@ -1203,6 +1216,7 @@ return; } /*get the payload content*/ + gaim_debug_info("MaYuan","GCF{%s}\n",cmd->payload); } static void @@ -1215,6 +1229,18 @@ /*get the payload content*/ } +static void +ubx_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + gaim_debug_info("MaYuan","UBX... \n"); +} + +static void +uux_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + gaim_debug_info("MaYuan","UUX... \n"); +} + /************************************************************************** * Message Types **************************************************************************/ @@ -1438,38 +1464,31 @@ void msn_notification_add_buddy(MsnNotification *notification, const char *list, const char *who, const char *store_name, - int group_id) + const char *group_id) { MsnCmdProc *cmdproc; cmdproc = notification->servconn->cmdproc; - if (group_id < 0 && !strcmp(list, "FL")) - group_id = 0; + if (group_id != NULL && !strcmp(list, "FL")) - if (group_id >= 0) - { + if (group_id >= 0){ msn_cmdproc_send(cmdproc, "ADD", "%s %s %s %d", list, who, store_name, group_id); - } - else - { + }else{ msn_cmdproc_send(cmdproc, "ADD", "%s %s %s", list, who, store_name); } } void msn_notification_rem_buddy(MsnNotification *notification, const char *list, - const char *who, int group_id) + const char *who, const char *group_id) { MsnCmdProc *cmdproc; cmdproc = notification->servconn->cmdproc; - if (group_id >= 0) - { + if (group_id != NULL){ msn_cmdproc_send(cmdproc, "REM", "%s %s %d", list, who, group_id); - } - else - { + }else{ msn_cmdproc_send(cmdproc, "REM", "%s %s", list, who); } } @@ -1489,7 +1508,7 @@ msn_table_add_cmd(cbs_table, "CHG", "CHG", NULL); msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd); msn_table_add_cmd(cbs_table, "ADD", "ADD", add_cmd); - msn_table_add_cmd(cbs_table, "ADD", "ILN", iln_cmd); + msn_table_add_cmd(cbs_table, "ADL", "ILN", iln_cmd); msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd); msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); msn_table_add_cmd(cbs_table, "USR", "XFR", xfr_cmd); @@ -1499,8 +1518,8 @@ msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd); msn_table_add_cmd(cbs_table, "REA", "REA", rea_cmd); msn_table_add_cmd(cbs_table, "PRP", "PRP", prp_cmd); - /* msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd); */ - msn_table_add_cmd(cbs_table, "BLP", "BLP", NULL); + msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd); +// msn_table_add_cmd(cbs_table, "BLP", "BLP", NULL); msn_table_add_cmd(cbs_table, "REG", "REG", reg_cmd); msn_table_add_cmd(cbs_table, "ADG", "ADG", adg_cmd); msn_table_add_cmd(cbs_table, "RMG", "RMG", rmg_cmd); @@ -1515,7 +1534,7 @@ msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd); msn_table_add_cmd(cbs_table, NULL, "REM", rem_cmd); - msn_table_add_cmd(cbs_table, NULL, "ADD", add_cmd); + msn_table_add_cmd(cbs_table, NULL, "ADL", adl_cmd); msn_table_add_cmd(cbs_table, NULL, "QRY", NULL); msn_table_add_cmd(cbs_table, NULL, "QNG", NULL); @@ -1525,6 +1544,9 @@ msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd); msn_table_add_cmd(cbs_table, NULL, "RNG", rng_cmd); + msn_table_add_cmd(cbs_table, NULL, "UBX", ubx_cmd); + msn_table_add_cmd(cbs_table, NULL, "UUX", uux_cmd); + msn_table_add_cmd(cbs_table, NULL, "URL", url_cmd); msn_table_add_cmd(cbs_table, "fallback", "XFR", xfr_cmd); Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-07-23 09:19:12 UTC (rev 16546) @@ -54,10 +54,10 @@ void msn_notification_add_buddy(MsnNotification *notification, const char *list, const char *who, - const char *store_name, int group_id); + const char *store_name, const char *group_id); void msn_notification_rem_buddy(MsnNotification *notification, const char *list, const char *who, - int group_id); + const char *group_id); MsnNotification *msn_notification_new(MsnSession *session); void msn_notification_destroy(MsnNotification *notification); gboolean msn_notification_connect(MsnNotification *notification, Modified: branches/soc-2006-msnp13/src/protocols/msn/session.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-23 09:19:12 UTC (rev 16546) @@ -43,6 +43,8 @@ session->user = msn_user_new(session->userlist, gaim_account_get_username(account), NULL); + /*if you want to chat with Yahoo Messenger*/ + //session->protocol_ver = WLM_YAHOO_PROT_VER; session->protocol_ver = WLM_PROT_VER; session->conv_seq = 1; @@ -250,22 +252,22 @@ MsnUser *remote_user; gboolean found = FALSE; + gaim_debug_info("MaYuan","buddy name:%s,group name:%s\n",b->name,group_name); remote_user = msn_userlist_find_user(session->userlist, b->name); if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP)){ - int group_id; + char *group_id; GList *l; group_id = msn_userlist_find_group_id(remote_user->userlist, group_name); for (l = remote_user->group_ids; l != NULL; l = l->next){ - if (group_id == GPOINTER_TO_INT(l->data)){ + if (!g_strcasecmp(group_id ,l->data)){ found = TRUE; break; } } - } if (!found){ Modified: branches/soc-2006-msnp13/src/protocols/msn/session.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.h 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/session.h 2006-07-23 09:19:12 UTC (rev 16546) @@ -107,6 +107,9 @@ int conv_seq; /**< The current conversation sequence number. */ + /*psm info*/ + char *psm; + struct { /*t and p, get via USR TWN*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/state.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/state.c 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/state.c 2006-07-23 09:19:12 UTC (rev 16546) @@ -38,7 +38,63 @@ N_("Available") }; +char * +msn_build_psm(char * psmstr,char *mediastr,char * guidstr) +{ + xmlnode *dataNode,*psmNode,*mediaNode,*guidNode; + char *result; + int length; + + dataNode = xmlnode_new("Data"); + + psmNode = xmlnode_new("PSM"); + if(psmstr != NULL){ + xmlnode_insert_data(psmNode,psmstr,strlen(psmstr)); + } + xmlnode_insert_child(dataNode,psmNode); + +//"<CurrentMedia>\0Music\01\0{0} - {1}\0 Song Title\0Song Artist\0Song Album\0\0</CurrentMedia>\ +<CurrentMedia>\0Games\01\0Playing {0}\0Game Name\0</CurrentMedia>\ +<CurrentMedia>\0Office\01\0Office Message\0Office App Name\0</CurrentMedia>" + + mediaNode = xmlnode_new("CurrentMedia"); + if(mediastr != NULL){ + xmlnode_insert_data(psmNode,mediastr,strlen(mediastr)); + } + xmlnode_insert_child(dataNode,mediaNode); + + guidNode = xmlnode_new("MachineGuid"); + if(guidstr != NULL){ + xmlnode_insert_data(guidNode,guidstr,strlen(guidstr)); + } + xmlnode_insert_child(dataNode,guidNode); + + result = xmlnode_to_str(dataNode,&length); + return result; +} + void +msn_set_psm(MsnSession *session) +{ + MsnCmdProc *cmdproc; + MsnTransaction *trans; + char *payload; + + cmdproc = session->notification->cmdproc; + /*prepare PSM info*/ + if(session->psm){ + g_free(session->psm); + } + session ->psm = g_strdup(msn_build_psm("Hello",NULL,NULL)); + payload = session->psm; + + gaim_debug_info("MaYuan","UUX{%s}\n",payload); + trans = msn_transaction_new(cmdproc, "UUX","%d",strlen(payload)); + msn_transaction_set_payload(trans, payload, strlen(payload)); + msn_cmdproc_send_trans(cmdproc, trans); +} + +void msn_change_status(MsnSession *session) { GaimAccount *account = session->account; @@ -62,13 +118,10 @@ msnobj = msn_user_get_object(user); - if (msnobj == NULL) - { + if (msnobj == NULL){ msn_cmdproc_send(cmdproc, "CHG", "%s %d", state_text, MSN_CLIENT_ID); - } - else - { + }else{ char *msnobj_str; msnobj_str = msn_object_to_string(msnobj); Modified: branches/soc-2006-msnp13/src/protocols/msn/state.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/state.h 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/state.h 2006-07-23 09:19:12 UTC (rev 16546) @@ -59,6 +59,8 @@ const char *msn_state_get_text(MsnAwayType state); +void msn_set_psm(MsnSession *session); + MsnAwayType msn_state_from_account(GaimAccount *account); #endif /* _MSN_STATE_H_ */ Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-07-23 04:11:21 UTC (rev 16545) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-07-23 09:19:12 UTC (rev 16546) @@ -187,7 +187,7 @@ const char *old_group_name, const char *new_group_name) { MsnCmdProc *cmdproc; - MsnTransaction *trans; +// MsnTransaction *trans; MsnMoveBuddy *data; cmdproc = userlist->session->notification->cmdproc; @@ -300,29 +300,19 @@ passport = msn_user_get_passport(user); - if (list_id == MSN_LIST_FL) - { + if (list_id == MSN_LIST_FL){ /* TODO: When is the user totally removed? */ - if (group_id >= 0) - { + if (group_id != NULL){ msn_user_remove_group_id(user, group_id); return; - } - else - { + }else{ /* session->sync->fl_users_count--; */ } - } - else if (list_id == MSN_LIST_AL) - { + }else if (list_id == MSN_LIST_AL){ gaim_privacy_permit_remove(account, passport, TRUE); - } - else if (list_id == MSN_LIST_BL) - { + }else if (list_id == MSN_LIST_BL){ gaim_privacy_deny_remove(account, passport, TRUE); - } - else if (list_id == MSN_LIST_RL) - { + }else if (list_id == MSN_LIST_RL){ GaimConversation *convo; gaim_debug_info("msn", @@ -347,11 +337,9 @@ user->list_op &= ~(1 << list_id); /* gaim_user_remove_list_id (user, list_id); */ - if (user->list_op == 0) - { + if (user->list_op == 0){ gaim_debug_info("msn", "Buddy '%s' shall be deleted?.\n", passport); - } } @@ -370,13 +358,11 @@ passport = msn_user_get_passport(user); store = msn_user_get_store_name(user); - if (list_op & MSN_LIST_FL_OP) - { + if (list_op & MSN_LIST_FL_OP){ GSList *c; - for (c = group_ids; c != NULL; c = g_slist_next(c)) - { - int group_id; - group_id = GPOINTER_TO_INT(c->data); + for (c = group_ids; c != NULL; c = g_slist_next(c)) { + char *group_id; + group_id = c->data; msn_user_add_group_id(user, group_id); } @@ -485,7 +471,7 @@ g_return_val_if_fail(user->passport != NULL, NULL); - if (!strcmp(passport, user->passport)) + if (!g_strcasecmp(passport, user->passport)) return user; } @@ -515,7 +501,7 @@ for (l = userlist->groups; l != NULL; l = l->next){ MsnGroup *group = l->data; - if (!strcmp(group->id,id)) + if (!g_strcasecmp(group->id,id)) return group; } @@ -548,10 +534,11 @@ group = msn_userlist_find_group_with_name(userlist, group_name); - if (group != NULL) + if (group != NULL){ return msn_group_get_id(group); - else + }else{ return NULL; + } } const char * @@ -599,7 +586,7 @@ const char *who, int list_id, const char *group_name) { MsnUser *user; - char *group_id; + const char *group_id; const char *list; user = msn_userlist_find_user(userlist, who); @@ -635,11 +622,11 @@ const char *group_name) { MsnUser *user; - int group_id; + const char *group_id; const char *list; const char *store_name; - group_id = -1; + group_id = NULL; if (!gaim_email_is_valid(who)){ /* only notify the user about problems adding to the friends list @@ -658,7 +645,7 @@ if (group_name != NULL){ group_id = msn_userlist_find_group_id(userlist, group_name); - if (group_id < 0){ + if (group_id == NULL){ /* Whoa, we must add that group first. */ msn_request_add_group(userlist, who, NULL, group_name); return; @@ -687,11 +674,11 @@ msn_userlist_move_buddy(MsnUserList *userlist, const char *who, const char *old_group_name, const char *new_group_name) { - int new_group_id; + const char *new_group_id; new_group_id = msn_userlist_find_group_id(userlist, new_group_name); - if (new_group_id < 0){ + if (new_group_id == NULL){ msn_request_add_group(userlist, who, old_group_name, new_group_name); return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-07-23 12:19:21
|
Revision: 16547 Author: mayuan2006 Date: 2006-07-23 05:19:10 -0700 (Sun, 23 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16547&view=rev Log Message: ----------- initial Good version, Can see others' online and offline status. Can chat. Some bug exist! Committed by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/group.h branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/session.c branches/soc-2006-msnp13/src/protocols/msn/user.c branches/soc-2006-msnp13/src/protocols/msn/userlist.c Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-07-23 09:19:12 UTC (rev 16546) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-07-23 12:19:10 UTC (rev 16547) @@ -28,6 +28,7 @@ #include "soap.h" #include "contact.h" #include "xmlnode.h" +#include "group.h" /*new a contact*/ MsnContact * @@ -220,6 +221,7 @@ xmlnode *groups,*group,*groupname,*groupId,*groupInfo; xmlnode *contacts,*contactNode,*contactId,*contactInfo,*contactType,*passportName,*displayName,*groupIds,*guid; xmlnode *ab; + char *group_name,*group_id; session = contact->session; gaim_debug_misc("xml","parse addressbook:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); @@ -236,44 +238,65 @@ gaim_debug_misc("xml","response{%p},name:%s\n",response,response->name); result =xmlnode_get_child(response,"ABFindAllResult"); gaim_debug_misc("xml","result{%p},name:%s\n",result,result->name); + + /*Process Group List*/ groups =xmlnode_get_child(result,"groups"); for(group = xmlnode_get_child(groups, "Group"); group; group = xmlnode_get_next_twin(group)){ - char * name,*group_id; - groupId = xmlnode_get_child(group,"groupId"); - group_id = xmlnode_get_data(groupId); - groupInfo = xmlnode_get_child(group,"groupInfo"); - groupname = xmlnode_get_child(groupInfo,"name"); - name = xmlnode_get_data(groupname); + groupId = xmlnode_get_child(group,"groupId"); + group_id = xmlnode_get_data(groupId); + groupInfo = xmlnode_get_child(group,"groupInfo"); + groupname = xmlnode_get_child(groupInfo,"name"); + group_name = xmlnode_get_data(groupname); - msn_group_new(session->userlist, group_id, name); + msn_group_new(session->userlist, group_id, group_name); - if (group_id == NULL) - /* Group of ungroupped buddies */ - continue; + if (group_id == NULL){ + /* Group of ungroupped buddies */ + continue; + } - if ((gaim_find_group(name)) == NULL){ - GaimGroup *g = gaim_group_new(name); - gaim_blist_add_group(g, NULL); - } + gaim_debug_misc("MsnContact","group_id:%s name:%s\n",group_id,group_name); + if ((gaim_find_group(group_name)) == NULL){ + GaimGroup *g = gaim_group_new(group_name); + gaim_blist_add_group(g, NULL); + } + } + /*add a default No group to set up the no group Membership*/ + group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID); + group_name = g_strdup(MSN_INDIVIDUALS_GROUP_NAME); + msn_group_new(session->userlist,group_id , group_name); + if (group_id != NULL){ + gaim_debug_misc("MsnContact","group_id:%s name:%s,value:%d\n",group_id,group_name,*group_name=='\0'); + if ((gaim_find_group(group_name)) == NULL){ + GaimGroup *g = gaim_group_new(group_name); + gaim_blist_add_group(g, NULL); + } + } + g_free(group_name); + g_free(group_id); - gaim_debug_misc("group","name:%s,Id:{%s}\n",name,group_id); + /*add a default No group to set up the no group Membership*/ + group_id = g_strdup(MSN_NON_IM_GROUP_ID); + group_name = g_strdup(MSN_NON_IM_GROUP_NAME); + msn_group_new(session->userlist,group_id , group_name); + if (group_id != NULL){ + gaim_debug_misc("MsnContact","group_id:%s name:%s,value:%d\n",group_id,group_name,*group_name=='\0'); + if ((gaim_find_group(group_name)) == NULL){ + GaimGroup *g = gaim_group_new(group_name); + gaim_blist_add_group(g, NULL); + } } + g_free(group_name); + g_free(group_id); + /*Process contact List*/ contacts =xmlnode_get_child(result,"contacts"); for(contactNode = xmlnode_get_child(contacts, "Contact"); contactNode; contactNode = xmlnode_get_next_twin(contactNode)){ MsnUser *user; - xmlnode *messengerEnableNode; char *passport,*Name,*uid,*type; - char *messengerEnable; - messengerEnableNode = xmlnode_get_child(contactNode,"isMessengerEnabled"); - messengerEnable = xmlnode_get_data(messengerEnableNode); - if(!g_strcasecmp(messengerEnable,"false")){ - continue; - } - contactId= xmlnode_get_child(contactNode,"contactId"); uid = xmlnode_get_data(contactId); @@ -305,38 +328,42 @@ msn_user_set_type(user,msn_get_user_type(type)); user->list_op |= 1; + gaim_debug_misc("MsnContact","\n"); groupIds = xmlnode_get_child(contactInfo,"groupIds"); if(groupIds){ for(guid = xmlnode_get_child(groupIds, "guid");guid; guid = xmlnode_get_next_twin(guid)){ - char *group_id; - group_id = xmlnode_get_data(guid); msn_user_add_group_id(user,group_id); gaim_debug_misc("contact","guid:%s\n",group_id); } }else{ + group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID); + msn_user_add_group_id(user,group_id); + g_free(group_id); +#if 0 + /*not in any group,Then set default group*/ char *name,*group_id; name = g_strdup(MSN_INDIVIDUALS_GROUP_NAME); group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID); + gaim_debug_misc("MsnContact","group_id:%s name:%s\n",group_id,name); msn_user_add_group_id(user,group_id); msn_group_new(session->userlist, group_id, name); - if (group_id == NULL) - /* Group of ungroupped buddies */ - continue; - - if ((gaim_find_group(name)) == NULL){ + if (group_id != NULL){ + gaim_debug_misc("MsnContact","group_id:%s name:%s,value:%d\n",group_id,name,*name=='\0'); + if ((gaim_find_group(name)) == NULL){ GaimGroup *g = gaim_group_new(name); gaim_blist_add_group(g, NULL); + } } gaim_debug_misc("contact","guid is NULL\n"); g_free(name); g_free(group_id); - +#endif } } Modified: branches/soc-2006-msnp13/src/protocols/msn/group.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/group.h 2006-07-23 09:19:12 UTC (rev 16546) +++ branches/soc-2006-msnp13/src/protocols/msn/group.h 2006-07-23 12:19:10 UTC (rev 16547) @@ -40,9 +40,12 @@ #define MSN_GROUP_IDS "<guid>9e57e654-59f0-44d1-aedc-0a7500b7e51f</guid>" #define MSN_DELETE_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupFilter><groupIds>%s</groupIds></groupFilter></ABGroupDelete></soap:Body></soap:Envelope>" -#define MSN_INDIVIDUALS_GROUP_ID "0" +#define MSN_INDIVIDUALS_GROUP_ID "123" #define MSN_INDIVIDUALS_GROUP_NAME "Other Contacts" +#define MSN_NON_IM_GROUP_ID "email" +#define MSN_NON_IM_GROUP_NAME "Non-IM Contacts" + /** * A group. */ Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-23 09:19:12 UTC (rev 16546) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-23 12:19:10 UTC (rev 16547) @@ -713,6 +713,7 @@ GaimConnection *gc; MsnUser *user; MsnObject *msnobj; + int wlmclient; const char *state, *passport, *friendly; session = cmdproc->session; @@ -721,7 +722,8 @@ state = cmd->params[1]; passport = cmd->params[2]; - friendly = gaim_url_decode(cmd->params[3]); + wlmclient = atoi(cmd->params[3]); + friendly = gaim_url_decode(cmd->params[4]); user = msn_userlist_find_user(session->userlist, passport); @@ -729,8 +731,8 @@ msn_user_set_friendly_name(user, friendly); - if (session->protocol_ver >= 9 && cmd->param_count == 6){ - msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[5])); + if (session->protocol_ver >= 9 && cmd->param_count == 7){ + msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[6])); msn_user_set_object(user, msnobj); } @@ -762,6 +764,7 @@ MsnUser *user; MsnObject *msnobj; int clientid; + int wlmclient; const char *state, *passport, *friendly; session = cmdproc->session; @@ -770,7 +773,8 @@ state = cmd->params[0]; passport = cmd->params[1]; - friendly = gaim_url_decode(cmd->params[2]); + wlmclient = atoi(cmd->params[2]); + friendly = gaim_url_decode(cmd->params[3]); user = msn_userlist_find_user(session->userlist, passport); @@ -779,15 +783,15 @@ msn_user_set_friendly_name(user, friendly); if (session->protocol_ver >= 9){ - if (cmd->param_count == 5){ - msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[4])); + if (cmd->param_count == 6){ + msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[5])); msn_user_set_object(user, msnobj); }else{ msn_user_set_object(user, NULL); } } - clientid = atoi(cmd->params[3]); + clientid = atoi(cmd->params[4]); user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE); msn_user_set_state(user, state); Modified: branches/soc-2006-msnp13/src/protocols/msn/session.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-23 09:19:12 UTC (rev 16546) +++ branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-23 12:19:10 UTC (rev 16547) @@ -234,12 +234,15 @@ /* The core used to use msn_add_buddy to add all buddies before * being logged in. This no longer happens, so we manually iterate * over the whole buddy list to identify sync issues. */ - - for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) { + for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next){ GaimGroup *group = (GaimGroup *)gnode; const char *group_name = group->name; if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) continue; + if(!g_strcasecmp(group_name, MSN_INDIVIDUALS_GROUP_NAME) + || !g_strcasecmp(group_name,MSN_NON_IM_GROUP_NAME)){ + continue; + } for(cnode = gnode->child; cnode; cnode = cnode->next) { if(!GAIM_BLIST_NODE_IS_CONTACT(cnode)) continue; @@ -248,7 +251,7 @@ if(!GAIM_BLIST_NODE_IS_BUDDY(bnode)) continue; b = (GaimBuddy *)bnode; - if(b->account == gc->account) { + if(b->account == gc->account){ MsnUser *remote_user; gboolean found = FALSE; @@ -256,11 +259,14 @@ remote_user = msn_userlist_find_user(session->userlist, b->name); if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP)){ - char *group_id; + const char *group_id; GList *l; group_id = msn_userlist_find_group_id(remote_user->userlist, group_name); + if(group_id == NULL){ + continue; + } for (l = remote_user->group_ids; l != NULL; l = l->next){ if (!g_strcasecmp(group_id ,l->data)){ Modified: branches/soc-2006-msnp13/src/protocols/msn/user.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/user.c 2006-07-23 09:19:12 UTC (rev 16546) +++ branches/soc-2006-msnp13/src/protocols/msn/user.c 2006-07-23 12:19:10 UTC (rev 16547) @@ -261,9 +261,11 @@ group_name = msn_userlist_find_group_name(userlist, id); + gaim_debug_info("User","group id:%s,name:%s,user:%s\n",id,group_name,passport); + g = gaim_find_group(group_name); - if ((id == 0) && (g == NULL)){ + if ((id == NULL) && (g == NULL)){ g = gaim_group_new(group_name); gaim_blist_add_group(g, NULL); } Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-07-23 09:19:12 UTC (rev 16546) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-07-23 12:19:10 UTC (rev 16547) @@ -468,11 +468,13 @@ for (l = userlist->users; l != NULL; l = l->next){ MsnUser *user = (MsnUser *)l->data; - +// gaim_debug_info("MsnUserList","user passport:%s,passport:%s\n",user->passport,passport); g_return_val_if_fail(user->passport != NULL, NULL); - if (!g_strcasecmp(passport, user->passport)) + if (!g_strcasecmp(passport, user->passport)){ +// gaim_debug_info("MsnUserList","return:%p\n",user); return user; + } } return NULL; @@ -516,11 +518,10 @@ g_return_val_if_fail(userlist != NULL, NULL); g_return_val_if_fail(name != NULL, NULL); - for (l = userlist->groups; l != NULL; l = l->next) - { + for (l = userlist->groups; l != NULL; l = l->next){ MsnGroup *group = l->data; - if ((group->name != NULL) && !g_ascii_strcasecmp(name, group->name)) + if ((group->name != NULL) && !g_strcasecmp(name, group->name)) return group; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-07-30 13:51:03
|
Revision: 16600 Author: mayuan2006 Date: 2006-07-30 06:44:34 -0700 (Sun, 30 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16600&view=rev Log Message: ----------- change to add SOAP HTTP header retrieve Now Can do the OIM Message XML process submitted by Ma Yuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c branches/soc-2006-msnp13/src/protocols/msn/contact.h branches/soc-2006-msnp13/src/protocols/msn/msg.c branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/oim.h branches/soc-2006-msnp13/src/protocols/msn/session.c branches/soc-2006-msnp13/src/protocols/msn/session.h branches/soc-2006-msnp13/src/protocols/msn/soap.c Modified: branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/cmdproc.c 2006-07-30 13:44:34 UTC (rev 16600) @@ -133,7 +133,7 @@ } msn_servconn_write(servconn, data, len); - gaim_debug_info("<<","%s\n",data); +// gaim_debug_info("<<","%s\n",data); g_free(data); } Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-07-30 13:44:34 UTC (rev 16600) @@ -27,6 +27,7 @@ #define MSN_CONTACT_SERVER "contacts.msn.com" +/*get contact list soap request template*/ #define MSN_GET_CONTACT_POST_URL "/abservice/SharingService.asmx" #define MSN_GET_CONTACT_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/FindMembership" #define MSN_GET_CONTACT_TEMPLATE "<?xml version='1.0' encoding='utf-8'?>"\ @@ -56,6 +57,7 @@ "</soap:Body>"\ "</soap:Envelope>" +/*get addressbook soap request template*/ #define MSN_GET_ADDRESS_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABFindAll" #define MSN_GET_ADDRESS_POST_URL "/abservice/abservice.asmx" #define MSN_GET_ADDRESS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ @@ -78,6 +80,7 @@ "</soap:Body>"\ "</soap:Envelope>" +/*Gleams SOAP request template*/ #define MSN_GLEAMS_TEMPLATE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\ "<soap:Header>"\ @@ -100,11 +103,13 @@ "</soap:Body>"\ "</soap:Envelope>" +/*add conatct soap request*/ #define MSN_CONTACT_ADD_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactAdd" #define MSN_CONTACT_XML "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\"><contactInfo><contactType>LivePending</contactType><passportName>%s</passportName><isMessengerUser>true</isMessengerUser></contactInfo></Contact>" #define MSN_ADD_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>ContactSave</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABContactAdd xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><contacts>%s</contacts><options><EnableAllowListManagement>true</EnableAllowListManagement></options></ABContactAdd></soap:Body></soap:Envelope>" +/*delete contact from contact list soap request template*/ #define MSN_CONTACT_DEL_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactDelete" #define MSN_CONTACTS_DEL "<Contact><contactId>5e8a2e64-c271-443f-ac86-2429f3ffd18a</contactId></Contact>" #define MSN_DEL_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><contacts>%s</contacts></ABContactDelete></soap:Body></soap:Envelope>" Modified: branches/soc-2006-msnp13/src/protocols/msn/msg.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-07-30 13:44:34 UTC (rev 16600) @@ -214,7 +214,7 @@ char **elems, **cur, **tokens; g_return_if_fail(payload != NULL); - + gaim_debug_info("MaYuan","payload:{%s}\n",payload); tmp_base = tmp = g_malloc0(payload_len + 1); memcpy(tmp_base, payload, payload_len); Modified: branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c 2006-07-30 13:44:34 UTC (rev 16600) @@ -386,7 +386,7 @@ } /* - * handle MSN Chanllege computation + * Handle MSN Chanllege computation *This algorithm reference with http://msnpiki.msnfanatic.com/index.php/MSNP11:Challenges */ #define BUFSIZE 256 Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-30 13:44:34 UTC (rev 16600) @@ -390,6 +390,7 @@ }else{ g_return_if_fail(cmd->payload_cb != NULL); + gaim_debug_info("MaYuan","MSG payload:{%s}\n",cmd->payload); cmd->payload_cb(cmdproc, cmd, cmd->payload, cmd->payload_len); } } @@ -1359,7 +1360,40 @@ static void initial_mdata_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { - gaim_debug_info("MaYuan","mdata...{%s} \n",msg->body); + MsnSession *session; + xmlnode *mdNode; + char *end; + char **elems, **cur, **tokens; + +// gaim_debug_info("MaYuan","mdata...{%s} \n",msg->body); + + /*new a oim session*/ + session = cmdproc->session; + session->oim = msn_oim_new(session); + + /*parse offline message data*/ + elems = g_strsplit(msg->body, "\r\n", 0); + for (cur = elems; *cur != NULL; cur++){ + const char *key, *value; + +// gaim_debug_info("MaYuan","cur:{%s}\n",*cur); + tokens = g_strsplit(*cur, ": ", 2); + + key = tokens[0]; + value = tokens[1]; + + /*if not MIME content ,then return*/ + if ((key != NULL) && (!strcmp(key, "Mail-Data")) ){ +// gaim_debug_info("MaYuan","data:{%s}\n",value); + msn_parse_oim_msg(session->oim,value); + g_strfreev(tokens); + break; + } + + g_strfreev(tokens); + } + + g_strfreev(elems); } static void Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-07-30 13:44:34 UTC (rev 16600) @@ -79,7 +79,7 @@ g_return_if_fail(session != NULL); } -void msn_oim_send_msg(MsnOim *oim,char * msg) +void msn_oim_send_msg(MsnOim *oim,char *msg) { if(msn_soap_connected(oim->sendconn) == -1){ msn_soap_init(oim->sendconn,MSN_OIM_SEND_HOST,1, @@ -89,6 +89,108 @@ } +static void +msn_oim_get_read_cb(gpointer data, GaimSslConnection *gsc, + GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + MsnOim * msnoim; + + gaim_debug_info("MaYuan","read buffer:{%s}\n",soapconn->body); +} + +static void +msn_oim_get_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + soapconn->read_cb = msn_oim_get_read_cb; + msn_soap_read_cb(data,source,cond); +} +/* +static void +msn_oim_login_connect_cb(gpointer data, GaimSslConnection *gsc, + GaimInputCondition cond) +{ + +}*/ + +static GaimConversation * +msn_oim_get_conv(MsnOim *oim,char *passport) +{ + GaimAccount *account; + GaimConversation * conv; + + g_return_val_if_fail(oim != NULL, NULL); + account = oim->session->account; + + conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, + passport, account); + if(conv == NULL){ + conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, account, passport); + } + return conv; +} + +void +msn_oim_report_user(MsnOim *oim,const char *passport,char *msg) +{ + GaimConversation * conv; + + if ((conv = msn_oim_get_conv(oim,passport)) != NULL){ + gaim_conversation_write(conv, NULL, msg, GAIM_MESSAGE_SYSTEM, time(NULL)); + } + +} + +void +msn_parse_oim_msg(MsnOim *oim,char *xmlmsg) +{ + xmlnode *mdNode,*mNode,*INode,*nNode,*ENode,*rtNode; + char *passport,*rTime,*msgid,*nickname; + + mdNode = xmlnode_from_str(xmlmsg, strlen(xmlmsg)); + for(mNode = xmlnode_get_child(mdNode, "M"); mNode; + mNode = xmlnode_get_next_twin(mNode)){ + INode = xmlnode_get_child(mNode,"E"); + passport = xmlnode_get_data(INode); + INode = xmlnode_get_child(mNode,"I"); + msgid = xmlnode_get_data(INode); + rtNode = xmlnode_get_child(mNode,"RT"); + rTime = xmlnode_get_data(rtNode); + nNode = xmlnode_get_child(mNode,"N"); + nickname = xmlnode_get_data(nNode); + gaim_debug_info("MaYuan","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); + msn_oim_report_user(oim,passport,"hello"); +// msn_oim_get_msg(oim,msgid); + } +} + +void msn_oim_get_msg(MsnOim *oim,char *msgid) +{ + const char *oimid ,*oimsoapbody,*t,*p; + + if(msn_soap_connected(oim->retrieveconn) == -1){ + gaim_debug_info("MaYuan","retreive OIM server not connected!\n"); + msn_soap_init(oim->retrieveconn,MSN_OIM_RETRIEVE_HOST,1, + msn_oim_login_connect_cb, + msn_oim_login_error_cb); + return; + } + + oim->retrieveconn->login_path = g_strdup(MSN_OIM_RETRIEVE__URL); + oim->retrieveconn->soap_action = g_strdup(MSN_OIM_DEL_SOAP_ACTION); + t = oim->session->passport_info.t; + p = oim->session->passport_info.p; + + oimsoapbody = g_strdup_printf(MSN_OIM_GET_TEMPLATE, + t, + p, + msgid + ); + msn_soap_post(oim->retrieveconn, oimsoapbody, msn_oim_get_written_cb); +} + /*msn oim server connect*/ void msn_oim_connect(MsnOim *oim) Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-07-30 13:44:34 UTC (rev 16600) @@ -98,6 +98,8 @@ /*function prototype*/ MsnOim * msn_oim_new(MsnSession *session); void msn_oim_destroy(MsnOim *oim); +void msn_parse_oim_msg(MsnOim *oim,char *xmlmsg); +void msn_oim_get_msg(MsnOim *oim,char *msgid); #endif/* _MSN_OIM_H_*/ /*endof oim.h*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/session.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-07-30 13:44:34 UTC (rev 16600) @@ -91,6 +91,11 @@ if (session->nexus != NULL) msn_nexus_destroy(session->nexus); + if (session->contact != NULL) + msn_contact_destroy(session->contact); + if (session->oim != NULL) + msn_oim_destroy(session->oim); + if (session->user != NULL) msn_user_destroy(session->user); Modified: branches/soc-2006-msnp13/src/protocols/msn/session.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.h 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/session.h 2006-07-30 13:44:34 UTC (rev 16600) @@ -39,6 +39,7 @@ #include "nexus.h" #include "httpconn.h" #include "contact.h" +#include "oim.h" #include "userlist.h" #include "sync.h" @@ -96,6 +97,7 @@ MsnNotification *notification; MsnNexus *nexus; MsnContact *contact; + MsnOim *oim; MsnSync *sync; MsnUserList *userlist; Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-07-29 22:03:25 UTC (rev 16599) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-07-30 13:44:34 UTC (rev 16600) @@ -117,7 +117,9 @@ msn_soap_free_write_buf(soapconn); /*close ssl connection*/ - gaim_ssl_close(soapconn->gsc); + if(soapconn->gsc != NULL){ + gaim_ssl_close(soapconn->gsc); + } soapconn->gsc = NULL; g_free(soapconn); @@ -199,41 +201,104 @@ return; } - body_start = (char *)g_strstr_len(soapconn->read_buf, soapconn->read_len,"\r\n\r\n"); - if(!body_start){ - return; + if (strstr(soapconn->read_buf, "HTTP/1.1 302") != NULL) + { + /* Redirect. */ + char *location, *c; + + location = strstr(soapconn->read_buf, "Location: "); + if (location == NULL) + { + msn_soap_free_read_buf(soapconn); + + return; + } + location = strchr(location, ' ') + 1; + + if ((c = strchr(location, '\r')) != NULL) + *c = '\0'; + + /* Skip the http:// */ + if ((c = strchr(location, '/')) != NULL) + location = c + 2; + + if ((c = strchr(location, '/')) != NULL) + { + g_free(soapconn->login_path); + soapconn->login_path = g_strdup(c); + + *c = '\0'; + } + + g_free(soapconn->login_host); + soapconn->login_host = g_strdup(location); + + gaim_ssl_connect(session->account, soapconn->login_host, + GAIM_SSL_DEFAULT_PORT, msn_soap_connect_cb, + msn_soap_error_cb, soapconn); } - body_start += 4; + else if (strstr(soapconn->read_buf, "HTTP/1.1 401 Unauthorized") != NULL) + { + const char *error; -// gaim_debug_misc("msn", "Soap Read: {%s}\n", soapconn->read_buf); + if ((error = strstr(soapconn->read_buf, "WWW-Authenticate")) != NULL) + { + if ((error = strstr(error, "cbtxt=")) != NULL) + { + const char *c; + char *temp; - /* we read the content-length*/ - length_start = strstr(soapconn->read_buf, "Content-Length: "); - length_start += strlen("Content-Length: "); - length_end = strstr(length_start, "\r\n"); - body_len = g_strndup(length_start,length_end - length_start); + error += strlen("cbtxt="); - /*setup the conn body */ - soapconn->body = body_start; - soapconn->body_len = atoi(body_len); -// gaim_debug_misc("MaYuan","content length :%d",soapconn->body_len); + if ((c = strchr(error, '\n')) == NULL) + c = error + strlen(error); - if(soapconn->read_len < body_start - soapconn->read_buf + atoi(body_len)){ - return; + temp = g_strndup(error, c - error); + error = gaim_url_decode(temp); + g_free(temp); + } + } + + msn_session_set_error(session, MSN_ERROR_SERV_UNAVAILABLE, error); } + else if (strstr(soapconn->read_buf, "HTTP/1.1 200 OK")) + { + /*OK! process the SOAP body*/ + body_start = (char *)g_strstr_len(soapconn->read_buf, soapconn->read_len,"\r\n\r\n"); + if(!body_start){ + return; + } + body_start += 4; - g_free(body_len); + // gaim_debug_misc("msn", "Soap Read: {%s}\n", soapconn->read_buf); + /* we read the content-length*/ + length_start = strstr(soapconn->read_buf, "Content-Length: "); + length_start += strlen("Content-Length: "); + length_end = strstr(length_start, "\r\n"); + body_len = g_strndup(length_start,length_end - length_start); + + /*setup the conn body */ + soapconn->body = body_start; + soapconn->body_len = atoi(body_len); + // gaim_debug_misc("MaYuan","content length :%d",soapconn->body_len); + + if(soapconn->read_len < body_start - soapconn->read_buf + atoi(body_len)){ + return; + } + + g_free(body_len); + #if 1 - /*remove the read handler*/ - gaim_input_remove(soapconn->input_handler); - soapconn->input_handler = -1; + /*remove the read handler*/ + gaim_input_remove(soapconn->input_handler); + soapconn->input_handler = -1; #endif - /*call the read callback*/ - if(soapconn->read_cb != NULL){ - soapconn->read_cb(soapconn,source,0); - } + /*call the read callback*/ + if(soapconn->read_cb != NULL){ + soapconn->read_cb(soapconn,source,0); + } #if 0 /*clear the read buffer*/ msn_soap_free_read_buf(soapconn); @@ -241,9 +306,10 @@ /*remove the read handler*/ gaim_input_remove(soapconn->input_handler); soapconn->input_handler = -1; -// gaim_ssl_close(soapconn->gsc); -// soapconn->gsc = NULL; + // gaim_ssl_close(soapconn->gsc); + // soapconn->gsc = NULL; #endif + } } void @@ -360,7 +426,7 @@ /*free read buffer*/ msn_soap_free_read_buf(soapconn); -// gaim_debug_info("MaYuan","send to contact server{%s}\n",request_str); + gaim_debug_info("MaYuan","send to server{%s}\n",request_str); msn_soap_write(soapconn,request_str,written_cb); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-07-30 15:55:40
|
Revision: 16601 Author: mayuan2006 Date: 2006-07-30 08:55:30 -0700 (Sun, 30 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16601&view=rev Log Message: ----------- change Windows Live ID authentication code style to simplify the code. add some comments committed by Ma Yuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/nexus.c branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/oim.h Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-07-30 13:44:34 UTC (rev 16600) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-07-30 15:55:30 UTC (rev 16601) @@ -415,30 +415,35 @@ msn_soap_post(contact->soapconn,MSN_GET_ADDRESS_TEMPLATE,msn_address_written_cb); } +/*add a Contact */ void msn_add_contact(MsnContact *contact) { } +/*delete a Contact*/ void msn_delete_contact(MsnContact *contact) { } +/*block a Contact*/ void msn_block_contact(MsnContact *contact) { } +/*unblock a contact*/ void msn_unblock_contact(MsnContact *contact) { } +/*get the gleams info*/ void msn_get_gleams(MsnContact *contact) { Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-07-30 13:44:34 UTC (rev 16600) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-07-30 15:55:30 UTC (rev 16601) @@ -26,6 +26,9 @@ #include "nexus.h" #include "notification.h" +/*Local Function Prototype*/ +static void nexus_login_connect_cb(gpointer data, GaimSslConnection *gsc,GaimInputCondition cond); + /************************************************************************** * Main **************************************************************************/ @@ -59,13 +62,8 @@ /************************************************************************** * Login **************************************************************************/ - static void -login_connect_cb(gpointer data, GaimSslConnection *gsc, - GaimInputCondition cond); - -static void -login_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) +nexus_login_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) { MsnSoapConn * soapconn = data; MsnSession *session; @@ -78,6 +76,7 @@ * to destroy it here, or we'd crash */ } +/*process the SOAP reply, get the Authentication Info*/ static void nexus_login_read_cb(gpointer data, gint source, GaimInputCondition cond) { @@ -85,6 +84,12 @@ MsnNexus *nexus; MsnSession *session; + char *base, *c; + char *msn_twn_t,*msn_twn_p; + char *login_params; + char **elems, **cur, **tokens; + char * cert_str; + nexus = soapconn->parent; g_return_if_fail(nexus != NULL); session = nexus->session; @@ -92,107 +97,52 @@ // gaim_debug_misc("msn", "TWN Server Reply: {%s}\n", soapconn->read_buf); - if (strstr(soapconn->read_buf, "HTTP/1.1 302") != NULL){ - /* Redirect. */ - char *location, *c; + /*reply OK, we should process the SOAP body*/ + gaim_debug_info("MaYuan","Windows Live ID Reply OK!\n"); - location = strstr(soapconn->read_buf, "Location: "); - if (location == NULL){ - msn_soap_free_read_buf(soapconn); - return; - } - location = strchr(location, ' ') + 1; + //TODO: we should parse it using XML + base = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_START_TOKEN); + base += strlen(TWN_START_TOKEN); + c = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_END_TOKEN); + login_params = g_strndup(base, c - base); - if ((c = strchr(location, '\r')) != NULL) - *c = '\0'; + // gaim_debug_info("msn", "TWN Cert: {%s}\n", login_params); - /* Skip the http:// */ - if ((c = strchr(location, '/')) != NULL) - location = c + 2; + /* Parse the challenge data. */ + elems = g_strsplit(login_params, "&", 0); - if ((c = strchr(location, '/')) != NULL){ - g_free(soapconn->login_path); - soapconn->login_path = g_strdup(c); + for (cur = elems; *cur != NULL; cur++){ + tokens = g_strsplit(*cur, "=", 2); + g_hash_table_insert(nexus->challenge_data, tokens[0], tokens[1]); + /* Don't free each of the tokens, only the array. */ + g_free(tokens); + } - *c = '\0'; - } - g_free(soapconn->login_host); + g_strfreev(elems); - msn_soap_init(soapconn,location,1,login_connect_cb,login_error_cb); - }else if (strstr(soapconn->read_buf, "HTTP/1.1 401 Unauthorized") != NULL){ - const char *error; + msn_twn_t = (char *)g_hash_table_lookup(nexus->challenge_data, "t"); + msn_twn_p = (char *)g_hash_table_lookup(nexus->challenge_data, "p"); - if ((error = strstr(soapconn->read_buf, "WWW-Authenticate")) != NULL) { - if ((error = strstr(error, "cbtxt=")) != NULL){ - const char *c; - char *temp; - - error += strlen("cbtxt="); - - if ((c = strchr(error, '\n')) == NULL) - c = error + strlen(error); - - temp = g_strndup(error, c - error); - error = gaim_url_decode(temp); - g_free(temp); - } - } - msn_session_set_error(session, MSN_ERROR_AUTH, error); - }else if (strstr(soapconn->read_buf, "HTTP/1.1 200 OK")){ - /*reply OK, we should process the SOAP body*/ - char *base, *c; - char *msn_twn_t,*msn_twn_p; - char *login_params; - - char **elems, **cur, **tokens; - char * cert_str; - - gaim_debug_info("MaYuan","Windows Live ID Reply OK!\n"); - - //TODO: we should parse it using XML - base = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_START_TOKEN); - base += strlen(TWN_START_TOKEN); - c = g_strstr_len(soapconn->read_buf, soapconn->read_len, TWN_END_TOKEN); - login_params = g_strndup(base, c - base); - -// gaim_debug_info("msn", "TWN Cert: {%s}\n", login_params); - - /* Parse the challenge data. */ - elems = g_strsplit(login_params, "&", 0); - - for (cur = elems; *cur != NULL; cur++){ - tokens = g_strsplit(*cur, "=", 2); - g_hash_table_insert(nexus->challenge_data, tokens[0], tokens[1]); - /* Don't free each of the tokens, only the array. */ - g_free(tokens); - } - - g_strfreev(elems); - - msn_twn_t = (char *)g_hash_table_lookup(nexus->challenge_data, "t"); - msn_twn_p = (char *)g_hash_table_lookup(nexus->challenge_data, "p"); - - /*setup the t and p parameter for session*/ - if (session->passport_info.t != NULL){ + /*setup the t and p parameter for session*/ + if (session->passport_info.t != NULL){ g_free(session->passport_info.t); - } - session->passport_info.t = g_strdup(msn_twn_t); + } + session->passport_info.t = g_strdup(msn_twn_t); - if (session->passport_info.p != NULL) + if (session->passport_info.p != NULL) g_free(session->passport_info.p); - session->passport_info.p = g_strdup(msn_twn_p); + session->passport_info.p = g_strdup(msn_twn_p); - cert_str = g_strdup_printf("t=%s&p=%s",msn_twn_t,msn_twn_p); - msn_got_login_params(session, cert_str); + cert_str = g_strdup_printf("t=%s&p=%s",msn_twn_t,msn_twn_p); + msn_got_login_params(session, cert_str); - gaim_debug_info("MaYuan","close nexus connection! \n"); - g_free(cert_str); - g_free(login_params); - msn_nexus_destroy(nexus); - session->nexus = NULL; - return; - } - msn_soap_free_read_buf(soapconn); + gaim_debug_info("MaYuan","close nexus connection! \n"); + g_free(cert_str); + g_free(login_params); + msn_nexus_destroy(nexus); + session->nexus = NULL; + + return; } static void @@ -205,8 +155,9 @@ } +/*when connect, do the SOAP Style windows Live ID authentication */ void -login_connect_cb(gpointer data, GaimSslConnection *gsc, +nexus_login_connect_cb(gpointer data, GaimSslConnection *gsc, GaimInputCondition cond) { MsnSoapConn *soapconn; @@ -285,6 +236,6 @@ /* Authenticate via Windows Live ID. */ gaim_debug_info("MaYuan","msn_nexus_connect...\n"); - msn_soap_init(nexus->soapconn,MSN_TWN_SERVER,1,login_connect_cb,login_error_cb); + msn_soap_init(nexus->soapconn,MSN_TWN_SERVER,1,nexus_login_connect_cb,nexus_login_error_cb); } Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-30 13:44:34 UTC (rev 16600) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-07-30 15:55:30 UTC (rev 16601) @@ -1370,6 +1370,7 @@ /*new a oim session*/ session = cmdproc->session; session->oim = msn_oim_new(session); +// msn_oim_connect(session->oim); /*parse offline message data*/ elems = g_strsplit(msg->body, "\r\n", 0); Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-07-30 13:44:34 UTC (rev 16600) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-07-30 15:55:30 UTC (rev 16601) @@ -50,9 +50,12 @@ g_free(oim); } +/**************************************** + * OIM send SOAP request + * **************************************/ /*oim SOAP server login error*/ static void -msn_oim_login_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) +msn_oim_send_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) { MsnSoapConn *soapconn = data; MsnSession *session; @@ -65,7 +68,7 @@ /*msn oim SOAP server connect process*/ static void -msn_oim_login_connect_cb(gpointer data, GaimSslConnection *gsc, +msn_oim_send_connect_cb(gpointer data, GaimSslConnection *gsc, GaimInputCondition cond) { MsnSoapConn *soapconn = data; @@ -83,13 +86,45 @@ { if(msn_soap_connected(oim->sendconn) == -1){ msn_soap_init(oim->sendconn,MSN_OIM_SEND_HOST,1, - msn_oim_login_connect_cb, - msn_oim_login_error_cb); + msn_oim_send_connect_cb, + msn_oim_send_error_cb); } } +/**************************************** + * OIM get SOAP request + * **************************************/ +/*oim SOAP server login error*/ static void +msn_oim_get_error_cb(GaimSslConnection *gsc, GaimSslErrorType error, void *data) +{ + MsnSoapConn *soapconn = data; + MsnSession *session; + + session = soapconn->session; + g_return_if_fail(session != NULL); + + msn_session_set_error(session, MSN_ERROR_SERV_DOWN, _("Unable to connect to OIM server")); +} + +/*msn oim SOAP server connect process*/ +static void +msn_oim_get_connect_cb(gpointer data, GaimSslConnection *gsc, + GaimInputCondition cond) +{ + MsnSoapConn *soapconn = data; + MsnSession * session; + MsnOim *oim; + + oim = soapconn->parent; + g_return_if_fail(oim != NULL); + + session = oim->session; + g_return_if_fail(session != NULL); +} + +static void msn_oim_get_read_cb(gpointer data, GaimSslConnection *gsc, GaimInputCondition cond) { @@ -107,14 +142,8 @@ soapconn->read_cb = msn_oim_get_read_cb; msn_soap_read_cb(data,source,cond); } -/* -static void -msn_oim_login_connect_cb(gpointer data, GaimSslConnection *gsc, - GaimInputCondition cond) -{ - -}*/ +/*get the conversation*/ static GaimConversation * msn_oim_get_conv(MsnOim *oim,char *passport) { @@ -132,6 +161,7 @@ return conv; } +/*put the OIM Message to User Conversation*/ void msn_oim_report_user(MsnOim *oim,const char *passport,char *msg) { @@ -143,6 +173,7 @@ } +/*parse the oim XML data*/ void msn_parse_oim_msg(MsnOim *oim,char *xmlmsg) { @@ -161,25 +192,24 @@ nNode = xmlnode_get_child(mNode,"N"); nickname = xmlnode_get_data(nNode); gaim_debug_info("MaYuan","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); - msn_oim_report_user(oim,passport,"hello"); -// msn_oim_get_msg(oim,msgid); +// msn_oim_report_user(oim,passport,"hello"); + msn_oim_get_msg(oim,msgid); } } +/*MSN OIM get SOAP request*/ void msn_oim_get_msg(MsnOim *oim,char *msgid) { const char *oimid ,*oimsoapbody,*t,*p; if(msn_soap_connected(oim->retrieveconn) == -1){ gaim_debug_info("MaYuan","retreive OIM server not connected!\n"); - msn_soap_init(oim->retrieveconn,MSN_OIM_RETRIEVE_HOST,1, - msn_oim_login_connect_cb, - msn_oim_login_error_cb); return; } + gaim_debug_info("MaYuan","Get OIM with SOAP \n"); oim->retrieveconn->login_path = g_strdup(MSN_OIM_RETRIEVE__URL); - oim->retrieveconn->soap_action = g_strdup(MSN_OIM_DEL_SOAP_ACTION); + oim->retrieveconn->soap_action = g_strdup(MSN_OIM_GET_SOAP_ACTION); t = oim->session->passport_info.t; p = oim->session->passport_info.p; @@ -198,8 +228,11 @@ gaim_debug_info("MaYuan","msn_oim_connect...\n"); msn_soap_init(oim->retrieveconn,MSN_OIM_RETRIEVE_HOST,1, - msn_oim_login_connect_cb, - msn_oim_login_error_cb); + msn_oim_get_connect_cb, + msn_oim_get_error_cb); + msn_soap_init(oim->sendconn,MSN_OIM_SEND_HOST,1, + msn_oim_send_connect_cb, + msn_oim_send_error_cb); } /*endof oim.c*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-07-30 13:44:34 UTC (rev 16600) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-07-30 15:55:30 UTC (rev 16601) @@ -98,6 +98,8 @@ /*function prototype*/ MsnOim * msn_oim_new(MsnSession *session); void msn_oim_destroy(MsnOim *oim); +void msn_oim_connect(MsnOim *oim); + void msn_parse_oim_msg(MsnOim *oim,char *xmlmsg); void msn_oim_get_msg(MsnOim *oim,char *msgid); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-02 05:44:50
|
Revision: 16613 Author: mayuan2006 Date: 2006-08-01 22:44:42 -0700 (Tue, 01 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16613&view=rev Log Message: ----------- add oim retrieve,can get oim message write the framework of oim send Committed by MaYuan <may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/contact.h branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/oim.h branches/soc-2006-msnp13/src/protocols/msn/soap.c Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-02 02:42:14 UTC (rev 16612) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-02 05:44:42 UTC (rev 16613) @@ -419,35 +419,39 @@ void msn_add_contact(MsnContact *contact) { - + gaim_debug_info("MaYuan","msn add a contact...\n"); } /*delete a Contact*/ void msn_delete_contact(MsnContact *contact) { - + gaim_debug_info("MaYuan","msn delete a contact...\n"); } /*block a Contact*/ void msn_block_contact(MsnContact *contact) { - + gaim_debug_info("MaYuan","msn block a contact...\n"); } /*unblock a contact*/ void msn_unblock_contact(MsnContact *contact) { - + gaim_debug_info("MaYuan","msn unblock a contact...\n"); } /*get the gleams info*/ void msn_get_gleams(MsnContact *contact) { - + gaim_debug_info("MaYuan","msn get gleams info...\n"); + /*build SOAP and POST it*/ + contact->soapconn->login_path = g_strdup(MSN_GET_ADDRESS_POST_URL); + contact->soapconn->soap_action = g_strdup(MSN_GET_ADDRESS_SOAP_ACTION); + msn_soap_post(contact->soapconn,MSN_GLEAMS_TEMPLATE,msn_address_written_cb); } void Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-02 02:42:14 UTC (rev 16612) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-02 05:44:42 UTC (rev 16613) @@ -81,7 +81,7 @@ "</soap:Envelope>" /*Gleams SOAP request template*/ -#define MSN_GLEAMS_TEMPLATE = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ +#define MSN_GLEAMS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\ "<soap:Header>"\ "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\ Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-02 02:42:14 UTC (rev 16612) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-02 05:44:42 UTC (rev 16613) @@ -27,6 +27,9 @@ #include "soap.h" #include "oim.h" +/*Local Function Prototype*/ +static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid); + /*new a OIM object*/ MsnOim * msn_oim_new(MsnSession *session) @@ -36,6 +39,7 @@ oim = g_new0(MsnOim, 1); oim->session = session; oim->retrieveconn = msn_soap_new(session,oim,1); + oim->oim_list = NULL; oim->sendconn = msn_soap_new(session,oim,1); return oim; @@ -82,12 +86,54 @@ g_return_if_fail(session != NULL); } +static void +msn_oim_send_read_cb(gpointer data, GaimSslConnection *gsc, + GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + MsnOim * msnoim; + + gaim_debug_info("MaYuan","read buffer:{%s}\n",soapconn->body); +} + +static void +msn_oim_send_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + soapconn->read_cb = msn_oim_send_read_cb; + msn_soap_read_cb(data,source,cond); +} + +/*pose single message to oim server*/ +void msn_oim_send_single_msg(MsnOim *oim,char * msg) +{ + const char *oimsoapbody,*t,*p; + + gaim_debug_info("MaYuan","send single OIM Message\n"); + oim->sendconn->login_path = g_strdup(MSN_OIM_SEND_URL); + oim->sendconn->soap_action = g_strdup(MSN_OIM_SEND_SOAP_ACTION); + t = oim->session->passport_info.t; + p = oim->session->passport_info.p; +#if 0 + oimsoapbody = g_strdup_printf(MSN_OIM_SEND_TEMPLATE, + membername, + friendname, + tomember, + mspauth, + prod_id, + lock_key, + msg_num, + msg + ); +#endif + msn_soap_post(oim->retrieveconn, oimsoapbody, msn_oim_send_written_cb); + +} + void msn_oim_send_msg(MsnOim *oim,char *msg) { if(msn_soap_connected(oim->sendconn) == -1){ - msn_soap_init(oim->sendconn,MSN_OIM_SEND_HOST,1, - msn_oim_send_connect_cb, - msn_oim_send_error_cb); } } @@ -122,6 +168,10 @@ session = oim->session; g_return_if_fail(session != NULL); + + gaim_debug_info("MaYuan","oim get SOAP Server connected!\n"); + /*call to get the message*/ + msn_oim_get_msg(oim); } static void @@ -145,7 +195,7 @@ /*get the conversation*/ static GaimConversation * -msn_oim_get_conv(MsnOim *oim,char *passport) +msn_oim_get_conv(MsnOim *oim,const char *passport) { GaimAccount *account; GaimConversation * conv; @@ -193,21 +243,21 @@ nickname = xmlnode_get_data(nNode); gaim_debug_info("MaYuan","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); // msn_oim_report_user(oim,passport,"hello"); - msn_oim_get_msg(oim,msgid); + oim->oim_list = g_list_append(oim->oim_list,msgid); } + if(msn_soap_connected(oim->retrieveconn) == -1){ + gaim_debug_info("MaYuan","retreive OIM server not connected! We need to connect it first\n"); + msn_oim_connect(oim); + return; + } + msn_oim_get_msg(oim); } -/*MSN OIM get SOAP request*/ -void msn_oim_get_msg(MsnOim *oim,char *msgid) +static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid) { - const char *oimid ,*oimsoapbody,*t,*p; + const char *oimsoapbody,*t,*p; - if(msn_soap_connected(oim->retrieveconn) == -1){ - gaim_debug_info("MaYuan","retreive OIM server not connected!\n"); - return; - } - - gaim_debug_info("MaYuan","Get OIM with SOAP \n"); + gaim_debug_info("MaYuan","Get single OIM Message\n"); oim->retrieveconn->login_path = g_strdup(MSN_OIM_RETRIEVE__URL); oim->retrieveconn->soap_action = g_strdup(MSN_OIM_GET_SOAP_ACTION); t = oim->session->passport_info.t; @@ -219,20 +269,39 @@ msgid ); msn_soap_post(oim->retrieveconn, oimsoapbody, msn_oim_get_written_cb); + } +/*MSN OIM get SOAP request*/ +void msn_oim_get_msg(MsnOim *oim) +{ + GList *list; + + gaim_debug_info("MaYuan","Get OIM with SOAP \n"); +// gaim_debug_info("MaYuan","oim->oim_list:%p,data:%s \n",oim->oim_list,oim->oim_list->data); + for(list = oim->oim_list; list!= NULL;list = g_list_next(list)){ + msn_oim_post_single_get_msg(oim,list->data); + oim->oim_list = g_list_remove(oim->oim_list, list->data); + } +} + /*msn oim server connect*/ void msn_oim_connect(MsnOim *oim) { gaim_debug_info("MaYuan","msn_oim_connect...\n"); - msn_soap_init(oim->retrieveconn,MSN_OIM_RETRIEVE_HOST,1, + if(msn_soap_connected(oim->retrieveconn) == -1){ + msn_soap_init(oim->retrieveconn,MSN_OIM_RETRIEVE_HOST,1, msn_oim_get_connect_cb, msn_oim_get_error_cb); - msn_soap_init(oim->sendconn,MSN_OIM_SEND_HOST,1, + } + + if(msn_soap_connected(oim->sendconn) == -1){ + msn_soap_init(oim->sendconn,MSN_OIM_SEND_HOST,1, msn_oim_send_connect_cb, msn_oim_send_error_cb); + } } /*endof oim.c*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-08-02 02:42:14 UTC (rev 16612) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-08-02 05:44:42 UTC (rev 16613) @@ -90,18 +90,26 @@ MsnSession *session; MsnSoapConn *retrieveconn; + GList * oim_list; MsnSoapConn *sendconn; gint LockKeyChallenge; }; -/*function prototype*/ +/**************************************************** + * function prototype + * **************************************************/ MsnOim * msn_oim_new(MsnSession *session); void msn_oim_destroy(MsnOim *oim); void msn_oim_connect(MsnOim *oim); void msn_parse_oim_msg(MsnOim *oim,char *xmlmsg); -void msn_oim_get_msg(MsnOim *oim,char *msgid); +/*get the OIM message*/ +void msn_oim_get_msg(MsnOim *oim); + +/*report the oim message to the conversation*/ +void msn_oim_report_user(MsnOim *oim,const char *passport,char *msg); + #endif/* _MSN_OIM_H_*/ /*endof oim.h*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-02 02:42:14 UTC (rev 16612) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-02 05:44:42 UTC (rev 16613) @@ -399,7 +399,7 @@ char * soap_body = NULL; char * request_str = NULL; - gaim_debug_info("MaYuan","msn_get_address_book()...\n"); + 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" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-06 15:17:03
|
Revision: 16653 Author: mayuan2006 Date: 2006-08-06 08:16:46 -0700 (Sun, 06 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16653&view=rev Log Message: ----------- a version can show the windows Live ID's Info correctly ready to send the oim,need to check committed by Ma Yuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/group.h branches/soc-2006-msnp13/src/protocols/msn/msn.c branches/soc-2006-msnp13/src/protocols/msn/msn.h branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/slp.c branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/switchboard.c branches/soc-2006-msnp13/src/protocols/msn/userlist.c Modified: branches/soc-2006-msnp13/src/protocols/msn/group.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/group.h 2006-08-05 17:45:13 UTC (rev 16652) +++ branches/soc-2006-msnp13/src/protocols/msn/group.h 2006-08-06 15:16:46 UTC (rev 16653) @@ -40,7 +40,7 @@ #define MSN_GROUP_IDS "<guid>9e57e654-59f0-44d1-aedc-0a7500b7e51f</guid>" #define MSN_DELETE_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupFilter><groupIds>%s</groupIds></groupFilter></ABGroupDelete></soap:Body></soap:Envelope>" -#define MSN_INDIVIDUALS_GROUP_ID "123" +#define MSN_INDIVIDUALS_GROUP_ID "1983" #define MSN_INDIVIDUALS_GROUP_NAME "Other Contacts" #define MSN_NON_IM_GROUP_ID "email" Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-05 17:45:13 UTC (rev 16652) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-06 15:16:46 UTC (rev 16653) @@ -565,6 +565,8 @@ (user->list_op & (1 << MSN_LIST_BL)) ? _("Yes") : _("No")); } + + gaim_debug_info("MaYuan","tooltip string:{%s}\n",str); } static GList * @@ -778,6 +780,7 @@ char *msgformat; char *msgtext; + gaim_debug_info("MaYuan","send IM {%s}\n",message); account = gaim_connection_get_account(gc); msn_import_html(message, &msgformat, &msgtext); @@ -1373,6 +1376,7 @@ "\n", "<br>"); g_string_free(str, TRUE); g_string_append_printf(s, "%s<br>", tmp); +// gaim_debug_info("MaYuan","tooltip info string:{%s}\n",s); g_free(tmp); } @@ -1414,7 +1418,7 @@ #define MSN_GOT_INFO_GET_FIELD(a, b) \ found = gaim_markup_extract_info_field(stripped, stripped_len, s, \ - "\n" a "\t", 0, "\n", 0, "Undisclosed", b, 0, NULL, NULL); \ + "\n" a ":\t", 0, "\n", 0, "Undisclosed", b, 0, NULL, NULL); \ if (found) \ sect_info = TRUE; @@ -1440,7 +1444,7 @@ MsnGetInfoStepTwoData *info2_data = NULL; #endif - gaim_debug_info("msn", "In msn_got_info\n"); + gaim_debug_info("msn", "In msn_got_info,url_text:{%s}\n",url_text); /* Make sure the connection is still valid */ if (g_list_find(gaim_connections_get_all(), info_data->gc) == NULL) Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-08-05 17:45:13 UTC (rev 16652) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-08-06 15:16:46 UTC (rev 16653) @@ -77,7 +77,8 @@ #define HOTMAIL_URL "http://www.hotmail.com/cgi-bin/folders" #define PASSPORT_URL "http://lc1.law13.hotmail.passport.com/cgi-bin/dologin?login=" -#define PROFILE_URL "http://spaces.msn.com/profile.aspx?mem=" +/*#define PROFILE_URL "http://spaces.msn.com/profile.aspx?mem="*/ +#define PROFILE_URL "http://spaces.live.com/profile.aspx?mem=" #define USEROPT_HOTMAIL 0 Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-05 17:45:13 UTC (rev 16652) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-06 15:16:46 UTC (rev 16653) @@ -1357,6 +1357,7 @@ g_hash_table_destroy(table); } +/*offline Message notification process*/ static void initial_mdata_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { @@ -1599,10 +1600,15 @@ msn_table_add_msg_type(cbs_table, "text/x-msmsgsprofile", profile_msg); + /*initial OIM notification*/ msn_table_add_msg_type(cbs_table, "text/x-msmsgsinitialmdatanotification", initial_mdata_msg); + /*OIM notification when user online*/ msn_table_add_msg_type(cbs_table, + "text/x-msmsgsoimnotification", + initial_mdata_msg); + msn_table_add_msg_type(cbs_table, "text/x-msmsgsinitialemailnotification", initial_email_msg); msn_table_add_msg_type(cbs_table, @@ -1618,3 +1624,4 @@ { msn_table_destroy(cbs_table); } + Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-05 17:45:13 UTC (rev 16652) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-06 15:16:46 UTC (rev 16653) @@ -181,7 +181,7 @@ MsnSoapConn * soapconn = data; MsnOim * msnoim; - gaim_debug_info("MaYuan","read buffer:{%s}\n",soapconn->body); + gaim_debug_info("MaYuan","OIM get read buffer:{%s}\n",soapconn->body); } static void @@ -296,12 +296,13 @@ msn_oim_get_connect_cb, msn_oim_get_error_cb); } - +#if 0 if(msn_soap_connected(oim->sendconn) == -1){ msn_soap_init(oim->sendconn,MSN_OIM_SEND_HOST,1, msn_oim_send_connect_cb, msn_oim_send_error_cb); } +#endif } /*endof oim.c*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/slp.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/slp.c 2006-08-05 17:45:13 UTC (rev 16652) +++ branches/soc-2006-msnp13/src/protocols/msn/slp.c 2006-08-06 15:16:46 UTC (rev 16653) @@ -33,6 +33,8 @@ /* ms to delay between sending buddy icon requests to the server. */ #define BUDDY_ICON_DELAY 20000 +/*debug SLP*/ +#define MSN_DEBUG_UD static void send_ok(MsnSlpCall *slpcall, const char *branch, const char *type, const char *content); Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-05 17:45:13 UTC (rev 16652) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-06 15:16:46 UTC (rev 16653) @@ -102,9 +102,12 @@ void msn_soap_destroy(MsnSoapConn *soapconn) { - g_free(soapconn->login_host); - g_free(soapconn->login_path); + if(soapconn->login_host) + g_free(soapconn->login_host); + if(soapconn->login_path) + g_free(soapconn->login_path); + /*remove the write handler*/ if (soapconn->output_handler > 0){ gaim_input_remove(soapconn->output_handler); Modified: branches/soc-2006-msnp13/src/protocols/msn/switchboard.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-05 17:45:13 UTC (rev 16652) +++ branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-06 15:16:46 UTC (rev 16653) @@ -29,6 +29,8 @@ #include "error.h" +#define MSN_DEBUG_SB + static MsnTable *cbs_table; static void msg_error_helper(MsnCmdProc *cmdproc, MsnMessage *msg, @@ -615,6 +617,7 @@ g_return_if_fail(swboard != NULL); g_return_if_fail(msg != NULL); + gaim_debug_info("Ma Yuan","switchboard send msg..\n"); if (msn_switchboard_can_send(swboard)) release_msg(swboard, msg); else if (queue) @@ -1051,6 +1054,8 @@ cal_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) { int reason = MSN_SB_ERROR_UNKNOWN; + MsnMessage *msg; + MsnSwitchBoard *swboard = trans->data; if (error == 215) { @@ -1063,7 +1068,19 @@ } gaim_debug_warning("msn", "cal_error: command %s gave error %i\n", trans->command, error); + gaim_debug_warning("msn", "Will Use Offline Message to sendit\n"); +// cal_error_helper(trans, reason); + /*offline Message send Process*/ + + while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL){ + gaim_debug_warning("Ma Yuan","offline msg to send:{%s}\n",msg->body); + /* The messages could not be sent due to a switchboard error */ + swboard->error = MSN_SB_ERROR_USER_OFFLINE; + msg_error_helper(swboard->cmdproc, msg, + MSN_MSG_ERROR_SB); + msn_message_unref(msg); + } cal_error_helper(trans, reason); } Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-05 17:45:13 UTC (rev 16652) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-06 15:16:46 UTC (rev 16653) @@ -617,6 +617,7 @@ msn_notification_rem_buddy(userlist->session->notification, list, who, group_id); } +/*add buddy*/ void msn_userlist_add_buddy(MsnUserList *userlist, const char *who, int list_id, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-06 16:20:53
|
Revision: 16654 Author: mayuan2006 Date: 2006-08-06 09:20:39 -0700 (Sun, 06 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16654&view=rev Log Message: ----------- can show the Photo info sucessfully! committed by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/msn.c branches/soc-2006-msnp13/src/protocols/msn/msn.h Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-06 15:16:46 UTC (rev 16653) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-06 16:20:39 UTC (rev 16654) @@ -1390,12 +1390,10 @@ { char *p, *q; - if ((p = strstr(url_text, " contactparams:photopreauthurl=\"")) != NULL) - { - p += strlen(" contactparams:photopreauthurl=\""); + if ((p = strstr(url_text, PHOTO_URL)) != NULL){ + p += strlen(PHOTO_URL); } - - if (p && (strncmp(p, "http://", 8) == 0) && ((q = strchr(p, '"')) != NULL)) + if (p && (strncmp(p, "http://",strlen("http://")) == 0) && ((q = strchr(p, '"')) != NULL)) return g_strndup(p, q - p); return NULL; @@ -1809,6 +1807,7 @@ #if PHOTO_SUPPORT /* Find the URL to the photo; must be before the marshalling [Bug 994207] */ photo_url_text = msn_get_photo_url(url_text); + gaim_debug_info("Ma Yuan","photo url:{%s}\n",photo_url_text); /* Marshall the existing state */ info2_data = g_malloc0(sizeof(MsnGetInfoStepTwoData)); Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-08-06 15:16:46 UTC (rev 16653) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-08-06 16:20:39 UTC (rev 16654) @@ -79,6 +79,7 @@ #define PASSPORT_URL "http://lc1.law13.hotmail.passport.com/cgi-bin/dologin?login=" /*#define PROFILE_URL "http://spaces.msn.com/profile.aspx?mem="*/ #define PROFILE_URL "http://spaces.live.com/profile.aspx?mem=" +#define PHOTO_URL " contactparams:photopreauthurl=\"" #define USEROPT_HOTMAIL 0 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-06 17:41:58
|
Revision: 16655 Author: mayuan2006 Date: 2006-08-06 10:41:51 -0700 (Sun, 06 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16655&view=rev Log Message: ----------- add a group add/del contact add/del/block/unblock SOAP Operation Framework Need to finish the content soon comitted by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/contact.h branches/soc-2006-msnp13/src/protocols/msn/history.c Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-06 16:20:39 UTC (rev 16654) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-06 17:41:51 UTC (rev 16655) @@ -410,7 +410,7 @@ { gaim_debug_info("MaYuan","msn_get_address_book()...\n"); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_GET_ADDRESS_POST_URL); + 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); } @@ -420,6 +420,12 @@ msn_add_contact(MsnContact *contact) { gaim_debug_info("MaYuan","msn add a contact...\n"); + + /*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); + msn_soap_post(contact->soapconn,MSN_GET_ADDRESS_TEMPLATE,msn_address_written_cb); + } /*delete a Contact*/ @@ -427,6 +433,10 @@ msn_delete_contact(MsnContact *contact) { gaim_debug_info("MaYuan","msn delete a contact...\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_address_written_cb); } /*block a Contact*/ @@ -434,6 +444,10 @@ msn_block_contact(MsnContact *contact) { gaim_debug_info("MaYuan","msn block a contact...\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_address_written_cb); } /*unblock a contact*/ @@ -441,6 +455,10 @@ msn_unblock_contact(MsnContact *contact) { gaim_debug_info("MaYuan","msn unblock a contact...\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_address_written_cb); } /*get the gleams info*/ @@ -449,11 +467,33 @@ { gaim_debug_info("MaYuan","msn get gleams info...\n"); /*build SOAP and POST it*/ - contact->soapconn->login_path = g_strdup(MSN_GET_ADDRESS_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_GET_ADDRESS_SOAP_ACTION); + 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_address_written_cb); } +void msn_add_group(MsnContact *contact) +{ + gaim_debug_info("MaYuan","msn add group...\n"); + + /*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,MSN_GROUP_ADD_TEMPLATE,msn_address_written_cb); + +} + +void msn_del_group(MsnContact *contact) +{ + gaim_debug_info("MaYuan","msn del group...\n"); + + /*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,MSN_GROUP_DEL_TEMPLATE,msn_address_written_cb); + +} + void msn_contact_connect(MsnContact *contact) { Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-06 16:20:39 UTC (rev 16654) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-06 17:41:51 UTC (rev 16655) @@ -57,9 +57,12 @@ "</soap:Body>"\ "</soap:Envelope>" +/************************************************ + * Address Book SOAP + * *********************************************/ +#define MSN_ADDRESS_BOOK_POST_URL "/abservice/abservice.asmx" /*get addressbook soap request template*/ #define MSN_GET_ADDRESS_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABFindAll" -#define MSN_GET_ADDRESS_POST_URL "/abservice/abservice.asmx" #define MSN_GET_ADDRESS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\ "<soap:Header>"\ @@ -81,6 +84,7 @@ "</soap:Envelope>" /*Gleams SOAP request template*/ +#define MSN_GET_GLEAMS_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABFindAll" #define MSN_GLEAMS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\ "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\ "<soap:Header>"\ @@ -103,6 +107,9 @@ "</soap:Body>"\ "</soap:Envelope>" +/******************************************************* + * Contact Add/del SOAP Action + *******************************************************/ /*add conatct soap request*/ #define MSN_CONTACT_ADD_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactAdd" #define MSN_CONTACT_XML "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\"><contactInfo><contactType>LivePending</contactType><passportName>%s</passportName><isMessengerUser>true</isMessengerUser></contactInfo></Contact>" @@ -116,7 +123,11 @@ #define MSN_MEMBER_TEMPLATE "<Member xsi:type=\"PassportMember\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Type>Passport</Type><State>Accepted</State><PassportName>%s</PassportName></Member>" +/******************************************************* + * Contact Block/Unblock SOAP Action + *******************************************************/ /*block means add contact to block list*/ +#define MSN_SHARE_POST_URL "/abservice/SharingService.asmx" #define MSN_CONTACT_BLOCK_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/AddMember" #define MSN_BLOCK_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>BlockUnblock</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><AddMember xmlns=\"http://www.msn.com/webservices/AddressBook\"><serviceHandle><Id>0</Id><Type>Messenger</Type><ForeignId></ForeignId></serviceHandle><memberships><Membership><MemberRole>Block</MemberRole><Members>%s</Members></Membership></memberships></AddMember></soap:Body></soap:Envelope>" @@ -124,6 +135,17 @@ #define MSN_CONTACT_UNBLOCK_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/DeleteMember" #define MSN_UNBLOCK_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>BlockUnblock</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><DeleteMember xmlns=\"http://www.msn.com/webservices/AddressBook\"><serviceHandle><Id>0</Id><Type>Messenger</Type><ForeignId></ForeignId></serviceHandle><memberships><Membership><MemberRole>Block</MemberRole><Members>%s</Members></Membership></memberships></DeleteMember></soap:Body></soap:Envelope>" +/******************************************************* + * Group SOAP Action + *******************************************************/ +/*add a group*/ +#define MSN_GROUP_ADD_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupAdd" +#define MSN_GROUP_ADD_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>GroupSave</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupAdd xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupAddOptions><fRenameOnMsgrConflict>false</fRenameOnMsgrConflict></groupAddOptions><groupInfo><GroupInfo><name>%s</name><groupType>C8529CE2-6EAD-434d-881F-341E17DB3FF8</groupType><fMessenger>false</fMessenger><annotations><Annotation><Name>MSN.IM.Display</Name><Value>1</Value></Annotation></annotations></GroupInfo></groupInfo></ABGroupAdd></soap:Body></soap:Envelope>" + +/*delete a group*/ +#define MSN_GROUP_DEL_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupDelete" +#define MSN_GROUP_DEL_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupFilter><groupIds><guid>%s</guid></groupIds></groupFilter></ABGroupDelete></soap:Body></soap:Envelope>" + typedef struct _MsnContact MsnContact; struct _MsnContact Modified: branches/soc-2006-msnp13/src/protocols/msn/history.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/history.c 2006-08-06 16:20:39 UTC (rev 16654) +++ branches/soc-2006-msnp13/src/protocols/msn/history.c 2006-08-06 17:41:51 UTC (rev 16655) @@ -84,3 +84,4 @@ msn_transaction_destroy(trans); } } + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-10 04:38:25
|
Revision: 16684 Author: mayuan2006 Date: 2006-08-09 21:38:13 -0700 (Wed, 09 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16684&view=rev Log Message: ----------- change the code of SOAP Action,Now using a stupid way to do the soap, wish to implement it in a clean way! borrow a strptime to parse the timestamp received from MSN Server. committed by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/contact.h branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c branches/soc-2006-msnp13/src/protocols/msn/msn-utils.h branches/soc-2006-msnp13/src/protocols/msn/notification.c Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-09 18:19:12 UTC (rev 16683) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-10 04:38:13 UTC (rev 16684) @@ -417,48 +417,71 @@ /*add a Contact */ void -msn_add_contact(MsnContact *contact) +msn_add_contact(MsnContact *contact,const char *passport) { + char *body = NULL; + char *contact_xml = NULL; + gaim_debug_info("MaYuan","msn add a contact...\n"); + contact_xml = g_strdup_printf(MSN_CONTACT_XML,passport); + 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); - msn_soap_post(contact->soapconn,MSN_GET_ADDRESS_TEMPLATE,msn_address_written_cb); + msn_soap_post(contact->soapconn,body,msn_address_written_cb); + g_free(body); } /*delete a Contact*/ void -msn_delete_contact(MsnContact *contact) +msn_delete_contact(MsnContact *contact,const char *passport_id) { + char *body = NULL; + char *contact_xml = NULL ; + gaim_debug_info("MaYuan","msn delete a contact...\n"); + contact_xml = g_strdup_printf(MSN_CONTACTS_DEL_XML,passport_id); + 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_GET_GLEAMS_SOAP_ACTION); - msn_soap_post(contact->soapconn,MSN_GLEAMS_TEMPLATE,msn_address_written_cb); + contact->soapconn->soap_action = g_strdup(MSN_CONTACT_DEL_SOAP_ACTION); + msn_soap_post(contact->soapconn,body,msn_address_written_cb); + g_free(body); } /*block a Contact*/ void -msn_block_contact(MsnContact *contact) -{ +msn_block_contact(MsnContact *contact,const char* membership_id) +{ + 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_ADDRESS_BOOK_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_GET_GLEAMS_SOAP_ACTION); - msn_soap_post(contact->soapconn,MSN_GLEAMS_TEMPLATE,msn_address_written_cb); + 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_address_written_cb); + g_free(body); } /*unblock a contact*/ void -msn_unblock_contact(MsnContact *contact) -{ +msn_unblock_contact(MsnContact *contact,const char* passport) +{ + 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_ADDRESS_BOOK_POST_URL); - contact->soapconn->soap_action = g_strdup(MSN_GET_GLEAMS_SOAP_ACTION); - msn_soap_post(contact->soapconn,MSN_GLEAMS_TEMPLATE,msn_address_written_cb); + 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_address_written_cb); + g_free(body); } /*get the gleams info*/ @@ -472,7 +495,8 @@ msn_soap_post(contact->soapconn,MSN_GLEAMS_TEMPLATE,msn_address_written_cb); } -void msn_add_group(MsnContact *contact) +/*add group*/ +void msn_add_group(MsnContact *contact,const char* group_name) { gaim_debug_info("MaYuan","msn add group...\n"); @@ -480,10 +504,10 @@ 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,MSN_GROUP_ADD_TEMPLATE,msn_address_written_cb); - } -void msn_del_group(MsnContact *contact) +/*delete a group*/ +void msn_del_group(MsnContact *contact,const char *guid) { gaim_debug_info("MaYuan","msn del group...\n"); Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-09 18:19:12 UTC (rev 16683) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-10 04:38:13 UTC (rev 16684) @@ -118,7 +118,7 @@ /*delete contact from contact list soap request template*/ #define MSN_CONTACT_DEL_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactDelete" -#define MSN_CONTACTS_DEL "<Contact><contactId>5e8a2e64-c271-443f-ac86-2429f3ffd18a</contactId></Contact>" +#define MSN_CONTACTS_DEL_XML "<Contact><contactId>%s</contactId></Contact>" #define MSN_DEL_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><contacts>%s</contacts></ABContactDelete></soap:Body></soap:Envelope>" #define MSN_MEMBER_TEMPLATE "<Member xsi:type=\"PassportMember\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Type>Passport</Type><State>Accepted</State><PassportName>%s</PassportName></Member>" @@ -126,12 +126,15 @@ /******************************************************* * Contact Block/Unblock SOAP Action *******************************************************/ -/*block means add contact to block list*/ +/*block means delete from allow list and add contact to block list*/ #define MSN_SHARE_POST_URL "/abservice/SharingService.asmx" #define MSN_CONTACT_BLOCK_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/AddMember" -#define MSN_BLOCK_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>BlockUnblock</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><AddMember xmlns=\"http://www.msn.com/webservices/AddressBook\"><serviceHandle><Id>0</Id><Type>Messenger</Type><ForeignId></ForeignId></serviceHandle><memberships><Membership><MemberRole>Block</MemberRole><Members>%s</Members></Membership></memberships></AddMember></soap:Body></soap:Envelope>" +/*first delete contact from allow list*/ +#define MSN_CONTACT_DELECT_FROM_ALLOW_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>BlockUnblock</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><DeleteMember xmlns=\"http://www.msn.com/webservices/AddressBook\"><serviceHandle><Id>0</Id><Type>Messenger</Type><ForeignId></ForeignId></serviceHandle><memberships><Membership><MemberRole>Allow</MemberRole><Members><Member xsi:type=\"PassportMember\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Type>Passport</Type><MembershipId>%s</MembershipId><State>Accepted</State></Member></Members></Membership></memberships></DeleteMember></soap:Body></soap:Envelope>" -/*unblock means delete contact to block list*/ +#define MSN_CONTACT_ADD_TO_BLOCK_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>BlockUnblock</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><AddMember xmlns=\"http://www.msn.com/webservices/AddressBook\"><serviceHandle><Id>0</Id><Type>Messenger</Type><ForeignId></ForeignId></serviceHandle><memberships><Membership><MemberRole>Block</MemberRole><Members>%s</Members></Membership></memberships></AddMember></soap:Body></soap:Envelope>" + +/*unblock means delete contact from block list*/ #define MSN_CONTACT_UNBLOCK_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/DeleteMember" #define MSN_UNBLOCK_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>BlockUnblock</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><DeleteMember xmlns=\"http://www.msn.com/webservices/AddressBook\"><serviceHandle><Id>0</Id><Type>Messenger</Type><ForeignId></ForeignId></serviceHandle><memberships><Membership><MemberRole>Block</MemberRole><Members>%s</Members></Membership></memberships></DeleteMember></soap:Body></soap:Envelope>" Modified: branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c 2006-08-09 18:19:12 UTC (rev 16683) +++ branches/soc-2006-msnp13/src/protocols/msn/msn-utils.c 2006-08-10 04:38:13 UTC (rev 16684) @@ -23,6 +23,7 @@ */ #include "msn.h" #include "msn-utils.h" +#include "time.h" //#include <openssl/md5.h> void @@ -362,7 +363,34 @@ *ret_host = host; *ret_port = port; } +/*************************************************************************** + * MSN Time Related Funciton + ***************************************************************************/ +#if 0 +int +msn_convert_iso8601(const char *timestr,struct tm tm_time) +{ + char temp[64]; + struct tm ctime; + time_t ts; + gaim_debug_info("MaYuan","convert string is{%s}\n",timestr); + tzset(); + /*copy string first*/ + memset(temp, 0, sizeof(temp)); + strncpy(temp, timestr, strlen(timestr)); + + /*convert via strptime()*/ + memset(&ctime, 0, sizeof(struct tm)); + strptime(temp, "%d %b %Y %T %Z", &ctime); + ts = mktime(&ctime) - timezone; + localtime_r(&ts, tm_time); +} +#endif + +/*************************************************************************** + * MSN Challenge Computing Function + ***************************************************************************/ /*check the edian of system*/ int isBigEndian(void) @@ -482,3 +510,976 @@ // gaim_debug_info("MaYuan","chl output{%s}\n",output); } +#if (!defined(_XOPEN_SOURCE))||defined(_WIN32) + +#ifndef __P +# if defined (__GNUC__) || (defined (__STDC__) && __STDC__) +# define __P(args) args +# else +# define __P(args) () +# endif /* GCC. */ +#endif /* Not __P. */ + +#if ! HAVE_LOCALTIME_R && ! defined localtime_r +# ifdef _LIBC +# define localtime_r __localtime_r +# else +/* Approximate localtime_r as best we can in its absence. */ +# define localtime_r my_localtime_r +static struct tm *localtime_r __P ((const time_t *, struct tm *)); +static struct tm * +localtime_r (t, tp) + const time_t *t; + struct tm *tp; +{ + struct tm *l = localtime (t); + if (! l) + return 0; + *tp = *l; + return tp; +} +# endif /* ! _LIBC */ +#endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */ + + +#define match_char(ch1, ch2) if (ch1 != ch2) return NULL + +#if defined __GNUC__ && __GNUC__ >= 2 +# define match_string(cs1, s2) \ + ({ size_t len = strlen (cs1); \ + int result = strncasecmp ((cs1), (s2), len) == 0; \ + if (result) (s2) += len; \ + result; }) +#else +/* Oh come on. Get a reasonable compiler. */ +# define match_string(cs1, s2) \ + (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1)) +#endif + +/* We intentionally do not use isdigit() for testing because this will + lead to problems with the wide character version. */ +#define get_number(from, to, n) \ + do { \ + int __n = n; \ + val = 0; \ + while (*rp == ' ') \ + ++rp; \ + if ((*rp < '0') || (*rp > '9')) \ + return NULL; \ + do { \ + val *= 10; \ + val += *rp++ - '0'; \ + } while ((--__n > 0) && (val * 10 <= to) && (*rp >= '0') && (*rp <= '9')); \ + if ((val < from) || (val > to)) \ + return NULL; \ + } while (0) + +#ifdef _NL_CURRENT +# define get_alt_number(from, to, n) \ + ({ \ + __label__ do_normal; \ + if (*decided != raw) \ + { \ + const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \ + int __n = n; \ + int any = 0; \ + while (*rp == ' ') \ + ++rp; \ + val = 0; \ + do { \ + val *= 10; \ + while (*alts != '\0') \ + { \ + size_t len = strlen (alts); \ + if (strncasecmp (alts, rp, len) == 0) \ + break; \ + alts += len + 1; \ + ++val; \ + } \ + if (*alts == '\0') \ + { \ + if (*decided == not && ! any) \ + goto do_normal; \ + /* If we haven't read anything it's an error. */ \ + if (! any) \ + return NULL; \ + /* Correct the premature multiplication. */ \ + val /= 10; \ + break; \ + } \ + else \ + *decided = loc; \ + } while (--__n > 0 && val * 10 <= to); \ + if (val < from || val > to) \ + return NULL; \ + } \ + else \ + { \ + do_normal: \ + get_number (from, to, n); \ + } \ + 0; \ + }) +#else +# define get_alt_number(from, to, n) \ + /* We don't have the alternate representation. */ \ + get_number(from, to, n) +#endif + +#define recursive(new_fmt) \ + (*(new_fmt) != '\0' \ + && (rp = strptime_internal (rp, (new_fmt), tm, decided, era_cnt)) != NULL) + + +#ifdef _LIBC +/* This is defined in locale/C-time.c in the GNU libc. */ +extern const struct locale_data _nl_C_LC_TIME; +extern const unsigned short int __mon_yday[2][13]; + +# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string) +# define ab_weekday_name \ + (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string) +# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string) +# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string) +# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string) +# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string) +# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string) +# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string) +# define HERE_T_FMT_AMPM \ + (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string) +# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string) + +# define strncasecmp(s1, s2, n) __strncasecmp (s1, s2, n) +#else +static char const weekday_name[][10] = + { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" + }; +static char const ab_weekday_name[][4] = + { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" + }; +static char const month_name[][10] = + { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + }; +static char const ab_month_name[][4] = + { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; +# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y" +# define HERE_D_FMT "%m/%d/%y" +# define HERE_AM_STR "AM" +# define HERE_PM_STR "PM" +# define HERE_T_FMT_AMPM "%I:%M:%S %p" +# define HERE_T_FMT "%H:%M:%S" + +const unsigned short int __mon_yday[2][13] = + { + /* Normal years. */ + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, + /* Leap years. */ + { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } + }; +#endif + +/* Status of lookup: do we use the locale data or the raw data? */ +enum locale_status { not, loc, raw }; + + +#ifndef __isleap +/* Nonzero if YEAR is a leap year (every 4 years, + except every 100th isn't, and every 400th is). */ +# define __isleap(year) \ + ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) +#endif + +/* Compute the day of the week. */ +static void +day_of_the_week (struct tm *tm) +{ + /* We know that January 1st 1970 was a Thursday (= 4). Compute the + the difference between this data in the one on TM and so determine + the weekday. */ + int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2); + int wday = (-473 + + (365 * (tm->tm_year - 70)) + + (corr_year / 4) + - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0) + + (((corr_year / 4) / 25) / 4) + + __mon_yday[0][tm->tm_mon] + + tm->tm_mday - 1); + tm->tm_wday = ((wday % 7) + 7) % 7; +} + +/* Compute the day of the year. */ +static void +day_of_the_year (struct tm *tm) +{ + tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon] + + (tm->tm_mday - 1)); +} + +static char * +#ifdef _LIBC +internal_function +#endif +strptime_internal __P ((const char *rp, const char *fmt, struct tm *tm, + enum locale_status *decided, int era_cnt)); + +static char * +#ifdef _LIBC +internal_function +#endif +strptime_internal (rp, fmt, tm, decided, era_cnt) + const char *rp; + const char *fmt; + struct tm *tm; + enum locale_status *decided; + int era_cnt; +{ + const char *rp_backup; + int cnt; + size_t val; + int have_I, is_pm; + int century, want_century; + int want_era; + int have_wday, want_xday; + int have_yday; + int have_mon, have_mday; +#ifdef _NL_CURRENT + size_t num_eras; +#endif + struct era_entry *era; + + have_I = is_pm = 0; + century = -1; + want_century = 0; + want_era = 0; + era = NULL; + + have_wday = want_xday = have_yday = have_mon = have_mday = 0; + + while (*fmt != '\0') + { + /* A white space in the format string matches 0 more or white + space in the input string. */ + if (isspace (*fmt)) + { + while (isspace (*rp)) + ++rp; + ++fmt; + continue; + } + + /* Any character but `%' must be matched by the same character + in the iput string. */ + if (*fmt != '%') + { + match_char (*fmt++, *rp++); + continue; + } + + ++fmt; +#ifndef _NL_CURRENT + /* We need this for handling the `E' modifier. */ + start_over: +#endif + + /* Make back up of current processing pointer. */ + rp_backup = rp; + + switch (*fmt++) + { + case '%': + /* Match the `%' character itself. */ + match_char ('%', *rp++); + break; + case 'a': + case 'A': + /* Match day of week. */ + for (cnt = 0; cnt < 7; ++cnt) + { +#ifdef _NL_CURRENT + if (*decided !=raw) + { + if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt), + weekday_name[cnt])) + *decided = loc; + break; + } + if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), + ab_weekday_name[cnt])) + *decided = loc; + break; + } + } +#endif + if (*decided != loc + && (match_string (weekday_name[cnt], rp) + || match_string (ab_weekday_name[cnt], rp))) + { + *decided = raw; + break; + } + } + if (cnt == 7) + /* Does not match a weekday name. */ + return NULL; + tm->tm_wday = cnt; + have_wday = 1; + break; + case 'b': + case 'B': + case 'h': + /* Match month name. */ + for (cnt = 0; cnt < 12; ++cnt) + { +#ifdef _NL_CURRENT + if (*decided !=raw) + { + if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt), + month_name[cnt])) + *decided = loc; + break; + } + if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), + ab_month_name[cnt])) + *decided = loc; + break; + } + } +#endif + if (match_string (month_name[cnt], rp) + || match_string (ab_month_name[cnt], rp)) + { + *decided = raw; + break; + } + } + if (cnt == 12) + /* Does not match a month name. */ + return NULL; + tm->tm_mon = cnt; + want_xday = 1; + break; + case 'c': + /* Match locale's date and time format. */ +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT))) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (*decided == not && + strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT)) + *decided = loc; + want_xday = 1; + break; + } + *decided = raw; + } +#endif + if (!recursive (HERE_D_T_FMT)) + return NULL; + want_xday = 1; + break; + case 'C': + /* Match century number. */ +#ifdef _NL_CURRENT + match_century: +#endif + get_number (0, 99, 2); + century = val; + want_xday = 1; + break; + case 'd': + case 'e': + /* Match day of month. */ + get_number (1, 31, 2); + tm->tm_mday = val; + have_mday = 1; + want_xday = 1; + break; + case 'F': + if (!recursive ("%Y-%m-%d")) + return NULL; + want_xday = 1; + break; + case 'x': +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, D_FMT))) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT)) + *decided = loc; + want_xday = 1; + break; + } + *decided = raw; + } +#endif + /* Fall through. */ + case 'D': + /* Match standard day format. */ + if (!recursive (HERE_D_FMT)) + return NULL; + want_xday = 1; + break; + case 'k': + case 'H': + /* Match hour in 24-hour clock. */ + get_number (0, 23, 2); + tm->tm_hour = val; + have_I = 0; + break; + case 'I': + /* Match hour in 12-hour clock. */ + get_number (1, 12, 2); + tm->tm_hour = val % 12; + have_I = 1; + break; + case 'j': + /* Match day number of year. */ + get_number (1, 366, 3); + tm->tm_yday = val - 1; + have_yday = 1; + break; + case 'm': + /* Match number of month. */ + get_number (1, 12, 2); + tm->tm_mon = val - 1; + have_mon = 1; + want_xday = 1; + break; + case 'M': + /* Match minute. */ + get_number (0, 59, 2); + tm->tm_min = val; + break; + case 'n': + case 't': + /* Match any white space. */ + while (isspace (*rp)) + ++rp; + break; + case 'p': + /* Match locale's equivalent of AM/PM. */ +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp)) + { + if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR)) + *decided = loc; + break; + } + if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp)) + { + if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR)) + *decided = loc; + is_pm = 1; + break; + } + *decided = raw; + } +#endif + if (!match_string (HERE_AM_STR, rp)) + if (match_string (HERE_PM_STR, rp)) + is_pm = 1; + else + return NULL; + break; + case 'r': +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM))) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (*decided == not && + strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM), + HERE_T_FMT_AMPM)) + *decided = loc; + break; + } + *decided = raw; + } +#endif + if (!recursive (HERE_T_FMT_AMPM)) + return NULL; + break; + case 'R': + if (!recursive ("%H:%M")) + return NULL; + break; + case 's': + { + /* The number of seconds may be very high so we cannot use + the `get_number' macro. Instead read the number + character for character and construct the result while + doing this. */ + time_t secs = 0; + if (*rp < '0' || *rp > '9') + /* We need at least one digit. */ + return NULL; + + do + { + secs *= 10; + secs += *rp++ - '0'; + } + while (*rp >= '0' && *rp <= '9'); + + if (localtime_r (&secs, tm) == NULL) + /* Error in function. */ + return NULL; + } + break; + case 'S': + get_number (0, 61, 2); + tm->tm_sec = val; + break; + case 'X': +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, T_FMT))) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT)) + *decided = loc; + break; + } + *decided = raw; + } +#endif + /* Fall through. */ + case 'T': + if (!recursive (HERE_T_FMT)) + return NULL; + break; + case 'u': + get_number (1, 7, 1); + tm->tm_wday = val % 7; + have_wday = 1; + break; + case 'g': + get_number (0, 99, 2); + /* XXX This cannot determine any field in TM. */ + break; + case 'G': + if (*rp < '0' || *rp > '9') + return NULL; + /* XXX Ignore the number since we would need some more + information to compute a real date. */ + do + ++rp; + while (*rp >= '0' && *rp <= '9'); + break; + case 'U': + case 'V': + case 'W': + get_number (0, 53, 2); + /* XXX This cannot determine any field in TM without some + information. */ + break; + case 'w': + /* Match number of weekday. */ + get_number (0, 6, 1); + tm->tm_wday = val; + have_wday = 1; + break; + case 'y': +#ifdef _NL_CURRENT + match_year_in_century: +#endif + /* Match year within century. */ + get_number (0, 99, 2); + /* The "Year 2000: The Millennium Rollover" paper suggests that + values in the range 69-99 refer to the twentieth century. */ + tm->tm_year = val >= 69 ? val : val + 100; + /* Indicate that we want to use the century, if specified. */ + want_century = 1; + want_xday = 1; + break; + case 'Y': + /* Match year including century number. */ + get_number (0, 9999, 4); + tm->tm_year = val - 1900; + want_century = 0; + want_xday = 1; + break; + case 'Z': + /* XXX How to handle this? */ + break; + case 'E': +#ifdef _NL_CURRENT + switch (*fmt++) + { + case 'c': + /* Match locale's alternate date and time format. */ + if (*decided != raw) + { + const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT); + + if (*fmt == '\0') + fmt = _NL_CURRENT (LC_TIME, D_T_FMT); + + if (!recursive (fmt)) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (strcmp (fmt, HERE_D_T_FMT)) + *decided = loc; + want_xday = 1; + break; + } + *decided = raw; + } + /* The C locale has no era information, so use the + normal representation. */ + if (!recursive (HERE_D_T_FMT)) + return NULL; + want_xday = 1; + break; + case 'C': + if (*decided != raw) + { + if (era_cnt >= 0) + { + era = _nl_select_era_entry (era_cnt); + if (match_string (era->era_name, rp)) + { + *decided = loc; + break; + } + else + return NULL; + } + else + { + num_eras = _NL_CURRENT_WORD (LC_TIME, + _NL_TIME_ERA_NUM_ENTRIES); + for (era_cnt = 0; era_cnt < (int) num_eras; + ++era_cnt, rp = rp_backup) + { + era = _nl_select_era_entry (era_cnt); + if (match_string (era->era_name, rp)) + { + *decided = loc; + break; + } + } + if (era_cnt == (int) num_eras) + { + era_cnt = -1; + if (*decided == loc) + return NULL; + } + else + break; + } + + *decided = raw; + } + /* The C locale has no era information, so use the + normal representation. */ + goto match_century; + case 'y': + if (*decided == raw) + goto match_year_in_century; + + get_number(0, 9999, 4); + tm->tm_year = val; + want_era = 1; + want_xday = 1; + break; + case 'Y': + if (*decided != raw) + { + num_eras = _NL_CURRENT_WORD (LC_TIME, + _NL_TIME_ERA_NUM_ENTRIES); + for (era_cnt = 0; era_cnt < (int) num_eras; + ++era_cnt, rp = rp_backup) + { + era = _nl_select_era_entry (era_cnt); + if (recursive (era->era_format)) + break; + } + if (era_cnt == (int) num_eras) + { + era_cnt = -1; + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + *decided = loc; + era_cnt = -1; + break; + } + + *decided = raw; + } + get_number (0, 9999, 4); + tm->tm_year = val - 1900; + want_century = 0; + want_xday = 1; + break; + case 'x': + if (*decided != raw) + { + const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT); + + if (*fmt == '\0') + fmt = _NL_CURRENT (LC_TIME, D_FMT); + + if (!recursive (fmt)) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (strcmp (fmt, HERE_D_FMT)) + *decided = loc; + break; + } + *decided = raw; + } + if (!recursive (HERE_D_FMT)) + return NULL; + break; + case 'X': + if (*decided != raw) + { + const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT); + + if (*fmt == '\0') + fmt = _NL_CURRENT (LC_TIME, T_FMT); + + if (!recursive (fmt)) + { + if (*decided == loc) + return NULL; + else + rp = rp_backup; + } + else + { + if (strcmp (fmt, HERE_T_FMT)) + *decided = loc; + break; + } + *decided = raw; + } + if (!recursive (HERE_T_FMT)) + return NULL; + break; + default: + return NULL; + } + break; +#else + /* We have no information about the era format. Just use + the normal format. */ + if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y' + && *fmt != 'x' && *fmt != 'X') + /* This is an illegal format. */ + return NULL; + + goto start_over; +#endif + case 'O': + switch (*fmt++) + { + case 'd': + case 'e': + /* Match day of month using alternate numeric symbols. */ + get_alt_number (1, 31, 2); + tm->tm_mday = val; + have_mday = 1; + want_xday = 1; + break; + case 'H': + /* Match hour in 24-hour clock using alternate numeric + symbols. */ + get_alt_number (0, 23, 2); + tm->tm_hour = val; + have_I = 0; + break; + case 'I': + /* Match hour in 12-hour clock using alternate numeric + symbols. */ + get_alt_number (1, 12, 2); + tm->tm_hour = val - 1; + have_I = 1; + break; + case 'm': + /* Match month using alternate numeric symbols. */ + get_alt_number (1, 12, 2); + tm->tm_mon = val - 1; + have_mon = 1; + want_xday = 1; + break; + case 'M': + /* Match minutes using alternate numeric symbols. */ + get_alt_number (0, 59, 2); + tm->tm_min = val; + break; + case 'S': + /* Match seconds using alternate numeric symbols. */ + get_alt_number (0, 61, 2); + tm->tm_sec = val; + break; + case 'U': + case 'V': + case 'W': + get_alt_number (0, 53, 2); + /* XXX This cannot determine any field in TM without + further information. */ + break; + case 'w': + /* Match number of weekday using alternate numeric symbols. */ + get_alt_number (0, 6, 1); + tm->tm_wday = val; + have_wday = 1; + break; + case 'y': + /* Match year within century using alternate numeric symbols. */ + get_alt_number (0, 99, 2); + tm->tm_year = val >= 69 ? val : val + 100; + want_xday = 1; + break; + default: + return NULL; + } + break; + default: + return NULL; + } + } + + if (have_I && is_pm) + tm->tm_hour += 12; + + if (century != -1) + { + if (want_century) + tm->tm_year = tm->tm_year % 100 + (century - 19) * 100; + else + /* Only the century, but not the year. Strange, but so be it. */ + tm->tm_year = (century - 19) * 100; + } + +#ifdef _NL_CURRENT + if (era_cnt != -1) + { + era = _nl_select_era_entry(era_cnt); + if (want_era) + tm->tm_year = (era->start_date[0] + + ((tm->tm_year - era->offset) + * era->absolute_direction)); + else + /* Era start year assumed. */ + tm->tm_year = era->start_date[0]; + } + else +#endif + if (want_era) + return NULL; + + if (want_xday && !have_wday) + { + if ( !(have_mon && have_mday) && have_yday) + { + /* We don't have tm_mon and/or tm_mday, compute them. */ + int t_mon = 0; + while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday) + t_mon++; + if (!have_mon) + tm->tm_mon = t_mon - 1; + if (!have_mday) + tm->tm_mday = + (tm->tm_yday + - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1); + } + day_of_the_week (tm); + } + if (want_xday && !have_yday) + day_of_the_year (tm); + + return (char *) rp; +} + + +char * +msn_strptime (buf, format, tm) + const char *buf; + const char *format; + struct tm *tm; +{ + enum locale_status decided; + +#ifdef _NL_CURRENT + decided = not; +#else + decided = raw; +#endif + return strptime_internal (buf, format, tm, &decided, -1); +} +#else +#define msn_strptime strptime +#endif Modified: branches/soc-2006-msnp13/src/protocols/msn/msn-utils.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn-utils.h 2006-08-09 18:19:12 UTC (rev 16683) +++ branches/soc-2006-msnp13/src/protocols/msn/msn-utils.h 2006-08-10 04:38:13 UTC (rev 16684) @@ -50,6 +50,7 @@ void msn_handle_chl(char *input, char *output); int isBigEndian(void); unsigned int swapInt(unsigned int dw); +char * msn_strptime (const char *buf,const char *format,struct tm *tm); #endif /* _MSN_UTILS_H_ */ Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-09 18:19:12 UTC (rev 16683) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-10 04:38:13 UTC (rev 16684) @@ -1368,6 +1368,24 @@ // gaim_debug_info("MaYuan","mdata...{%s} \n",msg->body); +// /*time debug*/ + { + const char *timestr; + time_t t; + struct tm *tm; + char datestr[]="2006-07-15T07:21:26+0700"; + GDate *date; + time(&t); + tm = gmtime(&t); + timestr = gaim_utf8_strftime("%a, %d %b %Y %T %Z", tm); +// strftime(datestr,strlen(datestr),"%a",tm); + date = g_date_new(); + g_date_set_parse(date,datestr); + gaim_debug_info("MaYuan","date is NULL?date valid%d\n",g_date_valid(date)); + g_date_free(date); + gaim_debug_info("MaYuan","utf8 time:{%s}\n",timestr); + } + /*new a oim session*/ session = cmdproc->session; session->oim = msn_oim_new(session); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-10 15:44:10
|
Revision: 16685 Author: mayuan2006 Date: 2006-08-10 08:43:55 -0700 (Thu, 10 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16685&view=rev Log Message: ----------- add delte group SOAP operation code ok committed by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/contact.h branches/soc-2006-msnp13/src/protocols/msn/msn.c branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/userlist.c Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-10 04:38:13 UTC (rev 16684) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-10 15:43:55 UTC (rev 16685) @@ -495,27 +495,59 @@ msn_soap_post(contact->soapconn,MSN_GLEAMS_TEMPLATE,msn_address_written_cb); } +/*************************************************************** + * Group Operation + ***************************************************************/ +static void +msn_group_read_cb(gpointer data, gint source, GaimInputCondition cond) +{ + gaim_debug_info("MaYuan","Group read \n"); +} + +static void +msn_group_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + gaim_debug_info("MaYuan","finish Group written\n"); + soapconn->read_cb = msn_group_read_cb; + msn_soap_read_cb(data,source,cond); +} + /*add group*/ -void msn_add_group(MsnContact *contact,const char* group_name) +void msn_add_group(MsnSession *session,const char* group_name) { + char *body = NULL; + MsnContact *contact ; + + g_return_if_fail(session != NULL); + contact = session->contact; gaim_debug_info("MaYuan","msn add group...\n"); + 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,MSN_GROUP_ADD_TEMPLATE,msn_address_written_cb); + msn_soap_post(contact->soapconn,body,msn_group_written_cb); + g_free(body); } /*delete a group*/ -void msn_del_group(MsnContact *contact,const char *guid) +void msn_del_group(MsnSession *session,const char *guid) { + MsnContact *contact; + char *body = NULL; + + g_return_if_fail(session != NULL); + contact = session->contact; gaim_debug_info("MaYuan","msn del group...\n"); + 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,MSN_GROUP_DEL_TEMPLATE,msn_address_written_cb); - + msn_soap_post(contact->soapconn,body,msn_group_written_cb); + g_free(body); } void Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-10 04:38:13 UTC (rev 16684) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-10 15:43:55 UTC (rev 16685) @@ -158,7 +158,9 @@ MsnSoapConn *soapconn; }; -/*function prototype*/ +/************************************************ + * function prototype + ************************************************/ MsnContact * msn_contact_new(MsnSession *session); void msn_contact_destroy(MsnContact *contact); @@ -166,5 +168,8 @@ void msn_get_contact_list(MsnContact * contact); void msn_get_address_book(MsnContact *contact); +/*group operation*/ +void msn_add_group(MsnSession *session,const char* group_name); +void msn_del_group(MsnSession *session,const char *guid); #endif/* _MSN_CMDPROC_H_*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-10 04:38:13 UTC (rev 16684) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-10 15:43:55 UTC (rev 16685) @@ -1268,6 +1268,7 @@ cmdproc = session->notification->cmdproc; enc_new_group_name = gaim_url_encode(group->name); + gaim_debug_info("MaYuan","rename group:old{%s},new{%s}",old_name,enc_new_group_name); old_gid = msn_userlist_find_group_id(session->userlist, old_name); if (old_gid != NULL){ Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-10 04:38:13 UTC (rev 16684) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-10 15:43:55 UTC (rev 16685) @@ -301,7 +301,7 @@ g_snprintf(proto_str, sizeof(proto_str), "MSNP%d", session->protocol_ver); for (i = 1; i < cmd->param_count -1; i++){ - gaim_debug_info("MaYuan","%s\,proto_str:%s\n",cmd->params[i],proto_str); + gaim_debug_info("MaYuan","%s,proto_str:%s\n",cmd->params[i],proto_str); if (strcmp(cmd->params[i], proto_str) >= 0) { protocol_supported = TRUE; break; @@ -531,11 +531,14 @@ MsnTransaction *trans; char * payload; + gaim_debug_info("MaYuan","Process ADL\n"); +#if 0 trans = msn_transaction_new(cmdproc, "RML",""); msn_transaction_set_payload(trans, payload, strlen(payload)); msn_cmdproc_send_trans(cmdproc, trans); +#endif } static void @@ -1414,6 +1417,8 @@ } g_strfreev(elems); +/* test code for add group*/ +// msn_add_group(session,"hello"); } static void @@ -1591,7 +1596,7 @@ msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd); msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd); - msn_table_add_cmd(cbs_table, NULL, "REM", rem_cmd); + msn_table_add_cmd(cbs_table, NULL, "RML", rml_cmd); msn_table_add_cmd(cbs_table, NULL, "ADL", adl_cmd); msn_table_add_cmd(cbs_table, NULL, "QRY", NULL); Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-10 04:38:13 UTC (rev 16684) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-10 15:43:55 UTC (rev 16685) @@ -187,7 +187,6 @@ const char *old_group_name, const char *new_group_name) { MsnCmdProc *cmdproc; -// MsnTransaction *trans; MsnMoveBuddy *data; cmdproc = userlist->session->notification->cmdproc; @@ -199,6 +198,7 @@ data->old_group_name = g_strdup(old_group_name); /*TODO:add new group via SOAP action*/ + } /************************************************************************** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-12 10:30:45
|
Revision: 16716 Author: mayuan2006 Date: 2006-08-12 03:30:30 -0700 (Sat, 12 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16716&view=rev Log Message: ----------- add/delete contact function OK committed by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/contact.h branches/soc-2006-msnp13/src/protocols/msn/msn.c branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/notification.h branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/soap.h branches/soc-2006-msnp13/src/protocols/msn/state.c branches/soc-2006-msnp13/src/protocols/msn/userlist.c Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-12 10:30:30 UTC (rev 16716) @@ -195,7 +195,7 @@ } static void -msn_contact_written_cb(gpointer data, gint source, GaimInputCondition cond) +msn_get_contact_written_cb(gpointer data, gint source, GaimInputCondition cond) { MsnSoapConn * soapconn = data; @@ -210,7 +210,7 @@ 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_contact_written_cb); + msn_soap_post(contact->soapconn,MSN_GET_CONTACT_TEMPLATE,msn_get_contact_written_cb); } static void @@ -372,7 +372,7 @@ xmlnode_free(node); msn_soap_free_read_buf(contact->soapconn); - dump_adl_cmd(session); + msn_notification_dump_contact(session); msn_set_psm(session); msn_session_finish_login(session); } @@ -415,44 +415,99 @@ msn_soap_post(contact->soapconn,MSN_GET_ADDRESS_TEMPLATE,msn_address_written_cb); } +static void +msn_add_contact_read_cb(gpointer data, gint source, GaimInputCondition cond) +{ + gaim_debug_info("MaYuan","block read done\n"); +} + +static void +msn_add_contact_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + gaim_debug_info("MaYuan","finish unblock written\n"); + soapconn->read_cb = msn_add_contact_read_cb; + msn_soap_read_cb(data,source,cond); +} + /*add a Contact */ void -msn_add_contact(MsnContact *contact,const char *passport) +msn_add_contact(MsnContact *contact,const char *passport,char *groupId) { char *body = NULL; char *contact_xml = NULL; gaim_debug_info("MaYuan","msn add a contact...\n"); contact_xml = g_strdup_printf(MSN_CONTACT_XML,passport); - body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE,contact_xml); - g_free(contact_xml); + if(groupId == NULL){ + 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); + }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); + } + msn_soap_post(contact->soapconn,body,msn_add_contact_written_cb); - /*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); - msn_soap_post(contact->soapconn,body,msn_address_written_cb); - g_free(body); } +static void +msn_delete_contact_read_cb(gpointer data, gint source, GaimInputCondition cond) +{ + gaim_debug_info("MaYuan","delete contact read done\n"); +} + +static void +msn_delete_contact_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + gaim_debug_info("MaYuan","delete contact written\n"); + soapconn->read_cb = msn_delete_contact_read_cb; + msn_soap_read_cb(data,source,cond); +} + /*delete a Contact*/ void -msn_delete_contact(MsnContact *contact,const char *passport_id) +msn_delete_contact(MsnContact *contact,const char *contactId) { char *body = NULL; char *contact_xml = NULL ; - gaim_debug_info("MaYuan","msn delete a contact...\n"); - contact_xml = g_strdup_printf(MSN_CONTACTS_DEL_XML,passport_id); + 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_address_written_cb); + msn_soap_post(contact->soapconn,body,msn_delete_contact_written_cb); g_free(body); } +static void +msn_block_read_cb(gpointer data, gint source, GaimInputCondition cond) +{ + gaim_debug_info("MaYuan","block read done\n"); +} + +static void +msn_block_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + gaim_debug_info("MaYuan","finish unblock written\n"); + soapconn->read_cb = msn_block_read_cb; + msn_soap_read_cb(data,source,cond); +} + /*block a Contact*/ void msn_block_contact(MsnContact *contact,const char* membership_id) @@ -464,10 +519,26 @@ /*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_address_written_cb); + msn_soap_post(contact->soapconn,body,msn_block_written_cb); g_free(body); } +static void +msn_unblock_read_cb(gpointer data, gint source, GaimInputCondition cond) +{ + gaim_debug_info("MaYuan","unblock read done\n"); +} + +static void +msn_unblock_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + gaim_debug_info("MaYuan","finish unblock written\n"); + soapconn->read_cb = msn_unblock_read_cb; + msn_soap_read_cb(data,source,cond); +} + /*unblock a contact*/ void msn_unblock_contact(MsnContact *contact,const char* passport) @@ -480,10 +551,26 @@ /*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_address_written_cb); + msn_soap_post(contact->soapconn,body,msn_unblock_written_cb); g_free(body); } +static void +msn_gleams_read_cb(gpointer data, gint source, GaimInputCondition cond) +{ + gaim_debug_info("MaYuan","Gleams read done\n"); +} + +static void +msn_gleams_written_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnSoapConn * soapconn = data; + + gaim_debug_info("MaYuan","finish Group written\n"); + soapconn->read_cb = msn_gleams_read_cb; + msn_soap_read_cb(data,source,cond); +} + /*get the gleams info*/ void msn_get_gleams(MsnContact *contact) @@ -492,7 +579,7 @@ /*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_address_written_cb); + msn_soap_post(contact->soapconn,MSN_GLEAMS_TEMPLATE,msn_gleams_written_cb); } /*************************************************************** Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.h 2006-08-12 10:30:30 UTC (rev 16716) @@ -25,7 +25,7 @@ #ifndef _MSN_CONTACT_H_ #define _MSN_CONTACT_H_ -#define MSN_CONTACT_SERVER "contacts.msn.com" +#define MSN_CONTACT_SERVER "omega.contacts.msn.com" /*get contact list soap request template*/ #define MSN_GET_CONTACT_POST_URL "/abservice/SharingService.asmx" @@ -116,6 +116,10 @@ #define MSN_ADD_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>ContactSave</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABContactAdd xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><contacts>%s</contacts><options><EnableAllowListManagement>true</EnableAllowListManagement></options></ABContactAdd></soap:Body></soap:Envelope>" +/*Contact Group Add*/ +#define MSN_ADD_CONTACT_GROUP_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupContactAdd" +#define MSN_ADD_CONTACT_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>ContactSave</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupContactAdd xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupFilter><groupIds><guid>%s</guid></groupIds></groupFilter><contacts>%s</contacts><groupContactAddOptions><fGenerateMissingQuickName>true</fGenerateMissingQuickName><EnableAllowListManagement>true</EnableAllowListManagement></groupContactAddOptions></ABGroupContactAdd></soap:Body></soap:Envelope>" + /*delete contact from contact list soap request template*/ #define MSN_CONTACT_DEL_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactDelete" #define MSN_CONTACTS_DEL_XML "<Contact><contactId>%s</contactId></Contact>" @@ -168,6 +172,11 @@ void msn_get_contact_list(MsnContact * contact); void msn_get_address_book(MsnContact *contact); +/*contact SOAP Operation*/ +void msn_add_contact(MsnContact *contact,const char *passport,char *groupId); +void msn_delete_contact(MsnContact *contact,const char *contactId); + + /*group operation*/ void msn_add_group(MsnSession *session,const char* group_name); void msn_del_group(MsnSession *session,const char *guid); Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-12 10:30:30 UTC (rev 16716) @@ -972,6 +972,7 @@ userlist = session->userlist; who = msn_normalize(gc->account, buddy->name); + gaim_debug_info("MaYuan","add user:{%s} to group:{%s}\n",who,group->name); if (!session->logged_in) { #if 0 Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-12 10:30:30 UTC (rev 16716) @@ -34,6 +34,11 @@ static MsnTable *cbs_table; +/**************************************************************************** + * Local Function Prototype + ****************************************************************************/ +void msn_add_contact_xml(xmlnode *mlNode,char *passport,int list_op,int type); + /************************************************************************** * Main **************************************************************************/ @@ -434,19 +439,70 @@ /************************************************************************** * Buddy Lists **************************************************************************/ +/* add contact to xmlnode */ +void +msn_add_contact_xml(xmlnode *mlNode,char *passport,int list_op,int type) +{ + xmlnode *d_node,*c_node; + char **tokens; + char *email,*domain; + char *list_op_str,*type_str; + + gaim_debug_info("MaYuan","passport:%s\n",passport); + tokens = g_strsplit(passport, "@", 2); + email = tokens[0]; + domain = tokens[1]; + + /*find a domain Node*/ + for(d_node = xmlnode_get_child(mlNode,"d"); d_node; d_node = xmlnode_get_next_twin(d_node)){ + const char * attr = NULL; + gaim_debug_info("MaYuan","d_node:%s\n",d_node->name); + attr = xmlnode_get_attrib(d_node,"n"); + if(attr == NULL){ + continue; + } + if(!strcmp(attr,domain)){ + break; + } + } + if(d_node == NULL){ + /*domain not found, create a new domain Node*/ + gaim_debug_info("MaYuan","get No d_node\n"); + d_node = xmlnode_new("d"); + xmlnode_set_attrib(d_node,"n",domain); + xmlnode_insert_child(mlNode,d_node); + } + + /*create contact node*/ + c_node = xmlnode_new("c"); + xmlnode_set_attrib(c_node,"n",email); + + list_op_str = g_strdup_printf("%d",list_op); + gaim_debug_info("MaYuan","list_op:%d\n",list_op_str); + xmlnode_set_attrib(c_node,"l",list_op_str); + g_free(list_op_str); +#if 0 + type_str = g_strdup_printf("%d",type); + xmlnode_set_attrib(c_node,"t",type_str); +#else + type_str = g_strdup_printf("1"); + xmlnode_set_attrib(c_node,"t",type_str); + g_free(type_str); +#endif + xmlnode_insert_child(d_node, c_node); +} + +/*dump contact info to NS*/ void -dump_adl_cmd(MsnSession *session) +msn_notification_dump_contact(MsnSession *session) { MsnCmdProc *cmdproc; MsnTransaction *trans; MsnUserList *userlist; MsnUser *user; GList *l; - xmlnode *adl_node,*d_node,*c_node; - char **tokens; - char *email,*domain; + xmlnode *adl_node; char *payload; - char *list_op,*type; int payload_len; cmdproc = session->notification->cmdproc; @@ -458,58 +514,15 @@ /*get the userlist*/ for (l = userlist->users; l != NULL; l = l->next){ user = l->data; - - gaim_debug_info("MaYuan","passport:%s\n",user->passport); - tokens = g_strsplit(user->passport, "@", 2); - email = tokens[0]; - domain = tokens[1]; - - /*find a domain node*/ - for(d_node = xmlnode_get_child(adl_node,"d"); d_node; d_node = xmlnode_get_next_twin(d_node)){ - const char * attr = NULL; - gaim_debug_info("MaYuan","d_node:%s\n",d_node->name); - attr = xmlnode_get_attrib(d_node,"n"); - if(attr == NULL){ - continue; - } - if(!strcmp(attr,domain)){ - break; - } - } - if(d_node == NULL){ - gaim_debug_info("MaYuan","get No d_node\n"); - d_node = xmlnode_new("d"); - xmlnode_set_attrib(d_node,"n",domain); - xmlnode_insert_child(adl_node,d_node); - } - - /*create contact node*/ - c_node = xmlnode_new("c"); - xmlnode_set_attrib(c_node,"n",email); - - list_op = g_strdup_printf("%d",user->list_op); - gaim_debug_info("MaYuan","list_op:%d\n",user->list_op); - xmlnode_set_attrib(c_node,"l",list_op); -#if 0 - type = g_strdup_printf("%d",user->type); - xmlnode_set_attrib(c_node,"t",type); -#else - type = g_strdup_printf("1"); - xmlnode_set_attrib(c_node,"t",type); -#endif - xmlnode_insert_child(d_node, c_node); - - g_free(list_op); - g_free(type); + msn_add_contact_xml(adl_node,user->passport,user->list_op,user->type); } payload = xmlnode_to_str(adl_node,&payload_len); + xmlnode_free(adl_node); gaim_debug_info("MaYuan","ADL{%s}\n",payload); trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload)); - msn_transaction_set_payload(trans, payload, strlen(payload)); - msn_cmdproc_send_trans(cmdproc, trans); } @@ -1530,16 +1543,29 @@ const char *group_id) { MsnCmdProc *cmdproc; + MsnTransaction *trans; + xmlnode *adl_node; + char *payload; + int payload_len; + cmdproc = notification->servconn->cmdproc; - if (group_id != NULL && !strcmp(list, "FL")) + if (strcmp(list, "FL") != 0){ + } - if (group_id >= 0){ - msn_cmdproc_send(cmdproc, "ADD", "%s %s %s %d", - list, who, store_name, group_id); - }else{ - msn_cmdproc_send(cmdproc, "ADD", "%s %s %s", list, who, store_name); - } + adl_node = xmlnode_new("ml"); + adl_node->child = NULL; + xmlnode_set_attrib(adl_node, "l", "1"); + + msn_add_contact_xml(adl_node,who,3,1); + + payload = xmlnode_to_str(adl_node,&payload_len); + xmlnode_free(adl_node); + + gaim_debug_info("MaYuan","ADL{%s}\n",payload); + trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload)); + msn_transaction_set_payload(trans, payload, strlen(payload)); + msn_cmdproc_send_trans(cmdproc, trans); } void @@ -1547,19 +1573,31 @@ const char *who, const char *group_id) { MsnCmdProc *cmdproc; + MsnTransaction *trans; + xmlnode *rml_node; + char *payload; + int payload_len; + cmdproc = notification->servconn->cmdproc; - if (group_id != NULL){ - msn_cmdproc_send(cmdproc, "REM", "%s %s %d", list, who, group_id); - }else{ - msn_cmdproc_send(cmdproc, "REM", "%s %s", list, who); - } + rml_node = xmlnode_new("ml"); + rml_node->child = NULL; + xmlnode_set_attrib(rml_node, "l", "1"); + + msn_add_contact_xml(rml_node,who,3,1); + + payload = xmlnode_to_str(rml_node,&payload_len); + xmlnode_free(rml_node); + + gaim_debug_info("MaYuan","RML{%s}\n",payload); + trans = msn_transaction_new(cmdproc, "RML","%d",strlen(payload)); + msn_transaction_set_payload(trans, payload, strlen(payload)); + msn_cmdproc_send_trans(cmdproc, trans); } /************************************************************************** * Init **************************************************************************/ - void msn_notification_init(void) { Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-08-12 10:30:30 UTC (rev 16716) @@ -63,7 +63,7 @@ gboolean msn_notification_connect(MsnNotification *notification, const char *host, int port); void msn_notification_disconnect(MsnNotification *notification); -void dump_adl_cmd(MsnSession *session); +void msn_notification_dump_contact(MsnSession *session); /** * Closes a notification. Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-12 10:30:30 UTC (rev 16716) @@ -106,7 +106,8 @@ } /*pose single message to oim server*/ -void msn_oim_send_single_msg(MsnOim *oim,char * msg) +void +msn_oim_send_single_msg(MsnOim *oim,char * msg) { const char *oimsoapbody,*t,*p; @@ -139,6 +140,10 @@ } /**************************************** + * OIM delete SOAP request + * **************************************/ + +/**************************************** * OIM get SOAP request * **************************************/ /*oim SOAP server login error*/ @@ -179,9 +184,13 @@ GaimInputCondition cond) { MsnSoapConn * soapconn = data; - MsnOim * msnoim; + MsnOim * oim = soapconn->session->oim; gaim_debug_info("MaYuan","OIM get read buffer:{%s}\n",soapconn->body); + + /*get next single Offline Message*/ + oim->oim_list = g_list_remove(oim->oim_list, oim->oim_list->data); +// msn_oim_get_msg(oim); } static void @@ -220,7 +229,6 @@ if ((conv = msn_oim_get_conv(oim,passport)) != NULL){ gaim_conversation_write(conv, NULL, msg, GAIM_MESSAGE_SYSTEM, time(NULL)); } - } /*parse the oim XML data*/ @@ -269,19 +277,15 @@ msgid ); msn_soap_post(oim->retrieveconn, oimsoapbody, msn_oim_get_written_cb); - } /*MSN OIM get SOAP request*/ void msn_oim_get_msg(MsnOim *oim) { - GList *list; - gaim_debug_info("MaYuan","Get OIM with SOAP \n"); // gaim_debug_info("MaYuan","oim->oim_list:%p,data:%s \n",oim->oim_list,oim->oim_list->data); - for(list = oim->oim_list; list!= NULL;list = g_list_next(list)){ - msn_oim_post_single_get_msg(oim,list->data); - oim->oim_list = g_list_remove(oim->oim_list, list->data); + if(oim->oim_list !=NULL){ + msn_oim_post_single_get_msg(oim,oim->oim_list->data); } } Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-12 10:30:30 UTC (rev 16716) @@ -146,12 +146,12 @@ { gssize len; gssize total_len = 0; - char temp_buf[10240]; + char temp_buf[MSN_SOAP_READ_BUFF_SIZE]; if(soapconn->ssl_conn){ - len = gaim_ssl_read(soapconn->gsc, temp_buf,sizeof(temp_buf)); + len = gaim_ssl_read(soapconn->gsc, temp_buf,MSN_SOAP_READ_BUFF_SIZE); }else{ - len = read(soapconn->fd, temp_buf,sizeof(temp_buf)); + len = read(soapconn->fd, temp_buf,MSN_SOAP_READ_BUFF_SIZE); } if(len >0){ total_len += len; @@ -162,6 +162,7 @@ soapconn->read_len += len; soapconn->read_buf[soapconn->read_len] = '\0'; } + gaim_debug_info("MaYuan","++soap ssl read:{%d}\n",total_len); // gaim_debug_info("MaYuan","nexus ssl read:{%s}\n",soapconn->read_buf); return total_len; } @@ -209,6 +210,7 @@ /* Redirect. */ char *location, *c; + gaim_debug_error("MaYuan", "soap redirect\n"); location = strstr(soapconn->read_buf, "Location: "); if (location == NULL) { @@ -244,6 +246,7 @@ { const char *error; + gaim_debug_error("MaYuan", "soap 401\n"); if ((error = strstr(soapconn->read_buf, "WWW-Authenticate")) != NULL) { if ((error = strstr(error, "cbtxt=")) != NULL) @@ -284,12 +287,11 @@ /*setup the conn body */ soapconn->body = body_start; soapconn->body_len = atoi(body_len); - // gaim_debug_misc("MaYuan","content length :%d",soapconn->body_len); + 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 + atoi(body_len)){ + if(soapconn->read_len < body_start - soapconn->read_buf + soapconn->body_len){ return; } - g_free(body_len); #if 1 @@ -313,6 +315,7 @@ // soapconn->gsc = NULL; #endif } + return; } void @@ -342,6 +345,13 @@ MsnSoapConn *soapconn = data; int len, total_len; + g_return_if_fail(soapconn != NULL); + if(soapconn->write_buf == NULL){ + gaim_debug_error("MaYuan","soap buffer is NULL\n"); + gaim_input_remove(soapconn->output_handler); + soapconn->output_handler = -1; + return; + } total_len = strlen(soapconn->write_buf); /* Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-08-12 10:30:30 UTC (rev 16716) @@ -26,6 +26,8 @@ #ifndef _MSN_SOAP_H_ #define _MSN_SOAP_H_ +#define MSN_SOAP_READ_BUFF_SIZE 8192 + /*MSN Https connection structure*/ typedef struct _MsnSoapConn MsnSoapConn; Modified: branches/soc-2006-msnp13/src/protocols/msn/state.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/state.c 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/state.c 2006-08-12 10:30:30 UTC (rev 16716) @@ -38,6 +38,17 @@ N_("Available") }; +/* Local Function Prototype*/ +char * msn_build_psm(char * psmstr,char *mediastr,char * guidstr); + +/* + * WLM media PSM info build prcedure + * + * Result can like: + * <CurrentMedia>\0Music\01\0{0} - {1}\0 Song Title\0Song Artist\0Song Album\0\0</CurrentMedia>\ + * <CurrentMedia>\0Games\01\0Playing {0}\0Game Name\0</CurrentMedia>\ + * <CurrentMedia>\0Office\01\0Office Message\0Office App Name\0</CurrentMedia>" + */ char * msn_build_psm(char * psmstr,char *mediastr,char * guidstr) { @@ -53,10 +64,6 @@ } xmlnode_insert_child(dataNode,psmNode); -//"<CurrentMedia>\0Music\01\0{0} - {1}\0 Song Title\0Song Artist\0Song Album\0\0</CurrentMedia>\ -<CurrentMedia>\0Games\01\0Playing {0}\0Game Name\0</CurrentMedia>\ -<CurrentMedia>\0Office\01\0Office Message\0Office App Name\0</CurrentMedia>" - mediaNode = xmlnode_new("CurrentMedia"); if(mediastr != NULL){ xmlnode_insert_data(psmNode,mediastr,strlen(mediastr)); Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-12 10:27:29 UTC (rev 16715) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-12 10:30:30 UTC (rev 16716) @@ -591,6 +591,10 @@ const char *list; user = msn_userlist_find_user(userlist, who); + + /*delete the contact from address book via soap action*/ + msn_delete_contact(userlist->session->contact,user->uid); + group_id = NULL; if (group_name != NULL){ @@ -614,7 +618,7 @@ /* Then request the rem to the server. */ list = lists[list_id]; - msn_notification_rem_buddy(userlist->session->notification, list, who, group_id); +// msn_notification_rem_buddy(userlist->session->notification, list, who, group_id); } /*add buddy*/ @@ -628,6 +632,7 @@ const char *list; const char *store_name; + gaim_debug_info("MaYuan", "userlist add buddy,name:{%s},group:{%s}\n",who ,group_name); group_id = NULL; if (!gaim_email_is_valid(who)){ @@ -668,8 +673,11 @@ /* Then request the add to the server. */ list = lists[list_id]; - msn_notification_add_buddy(userlist->session->notification, list, who, + gaim_debug_info("MaYuan", "add user:{%s} to group id {%s}\n",store_name ,group_id); + msn_add_contact(userlist->session->contact,who,group_id); +/* msn_notification_add_buddy(userlist->session->notification, list, who, store_name, group_id); + */ } void This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-12 12:57:26
|
Revision: 16722 Author: mayuan2006 Date: 2006-08-12 05:57:16 -0700 (Sat, 12 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16722&view=rev Log Message: ----------- change some minor bug committed by Ma Yuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/oim.h Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-12 11:20:34 UTC (rev 16721) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-12 12:57:16 UTC (rev 16722) @@ -37,7 +37,7 @@ /**************************************************************************** * Local Function Prototype ****************************************************************************/ -void msn_add_contact_xml(xmlnode *mlNode,char *passport,int list_op,int type); +void msn_add_contact_xml(xmlnode *mlNode,const char *passport,int list_op,int type); /************************************************************************** * Main @@ -441,7 +441,7 @@ **************************************************************************/ /* add contact to xmlnode */ void -msn_add_contact_xml(xmlnode *mlNode,char *passport,int list_op,int type) +msn_add_contact_xml(xmlnode *mlNode,const char *passport,int list_op,int type) { xmlnode *d_node,*c_node; char **tokens; @@ -1383,8 +1383,6 @@ initial_mdata_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { MsnSession *session; - xmlnode *mdNode; - char *end; char **elems, **cur, **tokens; // gaim_debug_info("MaYuan","mdata...{%s} \n",msg->body); Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-12 11:20:34 UTC (rev 16721) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-12 12:57:16 UTC (rev 16722) @@ -233,7 +233,7 @@ /*parse the oim XML data*/ void -msn_parse_oim_msg(MsnOim *oim,char *xmlmsg) +msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg) { xmlnode *mdNode,*mNode,*INode,*nNode,*ENode,*rtNode; char *passport,*rTime,*msgid,*nickname; Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-08-12 11:20:34 UTC (rev 16721) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-08-12 12:57:16 UTC (rev 16722) @@ -103,7 +103,7 @@ void msn_oim_destroy(MsnOim *oim); void msn_oim_connect(MsnOim *oim); -void msn_parse_oim_msg(MsnOim *oim,char *xmlmsg); +void msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg); /*get the OIM message*/ void msn_oim_get_msg(MsnOim *oim); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-13 06:09:56
|
Revision: 16733 Author: mayuan2006 Date: 2006-08-12 23:09:48 -0700 (Sat, 12 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16733&view=rev Log Message: ----------- change the BL process method continue to debug This is an in progress version,continue to add support for send Yahoo Message committed by Ma Yuan <may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/msn.h branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/userlist.c Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-13 05:50:19 UTC (rev 16732) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-13 06:09:48 UTC (rev 16733) @@ -91,8 +91,8 @@ return MSN_LIST_AL_OP; }else if(!strcmp(role,"Block")){ return MSN_LIST_BL_OP; -// }else if(!strcmp(role,"Reverse")){ -// return MSN_LIST_RL_OP; + }else if(!strcmp(role,"Reverse")){ + return MSN_LIST_RL_OP; } return 0; } @@ -326,7 +326,7 @@ } msn_user_set_uid(user,uid); msn_user_set_type(user,msn_get_user_type(type)); - user->list_op |= 1; + user->list_op |= MSN_LIST_FL_OP; gaim_debug_misc("MsnContact","\n"); groupIds = xmlnode_get_child(contactInfo,"groupIds"); Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-08-13 05:50:19 UTC (rev 16732) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.h 2006-08-13 06:09:48 UTC (rev 16733) @@ -100,6 +100,7 @@ MSN_LIST_RL_OP = 0x08 } MsnListOp; +#define MSN_LIST_OP_MASK 0x07 typedef enum { Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-13 05:50:19 UTC (rev 16732) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-13 06:09:48 UTC (rev 16733) @@ -481,11 +481,18 @@ gaim_debug_info("MaYuan","list_op:%d\n",list_op_str); xmlnode_set_attrib(c_node,"l",list_op_str); g_free(list_op_str); -#if 0 +#if 1 type_str = g_strdup_printf("%d",type); xmlnode_set_attrib(c_node,"t",type_str); #else - type_str = g_strdup_printf("1"); + if(g_strrstr(domain,"yahoo") != NULL){ + type_str = g_strdup_printf("31"); + }else{ + /*passport*/ + type_str = g_strdup_printf("1"); + } + /*mobile*/ + //type_str = g_strdup_printf("4"); xmlnode_set_attrib(c_node,"t",type_str); g_free(type_str); #endif @@ -514,7 +521,7 @@ /*get the userlist*/ for (l = userlist->users; l != NULL; l = l->next){ user = l->data; - msn_add_contact_xml(adl_node,user->passport,user->list_op,user->type); + msn_add_contact_xml(adl_node,user->passport,user->list_op&MSN_LIST_OP_MASK,user->type); } payload = xmlnode_to_str(adl_node,&payload_len); @@ -739,6 +746,7 @@ state = cmd->params[1]; passport = cmd->params[2]; + /*if a contact is actually on the WLM part or the yahoo part*/ wlmclient = atoi(cmd->params[3]); friendly = gaim_url_decode(cmd->params[4]); Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-13 05:50:19 UTC (rev 16732) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-13 06:09:48 UTC (rev 16733) @@ -228,6 +228,7 @@ const char *passport; const char *friendly; + gaim_debug_info("MaYuan","got add user...\n"); account = session->account; passport = msn_user_get_passport(user); @@ -675,9 +676,8 @@ gaim_debug_info("MaYuan", "add user:{%s} to group id {%s}\n",store_name ,group_id); msn_add_contact(userlist->session->contact,who,group_id); -/* msn_notification_add_buddy(userlist->session->notification, list, who, + msn_notification_add_buddy(userlist->session->notification, list, who, store_name, group_id); - */ } void This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-13 16:02:07
|
Revision: 16737 Author: mayuan2006 Date: 2006-08-13 09:01:52 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16737&view=rev Log Message: ----------- can send Message to Yahoo Messenger can receive the Yahoo Message, Need to post it to the conversation committed by Ma Yuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/command.c branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/msg.c branches/soc-2006-msnp13/src/protocols/msn/msn.c branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/notification.h branches/soc-2006-msnp13/src/protocols/msn/switchboard.c branches/soc-2006-msnp13/src/protocols/msn/user.c branches/soc-2006-msnp13/src/protocols/msn/userlist.c branches/soc-2006-msnp13/src/protocols/msn/userlist.h Modified: branches/soc-2006-msnp13/src/protocols/msn/command.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-08-13 16:01:52 UTC (rev 16737) @@ -51,6 +51,8 @@ (!strcmp(str,"RML")) || (!strcmp(str,"UBX")) || (!strcmp(str,"UBN")) || + (!strcmp(str,"UUM")) || + (!strcmp(str,"UBM")) || (!strcmp(str,"UUN")) || (!strcmp(str,"UUX"))){ return TRUE; @@ -66,6 +68,11 @@ if(!(strcmp(str,"MSG"))|| (!strcmp(str,"UBX")) ){ return 2; } + /*Yahoo User Message UBM + * Format UBM em...@ya... 32 1 [payload length]*/ + if(!(strcmp(str,"UBM"))|| (!strcmp(str,"UUM")) ){ + return 3; + } return 1; } Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-13 16:01:52 UTC (rev 16737) @@ -112,14 +112,13 @@ msn_parse_contact_list(MsnContact * contact) { MsnSession * session; - MsnUser *user; int list_op =0; char * passport; xmlnode * node,*body,*response,*result,*services,*service,*memberships; xmlnode *membershipnode,*members,*member,*passportNode,*role; session = contact->session; -// gaim_debug_misc("xml","parse contact list:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); + gaim_debug_misc("xml","parse contact list:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); // node = xmlnode_from_str(contact->soapconn->body, -1); @@ -148,6 +147,7 @@ members = xmlnode_get_child(membershipnode,"Members"); for(member = xmlnode_get_child(members, "Member"); member; member = xmlnode_get_next_twin(member)){ + MsnUser *user; xmlnode * typeNode; char * type; @@ -158,17 +158,20 @@ typeNode = xmlnode_get_child(member,"Type"); type = xmlnode_get_data(typeNode); gaim_debug_misc("Passport","name:%s,type:%s\n",passport,type); - user = msn_userlist_find_user(session->userlist, passport); - if (user == NULL){ - user = msn_user_new(session->userlist, passport, ""); - msn_userlist_add_user(session->userlist, user); - } -// user->list_op |= list_op; + + user = msn_userlist_find_add_user(session->userlist,passport,NULL); msn_got_lst_user(session, user, list_op, NULL); } if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PhoneMember")){ } if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"EmailMember")){ + xmlnode *emailNode; + + emailNode = xmlnode_get_child(member,"Email"); + passport = xmlnode_get_data(emailNode); + gaim_debug_info("Email","name:%s,list_op:%d\n",passport,list_op); + user = msn_userlist_find_add_user(session->userlist,passport,NULL); + msn_got_lst_user(session,user,list_op,NULL); } } } @@ -306,10 +309,27 @@ passportName = xmlnode_get_child(contactInfo,"passportName"); if(passportName == NULL){ + xmlnode *emailsNode, *contactEmailNode, *emailNode; + xmlnode *messengerEnabledNode; + char *msnEnabled; + /*TODO: add it to the none-instant Messenger group and recognize as email Membership*/ - continue; + /*Yahoo User?*/ + emailsNode = xmlnode_get_child(contactInfo,"emails"); + for(contactEmailNode = xmlnode_get_child(emailsNode,"ContactEmail");contactEmailNode; + contactEmailNode = xmlnode_get_next_twin(contactEmailNode) ){ + messengerEnabledNode = xmlnode_get_child(contactEmailNode,"isMessengerEnabled"); + msnEnabled = xmlnode_get_data(messengerEnabledNode); + if(!strcmp(msnEnabled,"true")){ + emailNode = xmlnode_get_child(contactEmailNode,"email"); + passport = xmlnode_get_data(emailNode); + gaim_debug_info("Ma Yuan","Yahoo User %s\n",passport); + break; + } + } + }else{ + passport = xmlnode_get_data(passportName); } - passport = xmlnode_get_data(passportName); displayName = xmlnode_get_child(contactInfo,"displayName"); Name =xmlnode_get_data(displayName); @@ -319,11 +339,7 @@ xmlnode_get_data(contactId), Name); - user = msn_userlist_find_user(session->userlist, passport); - if (user == NULL){ - user = msn_user_new(session->userlist, passport, Name); - msn_userlist_add_user(session->userlist, user); - } + user = msn_userlist_find_add_user(session->userlist, passport,Name); msn_user_set_uid(user,uid); msn_user_set_type(user,msn_get_user_type(type)); user->list_op |= MSN_LIST_FL_OP; Modified: branches/soc-2006-msnp13/src/protocols/msn/msg.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-08-13 16:01:52 UTC (rev 16737) @@ -471,6 +471,7 @@ { memcpy(n, body, body_len); n += body_len; + n = "\0"; } } Modified: branches/soc-2006-msnp13/src/protocols/msn/msn.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/msn.c 2006-08-13 16:01:52 UTC (rev 16737) @@ -780,7 +780,7 @@ char *msgformat; char *msgtext; - gaim_debug_info("MaYuan","send IM {%s}\n",message); + gaim_debug_info("MaYuan","send IM {%s} to %s\n",message,who); account = gaim_connection_get_account(gc); msn_import_html(message, &msgformat, &msgtext); @@ -794,20 +794,27 @@ } msg = msn_message_new_plain(msgtext); + msg->remote_user = g_strdup(who); msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat); g_free(msgformat); g_free(msgtext); + gaim_debug_info("MaYuan","prepare to send...\n"); if (g_ascii_strcasecmp(who, gaim_account_get_username(account))) { MsnSession *session; MsnSwitchBoard *swboard; session = gc->proto_data; - swboard = msn_session_get_swboard(session, who, MSN_SB_FLAG_IM); - - msn_switchboard_send_msg(swboard, msg, TRUE); + if(strstr(who,"yahoo") != NULL){ + gaim_debug_info("MaYuan","send to Yahoo!\n"); + uum_send_msg(session,msg); + }else{ + gaim_debug_info("MaYuan","send via switchboard\n"); + swboard = msn_session_get_swboard(session, who, MSN_SB_FLAG_IM); + msn_switchboard_send_msg(swboard, msg, TRUE); + } } else { Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-13 16:01:52 UTC (rev 16737) @@ -161,7 +161,7 @@ **************************************************************************/ static void -group_error_helper(MsnSession *session, const char *msg, int group_id, int error) +group_error_helper(MsnSession *session, const char *msg, const char *group_id, int error) { GaimAccount *account; GaimConnection *gc; @@ -400,6 +400,94 @@ } } +/*send Message to Yahoo Messenger*/ +void +uum_send_msg(MsnSession *session,MsnMessage *msg) +{ + MsnCmdProc *cmdproc; + MsnTransaction *trans; + char *payload; + gsize payload_len; + int type; + + cmdproc = session->notification->cmdproc; + g_return_if_fail(msg != NULL); + payload = msn_message_gen_payload(msg, &payload_len); + gaim_debug_info("MaYuan","send UUM,payload{%s}\n",payload); + type = msg->type; + trans = msn_transaction_new(cmdproc, "UUM","%s 32 %d %d",msg->remote_user,type,strlen(payload)); + msn_transaction_set_payload(trans, payload, strlen(payload)); + msn_cmdproc_send_trans(cmdproc, trans); +} + +static void +ubm_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, + size_t len) +{ + MsnMessage *msg; + GaimConnection *gc; + + gaim_debug_info("MaYuan","Process UBM payload:%s\n",payload); + msg = msn_message_new_from_cmd(cmdproc->session, cmd); + + msn_message_parse_payload(msg, payload, len); +#ifdef MSN_DEBUG_NS + msn_message_show_readable(msg, "Notification", TRUE); +#endif + + gaim_debug_info("MaYuan","type:%d\n",msg->type); + if(msg->type == MSN_MSG_TEXT){ + const char *value; + const char *body; + char *body_str; + char *body_enc; + char *body_final; + size_t body_len; + const char *passport; + + body = msn_message_get_bin_data(msg, &body_len); + body_str = g_strndup(body, body_len); + body_enc = g_markup_escape_text(body_str, -1); + g_free(body_str); + + passport = msg->remote_user; + gc = cmdproc->session->account->gc; + if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL) { + char *pre, *post; + + msn_parse_format(value, &pre, &post); + body_final = g_strdup_printf("%s%s%s", pre ? pre : "", + body_enc ? body_enc : "", post ? post : ""); + g_free(pre); + g_free(post); + g_free(body_enc); + } + serv_got_im(gc, passport, body_final, 0, time(NULL)); + } + msn_message_destroy(msg); +} + +/*Yahoo msg process*/ +static void +ubm_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + gaim_debug_info("MaYuan","Processing UBM... \n"); + if(cmd->payload_len == 0){ + return; + } + /* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued + * command and we are processing it */ + if (cmd->payload == NULL){ + cmdproc->last_cmd->payload_cb = ubm_cmd_post; + cmdproc->servconn->payload_len = atoi(cmd->params[2]); + }else{ + g_return_if_fail(cmd->payload_cb != NULL); + + gaim_debug_info("MaYuan","UBM payload:{%s}\n",cmd->payload); + ubm_cmd_post(cmdproc, cmd, cmd->payload, cmd->payload_len); + } +} + /************************************************************************** * Challenges * we use MD5 to caculate the Chanllenges @@ -481,12 +569,12 @@ gaim_debug_info("MaYuan","list_op:%d\n",list_op_str); xmlnode_set_attrib(c_node,"l",list_op_str); g_free(list_op_str); -#if 1 +#if 0 type_str = g_strdup_printf("%d",type); xmlnode_set_attrib(c_node,"t",type_str); #else if(g_strrstr(domain,"yahoo") != NULL){ - type_str = g_strdup_printf("31"); + type_str = g_strdup_printf("32"); }else{ /*passport*/ type_str = g_strdup_printf("1"); @@ -932,12 +1020,12 @@ static void reg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) { - int group_id; + const char * group_id; char **params; params = g_strsplit(trans->params, " ", 0); - group_id = atoi(params[0]); + group_id = params[0]; group_error_helper(cmdproc->session, _("Unable to rename group"), group_id, error); @@ -1640,6 +1728,7 @@ /* Asynchronous */ msn_table_add_cmd(cbs_table, NULL, "IPG", ipg_cmd); msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); + msn_table_add_cmd(cbs_table, NULL, "UBM", ubm_cmd); msn_table_add_cmd(cbs_table, NULL, "GCF", gcf_cmd); msn_table_add_cmd(cbs_table, NULL, "SBS", sbs_cmd); msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd); Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.h 2006-08-13 16:01:52 UTC (rev 16737) @@ -48,6 +48,7 @@ }; #include "state.h" +void uum_send_msg(MsnSession *session,MsnMessage *msg); void msn_notification_end(void); void msn_notification_init(void); Modified: branches/soc-2006-msnp13/src/protocols/msn/switchboard.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-13 16:01:52 UTC (rev 16737) @@ -742,6 +742,14 @@ } static void +ubm_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + gaim_debug_misc("MaYuan","get UBM...\n"); + cmdproc->servconn->payload_len = atoi(cmd->params[4]); + cmdproc->last_cmd->payload_cb = msg_cmd_post; +} + +static void nak_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnMessage *msg; @@ -1236,6 +1244,7 @@ msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); + msn_table_add_cmd(cbs_table, NULL, "UBM", ubm_cmd); msn_table_add_cmd(cbs_table, NULL, "JOI", joi_cmd); msn_table_add_cmd(cbs_table, NULL, "BYE", bye_cmd); msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd); Modified: branches/soc-2006-msnp13/src/protocols/msn/user.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/user.c 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/user.c 2006-08-13 16:01:52 UTC (rev 16737) @@ -142,8 +142,10 @@ { g_return_if_fail(user != NULL); - g_free(user->store_name); - user->store_name = g_strdup(name); + if (name != NULL){ + g_free(user->store_name); + user->store_name = g_strdup(name); + } } void Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-13 16:01:52 UTC (rev 16737) @@ -448,6 +448,19 @@ g_free(userlist); } +MsnUser * +msn_userlist_find_add_user(MsnUserList *userlist,const char *passport,const char *userName) +{ + MsnUser *user; + + user = msn_userlist_find_user(userlist, passport); + if (user == NULL){ + user = msn_user_new(userlist, passport, userName); + msn_userlist_add_user(userlist, user); + } + return user; +} + void msn_userlist_add_user(MsnUserList *userlist, MsnUser *user) { Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.h 2006-08-13 08:45:09 UTC (rev 16736) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.h 2006-08-13 16:01:52 UTC (rev 16737) @@ -75,10 +75,14 @@ MsnUserList *msn_userlist_new(MsnSession *session); void msn_userlist_destroy(MsnUserList *userlist); + void msn_userlist_add_user(MsnUserList *userlist, MsnUser *user); void msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user); MsnUser *msn_userlist_find_user(MsnUserList *userlist, - const char *passport); + const char *passport); +MsnUser *msn_userlist_find_add_user(MsnUserList *userlist, + const char *passport,const char *userName); + void msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group); void msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group); MsnGroup *msn_userlist_find_group_with_id(MsnUserList *userlist, const char *id); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-14 16:07:31
|
Revision: 16758 Author: mayuan2006 Date: 2006-08-14 09:07:20 -0700 (Mon, 14 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16758&view=rev Log Message: ----------- change to support Showing Yahoo Message committed by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/session.c branches/soc-2006-msnp13/src/protocols/msn/session.h Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-14 12:58:04 UTC (rev 16757) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-14 16:07:20 UTC (rev 16758) @@ -426,6 +426,8 @@ { MsnMessage *msg; GaimConnection *gc; + const char *passport; + const char *content_type; gaim_debug_info("MaYuan","Process UBM payload:%s\n",payload); msg = msn_message_new_from_cmd(cmdproc->session, cmd); @@ -435,35 +437,62 @@ msn_message_show_readable(msg, "Notification", TRUE); #endif - gaim_debug_info("MaYuan","type:%d\n",msg->type); - if(msg->type == MSN_MSG_TEXT){ + gc = cmdproc->session->account->gc; + passport = msg->remote_user; + + content_type = msn_message_get_content_type(msg); + gaim_debug_info("MaYuan","type:%d\n",content_type); + if(!strcmp(content_type,"text/plain")){ const char *value; const char *body; char *body_str; char *body_enc; char *body_final; size_t body_len; - const char *passport; body = msn_message_get_bin_data(msg, &body_len); body_str = g_strndup(body, body_len); body_enc = g_markup_escape_text(body_str, -1); g_free(body_str); - passport = msg->remote_user; - gc = cmdproc->session->account->gc; - if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL) { - char *pre, *post; + if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL) { + char *pre, *post; - msn_parse_format(value, &pre, &post); - body_final = g_strdup_printf("%s%s%s", pre ? pre : "", - body_enc ? body_enc : "", post ? post : ""); - g_free(pre); - g_free(post); - g_free(body_enc); + msn_parse_format(value, &pre, &post); + body_final = g_strdup_printf("%s%s%s", pre ? pre : "", + body_enc ? body_enc : "", post ? post : ""); + g_free(pre); + g_free(post); + g_free(body_enc); } serv_got_im(gc, passport, body_final, 0, time(NULL)); } + if(!strcmp(content_type,"text/x-msmsgscontrol")){ + if(msn_message_get_attr(msg, "TypingUser") != NULL){ + serv_got_typing(gc, passport, MSN_TYPING_RECV_TIMEOUT, + GAIM_TYPING); + } + } + if(!strcmp(content_type,"text/x-msnmsgr-datacast")){ + char *username, *str; + GaimAccount *account; + GaimBuddy *buddy; + const char *user; + + account = cmdproc->session->account; + user = msg->remote_user; + + if ((buddy = gaim_find_buddy(account, user)) != NULL){ + username = g_markup_escape_text(gaim_buddy_get_alias(buddy), -1); + }else{ + username = g_markup_escape_text(user, -1); + } + + str = g_strdup_printf(_("%s just sent you a Nudge!"), username); + g_free(username); + msn_session_report_user(cmdproc->session,user,str,GAIM_MESSAGE_SYSTEM); + g_free(str); + } msn_message_destroy(msg); } @@ -650,43 +679,6 @@ } static void -add_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) -{ - MsnSession *session; - MsnUser *user; - const char *list; - const char *passport; - const char *friendly; - MsnListId list_id; - int group_id; - - list = cmd->params[1]; - passport = cmd->params[3]; - friendly = gaim_url_decode(cmd->params[4]); - - session = cmdproc->session; - - user = msn_userlist_find_user(session->userlist, passport); - - if (user == NULL){ - user = msn_user_new(session->userlist, passport, friendly); - msn_userlist_add_user(session->userlist, user); - }else{ - msn_user_set_friendly_name(user, friendly); - } - - list_id = msn_get_list_id(list); - - if (cmd->param_count >= 6) - group_id = atoi(cmd->params[5]); - else - group_id = -1; - - msn_got_add_user(session, user, list_id, group_id); - msn_user_update(user); -} - -static void add_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) { MsnSession *session; @@ -1707,7 +1699,6 @@ /* Synchronous */ msn_table_add_cmd(cbs_table, "CHG", "CHG", NULL); msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd); - msn_table_add_cmd(cbs_table, "ADD", "ADD", add_cmd); msn_table_add_cmd(cbs_table, "ADL", "ILN", iln_cmd); msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd); msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-14 12:58:04 UTC (rev 16757) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-14 16:07:20 UTC (rev 16758) @@ -202,35 +202,6 @@ msn_soap_read_cb(data,source,cond); } -/*get the conversation*/ -static GaimConversation * -msn_oim_get_conv(MsnOim *oim,const char *passport) -{ - GaimAccount *account; - GaimConversation * conv; - - g_return_val_if_fail(oim != NULL, NULL); - account = oim->session->account; - - conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, - passport, account); - if(conv == NULL){ - conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, account, passport); - } - return conv; -} - -/*put the OIM Message to User Conversation*/ -void -msn_oim_report_user(MsnOim *oim,const char *passport,char *msg) -{ - GaimConversation * conv; - - if ((conv = msn_oim_get_conv(oim,passport)) != NULL){ - gaim_conversation_write(conv, NULL, msg, GAIM_MESSAGE_SYSTEM, time(NULL)); - } -} - /*parse the oim XML data*/ void msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg) @@ -250,7 +221,7 @@ nNode = xmlnode_get_child(mNode,"N"); nickname = xmlnode_get_data(nNode); gaim_debug_info("MaYuan","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); -// msn_oim_report_user(oim,passport,"hello"); +// msn_session_report_user(oim->session,passport,"hello"); oim->oim_list = g_list_append(oim->oim_list,msgid); } if(msn_soap_connected(oim->retrieveconn) == -1){ Modified: branches/soc-2006-msnp13/src/protocols/msn/session.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-08-14 12:58:04 UTC (rev 16757) +++ branches/soc-2006-msnp13/src/protocols/msn/session.c 2006-08-14 16:07:20 UTC (rev 16758) @@ -163,6 +163,38 @@ return NULL; } +/*get the conversation*/ +GaimConversation * +msn_session_get_conv(MsnSession *session,const char *passport) +{ + GaimAccount *account; + GaimConversation * conv; + + g_return_val_if_fail(session != NULL, NULL); + account = session->account; + + conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, + passport, account); + if(conv == NULL){ + conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, account, passport); + } + return conv; +} + +/* put Message to User Conversation + * + * passport - the one want to talk to you + */ +void +msn_session_report_user(MsnSession *session,const char *passport,char *msg,GaimMessageFlags flags) +{ + GaimConversation * conv; + + if ((conv = msn_session_get_conv(session,passport)) != NULL){ + gaim_conversation_write(conv, NULL, msg, flags, time(NULL)); + } +} + MsnSwitchBoard * msn_session_find_swboard_with_conv(MsnSession *session, GaimConversation *conv) { Modified: branches/soc-2006-msnp13/src/protocols/msn/session.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/session.h 2006-08-14 12:58:04 UTC (rev 16757) +++ branches/soc-2006-msnp13/src/protocols/msn/session.h 2006-08-14 16:07:20 UTC (rev 16758) @@ -234,4 +234,12 @@ */ void msn_session_finish_login(MsnSession *session); +/*get conversation via session, + * If has one, return that,else create a new one; + */ +GaimConversation *msn_session_get_conv(MsnSession *session,const char *passport); + +/*post message to User*/ +void msn_session_report_user(MsnSession *session,const char *passport, + char *msg,GaimMessageFlags flags); #endif /* _MSN_SESSION_H_ */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-15 16:48:43
|
Revision: 16772 Author: mayuan2006 Date: 2006-08-15 09:48:32 -0700 (Tue, 15 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16772&view=rev Log Message: ----------- change the UUX and FQY command procedure comitted by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/command.c branches/soc-2006-msnp13/src/protocols/msn/notification.c Modified: branches/soc-2006-msnp13/src/protocols/msn/command.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-08-15 15:57:07 UTC (rev 16771) +++ branches/soc-2006-msnp13/src/protocols/msn/command.c 2006-08-15 16:48:32 UTC (rev 16772) @@ -53,6 +53,7 @@ (!strcmp(str,"UBN")) || (!strcmp(str,"UUM")) || (!strcmp(str,"UBM")) || + (!strcmp(str,"FQY")) || (!strcmp(str,"UUN")) || (!strcmp(str,"UUX"))){ return TRUE; Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-15 15:57:07 UTC (rev 16771) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-15 16:48:32 UTC (rev 16772) @@ -37,6 +37,8 @@ /**************************************************************************** * Local Function Prototype ****************************************************************************/ +void msn_notification_post_adl(MsnCmdProc *cmdproc,char *payload ,int payload_len); + void msn_add_contact_xml(xmlnode *mlNode,const char *passport,int list_op,int type); /************************************************************************** @@ -447,7 +449,7 @@ const char *body; char *body_str; char *body_enc; - char *body_final; + char *body_final = NULL; size_t body_len; body = msn_message_get_bin_data(msg, &body_len); @@ -614,14 +616,25 @@ g_free(type_str); #endif xmlnode_insert_child(d_node, c_node); + + g_free(tokens); } +void +msn_notification_post_adl(MsnCmdProc *cmdproc,char *payload, int payload_len) +{ + MsnTransaction *trans; + + gaim_debug_info("MaYuan","Send ADL{%s}\n",payload); + trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload)); + msn_transaction_set_payload(trans, payload, strlen(payload)); + msn_cmdproc_send_trans(cmdproc, trans); +} + /*dump contact info to NS*/ void msn_notification_dump_contact(MsnSession *session) { - MsnCmdProc *cmdproc; - MsnTransaction *trans; MsnUserList *userlist; MsnUser *user; GList *l; @@ -629,7 +642,6 @@ char *payload; int payload_len; - cmdproc = session->notification->cmdproc; userlist = session->userlist; adl_node = xmlnode_new("ml"); adl_node->child = NULL; @@ -644,10 +656,31 @@ payload = xmlnode_to_str(adl_node,&payload_len); xmlnode_free(adl_node); - gaim_debug_info("MaYuan","ADL{%s}\n",payload); - trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload)); + msn_notification_post_adl(session->notification->cmdproc,payload,payload_len); +} + +/*Post FQY to NS,Inform add a Yahoo User*/ +void +msn_notification_fqy_yahoo(MsnSession *session,char *passport) +{ + MsnTransaction *trans; + MsnCmdProc *cmdproc; + char* email,*domain,*payload; + char **tokens; + + cmdproc = session->notification->cmdproc; + + tokens = g_strsplit(passport, "@", 2); + email = tokens[0]; + domain = tokens[1]; + + payload = g_strdup_printf("<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>",domain,email); + trans = msn_transaction_new(cmdproc, "FQY","%d",strlen(payload)); msn_transaction_set_payload(trans, payload, strlen(payload)); msn_cmdproc_send_trans(cmdproc, trans); + + g_free(payload); + g_free(tokens); } static void @@ -663,6 +696,21 @@ } static void +fqy_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, + size_t len) +{ + gaim_debug_info("MaYuan","FQY payload{%s}\n",payload); + msn_notification_post_adl(cmdproc,payload,len); +} + +static void +fqy_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + gaim_debug_info("MaYuan","Process FQY\n"); + cmdproc->last_cmd->payload_cb = fqy_cmd_post; +} + +static void rml_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnTransaction *trans; @@ -1344,9 +1392,21 @@ } static void +ubx_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, + size_t len) +{ + /*get the payload content*/ + gaim_debug_info("MaYuan","ubx{%s}\n",cmd->payload); +} + +static void ubx_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { gaim_debug_info("MaYuan","UBX... \n"); + if(cmd->payload_len == 0){ + return; + } + cmdproc->last_cmd->payload_cb = ubx_cmd_post; } static void @@ -1653,10 +1713,8 @@ payload = xmlnode_to_str(adl_node,&payload_len); xmlnode_free(adl_node); - gaim_debug_info("MaYuan","ADL{%s}\n",payload); - trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload)); - msn_transaction_set_payload(trans, payload, strlen(payload)); - msn_cmdproc_send_trans(cmdproc, trans); + msn_notification_post_adl(notification->servconn->cmdproc, + payload,payload_len); } void @@ -1727,6 +1785,7 @@ msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd); msn_table_add_cmd(cbs_table, NULL, "RML", rml_cmd); msn_table_add_cmd(cbs_table, NULL, "ADL", adl_cmd); + msn_table_add_cmd(cbs_table, NULL, "FQY", fqy_cmd); msn_table_add_cmd(cbs_table, NULL, "QRY", NULL); msn_table_add_cmd(cbs_table, NULL, "QNG", NULL); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-16 16:20:34
|
Revision: 16790 Author: mayuan2006 Date: 2006-08-16 09:20:25 -0700 (Wed, 16 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16790&view=rev Log Message: ----------- SOAP implementation rewrite. use Queue to buffer the SOAP request. Warning:Middle stage,Never Use it committed by Ma Yuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/soap.h Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-16 14:18:58 UTC (rev 16789) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-16 16:20:25 UTC (rev 16790) @@ -210,10 +210,14 @@ 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 @@ 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 @@ 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 @@ 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 @@ { 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 @@ 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 @@ 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 @@ 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 @@ /*add group*/ void msn_add_group(MsnSession *session,const char* group_name) { + MsnSoapReq *soap_request; + MsnContact *contact ; char *body = NULL; - MsnContact *contact ; g_return_if_fail(session != NULL); contact = session->contact; @@ -629,15 +665,18 @@ 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 @@ 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); } Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-16 14:18:58 UTC (rev 16789) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-16 16:20:25 UTC (rev 16790) @@ -109,7 +109,8 @@ 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 @@ 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 @@ 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 @@ 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*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-16 14:18:58 UTC (rev 16789) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-16 16:20:25 UTC (rev 16790) @@ -41,6 +41,8 @@ soapconn->gsc = NULL; soapconn->input_handler = -1; soapconn->output_handler = -1; + + soapconn->soap_queue = g_queue_new(); return soapconn; } @@ -65,6 +67,9 @@ 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 @@ 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 @@ } } +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_free_write_buf(soapconn); /*close ssl connection*/ - if(soapconn->gsc != NULL){ - gaim_ssl_close(soapconn->gsc); + msn_soap_close(soapconn); + + while ((request = g_queue_pop_head(soapconn->soap_queue)) != NULL){ + msn_soap_request_free(request); } - soapconn->gsc = NULL; - + g_queue_free(soapconn->soap_queue); g_free(soapconn); } @@ -290,7 +315,7 @@ 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 @@ /*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_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_post(MsnSoapConn *soapconn,const char * body,GaimInputFunction written_cb) +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_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 @@ "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); } Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-08-16 14:18:58 UTC (rev 16789) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-08-16 16:20:25 UTC (rev 16790) @@ -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 @@ /*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 @@ }; /*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 @@ /*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); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-19 05:52:24
|
Revision: 16873 Author: mayuan2006 Date: 2006-08-18 22:52:13 -0700 (Fri, 18 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16873&view=rev Log Message: ----------- change the SOAP process Framework a initial version,can work now committed by Ma Yuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/nexus.c branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/soap.h Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-19 05:44:40 UTC (rev 16872) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-19 05:52:13 UTC (rev 16873) @@ -30,6 +30,8 @@ #include "xmlnode.h" #include "group.h" +void msn_contact_connect_init(MsnSoapConn *soapconn); + /*new a contact*/ MsnContact * msn_contact_new(MsnSession *session) @@ -80,7 +82,7 @@ g_return_if_fail(session != NULL); /*login ok!We can retrieve the contact list*/ - msn_get_contact_list(contact); +// msn_get_contact_list(contact); } /*get MSN member role utility*/ @@ -212,12 +214,13 @@ { MsnSoapReq *soap_request; + gaim_debug_info("MaYuan","Getting Contact List...\n"); 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); + msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); } static void @@ -437,7 +440,7 @@ MSN_GET_ADDRESS_TEMPLATE, msn_get_address_cb, msn_address_written_cb); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); } static void @@ -483,7 +486,7 @@ body, msn_add_contact_read_cb, msn_add_contact_written_cb); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); g_free(soap_action); g_free(body); @@ -523,7 +526,7 @@ body, msn_delete_contact_read_cb, msn_delete_contact_written_cb); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); g_free(body); } @@ -559,7 +562,7 @@ body, msn_block_read_cb, msn_block_written_cb); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); g_free(body); } @@ -596,7 +599,7 @@ body, msn_unblock_read_cb, msn_unblock_written_cb); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); g_free(body); } @@ -630,7 +633,7 @@ MSN_GLEAMS_TEMPLATE, msn_gleams_read_cb, msn_gleams_written_cb); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); } /*************************************************************** @@ -670,7 +673,7 @@ body, msn_group_read_cb, msn_group_written_cb); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); } /*delete a group*/ @@ -691,18 +694,18 @@ body, msn_group_read_cb, msn_group_written_cb); - msn_soap_post(contact->soapconn,soap_request); + msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); g_free(body); } void -msn_contact_connect(MsnContact *contact) +msn_contact_connect_init(MsnSoapConn *soapconn) { /* Authenticate via Windows Live ID. */ gaim_debug_info("MaYuan","msn_contact_connect...\n"); - msn_soap_init(contact->soapconn,MSN_CONTACT_SERVER,1, + msn_soap_init(soapconn,MSN_CONTACT_SERVER,1, msn_contact_login_connect_cb, msn_contact_login_error_cb); } Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-08-19 05:44:40 UTC (rev 16872) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-08-19 05:52:13 UTC (rev 16873) @@ -182,7 +182,6 @@ /*prepare the Windows Live ID authentication token*/ username = g_strdup(gaim_account_get_username(session->account)); password = g_strdup(gaim_connection_get_password(session->account->gc)); -// g_strdup(gaim_url_encode(gaim_connection_get_password(session->account->gc))); challenge_str = g_strdup_printf( "lc=%s&id=%s&tw=%s&fs=%s&ru=%s&ct=%s&kpp=%s&kv=%s&ver=%s&rn=%s&tpf=%s\r\n", @@ -235,7 +234,7 @@ { /* Authenticate via Windows Live ID. */ gaim_debug_info("MaYuan","msn_nexus_connect...\n"); - msn_soap_init(nexus->soapconn,MSN_TWN_SERVER,1,nexus_login_connect_cb,nexus_login_error_cb); + msn_soap_connect(nexus->soapconn); } Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-19 05:44:40 UTC (rev 16872) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-19 05:52:13 UTC (rev 16873) @@ -1470,7 +1470,8 @@ /*starting retrieve the contact list*/ session->contact = msn_contact_new(session); - msn_contact_connect(session->contact); + msn_get_contact_list(session->contact); +// msn_contact_connect(session->contact); } static void Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-19 05:44:40 UTC (rev 16872) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-19 05:52:13 UTC (rev 16873) @@ -29,6 +29,8 @@ /*Local Function Prototype*/ static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid); +void msn_oim_retrieve_connect_init(MsnSoapConn *soapconn); +void msn_oim_send_connect_init(MsnSoapConn *soapconn); /*new a OIM object*/ MsnOim * @@ -134,7 +136,7 @@ soap_body, msn_oim_send_read_cb, msn_oim_send_written_cb); - msn_soap_post(oim->sendconn,soap_request); + msn_soap_post(oim->sendconn,soap_request,msn_oim_send_connect_init); } void msn_oim_send_msg(MsnOim *oim,char *msg) @@ -180,8 +182,6 @@ g_return_if_fail(session != NULL); gaim_debug_info("MaYuan","oim get SOAP Server connected!\n"); - /*call to get the message*/ - msn_oim_get_msg(oim); } static void @@ -193,9 +193,9 @@ gaim_debug_info("MaYuan","OIM get read buffer:{%s}\n",soapconn->body); + /*we need to process the read message!*/ /*get next single Offline Message*/ - oim->oim_list = g_list_remove(oim->oim_list, oim->oim_list->data); -// msn_oim_get_msg(oim); +// oim->oim_list = g_list_remove(oim->oim_list, oim->oim_list->data); } static void @@ -228,13 +228,8 @@ gaim_debug_info("MaYuan","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); // msn_session_report_user(oim->session,passport,"hello"); oim->oim_list = g_list_append(oim->oim_list,msgid); + msn_oim_post_single_get_msg(oim,msgid); } - if(msn_soap_connected(oim->retrieveconn) == -1){ - gaim_debug_info("MaYuan","retreive OIM server not connected! We need to connect it first\n"); - msn_oim_connect(oim); - return; - } - msn_oim_get_msg(oim); } static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid) @@ -258,37 +253,30 @@ soap_body, msn_oim_get_read_cb, msn_oim_get_written_cb); - msn_soap_post(oim->retrieveconn,soap_request); + msn_soap_post(oim->retrieveconn,soap_request,msn_oim_retrieve_connect_init); } -/*MSN OIM get SOAP request*/ -void msn_oim_get_msg(MsnOim *oim) -{ - gaim_debug_info("MaYuan","Get OIM with SOAP \n"); -// gaim_debug_info("MaYuan","oim->oim_list:%p,data:%s \n",oim->oim_list,oim->oim_list->data); - if(oim->oim_list !=NULL){ - msn_oim_post_single_get_msg(oim,oim->oim_list->data); - } -} - -/*msn oim server connect*/ +/*msn oim retrieve server connect init */ void -msn_oim_connect(MsnOim *oim) +msn_oim_retrieve_connect_init(MsnSoapConn *soapconn) { gaim_debug_info("MaYuan","msn_oim_connect...\n"); - if(msn_soap_connected(oim->retrieveconn) == -1){ - msn_soap_init(oim->retrieveconn,MSN_OIM_RETRIEVE_HOST,1, + if(msn_soap_connected(soapconn) == -1){ + msn_soap_init(soapconn,MSN_OIM_RETRIEVE_HOST,1, msn_oim_get_connect_cb, msn_oim_get_error_cb); } -#if 0 - if(msn_soap_connected(oim->sendconn) == -1){ - msn_soap_init(oim->sendconn,MSN_OIM_SEND_HOST,1, +} + +void msn_oim_send_connect_init(MsnSoapConn *sendconn) +{ + gaim_debug_info("MaYuan","msn oim send connect init...\n"); + if(msn_soap_connected(sendconn) == -1){ + msn_soap_init(sendconn,MSN_OIM_SEND_HOST,1, msn_oim_send_connect_cb, msn_oim_send_error_cb); } -#endif } /*endof oim.c*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 05:44:40 UTC (rev 16872) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 05:52:13 UTC (rev 16873) @@ -26,6 +26,12 @@ #include "msn.h" #include "soap.h" +void +msn_soap_set_process_step(MsnSoapConn *soapconn, MsnSoapStep step) +{ + soapconn->step = step; +} + //msn_soap_new(MsnSession *session,gpointer data,int sslconn) /*new a soap connection*/ MsnSoapConn * @@ -42,6 +48,7 @@ soapconn->input_handler = -1; soapconn->output_handler = -1; + msn_soap_set_process_step(soapconn,MSN_SOAP_UNCONNECTED); soapconn->soap_queue = g_queue_new(); return soapconn; } @@ -68,6 +75,7 @@ soapconn->connect_cb(data,gsc,cond); } + msn_soap_set_process_step(soapconn,MSN_SOAP_CONNECTED); /*we do the SOAP request here*/ msn_soap_post_head_request(soapconn); } @@ -83,6 +91,7 @@ if(soapconn->error_cb != NULL){ soapconn->error_cb(gsc,error,data); } + msn_soap_set_process_step(soapconn, MSN_SOAP_UNCONNECTED); } /*init the soap connection*/ @@ -97,6 +106,7 @@ soapconn->error_cb = error_cb; } +/*connect the soap connection*/ void msn_soap_connect(MsnSoapConn *soapconn) { @@ -108,6 +118,7 @@ } } +/*close the soap connection*/ void msn_soap_close(MsnSoapConn *soapconn) { @@ -118,6 +129,7 @@ } }else{ } + msn_soap_set_process_step(soapconn,MSN_SOAP_UNCONNECTED); } /*destroy the soap connection*/ @@ -146,6 +158,7 @@ /*close ssl connection*/ msn_soap_close(soapconn); + /*process the unhandled soap request*/ while ((request = g_queue_pop_head(soapconn->soap_queue)) != NULL){ msn_soap_request_free(request); } @@ -154,15 +167,15 @@ } /*check the soap is connected? - * if connected return 0 + * if connected return 1 */ int msn_soap_connected(MsnSoapConn *soapconn) { if(soapconn->ssl_conn){ - return (soapconn->gsc == NULL? -1 : 0); + return (soapconn->gsc == NULL? 0 : 1); } - return(soapconn->fd>0? 0 : -1); + return(soapconn->fd>0? 1 : 0); } /*read and append the content to the buffer*/ @@ -475,26 +488,33 @@ { 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); } } + msn_soap_set_process_step(soapconn,MSN_SOAP_CONNECTED_IDLE); } void -msn_soap_post(MsnSoapConn *soapconn,MsnSoapReq *request) +msn_soap_post(MsnSoapConn *soapconn,MsnSoapReq *request, + MsnSoapConnectInitFunction msn_soap_init_func) { g_queue_push_tail(soapconn->soap_queue, request); if(!msn_soap_connected(soapconn)){ /*not connected?connect it first*/ + gaim_debug_info("Ma Yuan","soap is not connected!\n"); + msn_soap_init_func(soapconn); msn_soap_connect(soapconn); return; } + gaim_debug_info("Ma Yuan","soap connected!\n"); /*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... */ + if(soapconn->step == MSN_SOAP_CONNECTED_IDLE){ + msn_soap_post_head_request(soapconn); + } } /*Post the soap request action*/ @@ -505,6 +525,7 @@ char * request_str = NULL; gaim_debug_info("MaYuan","msn_soap_post()...\n"); + msn_soap_set_process_step(soapconn,MSN_SOAP_PROCESSING); soap_head = g_strdup_printf( "POST %s HTTP/1.1\r\n" "SOAPAction: %s\r\n" Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-08-19 05:44:40 UTC (rev 16872) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-08-19 05:52:13 UTC (rev 16873) @@ -28,12 +28,22 @@ #define MSN_SOAP_READ_BUFF_SIZE 8192 +typedef enum +{ + MSN_SOAP_UNCONNECTED, + MSN_SOAP_CONNECTED, + MSN_SOAP_PROCESSING, + MSN_SOAP_CONNECTED_IDLE +}MsnSoapStep; + /*MSN SoapRequest structure*/ typedef struct _MsnSoapReq MsnSoapReq; /*MSN Https connection structure*/ typedef struct _MsnSoapConn MsnSoapConn; +typedef void (*MsnSoapConnectInitFunction)(MsnSoapConn *); + struct _MsnSoapReq{ /*request sequence*/ int id; @@ -56,6 +66,7 @@ char *login_path; char *soap_action; + MsnSoapStep step; /*ssl connection?*/ guint ssl_conn; /*normal connection*/ @@ -109,10 +120,11 @@ /*init a soap conneciton */ void msn_soap_init(MsnSoapConn *soapconn,char * host,int ssl,GaimSslInputFunction connect_cb,GaimSslErrorFunction error_cb); +void msn_soap_connect(MsnSoapConn *soapconn); /*write to soap*/ void msn_soap_write(MsnSoapConn * soapconn, char *write_buf, GaimInputFunction written_cb); -void msn_soap_post(MsnSoapConn *soapconn,MsnSoapReq *request); +void msn_soap_post(MsnSoapConn *soapconn,MsnSoapReq *request,MsnSoapConnectInitFunction msn_soap_init_func); void msn_soap_free_read_buf(MsnSoapConn *soapconn); void msn_soap_free_write_buf(MsnSoapConn *soapconn); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-19 07:02:21
|
Revision: 16876 Author: mayuan2006 Date: 2006-08-19 00:02:12 -0700 (Sat, 19 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16876&view=rev Log Message: ----------- add some comments committed by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/switchboard.c Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 06:45:42 UTC (rev 16875) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 07:02:12 UTC (rev 16876) @@ -26,6 +26,7 @@ #include "msn.h" #include "soap.h" +/*setup the soap process step*/ void msn_soap_set_process_step(MsnSoapConn *soapconn, MsnSoapStep step) { @@ -483,6 +484,7 @@ g_free(request); } +/*post the soap request queue's head request*/ void msn_soap_post_head_request(MsnSoapConn *soapconn) { @@ -495,6 +497,9 @@ msn_soap_set_process_step(soapconn,MSN_SOAP_CONNECTED_IDLE); } +/*post the soap request , + * if not connected, Connected first. + */ void msn_soap_post(MsnSoapConn *soapconn,MsnSoapReq *request, MsnSoapConnectInitFunction msn_soap_init_func) Modified: branches/soc-2006-msnp13/src/protocols/msn/switchboard.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-19 06:45:42 UTC (rev 16875) +++ branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-19 07:02:12 UTC (rev 16876) @@ -984,16 +984,13 @@ swboard = cmdproc->data; g_return_if_fail(swboard != NULL); - if (msn_switchboard_is_invited(swboard)) - { + if (msn_switchboard_is_invited(swboard)){ swboard->empty = FALSE; msn_cmdproc_send(cmdproc, "ANS", "%s %s %s", gaim_account_get_username(account), swboard->auth_key, swboard->session_id); - } - else - { + }else{ msn_cmdproc_send(cmdproc, "USR", "%s %s", gaim_account_get_username(account), swboard->auth_key); @@ -1132,6 +1129,7 @@ /* The conversation window was closed. */ return; + gaim_debug_info("MaYuan","Switchboard:auth:{%s} socket:{%s}\n",cmd->params[4],cmd->params[2]); msn_switchboard_set_auth_key(swboard, cmd->params[4]); msn_parse_socket(cmd->params[2], &host, &port); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-19 11:47:21
|
Revision: 16882 Author: mayuan2006 Date: 2006-08-19 04:46:33 -0700 (Sat, 19 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16882&view=rev Log Message: ----------- a version can work with windows Not stable Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/msg.c branches/soc-2006-msnp13/src/protocols/msn/nexus.c branches/soc-2006-msnp13/src/protocols/msn/nexus.h branches/soc-2006-msnp13/src/protocols/msn/notification.c branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/switchboard.c Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-19 08:15:19 UTC (rev 16881) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-19 11:46:33 UTC (rev 16882) @@ -326,6 +326,9 @@ for(contactEmailNode = xmlnode_get_child(emailsNode,"ContactEmail");contactEmailNode; contactEmailNode = xmlnode_get_next_twin(contactEmailNode) ){ messengerEnabledNode = xmlnode_get_child(contactEmailNode,"isMessengerEnabled"); + if(messengerEnabledNode == NULL){ + break; + } msnEnabled = xmlnode_get_data(messengerEnabledNode); if(!strcmp(msnEnabled,"true")){ emailNode = xmlnode_get_child(contactEmailNode,"email"); @@ -339,7 +342,10 @@ } displayName = xmlnode_get_child(contactInfo,"displayName"); - Name =xmlnode_get_data(displayName); + if(displayName == NULL) + Name = ""; + else + Name =xmlnode_get_data(displayName); gaim_debug_misc("contact","name:%s,Id:{%s},display:{%s}\n", passport, Modified: branches/soc-2006-msnp13/src/protocols/msn/msg.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-08-19 08:15:19 UTC (rev 16881) +++ branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-08-19 11:46:33 UTC (rev 16882) @@ -104,8 +104,7 @@ gaim_debug_info("msn", "message unref (%p)[%d]\n", msg, msg->ref_count); #endif - if (msg->ref_count == 0) - { + if (msg->ref_count == 0){ msn_message_destroy(msg); return NULL; @@ -121,15 +120,15 @@ char *message_cr; msg = msn_message_new(MSN_MSG_TEXT); - msn_message_set_attr(msg, "User-Agent", "Gaim/" VERSION); +// msn_message_set_attr(msg, "User-Agent", "Gaim/" VERSION); msn_message_set_content_type(msg, "text/plain"); msn_message_set_charset(msg, "UTF-8"); - msn_message_set_flag(msg, 'A'); + msn_message_set_flag(msg, 'N'); msn_message_set_attr(msg, "X-MMS-IM-Format", - "FN=MS%20Sans%20Serif; EF=; CO=0; PF=0"); + "FN=MS%20Sans%20Serif; EF=; CO=0; CS=86;PF=0"); message_cr = gaim_str_add_cr(message); - msn_message_set_bin_data(msg, message_cr, strlen(message_cr)); + msn_message_set_bin_data(msg, message_cr, strlen(message_cr)+1); g_free(message_cr); return msg; @@ -471,7 +470,7 @@ { memcpy(n, body, body_len); n += body_len; - n = "\0"; +// n = '\0'; } } Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-08-19 08:15:19 UTC (rev 16881) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-08-19 11:46:33 UTC (rev 16882) @@ -163,6 +163,7 @@ MsnSoapConn *soapconn; MsnNexus * nexus; MsnSession *session; + char *ru,*lc,*id,*tw,*ct,*kpp,*kv,*ver,*rn,*tpf; char *username, *password; char *request_str, *head, *tail,*challenge_str; @@ -183,19 +184,31 @@ username = g_strdup(gaim_account_get_username(session->account)); password = g_strdup(gaim_connection_get_password(session->account->gc)); + lc = (char *)g_hash_table_lookup(nexus->challenge_data, "lc"); + id = (char *)g_hash_table_lookup(nexus->challenge_data, "id"); + tw = (char *)g_hash_table_lookup(nexus->challenge_data, "tw"); + ru = (char *)g_hash_table_lookup(nexus->challenge_data, "ru"); + ct = (char *)g_hash_table_lookup(nexus->challenge_data, "ct"); + kpp= (char *)g_hash_table_lookup(nexus->challenge_data, "kpp"); + kv = (char *)g_hash_table_lookup(nexus->challenge_data, "kv"); + ver= (char *)g_hash_table_lookup(nexus->challenge_data, "ver"); + rn = (char *)g_hash_table_lookup(nexus->challenge_data, "rn"); + tpf= (char *)g_hash_table_lookup(nexus->challenge_data, "tpf"); + + if(!(lc && id && tw && ru && ct && kpp && kv && ver && tpf)){ + gaim_debug_error("MaYuan","WLM Authenticate Key Error!\n"); + msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication Failed")); + g_free(username); + g_free(password); + gaim_ssl_close(gsc); + msn_nexus_destroy(nexus); + session->nexus = NULL; + return; + } + challenge_str = g_strdup_printf( - "lc=%s&id=%s&tw=%s&fs=%s&ru=%s&ct=%s&kpp=%s&kv=%s&ver=%s&rn=%s&tpf=%s\r\n", - (char *)g_hash_table_lookup(nexus->challenge_data, "lc"), - (char *)g_hash_table_lookup(nexus->challenge_data, "id"), - (char *)g_hash_table_lookup(nexus->challenge_data, "tw"), - (char *)g_hash_table_lookup(nexus->challenge_data, "fs"), - (char *)g_hash_table_lookup(nexus->challenge_data, "ru"), - (char *)g_hash_table_lookup(nexus->challenge_data, "ct"), - (char *)g_hash_table_lookup(nexus->challenge_data, "kpp"), - (char *)g_hash_table_lookup(nexus->challenge_data, "kv"), - (char *)g_hash_table_lookup(nexus->challenge_data, "ver"), - (char *)g_hash_table_lookup(nexus->challenge_data, "rn"), - (char *)g_hash_table_lookup(nexus->challenge_data, "tpf") + "lc=%s&id=%s&tw=%s&fs=1&ru=%s&ct=%s&kpp=%s&kv=%s&ver=%s&rn=%s&tpf=%s\r\n", + lc,id,tw,ru,ct,kpp,kv,ver,rn,tpf ); /*build the SOAP windows Live ID XML body */ Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.h 2006-08-19 08:15:19 UTC (rev 16881) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.h 2006-08-19 11:46:33 UTC (rev 16882) @@ -77,7 +77,8 @@ struct _MsnNexus { MsnSession *session; - MsnSoapConn *soapconn; + MsnSoapConn *soapconn; + char * challenge_data_str; GHashTable *challenge_data; }; Modified: branches/soc-2006-msnp13/src/protocols/msn/notification.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-19 08:15:19 UTC (rev 16881) +++ branches/soc-2006-msnp13/src/protocols/msn/notification.c 2006-08-19 11:46:33 UTC (rev 16882) @@ -248,15 +248,16 @@ session->nexus = msn_nexus_new(session); /* Parse the challenge data. */ - + session->nexus->challenge_data_str = g_strdup(cmd->params[3]); elems = g_strsplit(cmd->params[3], ",", 0); for (cur = elems; *cur != NULL; cur++){ tokens = g_strsplit(*cur, "=", 2); -// gaim_debug_info("MaYuan","challenge %p,key:%s,value:%s\n", -// session->nexus->challenge_data,tokens[0],tokens[1]); - if(tokens[0]&&tokens[1]) + if(tokens[0]&&tokens[1]){ + gaim_debug_info("MaYuan","challenge %p,key:%s,value:%s\n", + session->nexus->challenge_data,tokens[0],tokens[1]); g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]); + } /* Don't free each of the tokens, only the array. */ g_free(tokens); } Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 08:15:19 UTC (rev 16881) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 11:46:33 UTC (rev 16882) @@ -101,10 +101,12 @@ GaimSslInputFunction connect_cb, GaimSslErrorFunction error_cb) { + gaim_debug_info("MaYuan","msn_soap_init...\n"); soapconn->login_host = g_strdup(host); soapconn->ssl_conn = ssl; soapconn->connect_cb = connect_cb; soapconn->error_cb = error_cb; + gaim_debug_info("MaYuan","msn_soap_init...done\n"); } /*connect the soap connection*/ @@ -343,14 +345,13 @@ if(soapconn->read_cb != NULL){ soapconn->read_cb(soapconn,source,0); } + /*clear the read buffer*/ + msn_soap_free_read_buf(soapconn); /*Process the next queued SOAP request*/ msn_soap_post_head_request(soapconn); #if 0 - /*clear the read buffer*/ - msn_soap_free_read_buf(soapconn); - /*remove the read handler*/ gaim_input_remove(soapconn->input_handler); soapconn->input_handler = -1; Modified: branches/soc-2006-msnp13/src/protocols/msn/switchboard.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-19 08:15:19 UTC (rev 16881) +++ branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-19 11:46:33 UTC (rev 16882) @@ -530,6 +530,7 @@ payload = msn_message_gen_payload(msg, &payload_len); #ifdef MSN_DEBUG_SB + gaim_debug_info("MaYuan","SB length:{%d}",payload_len); msn_message_show_readable(msg, "SB SEND", FALSE); #endif @@ -706,8 +707,8 @@ process_queue(swboard); - if (!session->http_method) - send_clientcaps(swboard); +// if (!session->http_method) +// send_clientcaps(swboard); if (swboard->closed) msn_switchboard_close(swboard); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-19 14:12:57
|
Revision: 16884 Author: mayuan2006 Date: 2006-08-19 07:12:41 -0700 (Sat, 19 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16884&view=rev Log Message: ----------- chat function ok debugging the multiple soap request in one ssl connection not stable. comitted by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/README branches/soc-2006-msnp13/src/protocols/msn/msg.c branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/oim.h branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/soap.h branches/soc-2006-msnp13/src/protocols/msn/transaction.c Modified: branches/soc-2006-msnp13/src/protocols/msn/README =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/README 2006-08-19 13:44:47 UTC (rev 16883) +++ branches/soc-2006-msnp13/src/protocols/msn/README 2006-08-19 14:12:41 UTC (rev 16884) @@ -37,3 +37,11 @@ 4. Reference The very useful sites of MSN Protocol: +MSNpiki site: +reverse engineer of MSN Protocol.up to dated. +http://msnpiki.msnfanatic.com/index.php/MSN_Protocol_Version_13 + +hypothetic site: +old MSN Protocol Introduction,but very useful for basic idea of MSN protocol +http://www.hypothetic.org/docs/msn/index.php + Modified: branches/soc-2006-msnp13/src/protocols/msn/msg.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-08-19 13:44:47 UTC (rev 16883) +++ branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-08-19 14:12:41 UTC (rev 16884) @@ -23,6 +23,7 @@ */ #include "msn.h" #include "msg.h" +#define MSN_DEBUG_MSG MsnMessage * msn_message_new(MsnMsgType type) @@ -123,12 +124,12 @@ // msn_message_set_attr(msg, "User-Agent", "Gaim/" VERSION); msn_message_set_content_type(msg, "text/plain"); msn_message_set_charset(msg, "UTF-8"); - msn_message_set_flag(msg, 'N'); + msn_message_set_flag(msg, 'A'); msn_message_set_attr(msg, "X-MMS-IM-Format", "FN=MS%20Sans%20Serif; EF=; CO=0; CS=86;PF=0"); message_cr = gaim_str_add_cr(message); - msn_message_set_bin_data(msg, message_cr, strlen(message_cr)+1); + msn_message_set_bin_data(msg, message_cr, strlen(message_cr)); g_free(message_cr); return msg; @@ -514,14 +515,11 @@ if (msg->body != NULL) g_free(msg->body); - if (data != NULL && len > 0) - { + if (data != NULL && len > 0){ msg->body = g_malloc0(len + 1); memcpy(msg->body, data, len); msg->body_len = len; - } - else - { + }else{ msg->body = NULL; msg->body_len = 0; } Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-19 13:44:47 UTC (rev 16883) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-19 14:12:41 UTC (rev 16884) @@ -238,8 +238,6 @@ 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); - oim->retrieveconn->soap_action = g_strdup(MSN_OIM_GET_SOAP_ACTION); t = oim->session->passport_info.t; p = oim->session->passport_info.p; @@ -248,8 +246,8 @@ p, msgid ); - soap_request = msn_soap_request_new(MSN_OIM_SEND_HOST, - MSN_OIM_SEND_URL,MSN_OIM_SEND_SOAP_ACTION, + soap_request = msn_soap_request_new(MSN_OIM_RETRIEVE_HOST, + MSN_OIM_RETRIEVE_URL,MSN_OIM_GET_SOAP_ACTION, soap_body, msn_oim_get_read_cb, msn_oim_get_written_cb); @@ -261,22 +259,17 @@ msn_oim_retrieve_connect_init(MsnSoapConn *soapconn) { gaim_debug_info("MaYuan","msn_oim_connect...\n"); - - if(msn_soap_connected(soapconn) == -1){ - msn_soap_init(soapconn,MSN_OIM_RETRIEVE_HOST,1, + msn_soap_init(soapconn,MSN_OIM_RETRIEVE_HOST,1, msn_oim_get_connect_cb, msn_oim_get_error_cb); - } } void msn_oim_send_connect_init(MsnSoapConn *sendconn) { gaim_debug_info("MaYuan","msn oim send connect init...\n"); - if(msn_soap_connected(sendconn) == -1){ - msn_soap_init(sendconn,MSN_OIM_SEND_HOST,1, + msn_soap_init(sendconn,MSN_OIM_SEND_HOST,1, msn_oim_send_connect_cb, msn_oim_send_error_cb); - } } /*endof oim.c*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-08-19 13:44:47 UTC (rev 16883) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.h 2006-08-19 14:12:41 UTC (rev 16884) @@ -26,7 +26,7 @@ #define _MSN_OIM_H_ #define MSN_OIM_RETRIEVE_HOST "rsi.hotmail.com" -#define MSN_OIM_RETRIEVE__URL "/rsi/rsi.asmx" +#define MSN_OIM_RETRIEVE_URL "/rsi/rsi.asmx" #define MSN_OIM_GET_SOAP_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage" #define MSN_OIM_DEL_SOAP_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/DeleteMessages" Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 13:44:47 UTC (rev 16883) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 14:12:41 UTC (rev 16884) @@ -119,6 +119,7 @@ soapconn); }else{ } + msn_soap_set_process_step(soapconn,MSN_SOAP_CONNECTING); } /*close the soap connection*/ @@ -185,14 +186,16 @@ static gssize msn_soap_read(MsnSoapConn *soapconn) { - gssize len; + gssize len,requested_len; gssize total_len = 0; char temp_buf[MSN_SOAP_READ_BUFF_SIZE]; +// requested_len = (soapconn->need_to_read > 0) ? soapconn->need_to_read : MSN_SOAP_READ_BUFF_SIZE; + requested_len = MSN_SOAP_READ_BUFF_SIZE; if(soapconn->ssl_conn){ - len = gaim_ssl_read(soapconn->gsc, temp_buf,MSN_SOAP_READ_BUFF_SIZE); + len = gaim_ssl_read(soapconn->gsc, temp_buf,requested_len); }else{ - len = read(soapconn->fd, temp_buf,MSN_SOAP_READ_BUFF_SIZE); + len = read(soapconn->fd, temp_buf,requested_len); } if(len >0){ total_len += len; @@ -330,7 +333,9 @@ soapconn->body_len = atoi(body_len); gaim_debug_misc("MaYuan","SOAP Read length :%d,body len:%d\n",soapconn->read_len,soapconn->body_len); + soapconn->need_to_read = (body_start - soapconn->read_buf +soapconn->body_len) - soapconn->read_len; if(soapconn->read_len < body_start - soapconn->read_buf + soapconn->body_len){ +// if(soapconn->need_to_read >0){ return; } g_free(body_len); @@ -370,6 +375,7 @@ } soapconn->read_buf = NULL; soapconn->read_len = 0; + soapconn->need_to_read = 0; } void @@ -506,7 +512,7 @@ MsnSoapConnectInitFunction msn_soap_init_func) { g_queue_push_tail(soapconn->soap_queue, request); - if(!msn_soap_connected(soapconn)){ + if(!msn_soap_connected(soapconn)&&(soapconn->step == MSN_SOAP_UNCONNECTED)){ /*not connected?connect it first*/ gaim_debug_info("Ma Yuan","soap is not connected!\n"); msn_soap_init_func(soapconn); Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.h =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-08-19 13:44:47 UTC (rev 16883) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.h 2006-08-19 14:12:41 UTC (rev 16884) @@ -31,6 +31,7 @@ typedef enum { MSN_SOAP_UNCONNECTED, + MSN_SOAP_CONNECTING, MSN_SOAP_CONNECTED, MSN_SOAP_PROCESSING, MSN_SOAP_CONNECTED_IDLE @@ -95,6 +96,7 @@ /*read buffer*/ char *read_buf; gsize read_len; + gsize need_to_read; GaimInputFunction read_cb; /*HTTP reply body part*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/transaction.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/transaction.c 2006-08-19 13:44:47 UTC (rev 16883) +++ branches/soc-2006-msnp13/src/protocols/msn/transaction.c 2006-08-19 14:12:41 UTC (rev 16884) @@ -205,8 +205,7 @@ void msn_transaction_set_timeout_cb(MsnTransaction *trans, MsnTimeoutCb cb) { - if (trans->timer) - { + if (trans->timer){ gaim_debug_error("msn", "This shouldn't be happening\n"); gaim_timeout_remove(trans->timer); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <may...@us...> - 2006-08-19 16:14:08
|
Revision: 16885 Author: mayuan2006 Date: 2006-08-19 09:13:55 -0700 (Sat, 19 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16885&view=rev Log Message: ----------- middle stage of debugging multiple-SOAP request read 0 from soap Reply comitted by MaYuan<may...@gm...> Modified Paths: -------------- branches/soc-2006-msnp13/src/protocols/msn/contact.c branches/soc-2006-msnp13/src/protocols/msn/msg.c branches/soc-2006-msnp13/src/protocols/msn/nexus.c branches/soc-2006-msnp13/src/protocols/msn/oim.c branches/soc-2006-msnp13/src/protocols/msn/soap.c branches/soc-2006-msnp13/src/protocols/msn/switchboard.c branches/soc-2006-msnp13/src/protocols/msn/userlist.c Modified: branches/soc-2006-msnp13/src/protocols/msn/contact.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-19 14:12:41 UTC (rev 16884) +++ branches/soc-2006-msnp13/src/protocols/msn/contact.c 2006-08-19 16:13:55 UTC (rev 16885) @@ -206,7 +206,7 @@ gaim_debug_info("MaYuan","finish contact written\n"); soapconn->read_cb = msn_get_contact_list_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } void @@ -343,7 +343,7 @@ displayName = xmlnode_get_child(contactInfo,"displayName"); if(displayName == NULL) - Name = ""; + Name = passport; else Name =xmlnode_get_data(displayName); @@ -430,7 +430,7 @@ gaim_debug_info("MaYuan","finish contact written\n"); soapconn->read_cb = msn_get_address_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } /*get the address book*/ @@ -462,7 +462,7 @@ gaim_debug_info("MaYuan","finish unblock written\n"); soapconn->read_cb = msn_add_contact_read_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } /*add a Contact */ @@ -511,7 +511,7 @@ gaim_debug_info("MaYuan","delete contact written\n"); soapconn->read_cb = msn_delete_contact_read_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } /*delete a Contact*/ @@ -550,7 +550,7 @@ gaim_debug_info("MaYuan","finish unblock written\n"); soapconn->read_cb = msn_block_read_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } /*block a Contact*/ @@ -586,7 +586,7 @@ gaim_debug_info("MaYuan","finish unblock written\n"); soapconn->read_cb = msn_unblock_read_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } /*unblock a contact*/ @@ -623,7 +623,7 @@ gaim_debug_info("MaYuan","finish Group written\n"); soapconn->read_cb = msn_gleams_read_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } /*get the gleams info*/ @@ -658,7 +658,7 @@ gaim_debug_info("MaYuan","finish Group written\n"); soapconn->read_cb = msn_group_read_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } /*add group*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/msg.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-08-19 14:12:41 UTC (rev 16884) +++ branches/soc-2006-msnp13/src/protocols/msn/msg.c 2006-08-19 16:13:55 UTC (rev 16885) @@ -121,7 +121,7 @@ char *message_cr; msg = msn_message_new(MSN_MSG_TEXT); -// msn_message_set_attr(msg, "User-Agent", "Gaim/" VERSION); + msn_message_set_attr(msg, "User-Agent", "Gaim/" VERSION); msn_message_set_content_type(msg, "text/plain"); msn_message_set_charset(msg, "UTF-8"); msn_message_set_flag(msg, 'A'); Modified: branches/soc-2006-msnp13/src/protocols/msn/nexus.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-08-19 14:12:41 UTC (rev 16884) +++ branches/soc-2006-msnp13/src/protocols/msn/nexus.c 2006-08-19 16:13:55 UTC (rev 16885) @@ -151,7 +151,7 @@ MsnSoapConn * soapconn = data; soapconn->read_cb = nexus_login_read_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } Modified: branches/soc-2006-msnp13/src/protocols/msn/oim.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-19 14:12:41 UTC (rev 16884) +++ branches/soc-2006-msnp13/src/protocols/msn/oim.c 2006-08-19 16:13:55 UTC (rev 16885) @@ -104,7 +104,7 @@ MsnSoapConn * soapconn = data; soapconn->read_cb = msn_oim_send_read_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } /*pose single message to oim server*/ @@ -204,7 +204,7 @@ MsnSoapConn * soapconn = data; soapconn->read_cb = msn_oim_get_read_cb; - msn_soap_read_cb(data,source,cond); +// msn_soap_read_cb(data,source,cond); } /*parse the oim XML data*/ Modified: branches/soc-2006-msnp13/src/protocols/msn/soap.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 14:12:41 UTC (rev 16884) +++ branches/soc-2006-msnp13/src/protocols/msn/soap.c 2006-08-19 16:13:55 UTC (rev 16885) @@ -352,17 +352,11 @@ } /*clear the read buffer*/ msn_soap_free_read_buf(soapconn); - +#if 1 +// msn_soap_close(soapconn); +#endif /*Process the next queued SOAP request*/ msn_soap_post_head_request(soapconn); - -#if 0 - /*remove the read handler*/ - gaim_input_remove(soapconn->input_handler); - soapconn->input_handler = -1; - // gaim_ssl_close(soapconn->gsc); - // soapconn->gsc = NULL; -#endif } return; } @@ -437,6 +431,8 @@ if(soapconn->written_cb != NULL){ soapconn->written_cb(soapconn, source, 0); } + /*maybe we need to read the input?*/ + msn_soap_read_cb(soapconn,source,0); } /*write the buffer to SOAP connection*/ @@ -495,6 +491,8 @@ void msn_soap_post_head_request(MsnSoapConn *soapconn) { + g_return_if_fail(soapconn->soap_queue != NULL); + if(!g_queue_is_empty(soapconn->soap_queue)){ MsnSoapReq *request; if((request = g_queue_pop_head(soapconn->soap_queue)) != NULL){ Modified: branches/soc-2006-msnp13/src/protocols/msn/switchboard.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-19 14:12:41 UTC (rev 16884) +++ branches/soc-2006-msnp13/src/protocols/msn/switchboard.c 2006-08-19 16:13:55 UTC (rev 16885) @@ -707,8 +707,8 @@ process_queue(swboard); -// if (!session->http_method) -// send_clientcaps(swboard); + if (!session->http_method) + send_clientcaps(swboard); if (swboard->closed) msn_switchboard_close(swboard); Modified: branches/soc-2006-msnp13/src/protocols/msn/userlist.c =================================================================== --- branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-19 14:12:41 UTC (rev 16884) +++ branches/soc-2006-msnp13/src/protocols/msn/userlist.c 2006-08-19 16:13:55 UTC (rev 16885) @@ -458,6 +458,7 @@ user = msn_user_new(userlist, passport, userName); msn_userlist_add_user(userlist, user); } + msn_user_set_store_name(user, userName); return user; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |