static void jabber_chat_disco_traffic_cb(JabberStream *js, xmlnode *packet, gpointer data) { JabberChat *chat; xmlnode *query; int id = GPOINTER_TO_INT(data); if(!(chat = jabber_chat_find_by_id(js, id))) return; /* defaults, in case the conference server doesn't * support this request */ chat->xhtml = TRUE; if(xmlnode_get_child(packet, "error")) { return; } if(!(query = xmlnode_get_child(packet, "query"))) return; /* disabling this until more MUC servers support * announcing this chat->xhtml = FALSE; for(x = xmlnode_get_child(query, "feature"); x; x = xmlnode_get_next_twin(x)) { const char *var = xmlnode_get_attrib(x, "var"); if(var && !strcmp(var, "http://jabber.org/protocol/xhtml-im")) { chat->xhtml = TRUE; } } */ }
JabberChat *jabber_chat_find_by_conv(PurpleConversation *conv) { PurpleAccount *account = purple_conversation_get_account(conv); PurpleConnection *gc = purple_account_get_connection(account); JabberStream *js = gc->proto_data; int id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)); return jabber_chat_find_by_id(js, id); }
JabberChat *jabber_chat_find_by_conv(GaimConversation *conv) { GaimAccount *account = gaim_conversation_get_account(conv); GaimConnection *gc = gaim_account_get_connection(account); JabberStream *js = gc->proto_data; int id = gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)); return jabber_chat_find_by_id(js, id); }
void jabber_chat_set_topic(PurpleConnection *gc, int id, const char *topic) { JabberStream *js = gc->proto_data; JabberChat *chat = jabber_chat_find_by_id(js, id); if(!chat) return; jabber_chat_change_topic(chat, topic); }
char *jabber_chat_buddy_real_name(PurpleConnection *gc, int id, const char *who) { JabberStream *js = gc->proto_data; JabberChat *chat; chat = jabber_chat_find_by_id(js, id); if(!chat) return NULL; return g_strdup_printf("%s@%s/%s", chat->room, chat->server, who); }
void jabber_chat_invite(PurpleConnection *gc, int id, const char *msg, const char *name) { JabberStream *js = gc->proto_data; JabberChat *chat; xmlnode *message, *body, *x, *invite; char *room_jid; chat = jabber_chat_find_by_id(js, id); if(!chat) return; message = xmlnode_new("message"); room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); if(chat->muc) { xmlnode_set_attrib(message, "to", room_jid); x = xmlnode_new_child(message, "x"); xmlnode_set_namespace(x, "http://jabber.org/protocol/muc#user"); invite = xmlnode_new_child(x, "invite"); xmlnode_set_attrib(invite, "to", name); if (msg) { body = xmlnode_new_child(invite, "reason"); xmlnode_insert_data(body, msg, -1); } } else { xmlnode_set_attrib(message, "to", name); /* * Putting the reason into the body was an 'undocumented protocol, * ...not part of "groupchat 1.0"'. * http://xmpp.org/extensions/attic/jep-0045-1.16.html#invite * * Left here for compatibility. */ if (msg) { body = xmlnode_new_child(message, "body"); xmlnode_insert_data(body, msg, -1); } x = xmlnode_new_child(message, "x"); xmlnode_set_attrib(x, "jid", room_jid); /* The better place for it! XEP-0249 style. */ if (msg) xmlnode_set_attrib(x, "reason", msg); xmlnode_set_namespace(x, "jabber:x:conference"); } jabber_send(js, message); xmlnode_free(message); g_free(room_jid); }
void jabber_chat_leave(PurpleConnection *gc, int id) { JabberStream *js = gc->proto_data; JabberChat *chat = jabber_chat_find_by_id(js, id); if(!chat) return; jabber_chat_part(chat, NULL); chat->conv = NULL; }
char *jabber_chat_buddy_real_name(PurpleConnection *gc, int id, const char *who) { JabberStream *js = gc->proto_data; JabberChat *chat; JabberChatMember *jcm; chat = jabber_chat_find_by_id(js, id); if(!chat) return NULL; jcm = g_hash_table_lookup(chat->members, who); if (jcm != NULL && jcm->jid) return g_strdup(jcm->jid); return g_strdup_printf("%s@%s/%s", chat->room, chat->server, who); }
static void jabber_chat_affiliation_list_cb(JabberStream *js, const char *from, JabberIqType type, const char *id, xmlnode *packet, gpointer data) { JabberChat *chat; xmlnode *query, *item; int chat_id = GPOINTER_TO_INT(data); GString *buf; if(!(chat = jabber_chat_find_by_id(js, chat_id))) return; if (type == JABBER_IQ_ERROR) return; if(!(query = xmlnode_get_child(packet, "query"))) return; buf = g_string_new(_("Affiliations:")); item = xmlnode_get_child(query, "item"); if (item) { for( ; item; item = xmlnode_get_next_twin(item)) { const char *jid = xmlnode_get_attrib(item, "jid"); const char *affiliation = xmlnode_get_attrib(item, "affiliation"); if (jid && affiliation) g_string_append_printf(buf, "\n%s %s", jid, affiliation); } } else { buf = g_string_append_c(buf, '\n'); buf = g_string_append_len(buf, _("No users found"), -1); } purple_conv_chat_write(PURPLE_CONV_CHAT(chat->conv), "", buf->str, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL)); g_string_free(buf, TRUE); }
static void jabber_chat_disco_traffic_cb(JabberStream *js, const char *from, JabberIqType type, const char *id, xmlnode *packet, gpointer data) { JabberChat *chat; #if 0 xmlnode *query, *x; #endif int chat_id = GPOINTER_TO_INT(data); if(!(chat = jabber_chat_find_by_id(js, chat_id))) return; /* defaults, in case the conference server doesn't * support this request */ chat->xhtml = TRUE; /* disabling this until more MUC servers support * announcing this */ #if 0 if (type == JABBER_IQ_ERROR) { return; } if(!(query = xmlnode_get_child(packet, "query"))) return; chat->xhtml = FALSE; for(x = xmlnode_get_child(query, "feature"); x; x = xmlnode_get_next_twin(x)) { const char *var = xmlnode_get_attrib(x, "var"); if(var && !strcmp(var, NS_XHTML_IM)) { chat->xhtml = TRUE; } } #endif }
void jabber_chat_invite(PurpleConnection *gc, int id, const char *msg, const char *name) { JabberStream *js = gc->proto_data; JabberChat *chat; xmlnode *message, *body, *x, *invite; char *room_jid; chat = jabber_chat_find_by_id(js, id); if(!chat) return; message = xmlnode_new("message"); room_jid = g_strdup_printf("%s@%s", chat->room, chat->server); if(chat->muc) { xmlnode_set_attrib(message, "to", room_jid); x = xmlnode_new_child(message, "x"); xmlnode_set_namespace(x, "http://jabber.org/protocol/muc#user"); invite = xmlnode_new_child(x, "invite"); xmlnode_set_attrib(invite, "to", name); body = xmlnode_new_child(invite, "reason"); xmlnode_insert_data(body, msg, -1); } else { xmlnode_set_attrib(message, "to", name); body = xmlnode_new_child(message, "body"); xmlnode_insert_data(body, msg, -1); x = xmlnode_new_child(message, "x"); xmlnode_set_attrib(x, "jid", room_jid); xmlnode_set_namespace(x, "jabber:x:conference"); } jabber_send(js, message); xmlnode_free(message); g_free(room_jid); }