1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-12-04 14:46:46 -05:00

Move disco info struct to connection

This commit is contained in:
James Booth 2016-05-07 23:28:16 +01:00
parent 9596591610
commit 6ce8edc194
8 changed files with 71 additions and 61 deletions

View File

@ -2991,7 +2991,7 @@ cmd_blocked(ProfWin *window, const char *const command, gchar **args)
return TRUE; return TRUE;
} }
if (!session_service_supports(XMPP_FEATURE_BLOCKING)) { if (!connection_supports(XMPP_FEATURE_BLOCKING)) {
cons_show("Blocking not supported by server."); cons_show("Blocking not supported by server.");
return TRUE; return TRUE;
} }

View File

@ -60,6 +60,7 @@ typedef struct prof_conn_t {
int priority; int priority;
char *domain; char *domain;
GHashTable *available_resources; GHashTable *available_resources;
GSList *disco_items;
} ProfConnection; } ProfConnection;
static ProfConnection conn; static ProfConnection conn;
@ -82,6 +83,7 @@ void connection_init(void)
conn.xmpp_conn = NULL; conn.xmpp_conn = NULL;
conn.xmpp_ctx = NULL; conn.xmpp_ctx = NULL;
conn.domain = NULL; conn.domain = NULL;
conn.disco_items = NULL;
conn.available_resources = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)resource_destroy); conn.available_resources = g_hash_table_new_full(g_str_hash, g_str_equal, free, (GDestroyNotify)resource_destroy);
} }
@ -199,6 +201,12 @@ connection_get_fulljid(void)
return xmpp_conn_get_jid(conn.xmpp_conn); return xmpp_conn_get_jid(conn.xmpp_conn);
} }
GSList*
connection_get_disco_items(void)
{
return conn.disco_items;
}
GList* GList*
connection_get_available_resources(void) connection_get_available_resources(void)
{ {
@ -282,6 +290,12 @@ connection_set_presence_msg(const char *const message)
} }
} }
void
connection_set_disco_items(GSList *disco_items)
{
conn.disco_items = disco_items;
}
void void
connection_free_domain(void) connection_free_domain(void)
{ {
@ -352,6 +366,50 @@ connection_send_stanza(const char *const stanza)
} }
} }
void
connection_disco_on_login(void)
{
DiscoInfo *info = malloc(sizeof(struct disco_info_t));
info->item = strdup(conn.domain);
info->features = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
conn.disco_items = g_slist_append(conn.disco_items, info);
}
void
_disco_item_destroy(DiscoInfo *info)
{
if (info) {
free(info->item);
if (info->features) {
g_hash_table_destroy(info->features);
}
free(info);
}
}
void
connection_disco_items_free(void)
{
g_slist_free_full(conn.disco_items, (GDestroyNotify)_disco_item_destroy);
conn.disco_items = NULL;
}
gboolean
connection_supports(const char *const feature)
{
DiscoInfo *disco_info;
GSList *curr = conn.disco_items;
while (curr) {
disco_info = curr->data;
if (g_hash_table_lookup_extended(disco_info->features, feature, NULL, NULL)) {
return TRUE;
}
curr = g_slist_next(curr);
}
return FALSE;
}
static void static void
_connection_handler(xmpp_conn_t *const xmpp_conn, const xmpp_conn_event_t status, const int error, _connection_handler(xmpp_conn_t *const xmpp_conn, const xmpp_conn_event_t status, const int error,
xmpp_stream_error_t *const stream_error, void *const userdata) xmpp_stream_error_t *const stream_error, void *const userdata)

View File

@ -41,14 +41,14 @@ void connection_init(void);
jabber_conn_status_t connection_connect(const char *const fulljid, const char *const passwd, const char *const altdomain, int port, jabber_conn_status_t connection_connect(const char *const fulljid, const char *const passwd, const char *const altdomain, int port,
const char *const tls_policy); const char *const tls_policy);
void connection_disco_on_login(void);
char *connection_get_domain(void);
void connection_set_status(jabber_conn_status_t status); void connection_set_status(jabber_conn_status_t status);
void connection_set_presence_msg(const char *const message); void connection_set_presence_msg(const char *const message);
void connection_set_priority(const int priority); void connection_set_priority(const int priority);
void connection_set_domain(char *domain); void connection_set_domain(char *domain);
void connection_set_priority(int priority); void connection_set_priority(int priority);
void connection_set_disco_items(GSList *disco_items);
void connection_free_conn(void); void connection_free_conn(void);
void connection_free_ctx(void); void connection_free_ctx(void);
@ -58,6 +58,9 @@ void connection_free_log(void);
xmpp_conn_t* connection_get_conn(void); xmpp_conn_t* connection_get_conn(void);
xmpp_ctx_t* connection_get_ctx(void); xmpp_ctx_t* connection_get_ctx(void);
char *connection_get_domain(void);
GSList* connection_get_disco_items(void);
void connection_add_available_resource(Resource *resource); void connection_add_available_resource(Resource *resource);
void connection_remove_available_resource(const char *const resource); void connection_remove_available_resource(const char *const resource);
void connection_remove_all_available_resources(void); void connection_remove_all_available_resources(void);

View File

@ -309,7 +309,7 @@ iq_disable_carbons(void)
void void
iq_http_upload_request(HTTPUpload *upload) iq_http_upload_request(HTTPUpload *upload)
{ {
GSList *disco_items = session_get_disco_items(); GSList *disco_items = connection_get_disco_items();
DiscoInfo *disco_info; DiscoInfo *disco_info;
if (disco_items && (g_slist_length(disco_items) > 0)) { if (disco_items && (g_slist_length(disco_items) > 0)) {
while (disco_items) { while (disco_items) {
@ -1920,7 +1920,7 @@ _disco_info_response_id_handler_onconnect(xmpp_stanza_t *const stanza, void *con
if (query) { if (query) {
xmpp_stanza_t *child = xmpp_stanza_get_children(query); xmpp_stanza_t *child = xmpp_stanza_get_children(query);
GSList *disco_items = session_get_disco_items(); GSList *disco_items = connection_get_disco_items();
DiscoInfo *disco_info; DiscoInfo *disco_info;
if (disco_items && (g_slist_length(disco_items) > 0)) { if (disco_items && (g_slist_length(disco_items) > 0)) {
while (disco_items) { while (disco_items) {
@ -2055,7 +2055,7 @@ _disco_items_result_handler(xmpp_stanza_t *const stanza)
DiscoInfo *info = malloc(sizeof(struct disco_info_t)); DiscoInfo *info = malloc(sizeof(struct disco_info_t));
info->item = strdup(item->jid); info->item = strdup(item->jid);
info->features = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL); info->features = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
session_set_disco_items(g_slist_append(session_get_disco_items(), info)); connection_set_disco_items(g_slist_append(connection_get_disco_items(), info));
iq_disco_info_request_onconnect(info->item); iq_disco_info_request_onconnect(info->item);
res_items = g_slist_next(res_items); res_items = g_slist_next(res_items);
} }

View File

@ -66,8 +66,6 @@
#include "xmpp/stanza.h" #include "xmpp/stanza.h"
#include "xmpp/xmpp.h" #include "xmpp/xmpp.h"
static GSList *disco_items;
// for auto reconnect // for auto reconnect
static struct { static struct {
char *name; char *name;
@ -91,8 +89,6 @@ static void _session_free_saved_account(void);
static void _session_free_saved_details(void); static void _session_free_saved_details(void);
static void _session_free_session_data(void); static void _session_free_session_data(void);
static void _session_info_destroy(DiscoInfo *info);
void void
session_init(void) session_init(void)
{ {
@ -100,7 +96,6 @@ session_init(void)
connection_init(); connection_init();
presence_sub_requests_init(); presence_sub_requests_init();
caps_init(); caps_init();
disco_items = NULL;
xmpp_initialize(); xmpp_initialize();
} }
@ -273,33 +268,6 @@ session_process_events(int millis)
} }
} }
GSList*
session_get_disco_items(void)
{
return (disco_items);
}
gboolean
session_service_supports(const char *const feature)
{
DiscoInfo *disco_info;
while (disco_items) {
disco_info = disco_items->data;
if (g_hash_table_lookup_extended(disco_info->features, feature, NULL, NULL)) {
return TRUE;
}
disco_items = g_slist_next(disco_items);
}
return FALSE;
}
void
session_set_disco_items(GSList *_disco_items)
{
disco_items = _disco_items;
}
char* char*
session_get_account_name(void) session_get_account_name(void)
{ {
@ -342,11 +310,8 @@ session_login_success(gboolean secured)
blocking_request(); blocking_request();
// items discovery // items discovery
DiscoInfo *info = malloc(sizeof(struct disco_info_t)); connection_disco_on_login();
info->item = strdup(connection_get_domain()); iq_disco_info_request_onconnect(connection_get_domain());
info->features = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
disco_items = g_slist_append(disco_items, info);
iq_disco_info_request_onconnect(info->item);
iq_disco_items_request_onconnect(connection_get_domain()); iq_disco_items_request_onconnect(connection_get_domain());
if (prefs_get_boolean(PREF_CARBONS)){ if (prefs_get_boolean(PREF_CARBONS)){
@ -392,18 +357,6 @@ session_lost_connection(void)
_session_free_session_data(); _session_free_session_data();
} }
static void
_session_info_destroy(DiscoInfo *info)
{
if (info) {
free(info->item);
if (info->features) {
g_hash_table_destroy(info->features);
}
free(info);
}
}
static void static void
_session_reconnect(void) _session_reconnect(void)
{ {
@ -441,8 +394,6 @@ _session_free_saved_details(void)
static void static void
_session_free_session_data(void) _session_free_session_data(void)
{ {
g_slist_free_full(disco_items, (GDestroyNotify)_session_info_destroy);
disco_items = NULL;
connection_remove_all_available_resources(); connection_remove_all_available_resources();
chat_sessions_clear(); chat_sessions_clear();
presence_clear_sub_requests(); presence_clear_sub_requests();

View File

@ -49,8 +49,6 @@
void session_login_success(gboolean secured); void session_login_success(gboolean secured);
void session_login_failed(void); void session_login_failed(void);
void session_lost_connection(void); void session_lost_connection(void);
GSList* session_get_disco_items(void);
void session_set_disco_items(GSList *_disco_items);
void session_autoping_fail(void); void session_autoping_fail(void);
#endif #endif

View File

@ -119,7 +119,6 @@ void session_shutdown(void);
void session_process_events(int millis); void session_process_events(int millis);
char* session_get_account_name(void); char* session_get_account_name(void);
gboolean session_service_supports(const char *const feature);
jabber_conn_status_t connection_get_status(void); jabber_conn_status_t connection_get_status(void);
char *connection_get_presence_msg(void); char *connection_get_presence_msg(void);
@ -132,6 +131,7 @@ TLSCertificate* connection_get_tls_peer_cert(void);
gboolean connection_is_secured(void); gboolean connection_is_secured(void);
gboolean connection_send_stanza(const char *const stanza); gboolean connection_send_stanza(const char *const stanza);
GList* connection_get_available_resources(void); GList* connection_get_available_resources(void);
gboolean connection_supports(const char *const feature);
char* message_send_chat(const char *const barejid, const char *const msg, const char *const oob_url); char* message_send_chat(const char *const barejid, const char *const msg, const char *const oob_url);
char* message_send_chat_otr(const char *const barejid, const char *const msg); char* message_send_chat_otr(const char *const barejid, const char *const msg);

View File

@ -83,7 +83,7 @@ connection_send_stanza(const char *const stanza)
} }
gboolean gboolean
session_service_supports(const char *const feature) connection_supports(const char *const feature)
{ {
return FALSE; return FALSE;
} }