static void yahoo_conf_join(struct yahoo_data *yd, GaimConversation *c, const char *dn, const char *room, const char *topic, const char *members) { struct yahoo_packet *pkt; char **memarr = NULL; int i; if (members) memarr = g_strsplit(members, "\n", 0); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFLOGON, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 1, dn); yahoo_packet_hash(pkt, 3, dn); yahoo_packet_hash(pkt, 57, room); if (memarr) { for(i = 0 ; memarr[i]; i++) { if (!strcmp(memarr[i], "") || !strcmp(memarr[i], dn)) continue; yahoo_packet_hash(pkt, 3, memarr[i]); gaim_chat_add_user(GAIM_CHAT(c), memarr[i], NULL); } } yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); if (memarr) g_strfreev(memarr); }
static int yahoo_chat_send(struct yahoo_data *yd, const char *dn, const char *room, const char *what) { struct yahoo_packet *pkt; int me = 0; char *msg1, *msg2; msg1 = g_strdup(what); if (meify(msg1, -1)) me = 1; msg2 = yahoo_html_to_codes(msg1); g_free(msg1); pkt = yahoo_packet_new(YAHOO_SERVICE_COMMENT, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 1, dn); yahoo_packet_hash(pkt, 104, room); yahoo_packet_hash(pkt, 117, msg2); if (me) yahoo_packet_hash(pkt, 124, "2"); else yahoo_packet_hash(pkt, 124, "1"); /* fixme: what about /think? (124=3) */ yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); g_free(msg2); return 0; }
static void yahoo_conf_invite(GaimConnection *gc, GaimConversation *c, const char *dn, const char *buddy, const char *room, const char *msg) { struct yahoo_data *yd = gc->proto_data; struct yahoo_packet *pkt; GList *members; char *msg2 = NULL; if (msg) msg2 = yahoo_string_encode(gc, msg, NULL); members = gaim_conv_chat_get_users(GAIM_CONV_CHAT(c)); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFADDINVITE, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, "sssss", 1, dn, 51, buddy, 57, room, 58, msg?msg2:"", 13, "0"); for(; members; members = members->next) { const char *name = gaim_conv_chat_cb_get_name(members->data); if (!strcmp(name, dn)) continue; yahoo_packet_hash(pkt, "ss", 52, name, 53, name); } yahoo_packet_send_and_free(pkt, yd); g_free(msg2); }
static int yahoo_conf_send(struct yahoo_data *yd, const char *dn, const char *room, GList *members, const char *what) { struct yahoo_packet *pkt; GList *who; char *msg; msg = yahoo_html_to_codes(what); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFMSG, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 1, dn); for (who = members; who; who = who->next) yahoo_packet_hash(pkt, 53, (char *)who->data); yahoo_packet_hash(pkt, 57, room); yahoo_packet_hash(pkt, 14, msg); yahoo_packet_hash(pkt, 97, "1"); /* utf-8 */ yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); g_free(msg); return 0; }
static void yahoo_conf_invite(PurpleConnection *gc, PurpleChatConversation *c, const char *dn, const char *buddy, const char *room, const char *msg) { YahooData *yd = purple_connection_get_protocol_data(gc); struct yahoo_packet *pkt; GList *members, *it; char *msg2 = NULL; if (msg) msg2 = yahoo_string_encode(gc, msg, FALSE); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFADDINVITE, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sssss", 1, dn, 51, buddy, 57, room, 58, msg?msg2:"", 13, "0"); members = purple_chat_conversation_get_users(c); for(it = members; it; it = it->next) { const char *name = purple_chat_user_get_name(it->data); if (!strcmp(name, dn)) continue; yahoo_packet_hash(pkt, "ss", 52, name, 53, name); } g_list_free(members); yahoo_packet_send_and_free(pkt, yd); g_free(msg2); }
static void yahoo_xfer_init_15(PurpleXfer *xfer) { struct yahoo_xfer_data *xfer_data; PurpleConnection *gc; PurpleAccount *account; YahooData *yd; struct yahoo_packet *pkt; xfer_data = purple_xfer_get_protocol_data(xfer); gc = xfer_data->gc; yd = purple_connection_get_protocol_data(gc); account = purple_connection_get_account(gc); if (purple_xfer_get_xfer_type(xfer) == PURPLE_XFER_TYPE_SEND) { gchar *filename; filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sssiiiisiii", 1, purple_normalize(account, purple_account_get_username(account)), 5, purple_xfer_get_remote_user(xfer), 265, xfer_data->xfer_peer_idstring, 222, 1, 266, 1, 302, 268, 300, 268, 27, filename, 28, (int)purple_xfer_get_size(xfer), 301, 268, 303, 268); g_free(filename); } else { if(xfer_data->firstoflist == TRUE) { pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sssi", 1, purple_normalize(account, purple_account_get_username(account)), 5, purple_xfer_get_remote_user(xfer), 265, xfer_data->xfer_peer_idstring, 222, 3); } else { pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sssi", 1, purple_normalize(account, purple_account_get_username(account)), 5, purple_xfer_get_remote_user(xfer), 265, xfer_data->xfer_peer_idstring, 271, 1); } } yahoo_packet_send_and_free(pkt, yd); }
static void yahoo_chat_join(struct yahoo_data *yd, const char *dn, const char *room, const char *topic) { struct yahoo_packet *pkt; pkt = yahoo_packet_new(YAHOO_SERVICE_CHATJOIN, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 62, "2"); yahoo_packet_hash(pkt, 104, room); yahoo_packet_hash(pkt, 129, "0"); yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); }
static void yahoo_xfer_cancel_recv(PurpleXfer *xfer) { struct yahoo_xfer_data *xfer_data; xfer_data = purple_xfer_get_protocol_data(xfer); if(purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) { PurpleConnection *gc; PurpleAccount *account; YahooData *yd; struct yahoo_packet *pkt; gc = xfer_data->gc; yd = purple_connection_get_protocol_data(gc); account = purple_connection_get_account(gc); if(!xfer_data->xfer_idstring_for_relay) /* hack to see if file trans acc/info packet has been received */ { pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sssi", 1, purple_normalize(account, purple_account_get_username(account)), 5, purple_xfer_get_remote_user(xfer), 265, xfer_data->xfer_peer_idstring, 222, 4); } else { pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15, YAHOO_STATUS_DISCONNECTED, yd->session_id); yahoo_packet_hash(pkt, "sssi", 1, purple_normalize(account, purple_account_get_username(account)), 5, purple_xfer_get_remote_user(xfer), 265, xfer_data->xfer_peer_idstring, 66, -1); } yahoo_packet_send_and_free(pkt, yd); } if (xfer_data) { purple_http_conn_cancel(xfer_data->hc); yahoo_xfer_data_free(xfer_data); } purple_xfer_set_protocol_data(xfer, NULL); }
/* special function to log us on to the yahoo chat service */ static void yahoo_chat_online(GaimConnection *gc) { struct yahoo_data *yd = gc->proto_data; struct yahoo_packet *pkt; pkt = yahoo_packet_new(YAHOO_SERVICE_CHATONLINE, YAHOO_STATUS_AVAILABLE,0); yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); yahoo_packet_hash(pkt, 109, gaim_connection_get_display_name(gc)); yahoo_packet_hash(pkt, 6, "abcde"); yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); }
static void yahoo_chat_invite(GaimConnection *gc, const char *dn, const char *buddy, const char *room, const char *msg) { struct yahoo_data *yd = gc->proto_data; struct yahoo_packet *pkt; char *room2, *msg2 = NULL; gboolean utf8 = TRUE; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); ycht_chat_send_invite(yd->ycht, room, buddy, msg); return; } room2 = yahoo_string_encode(gc, room, &utf8); if (msg) msg2 = yahoo_string_encode(gc, msg, NULL); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATADDINVITE, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, "sssss", 1, dn, 118, buddy, 104, room2, 117, (msg2?msg2:""), 129, "0"); yahoo_packet_send_and_free(pkt, yd); g_free(room2); g_free(msg2); }
static int yahoo_conf_send(GaimConnection *gc, const char *dn, const char *room, GList *members, const char *what) { struct yahoo_data *yd = gc->proto_data; struct yahoo_packet *pkt; GList *who; char *msg, *msg2; int utf8 = 1; msg = yahoo_html_to_codes(what); msg2 = yahoo_string_encode(gc, msg, &utf8); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFMSG, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash_str(pkt, 1, dn); for (who = members; who; who = who->next) { const char *name = gaim_conv_chat_cb_get_name(who->data); yahoo_packet_hash_str(pkt, 53, name); } yahoo_packet_hash(pkt, "ss", 57, room, 14, msg2); if (utf8) yahoo_packet_hash_str(pkt, 97, "1"); /* utf-8 */ yahoo_packet_send_and_free(pkt, yd); g_free(msg); g_free(msg2); return 0; }
static void yahoo_chat_invite(struct yahoo_data *yd, const char *dn, const char *buddy, const char *room, const char *msg) { struct yahoo_packet *pkt; pkt = yahoo_packet_new(YAHOO_SERVICE_CHATADDINVITE, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 1, dn); yahoo_packet_hash(pkt, 118, buddy); yahoo_packet_hash(pkt, 104, room); yahoo_packet_hash(pkt, 117, (msg?msg:"")); yahoo_packet_hash(pkt, 129, "0"); yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); }
static void yahoo_chat_join(PurpleConnection *gc, const char *dn, const char *room, const char *topic, const char *id) { YahooData *yd = gc->proto_data; struct yahoo_packet *pkt; char *room2; gboolean utf8 = TRUE; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); ycht_chat_join(yd->ycht, room); return; } /* apparently room names are always utf8, or else always not utf8, * so we don't have to actually pass the flag in the packet. Or something. */ room2 = yahoo_string_encode(gc, room, &utf8); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATJOIN, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "ssss", 1, purple_connection_get_display_name(gc), 104, room2, 62, "2", 129, id ? id : "0"); yahoo_packet_send_and_free(pkt, yd); g_free(room2); }
void yahoo_chat_goto(PurpleConnection *gc, const char *name) { YahooData *yd; struct yahoo_packet *pkt; yd = gc->proto_data; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); ycht_chat_goto_user(yd->ycht, name); return; } if (!yd->chat_online) { yahoo_chat_online(gc); g_free(yd->pending_chat_room); yd->pending_chat_room = NULL; g_free(yd->pending_chat_id); yd->pending_chat_id = NULL; g_free(yd->pending_chat_topic); yd->pending_chat_topic = NULL; g_free(yd->pending_chat_goto); yd->pending_chat_goto = g_strdup(name); return; } pkt = yahoo_packet_new(YAHOO_SERVICE_CHATGOTO, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sss", 109, name, 1, purple_connection_get_display_name(gc), 62, "2"); yahoo_packet_send_and_free(pkt, yd); }
static void yahoo_conf_join(YahooData *yd, PurpleConversation *c, const char *dn, const char *room, const char *topic, const char *members) { struct yahoo_packet *pkt; char **memarr = NULL; int i; if (members) memarr = g_strsplit(members, "\n", 0); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFLOGON, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sss", 1, dn, 3, dn, 57, room); if (memarr) { for(i = 0 ; memarr[i]; i++) { if (!strcmp(memarr[i], "") || !strcmp(memarr[i], dn)) continue; yahoo_packet_hash_str(pkt, 3, memarr[i]); purple_conv_chat_add_user(PURPLE_CONV_CHAT(c), memarr[i], NULL, PURPLE_CBFLAGS_NONE, TRUE); } } yahoo_packet_send_and_free(pkt, yd); if (memarr) g_strfreev(memarr); }
/* this is a confirmation of yahoo_chat_online(); */ void yahoo_process_chat_online(PurpleConnection *gc, struct yahoo_packet *pkt) { YahooData *yd = (YahooData *) gc->proto_data; if (pkt->status == 1) { yd->chat_online = TRUE; /* We need to goto a user in chat */ if (yd->pending_chat_goto) { struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_CHATGOTO, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sss", 109, yd->pending_chat_goto, 1, purple_connection_get_display_name(gc), 62, "2"); yahoo_packet_send_and_free(pkt, yd); } else if (yd->pending_chat_room) { yahoo_chat_join(gc, purple_connection_get_display_name(gc), yd->pending_chat_room, yd->pending_chat_topic, yd->pending_chat_id); } g_free(yd->pending_chat_room); yd->pending_chat_room = NULL; g_free(yd->pending_chat_id); yd->pending_chat_id = NULL; g_free(yd->pending_chat_topic); yd->pending_chat_topic = NULL; g_free(yd->pending_chat_goto); yd->pending_chat_goto = NULL; } }
static int yahoo_conf_send(PurpleConnection *gc, const char *dn, const char *room, GList *members, const char *what) { YahooData *yd = purple_connection_get_protocol_data(gc); struct yahoo_packet *pkt; GList *who; char *msg, *msg2; msg = yahoo_html_to_codes(what); msg2 = yahoo_string_encode(gc, msg, TRUE); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFMSG, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash_str(pkt, 1, dn); for (who = members; who; who = who->next) { const char *name = purple_chat_user_get_name(who->data); yahoo_packet_hash_str(pkt, 53, name); } yahoo_packet_hash(pkt, "ss", 57, room, 14, msg2); yahoo_packet_hash_str(pkt, 97, "1"); /* UTF-8 */ yahoo_packet_send_and_free(pkt, yd); g_free(msg); g_free(msg2); return 0; }
static void yahoo_conf_invite(struct yahoo_data *yd, GaimConversation *c, const char *dn, const char *buddy, const char *room, const char *msg) { struct yahoo_packet *pkt; GList *members; members = gaim_chat_get_users(GAIM_CHAT(c)); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFADDINVITE, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 1, dn); yahoo_packet_hash(pkt, 51, buddy); yahoo_packet_hash(pkt, 57, room); yahoo_packet_hash(pkt, 58, msg?msg:""); yahoo_packet_hash(pkt, 13, "0"); for(; members; members = members->next) { if (!strcmp(members->data, dn)) continue; yahoo_packet_hash(pkt, 52, (char *)members->data); yahoo_packet_hash(pkt, 53, (char *)members->data); } yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); }
static void yahoo_conf_leave(struct yahoo_data *yd, const char *room, const char *dn, GList *who) { struct yahoo_packet *pkt; GList *w; pkt = yahoo_packet_new(YAHOO_SERVICE_CONFLOGOFF, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 1, dn); for (w = who; w; w = w->next) { yahoo_packet_hash(pkt, 3, (char *)w->data); } yahoo_packet_hash(pkt, 57, room); yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); }
void yahoo_chat_goto(GaimConnection *gc, const char *name) { struct yahoo_data *yd; struct yahoo_packet *pkt; yd = gc->proto_data; if (!yd->chat_online) yahoo_chat_online(gc); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATGOTO, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 109, name); yahoo_packet_hash(pkt, 1, gaim_connection_get_display_name(gc)); yahoo_packet_hash(pkt, 62, "2"); yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); }
static void yahoo_chat_leave(struct yahoo_data *yd, const char *room, const char *dn) { struct yahoo_packet *pkt; pkt = yahoo_packet_new(YAHOO_SERVICE_CHATEXIT, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, 104, room); yahoo_packet_hash(pkt, 109, dn); yahoo_packet_hash(pkt, 108, "1"); yahoo_packet_hash(pkt, 112, "0"); /* what does this one mean? */ yahoo_send_packet(yd, pkt); yahoo_packet_free(pkt); yd->in_chat = 0; if (yd->chat_name) { g_free(yd->chat_name); yd->chat_name = NULL; } }
static void yahoo_chat_leave(PurpleConnection *gc, const char *room, const char *dn, gboolean logout) { YahooData *yd = gc->proto_data; struct yahoo_packet *pkt; char *eroom; gboolean utf8 = 1; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); ycht_chat_leave(yd->ycht, room, logout); return; } eroom = yahoo_string_encode(gc, room, &utf8); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATEXIT, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sss", 104, eroom, 109, dn, 108, "1"); yahoo_packet_hash_str(pkt, 112, "0"); /* what does this one mean? */ yahoo_packet_send_and_free(pkt, yd); yd->in_chat = 0; if (yd->chat_name) { g_free(yd->chat_name); yd->chat_name = NULL; } if (purple_find_chat(gc, YAHOO_CHAT_ID) != NULL) serv_got_chat_left(gc, YAHOO_CHAT_ID); if (!logout) return; pkt = yahoo_packet_new(YAHOO_SERVICE_CHATLOGOUT, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash_str(pkt, 1, dn); yahoo_packet_send_and_free(pkt, yd); yd->chat_online = FALSE; g_free(yd->pending_chat_room); yd->pending_chat_room = NULL; g_free(yd->pending_chat_id); yd->pending_chat_id = NULL; g_free(yd->pending_chat_topic); yd->pending_chat_topic = NULL; g_free(yd->pending_chat_goto); yd->pending_chat_goto = NULL; g_free(eroom); }
/* special function to log us on to the yahoo chat service */ static void yahoo_chat_online(GaimConnection *gc) { struct yahoo_data *yd = gc->proto_data; struct yahoo_packet *pkt; if (yd->wm) { ycht_connection_open(gc); return; } pkt = yahoo_packet_new(YAHOO_SERVICE_CHATONLINE, YAHOO_STATUS_AVAILABLE,0); yahoo_packet_hash(pkt, "sss", 1, gaim_connection_get_display_name(gc), 109, gaim_connection_get_display_name(gc), 6, "abcde"); yahoo_packet_send_and_free(pkt, yd); }
static void yahoo_send_userinfo_to_user(struct yahoo_userinfo *yui, const char *who) { struct yahoo_packet *pkt; PurpleConnection *gc; gc = yui->yd->gc; pkt = yahoo_packet_new(YAHOO_SERVICE_CONTACT_DETAILS, 0, 0); yahoo_packet_hash(pkt, "siisis", 1, purple_connection_get_display_name(gc), 13, 1, /* This creates a conversation window in the official client */ 302, 5, 5, who, 303, 5, 280, yui->xml); yahoo_packet_send_and_free(pkt, yui->yd); }
static int yahoo_chat_send(GaimConnection *gc, const char *dn, const char *room, const char *what, GaimMessageFlags flags) { struct yahoo_data *yd = gc->proto_data; struct yahoo_packet *pkt; int me = 0; char *msg1, *msg2, *room2; gboolean utf8 = TRUE; if (yd->wm) { g_return_val_if_fail(yd->ycht != NULL, 1); return ycht_chat_send(yd->ycht, room, what); } msg1 = g_strdup(what); if (meify(msg1, -1)) me = 1; msg2 = yahoo_html_to_codes(msg1); g_free(msg1); msg1 = yahoo_string_encode(gc, msg2, &utf8); g_free(msg2); room2 = yahoo_string_encode(gc, room, NULL); pkt = yahoo_packet_new(YAHOO_SERVICE_COMMENT, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, "sss", 1, dn, 104, room2, 117, msg1); if (me) yahoo_packet_hash_str(pkt, 124, "2"); else yahoo_packet_hash_str(pkt, 124, "1"); /* fixme: what about /think? (124=3) */ if (utf8) yahoo_packet_hash_str(pkt, 97, "1"); yahoo_packet_send_and_free(pkt, yd); g_free(msg1); g_free(room2); return 0; }
void yahoo_chat_goto(GaimConnection *gc, const char *name) { struct yahoo_data *yd; struct yahoo_packet *pkt; yd = gc->proto_data; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); ycht_chat_goto_user(yd->ycht, name); return; } if (!yd->chat_online) yahoo_chat_online(gc); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATGOTO, YAHOO_STATUS_AVAILABLE, 0); yahoo_packet_hash(pkt, "sss", 109, name, 1, gaim_connection_get_display_name(gc), 62, "2"); yahoo_packet_send_and_free(pkt, yd); }
static int yahoo_chat_send(PurpleConnection *gc, const char *dn, const char *room, const char *what, PurpleMessageFlags flags) { YahooData *yd = purple_connection_get_protocol_data(gc); struct yahoo_packet *pkt; int me = 0; char *msg1, *msg2, *room2; if (yd->wm) { g_return_val_if_fail(yd->ycht != NULL, 1); return ycht_chat_send(yd->ycht, room, what); } msg1 = g_strdup(what); if (purple_message_meify(msg1, -1)) me = 1; msg2 = yahoo_html_to_codes(msg1); g_free(msg1); msg1 = yahoo_string_encode(gc, msg2, TRUE); g_free(msg2); room2 = yahoo_string_encode(gc, room, FALSE); pkt = yahoo_packet_new(YAHOO_SERVICE_COMMENT, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sss", 1, dn, 104, room2, 117, msg1); if (me) yahoo_packet_hash_str(pkt, 124, "2"); else yahoo_packet_hash_str(pkt, 124, "1"); /* fixme: what about /think? (124=3) */ yahoo_packet_hash_str(pkt, 97, "1"); /* UTF-8 */ yahoo_packet_send_and_free(pkt, yd); g_free(msg1); g_free(room2); return 0; }
static void yahoo_chat_invite(PurpleConnection *gc, const char *dn, const char *buddy, const char *room, const char *msg) { YahooData *yd = purple_connection_get_protocol_data(gc); struct yahoo_packet *pkt; char *room2, *msg2 = NULL; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); ycht_chat_send_invite(yd->ycht, room, buddy, msg); return; } room2 = yahoo_string_encode(gc, room, TRUE); if (msg) msg2 = yahoo_string_encode(gc, msg, FALSE); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATADDINVITE, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sssss", 1, dn, 118, buddy, 104, room2, 117, (msg2?msg2:""), 129, "0"); yahoo_packet_send_and_free(pkt, yd); g_free(room2); g_free(msg2); }
/* special function to log us on to the yahoo chat service */ static void yahoo_chat_online(PurpleConnection *gc) { YahooData *yd = gc->proto_data; struct yahoo_packet *pkt; const char *rll; if (yd->wm) { ycht_connection_open(gc); return; } rll = purple_account_get_string(purple_connection_get_account(gc), "room_list_locale", YAHOO_ROOMLIST_LOCALE); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATONLINE, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sssss", 109, purple_connection_get_display_name(gc), 1, purple_connection_get_display_name(gc), 6, "abcde", /* I'm not sure this is the correct way to set this. */ 98, rll, 135, yd->jp ? YAHOO_CLIENT_VERSION : YAHOOJP_CLIENT_VERSION); yahoo_packet_send_and_free(pkt, yd); }
void yahoo_process_filetrans_info_15(PurpleConnection *gc, struct yahoo_packet *pkt) { char *url = NULL; long val_249 = 0; long val_66 = 0; PurpleXfer *xfer; YahooData *yd; struct yahoo_xfer_data *xfer_data; char *xfer_peer_idstring = NULL; char *xfer_idstring_for_relay = NULL; GSList *l; struct yahoo_packet *pkt_to_send; yd = purple_connection_get_protocol_data(gc); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 4: /* from */ break; case 5: /* to */ break; case 265: if (g_utf8_validate(pair->value, -1, NULL)) { xfer_peer_idstring = pair->value; } else { purple_debug_warning("yahoo", "yahoo_process_filetrans_info_15 " "got non-UTF-8 string for key %d\n", pair->key); } break; case 27: /* filename */ break; case 66: val_66 = strtol(pair->value, NULL, 10); break; case 249: val_249 = strtol(pair->value, NULL, 10); /* 249 has value 1 or 2 when doing p2p transfer and value 3 when relaying through yahoo server */ break; case 250: if (g_utf8_validate(pair->value, -1, NULL)) { url = pair->value; /* TODO: rename to host? what about non-relay? */ } else { purple_debug_warning("yahoo", "yahoo_process_filetrans_info_15 " "got non-UTF-8 string for key %d\n", pair->key); } break; case 251: if (g_utf8_validate(pair->value, -1, NULL)) { xfer_idstring_for_relay = pair->value; } else { purple_debug_warning("yahoo", "yahoo_process_filetrans_info_15 " "got non-UTF-8 string for key %d\n", pair->key); } break; } } if(!xfer_peer_idstring) return; xfer = g_hash_table_lookup(yd->xfer_peer_idstring_map, xfer_peer_idstring); if(!xfer) return; if(val_66==-1) { purple_xfer_cancel_remote(xfer); return; } xfer_data = purple_xfer_get_protocol_data(xfer); xfer_data->info_val_249 = val_249; xfer_data->xfer_idstring_for_relay = g_strdup(xfer_idstring_for_relay); if(val_249 == 1 || val_249 == 3) { PurpleHttpRequest *req; PurpleAccount *account; xfer_data->is_relay = (val_249 == 3); if (!xfer_data->is_relay) { purple_debug_error("yahoo", "Non-relay FT aren't tested yet.\n"); purple_notify_error(gc, NULL, _("File Transfer Failed"), _("Unsupported method"), purple_request_cpar_from_connection(gc)); purple_xfer_cancel_remote(xfer); } account = purple_connection_get_account(xfer_data->gc); xfer_data->url = yahoo_ft_url_gen(xfer, url); pkt_to_send = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt_to_send, "ssssis", 1, purple_normalize(account, purple_account_get_username(account)), 5, purple_xfer_get_remote_user(xfer), 265, xfer_data->xfer_peer_idstring, 27, purple_xfer_get_filename(xfer), 249, xfer_data->info_val_249, 251, xfer_data->xfer_idstring_for_relay); yahoo_packet_send_and_free(pkt_to_send, yd); req = yahoo_ft_new_req(xfer_data); purple_http_request_set_method(req, "HEAD"); xfer_data->hc = purple_http_request(gc, req, yahoo_process_filetrans_info_15_got, xfer); purple_http_request_unref(req); } else if (val_249 == 2) purple_debug_error("yahoo", "p2p file transfers are not supported yet\n"); }