static void sig_recv_iq(XMPP_SERVER_REC *server, LmMessage *lmsg, const int type, const char *id, const char *from, const char *to) { LmMessageNode *node, *child; char *name, *version, *os; if (type == LM_MESSAGE_SUB_TYPE_RESULT && (node = lm_find_node(lmsg->node,"query", XMLNS, XMLNS_VERSION)) != NULL) { name = version = os = NULL; for (child = node->children; child != NULL; child = child->next) { if (child->value == NULL) continue; if (name == NULL && strcmp(child->name, "name") == 0) g_strstrip(name = xmpp_recode_in(child->value)); else if (version == NULL && strcmp(child->name, "version") == 0) g_strstrip(version = xmpp_recode_in(child->value)); else if (os == NULL && strcmp(child->name, "os") == 0) g_strstrip(os = xmpp_recode_in(child->value)); } signal_emit("xmpp version", 5, server, from, name, version, os); g_free(name); g_free(version); g_free(os); } else if (type == LM_MESSAGE_SUB_TYPE_GET && (node = lm_find_node(lmsg->node,"query", XMLNS, XMLNS_VERSION)) != NULL) send_version(server, from, id); }
static void sig_recv_message(XMPP_SERVER_REC *server, LmMessage *lmsg, const int type, const char *id, const char *from, const char *to) { LmMessageNode *node; MUC_REC *channel; const char *stamp; char *nick, *str; time_t t; node = lm_find_node(lmsg->node, "delay", "xmlns", XMLNS_DELAY); if (node == NULL) { /* XEP-0091: Delayed Delivery (deprecated) */ node = lm_find_node(lmsg->node, "x", "xmlns", XMLNS_OLD_DELAY); if (node == NULL) return; } stamp = lm_message_node_get_attribute(node, "stamp"); if ((t = xep82_datetime(stamp)) == (time_t)-1) return; node = lm_message_node_get_child(lmsg->node, "body"); if (node == NULL || node->value == NULL || *node->value == '\0') return; if (type == LM_MESSAGE_SUB_TYPE_GROUPCHAT && (channel = get_muc(server, from)) != NULL && (nick = muc_extract_nick(from)) != NULL) { str = xmpp_recode_in(node->value); if (g_ascii_strncasecmp(str, "/me ", 4) == 0) signal_emit("message xmpp delay action", 6, server, str+4, nick, channel->name, &t, GINT_TO_POINTER(SEND_TARGET_CHANNEL)); else signal_emit("message xmpp delay", 6, server, str, nick, channel->name, &t, GINT_TO_POINTER(SEND_TARGET_CHANNEL)); g_free(str); g_free(nick); } else if ((type == LM_MESSAGE_SUB_TYPE_NOT_SET || type == LM_MESSAGE_SUB_TYPE_HEADLINE || type == LM_MESSAGE_SUB_TYPE_NORMAL || type == LM_MESSAGE_SUB_TYPE_CHAT)) { str = xmpp_recode_in(node->value); if (g_ascii_strncasecmp(str, "/me ", 4) == 0) signal_emit("message xmpp delay action", 6, server, str+4, from, from, &t, GINT_TO_POINTER(SEND_TARGET_NICK)); else signal_emit("message xmpp delay", 6, server, str+4, from, from, &t, GINT_TO_POINTER(SEND_TARGET_NICK)); g_free(str); } else return; signal_stop(); }
static void sig_recv_iq(XMPP_SERVER_REC *server, LmMessage *lmsg, const int type, const char *id, const char *from, const char *to) { LmMessageNode *node; GSList *features; if (type == LM_MESSAGE_SUB_TYPE_RESULT) { node = lm_find_node(lmsg->node, "query", XMLNS, XMLNS_DISCO); if (node == NULL) return; features = NULL; for (node = node->children; node != NULL; node = node->next) { if (strcmp(node->name, "feature") == 0) { features = g_slist_prepend(features, xmpp_recode_in( lm_message_node_get_attribute(node, "var"))); } } signal_emit("xmpp features", 3, server, from, features); if (strcmp(from, server->domain) == 0) { cleanup_features(server->server_features); server->server_features = features; signal_emit("xmpp server features", 1, server); } else cleanup_features(features); } else if (type == LM_MESSAGE_SUB_TYPE_GET) { node = lm_find_node(lmsg->node, "query", XMLNS, XMLNS_DISCO); if (node != NULL) send_disco(server, from); } }
static void vcard_handle(XMPP_SERVER_REC *server, const char *jid, LmMessageNode *node) { LmMessageNode *child, *subchild; GHashTable *ht; const char *adressing; char *value; ht = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); child = node->children; while (child != NULL) { /* ignore avatar */ if (g_ascii_strcasecmp(child->name, "PHOTO") == 0) goto next; if (child->value != NULL) { value = xmpp_recode_in(child->value); g_strstrip(value); g_hash_table_insert(ht, child->name, value); goto next; } /* find the adressing type indicator */ subchild = child->children; adressing = NULL; while (subchild != NULL && adressing == NULL) { if (subchild->value == NULL && ( g_ascii_strcasecmp(subchild->name , "HOME") == 0 || g_ascii_strcasecmp(subchild->name , "WORK") == 0)) adressing = subchild->name; subchild = subchild->next; } subchild = child->children; while (subchild != NULL) { if (subchild->value != NULL) { value = xmpp_recode_in(subchild->value); /* TODO sub... */ g_free(value); } subchild = subchild->next; } next: child = child->next; } signal_emit("xmpp vcard", 3, server, jid, ht); g_hash_table_destroy(ht); }
static LmHandlerResult handle_stanza(LmMessageHandler *handler, LmConnection *connection, LmMessage *lmsg, gpointer user_data) { XMPP_SERVER_REC *server; int type; const char *id; char *from, *to, *raw; if ((server = XMPP_SERVER(user_data)) == NULL) return LM_HANDLER_RESULT_REMOVE_MESSAGE; raw = xmpp_recode_in(lm_message_node_to_string(lmsg->node)); signal_emit("xmpp xml in", 2, server, raw); g_free(raw); type = lm_message_get_sub_type(lmsg); id = lm_message_node_get_attribute(lmsg->node, "id"); if (id == NULL) id = ""; from = xmpp_recode_in(lm_message_node_get_attribute(lmsg->node, "from")); if (from == NULL) from = g_strdup(""); to = xmpp_recode_in(lm_message_node_get_attribute(lmsg->node, "to")); if (to == NULL) to = g_strdup(""); switch(lm_message_get_type(lmsg)) { case LM_MESSAGE_TYPE_MESSAGE: signal_emit("xmpp recv message", 6, server, lmsg, type, id, from, to); break; case LM_MESSAGE_TYPE_PRESENCE: signal_emit("xmpp recv presence", 6, server, lmsg, type, id, from, to); break; case LM_MESSAGE_TYPE_IQ: signal_emit("xmpp recv iq", 6, server, lmsg, type, id, from, to); break; default: signal_emit("xmpp recv others", 6, server, lmsg, type, id, from, to); break; } g_free(from); g_free(to); return LM_HANDLER_RESULT_REMOVE_MESSAGE; }
static void send_stanza(XMPP_SERVER_REC *server, LmMessage *lmsg) { char *xml, *recoded; g_return_if_fail(IS_XMPP_SERVER(server)); g_return_if_fail(lmsg != NULL); xml = lm_message_node_to_string(lmsg->node); recoded = xmpp_recode_in(xml); g_free(xml); signal_emit("xmpp xml out", 2, server, recoded); g_free(recoded); lm_connection_send(server->lmconn, lmsg, NULL); }