📄 slp.c
字号:
g_free(nonce); } else if (!strcmp(type, "application/x-msnmsgr-transrespbody")) {#if 0 char *ip_addrs; char *temp; char *nonce; int port; nonce = get_token(content, "Nonce: {", "}\r\n"); ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n"); temp = get_token(content, "IPv4Internal-Port: ", "\r\n"); if (temp != NULL) port = atoi(temp); else port = -1; g_free(temp); if (ip_addrs == NULL) return; if (port > 0) got_transresp(slpcall, nonce, ip_addrs, port); g_free(nonce); g_free(ip_addrs);#endif }}static voidgot_ok(MsnSlpCall *slpcall, const char *type, const char *content){ g_return_if_fail(slpcall != NULL); g_return_if_fail(type != NULL); if (!strcmp(type, "application/x-msnmsgr-sessionreqbody")) {#if 0 if (slpcall->type == MSN_SLPCALL_DC) { /* First let's try a DirectConnection. */ MsnSlpLink *slplink; MsnSlpMessage *slpmsg; char *header; char *content; char *branch; slplink = slpcall->slplink; branch = rand_guid(); content = g_strdup_printf( "Bridges: TRUDPv1 TCPv1\r\n" "NetID: 0\r\n" "Conn-Type: Direct-Connect\r\n" "UPnPNat: false\r\n" "ICF: false\r\n" ); header = g_strdup_printf("INVITE MSNMSGR:%s MSNSLP/1.0", slplink->remote_user); slpmsg = msn_slp_sipmsg_new(slpcall, 0, header, branch, "application/x-msnmsgr-transreqbody", content);#ifdef DEBUG_SLP slpmsg->info = "SLP INVITE"; slpmsg->text_body = TRUE;#endif msn_slplink_send_slpmsg(slplink, slpmsg); g_free(header); g_free(content); g_free(branch); } else { msn_slp_call_session_init(slpcall); }#else msn_slp_call_session_init(slpcall);#endif } else if (!strcmp(type, "application/x-msnmsgr-transreqbody")) { /* Do we get this? */ gaim_debug_info("msn", "OK with transreqbody\n"); } else if (!strcmp(type, "application/x-msnmsgr-transrespbody")) {#if 0 char *ip_addrs; char *temp; char *nonce; int port; nonce = get_token(content, "Nonce: {", "}\r\n"); ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n"); temp = get_token(content, "IPv4Internal-Port: ", "\r\n"); if (temp != NULL) port = atoi(temp); else port = -1; g_free(temp); if (ip_addrs == NULL) return; if (port > 0) got_transresp(slpcall, nonce, ip_addrs, port); g_free(nonce); g_free(ip_addrs);#endif }}MsnSlpCall *msn_slp_sip_recv(MsnSlpLink *slplink, const char *body, gsize len){ MsnSlpCall *slpcall; if (!strncmp(body, "INVITE", strlen("INVITE"))) { char *branch; char *content; char *content_type; slpcall = msn_slp_call_new(slplink); /* From: <msnmsgr:buddy@hotmail.com> */#if 0 slpcall->remote_user = get_token(body, "From: <msnmsgr:", ">\r\n");#endif branch = get_token(body, ";branch={", "}"); slpcall->id = get_token(body, "Call-ID: {", "}");#if 0 long content_len = -1; temp = get_token(body, "Content-Length: ", "\r\n"); if (temp != NULL) content_len = atoi(temp); g_free(temp);#endif content_type = get_token(body, "Content-Type: ", "\r\n"); content = get_token(body, "\r\n\r\n", NULL); got_invite(slpcall, branch, content_type, content); g_free(content_type); g_free(content); } else if (!strncmp(body, "MSNSLP/1.0 ", strlen("MSNSLP/1.0 "))) { char *content; char *content_type; /* Make sure this is "OK" */ const char *status = body + strlen("MSNSLP/1.0 "); char *call_id; call_id = get_token(body, "Call-ID: {", "}"); slpcall = msn_slplink_find_slp_call(slplink, call_id); g_free(call_id); g_return_val_if_fail(slpcall != NULL, NULL); if (strncmp(status, "200 OK", 6)) { /* It's not valid. Kill this off. */ char temp[32]; const char *c; /* Eww */ if ((c = strchr(status, '\r')) || (c = strchr(status, '\n')) || (c = strchr(status, '\0'))) { size_t offset = c - status; if (offset >= sizeof(temp)) offset = sizeof(temp) - 1; strncpy(temp, status, offset); temp[offset] = '\0'; } gaim_debug_error("msn", "Received non-OK result: %s\n", temp); slpcall->wasted = TRUE; /* msn_slp_call_destroy(slpcall); */ return slpcall; } content_type = get_token(body, "Content-Type: ", "\r\n"); content = get_token(body, "\r\n\r\n", NULL); got_ok(slpcall, content_type, content); g_free(content_type); g_free(content); } else if (!strncmp(body, "BYE", strlen("BYE"))) { char *call_id; call_id = get_token(body, "Call-ID: {", "}"); slpcall = msn_slplink_find_slp_call(slplink, call_id); g_free(call_id); if (slpcall != NULL) slpcall->wasted = TRUE; /* msn_slp_call_destroy(slpcall); */ } else slpcall = NULL; return slpcall;}/************************************************************************** * Msg Callbacks **************************************************************************/voidmsn_p2p_msg(MsnCmdProc *cmdproc, MsnMessage *msg){ MsnSession *session; MsnSlpLink *slplink; session = cmdproc->servconn->session; slplink = msn_session_get_slplink(session, msg->remote_user); msn_slplink_process_msg(slplink, msg);}voidgot_emoticon(MsnSlpCall *slpcall, const char *data, long long size){ gaim_debug_info("msn", "Got smiley: %s\n", slpcall->data_info);#if 0 GaimConversation *conv; GaimConnection *gc = slpsession->swboard->servconn->session->account->gc; serv_got_smiley(gc, info, data, size);#endif}voidmsn_emoticon_msg(MsnCmdProc *cmdproc, MsnMessage *msg){ MsnSession *session; MsnSlpLink *slplink; MsnObject *obj; char **tokens; char *smile; const char *who; session = cmdproc->servconn->session; tokens = g_strsplit(msg->body, "\t", 2); smile = tokens[0]; obj = msn_object_new_from_string(gaim_url_decode(tokens[1])); who = msn_object_get_creator(obj); slplink = msn_session_get_slplink(session, who); msn_slplink_request_object(slplink, smile, got_emoticon, obj); g_strfreev(tokens);}static gbooleanbuddy_icon_cached(GaimConnection *gc, MsnObject *obj){ GaimAccount *account; GaimBuddy *buddy; GSList *sl; const char *old; const char *new; g_return_val_if_fail(obj != NULL, FALSE); account = gaim_connection_get_account(gc); sl = gaim_find_buddies(account, msn_object_get_creator(obj)); if (sl == NULL) return FALSE; buddy = (GaimBuddy *)sl->data; old = gaim_blist_node_get_string((GaimBlistNode *)buddy, "icon_checksum"); new = msn_object_get_sha1c(obj); if (new == NULL) return FALSE; if (old != NULL && !strcmp(old, new)) return TRUE; return FALSE;}voidmsn_release_buddy_icon_request(MsnUserList *userlist){ MsnUser *user; while (userlist->buddy_icon_window > 0) { GQueue *queue; GaimAccount *account; const char *username; queue = userlist->buddy_icon_requests; if (g_queue_is_empty(userlist->buddy_icon_requests)) break; user = g_queue_pop_head(queue); account = userlist->session->account; username = user->passport; msn_request_user_display(user); userlist->buddy_icon_window--; }}voidmsn_queue_buddy_icon_request(MsnUser *user){ GaimAccount *account; MsnObject *obj; GQueue *queue; account = user->userlist->session->account; obj = msn_user_get_object(user); if (obj == NULL) { /* It seems the user has not set a msnobject */ GSList *sl; /* TODO: I think we need better buddy icon core functions. */ gaim_buddy_icons_set_for_user(account, user->passport, NULL, -1); sl = gaim_find_buddies(account, user->passport); for (; sl != NULL; sl = sl->next) { GaimBuddy *buddy = (GaimBuddy *)sl->data; gaim_blist_node_remove_setting((GaimBlistNode*)buddy, "icon_checksum"); } return; } if (!buddy_icon_cached(account->gc, obj)) { MsnUserList *userlist; userlist = user->userlist; queue = userlist->buddy_icon_requests; g_queue_push_tail(queue, user); if (userlist->buddy_icon_window > 0) msn_release_buddy_icon_request(userlist); }}voidgot_user_display(MsnSlpCall *slpcall, const char *data, long long size){ const char *info; GaimAccount *account; GSList *sl; info = slpcall->data_info; gaim_debug_info("msn", "Got User Display: %s\n", info); account = slpcall->slplink->session->account; /* TODO: I think we need better buddy icon core functions. */ gaim_buddy_icons_set_for_user(account, slpcall->slplink->remote_user, (void *)data, size); sl = gaim_find_buddies(account, slpcall->slplink->remote_user); for (; sl != NULL; sl = sl->next) { GaimBuddy *buddy = (GaimBuddy *)sl->data; gaim_blist_node_set_string((GaimBlistNode*)buddy, "icon_checksum", info); } slpcall->slplink->session->userlist->buddy_icon_window++; msn_release_buddy_icon_request(slpcall->slplink->session->userlist);}voidmsn_request_user_display(MsnUser *user){ GaimAccount *account; MsnSession *session; MsnSlpLink *slplink; MsnObject *obj; const char *info; session = user->userlist->session; account = session->account; slplink = msn_session_get_slplink(session, user->passport); obj = msn_user_get_object(user); info = msn_object_get_sha1c(obj); if (g_ascii_strcasecmp(user->passport, gaim_account_get_username(account))) { msn_slplink_request_object(slplink, info, got_user_display, obj); } else { MsnObject *my_obj = NULL; const char *filename = NULL; gchar *data = NULL; gsize len = 0; const char *my_info = NULL; GSList *sl; gaim_debug_info("msn", "Requesting our own user display\n"); my_obj = msn_user_get_object(session->user); if (my_obj != NULL) { filename = msn_object_get_real_location(my_obj); my_info = msn_object_get_sha1c(my_obj); } if (filename != NULL) g_file_get_contents(filename, &data, &len, NULL); /* TODO: I think we need better buddy icon core functions. */ gaim_buddy_icons_set_for_user(account, user->passport, (void *)data, len); sl = gaim_find_buddies(account, user->passport); for (; sl != NULL; sl = sl->next) { GaimBuddy *buddy = (GaimBuddy *)sl->data; gaim_blist_node_set_string((GaimBlistNode*)buddy, "icon_checksum", info); } session->userlist->buddy_icon_window++; msn_release_buddy_icon_request(session->userlist); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -