void roster_send_remove_from_group(const char * const group, PContact contact) { GSList *groups = p_contact_groups(contact); GSList *new_groups = NULL; while (groups) { if (strcmp(groups->data, group) != 0) { new_groups = g_slist_append(new_groups, strdup(groups->data)); } groups = g_slist_next(groups); } xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); // add an id handler to handle the response char *unique_id = create_unique_id(NULL); GroupData *data = malloc(sizeof(GroupData)); data->group = strdup(group); if (p_contact_name(contact)) { data->name = strdup(p_contact_name(contact)); } else { data->name = strdup(p_contact_barejid(contact)); } xmpp_id_handler_add(conn, _group_remove_handler, unique_id, data); xmpp_stanza_t *iq = stanza_create_roster_set(ctx, unique_id, p_contact_barejid(contact), p_contact_name(contact), new_groups); xmpp_send(conn, iq); xmpp_stanza_release(iq); free(unique_id); }
/** * This connection handler is called after connection has been etablized. * All initial messages can therefore be put here. */ static void sdvp_HandleConnection(xmpp_conn_t * const conn, const xmpp_conn_event_t status, const int error, xmpp_stream_error_t * const stream_error, void * const userdata) { xmpp_ctx_t *ctx = (xmpp_ctx_t *) userdata; xmpp_stanza_t* pres; char packetId[PACKET_ID_LENGTH_INC_TERM]; if (status == XMPP_CONN_CONNECT) { syslog(LOG_DEBUG, "Connected\n"); xmpp_handler_add(conn, HandleRpcCall, "jabber:iq:rpc", "iq", "get", ctx); xmpp_handler_add(conn, PresenceHandler, NULL, "presence", NULL, ctx); xmpp_handler_add(conn, HandlePing, "urn:xmpp:ping", "iq", "get", ctx); xmpp_id_handler_add(conn, HandlePingResult, "ping", ctx); // Send initial <presence/> so that we appear online to contacts // This is very important as the server don't route messages/iq's if not online! // pres = xmpp_stanza_new(ctx); xmpp_stanza_set_name(pres, "presence"); _GeneratePacketId(packetId, PACKET_ID_LENGTH_INC_TERM); xmpp_stanza_set_id(pres, packetId); xmpp_send(conn, pres); xmpp_stanza_release(pres); // Send request for roaster _SendRosterRequest(conn, ctx); if (callbackOnConnectionChange != NULL ) { callbackOnConnectionChange(SDVP_CONN_CONNECT); } } else { syslog(LOG_WARNING, "conn_handler disconnected\n"); sdvpIsRunning = false; xmpp_stop(ctx); } }
void bookmark_request(void) { char *id; xmpp_conn_t *conn = connection_get_conn(); xmpp_ctx_t *ctx = connection_get_ctx(); xmpp_stanza_t *iq; id = strdup("bookmark_init_request"); autojoin_count = 0; if (bookmark_ac != NULL) { autocomplete_free(bookmark_ac); } bookmark_ac = autocomplete_new(); if (bookmark_list != NULL) { g_list_free_full(bookmark_list, _bookmark_item_destroy); bookmark_list = NULL; } xmpp_timed_handler_add(conn, _bookmark_handle_delete, BOOKMARK_TIMEOUT, id); xmpp_id_handler_add(conn, _bookmark_handle_result, id, id); iq = stanza_create_storage_bookmarks(ctx); xmpp_stanza_set_id(iq, id); xmpp_send(conn, iq); xmpp_stanza_release(iq); }
static void _iq_send_caps_request(const char * const to, const char * const id, const char * const node, const char * const ver) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); if (!node) { log_error("Could not create caps request, no node"); return; } if (!ver) { log_error("Could not create caps request, no ver"); return; } GString *node_str = g_string_new(""); g_string_printf(node_str, "%s#%s", node, ver); xmpp_stanza_t *iq = stanza_create_disco_info_iq(ctx, id, to, node_str->str); g_string_free(node_str, TRUE); xmpp_id_handler_add(conn, _caps_response_handler, id, NULL); xmpp_send(conn, iq); xmpp_stanza_release(iq); }
void mood_publish(mood_callback_t callback, const char * const usermood, const char * const usertext) { xmpp_stanza_t *iq, *pubsub, *publish, *item, *mood, *stanza, *text; iq = xmpp_stanza_new(ctx); xmpp_stanza_set_name(iq, "iq"); xmpp_stanza_set_type(iq, "set"); xmpp_stanza_set_id(iq, "mood1"); /* FIXME */ pubsub = xmpp_stanza_new(ctx); xmpp_stanza_set_name(pubsub, "pubsub"); xmpp_stanza_set_ns(pubsub, NS_PUBSUB); xmpp_stanza_add_child(iq, pubsub); xmpp_stanza_release(pubsub); publish = xmpp_stanza_new(ctx); xmpp_stanza_set_name(publish, "publish"); xmpp_stanza_set_attribute(publish, "node", NS_MOOD); xmpp_stanza_add_child(pubsub, publish); xmpp_stanza_release(publish); item = xmpp_stanza_new(ctx); xmpp_stanza_set_name(item, "item"); xmpp_stanza_add_child(publish, item); xmpp_stanza_release(item); mood = xmpp_stanza_new(ctx); xmpp_stanza_set_name(mood, "mood"); xmpp_stanza_set_ns(mood, NS_MOOD); xmpp_stanza_add_child(item, mood); xmpp_stanza_release(mood); if (usermood != NULL) { stanza = xmpp_stanza_new(ctx); xmpp_stanza_set_name(stanza, usermood); xmpp_stanza_add_child(mood, stanza); xmpp_stanza_release(stanza); } if (usertext != NULL) { text = xmpp_stanza_new(ctx); xmpp_stanza_set_name(text, "text"); xmpp_stanza_set_text(text, usertext); xmpp_stanza_add_child(mood, text); xmpp_stanza_release(text); } xmpp_id_handler_add(conn, mood_result_handler, xmpp_stanza_get_id(iq), callback); xmpp_send(conn, iq); xmpp_stanza_release(iq); }
static void _iq_submit_room_config(const char * const room, DataForm *form) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_stanza_t *iq = stanza_create_room_config_submit_iq(ctx, room, form); char *id = xmpp_stanza_get_id(iq); xmpp_id_handler_add(conn, _room_config_submit_handler, id, NULL); xmpp_send(conn, iq); xmpp_stanza_release(iq); }
static void _iq_request_room_config_form(const char * const room_jid) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_stanza_t *iq = stanza_create_room_config_request_iq(ctx, room_jid); char *id = xmpp_stanza_get_id(iq); xmpp_id_handler_add(conn, _room_config_handler, id, NULL); xmpp_send(conn, iq); xmpp_stanza_release(iq); }
static void _iq_destroy_instant_room(const char * const room_jid) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_stanza_t *iq = stanza_create_instant_room_destroy_iq(ctx, room_jid); char *id = xmpp_stanza_get_id(iq); xmpp_id_handler_add(conn, _destroy_room_result_handler, id, NULL); xmpp_send(conn, iq); xmpp_stanza_release(iq); }
static void _iq_disco_info_request(gchar *jid) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); char *id = create_unique_id("disco_info"); xmpp_stanza_t *iq = stanza_create_disco_info_iq(ctx, id, jid, NULL); xmpp_id_handler_add(conn, _disco_info_response_handler, id, NULL); xmpp_send(conn, iq); xmpp_stanza_release(iq); }
static void _iq_send_ping(const char * const target) { xmpp_conn_t * const conn = connection_get_conn(); xmpp_ctx_t * const ctx = connection_get_ctx(); xmpp_stanza_t *iq = stanza_create_ping_iq(ctx, target); char *id = xmpp_stanza_get_id(iq); GDateTime *now = g_date_time_new_now_local(); xmpp_id_handler_add(conn, _manual_pong_handler, id, now); xmpp_send(conn, iq); xmpp_stanza_release(iq); }
static int _ping_timed_handler(xmpp_conn_t * const conn, void * const userdata) { xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata; if (jabber_get_connection_status() == JABBER_CONNECTED) { xmpp_stanza_t *iq = stanza_create_ping_iq(ctx, NULL); char *id = xmpp_stanza_get_id(iq); // add pong handler xmpp_id_handler_add(conn, _pong_handler, id, ctx); xmpp_send(conn, iq); xmpp_stanza_release(iq); } return 1; }
void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, const int error, xmpp_stream_error_t * const stream_error, void * const userdata) { xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata; xmpp_stanza_t *iq, *query; if (status == XMPP_CONN_CONNECT) { fprintf(stderr, "DEBUG: connected\n"); /* create iq stanza for request */ iq = xmpp_stanza_new(ctx); xmpp_stanza_set_name(iq, "iq"); xmpp_stanza_set_type(iq, "get"); xmpp_stanza_set_id(iq, "active1"); xmpp_stanza_set_attribute(iq, "to", "xxxxxxxxx.com"); query = xmpp_stanza_new(ctx); xmpp_stanza_set_name(query, "query"); xmpp_stanza_set_ns(query, XMPP_NS_DISCO_ITEMS); xmpp_stanza_set_attribute(query, "node", "sessions"); xmpp_stanza_add_child(iq, query); /* we can release the stanza since it belongs to iq now */ xmpp_stanza_release(query); /* set up reply handler */ xmpp_id_handler_add(conn, handle_reply, "active1", ctx); /* send out the stanza */ xmpp_send(conn, iq); /* release the stanza */ xmpp_stanza_release(iq); } else { fprintf(stderr, "DEBUG: disconnected\n"); xmpp_stop(ctx); } }
int xmppipe_stream_init(xmppipe_state_t *state) { xmpp_stanza_t *enable = NULL; if (state->sm_request_interval == 0) return 0; /* <enable xmlns='urn:xmpp:sm:3'/> */ enable = xmppipe_stanza_new(state->ctx); xmppipe_stanza_set_name(enable, "enable"); xmppipe_stanza_set_ns(enable, "urn:xmpp:sm:3"); xmpp_send(state->conn, enable); (void)xmpp_stanza_release(enable); xmpp_handler_add(state->conn, handle_sm_enabled, "urn:xmpp:sm:3", "enabled", NULL, state); xmpp_handler_add(state->conn, handle_sm_request, "urn:xmpp:sm:3", "r", NULL, state); xmpp_handler_add(state->conn, handle_sm_ack, "urn:xmpp:sm:3", "a", NULL, state); xmpp_handler_add(state->conn, handle_message, NULL, "message", NULL, state); xmpp_handler_add(state->conn, handle_version, "jabber:iq:version", "iq", NULL, state); xmpp_id_handler_add(state->conn, handle_ping_reply, "c2s1", state); /* XXX multiple handlers can be called for each event * XXX * XXX * is the order handlers are called determinisitc? * XXX * the NULL handler needs to installed as soon as stream management is enabled * XXX * a handler has to exist for unsupported events */ xmpp_handler_add(state->conn, handle_null, NULL, NULL, NULL, state); return 0; }