static GList * get_nicks(XMPP_SERVER_REC *server, const char *nick, gboolean quoted, gboolean complete_names) { GSList *gl, *ul; GList *list; XMPP_ROSTER_USER_REC *user; char *jid, *resource; int len; gboolean pass2; len = strlen(nick); /* resources completion */ resource = xmpp_extract_resource(nick); if (resource != NULL) { jid = xmpp_strip_resource(nick); list = get_resources(server, jid, resource, quoted); g_free(resource); g_free(jid); return list; } list = NULL; pass2 = FALSE; again: /* first complete with online contacts * then complete with offline contacts */ for (gl = server->roster; gl != NULL; gl = gl->next) { for (ul = ((XMPP_ROSTER_GROUP_REC *)gl->data)->users; ul != NULL ; ul = ul->next) { user = (XMPP_ROSTER_USER_REC *)ul->data; if ((!pass2 && user->resources == NULL) || (pass2 && user->resources != NULL)) continue; if (complete_names && user->name != NULL && g_ascii_strncasecmp(user->name, nick, len) == 0) list = g_list_prepend(list, quoted ? quoted_if_space(user->name, NULL) : g_strdup(user->name)); if (g_ascii_strncasecmp(user->jid, nick, len) == 0) list = g_list_prepend(list, quoted ? quoted_if_space(user->jid, NULL) : g_strdup(user->jid)); } } if ((pass2 = !pass2)) goto again; /* TODO: rewrite this function */ return list; }
static char * cmd_connect_get_line(const char *data) { GHashTable *optlist; const char *port; char *line, *jid, *password, *network, *network_free, *host, *host_free; void *free_arg; line = host_free = network_free = NULL; if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTIONS, "xmppconnect", &optlist, &jid, &password)) return NULL; if (*password == '\0') password = g_strdup("\r"); /* we will prompt for password later */ if (*jid == '\0' || password == NULL || *password == '\0' || !xmpp_have_domain(jid)) { cmd_params_free(free_arg); signal_emit("error command", 1, GINT_TO_POINTER(CMDERR_NOT_ENOUGH_PARAMS)); signal_stop(); return NULL; } network = g_hash_table_lookup(optlist, "network"); if (network == NULL || *network == '\0') { char *stripped = xmpp_strip_resource(jid); network = network_free = g_strconcat("xmpp:", stripped, (void *)NULL); g_free(stripped); } host = g_hash_table_lookup(optlist, "host"); if (host == NULL || *host == '\0') host = host_free = xmpp_extract_domain(jid); port = g_hash_table_lookup(optlist, "port"); if (port == NULL) port = "0"; line = g_strdup_printf("%s-xmppnet \"%s\" %s %d \"%s\" \"%s\"", (g_hash_table_lookup(optlist, "ssl") != NULL) ? "-ssl " : "", network, host, atoi(port), password, jid); g_free(network_free); g_free(host_free); cmd_params_free(free_arg); return line; }
static void sig_vcard(XMPP_SERVER_REC *server, const char *jid, GHashTable *ht) { XMPP_ROSTER_USER_REC *user; struct vcard_user_data ud; char *name; user = rosters_find_user(server->roster, jid, NULL, NULL); name = user != NULL && user->name != NULL ? g_strdup(user->name) : xmpp_strip_resource(jid); printformat_module(MODULE_NAME, server, jid, MSGLEVEL_CRAP, XMPPTXT_VCARD, name, jid); g_free(name); ud.server = server; ud.jid = jid; g_hash_table_foreach(ht, (void (*)(gpointer, gpointer, gpointer))func_vcard_value, &ud); printformat_module(MODULE_NAME, server, jid, MSGLEVEL_CRAP, XMPPTXT_END_OF_VCARD); }
SERVER_REC * xmpp_server_init_connect(SERVER_CONNECT_REC *connrec) { XMPP_SERVER_REC *server; XMPP_SERVER_CONNECT_REC *conn = (XMPP_SERVER_CONNECT_REC *)connrec; char *recoded; if (conn->address == NULL || conn->address[0] == '\0') return NULL; if (conn->nick == NULL || conn->nick[0] == '\0') return NULL; g_return_val_if_fail(IS_XMPP_SERVER_CONNECT(conn), NULL); server = g_new0(XMPP_SERVER_REC, 1); server->chat_type = XMPP_PROTOCOL; server->user = xmpp_extract_user(conn->nick); server->domain = xmpp_have_domain(conn->nick) ? xmpp_extract_domain(conn->nick) : g_strdup(conn->address); server->jid = xmpp_have_domain(conn->nick) ? xmpp_strip_resource(conn->nick) : g_strconcat(server->user, "@", server->domain, (void *)NULL); server->resource = xmpp_extract_resource(conn->nick); if (server->resource == NULL) server->resource = g_strdup("irssi-xmpp"); server->priority = settings_get_int("xmpp_priority"); if (xmpp_priority_out_of_bound(server->priority)) server->priority = 0; server->ping_id = NULL; server->server_features = NULL; server->my_resources = NULL; server->roster = NULL; server->msg_handlers = NULL; server->channels_join = channels_join; server->isnickflag = isnickflag_func; server->ischannel = ischannel_func; server->get_nick_flags = get_nick_flags; server->send_message = send_message; server->connrec = (XMPP_SERVER_CONNECT_REC *)conn; server_connect_ref(connrec); /* don't use irssi's sockets */ server->connrec->no_connect = TRUE; server->connect_pid = -1; if (server->connrec->port <= 0) server->connrec->port = (server->connrec->use_ssl) ? LM_CONNECTION_DEFAULT_PORT_SSL : LM_CONNECTION_DEFAULT_PORT; if (conn->real_jid == NULL) conn->real_jid = conn->nick; else g_free(conn->nick); conn->nick = g_strdup(settings_get_bool("xmpp_set_nick_as_username") ? server->user : server->jid); /* init loudmouth connection structure */ server->lmconn = lm_connection_new(NULL); lm_connection_set_server(server->lmconn, server->connrec->address); lm_connection_set_port(server->lmconn, server->connrec->port); recoded = xmpp_recode_out(server->jid); lm_connection_set_jid(server->lmconn, recoded); g_free(recoded); lm_connection_set_keep_alive_rate(server->lmconn, 30); server->timeout_tag = 0; server_connect_init((SERVER_REC *)server); server->connect_tag = 1; return (SERVER_REC *)server; }