JabberChat *jabber_join_chat(JabberStream *js, const char *room, const char *server, const char *handle, const char *password, GHashTable *data) { JabberChat *chat; PurpleConnection *gc; PurpleAccount *account; PurpleStatus *status; xmlnode *presence, *x; JabberBuddyState state; char *msg; int priority; char *jid; chat = jabber_chat_new(js, room, server, handle, password, data); if (chat == NULL) return NULL; gc = js->gc; account = purple_connection_get_account(gc); status = purple_account_get_active_status(account); purple_status_to_jabber(status, &state, &msg, &priority); presence = jabber_presence_create_js(js, state, msg, priority); g_free(msg); jid = g_strdup_printf("%s@%s/%s", room, server, handle); xmlnode_set_attrib(presence, "to", jid); g_free(jid); x = xmlnode_new_child(presence, "x"); xmlnode_set_namespace(x, "http://jabber.org/protocol/muc"); if (password && *password) { xmlnode *p = xmlnode_new_child(x, "password"); xmlnode_insert_data(p, password, -1); } jabber_send(js, presence); xmlnode_free(presence); return chat; }
JabberChat *jabber_join_chat(JabberStream *js, const char *room, const char *server, const char *handle, const char *password, GHashTable *data) { JabberChat *chat; PurpleConnection *gc; PurpleAccount *account; PurpleStatus *status; xmlnode *presence, *x; JabberBuddyState state; char *msg; int priority; char *jid; char *history_maxchars; char *history_maxstanzas; char *history_seconds; char *history_since; struct tm history_since_datetime; const char *history_since_string = NULL; chat = jabber_chat_new(js, room, server, handle, password, data); if (chat == NULL) return NULL; gc = js->gc; account = purple_connection_get_account(gc); status = purple_account_get_active_status(account); purple_status_to_jabber(status, &state, &msg, &priority); presence = jabber_presence_create_js(js, state, msg, priority); g_free(msg); jid = g_strdup_printf("%s@%s/%s", room, server, handle); xmlnode_set_attrib(presence, "to", jid); g_free(jid); history_maxchars = g_hash_table_lookup(data, "history_maxchars"); history_maxstanzas = g_hash_table_lookup(data, "history_maxstanzas"); history_seconds = g_hash_table_lookup(data, "history_seconds"); history_since = g_hash_table_lookup(data, "history_since"); if (history_since) { if (purple_str_to_time(history_since, TRUE, &history_since_datetime, NULL, NULL) != 0) { history_since_string = purple_utf8_strftime("%Y-%m-%dT%H:%M:%SZ", &history_since_datetime); } else { history_since_string = NULL; purple_debug_error("jabber", "Invalid date format for history_since" " while requesting history: %s", history_since); } } x = xmlnode_new_child(presence, "x"); xmlnode_set_namespace(x, "http://jabber.org/protocol/muc"); if (password && *password) { xmlnode *p = xmlnode_new_child(x, "password"); xmlnode_insert_data(p, password, -1); } if ((history_maxchars && *history_maxchars) || (history_maxstanzas && *history_maxstanzas) || (history_seconds && *history_seconds) || (history_since_string && *history_since_string)) { xmlnode *history = xmlnode_new_child(x, "history"); if (history_maxchars && *history_maxchars) { xmlnode_set_attrib(history, "maxchars", history_maxchars); } if (history_maxstanzas && *history_maxstanzas) { xmlnode_set_attrib(history, "maxstanzas", history_maxstanzas); } if (history_seconds && *history_seconds) { xmlnode_set_attrib(history, "seconds", history_seconds); } if (history_since_string && *history_since_string) { xmlnode_set_attrib(history, "since", history_since_string); } } jabber_send(js, presence); xmlnode_free(presence); return chat; }