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_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 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_message(XMPP_SERVER_REC *server, LmMessage *lmsg, const int type, const char *id, const char *from, const char *to) { LmMessageNode *node; 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) || server->ischannel(SERVER(server), from)) return; node = lm_find_node(lmsg->node, "x", XMLNS, XMLNS_EVENT); if (node == NULL) { signal_emit("xmpp composing hide", 2, server, from); return; } if (lm_message_node_get_child(lmsg->node, "body") != NULL || lm_message_node_get_child(lmsg->node, "subject") != NULL) { if (lm_message_node_get_child(node, "composing") != NULL) datalist_add(composings, server, from, g_strdup(id)); else datalist_remove(composings, server, from); signal_emit("xmpp composing hide", 2, server, from); } else { if (lm_message_node_get_child(node, "composing") != NULL) signal_emit("xmpp composing show", 2, server, from); else signal_emit("xmpp composing hide", 2, server, from); } }
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; if (type != LM_MESSAGE_SUB_TYPE_RESULT) return; node = lm_find_node(lmsg->node, "vCard", XMLNS, XMLNS_VCARD); if (node != NULL) vcard_handle(server, from, node); }