about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/xmpp/capabilities.c152
-rw-r--r--src/xmpp/capabilities.h4
-rw-r--r--src/xmpp/stanza.c37
3 files changed, 93 insertions, 100 deletions
diff --git a/src/xmpp/capabilities.c b/src/xmpp/capabilities.c
index 6cdf0852..6310352e 100644
--- a/src/xmpp/capabilities.c
+++ b/src/xmpp/capabilities.c
@@ -73,7 +73,7 @@ static char *my_sha1;
 static void _save_cache(void);
 static EntityCapabilities* _caps_by_ver(const char *const ver);
 static EntityCapabilities* _caps_by_jid(const char *const jid);
-EntityCapabilities* _caps_copy(EntityCapabilities *caps);
+static EntityCapabilities* _caps_copy(EntityCapabilities *caps);
 
 void
 caps_init(void)
@@ -127,6 +127,45 @@ caps_get_features(void)
     return result;
 }
 
+EntityCapabilities*
+caps_create(const char *const category, const char *const type, const char *const name,
+    const char *const software, const char *const software_version,
+    const char *const os, const char *const os_version,
+    GSList *features)
+{
+    EntityCapabilities *result = (EntityCapabilities *)malloc(sizeof(EntityCapabilities));
+
+    if (category || type || name) {
+        DiscoIdentity *identity = (DiscoIdentity*)malloc(sizeof(DiscoIdentity));
+        identity->category = category ? strdup(category) : NULL;
+        identity->type = type ? strdup(type) : NULL;
+        identity->name = name ? strdup(name) : NULL;
+        result->identity = identity;
+    } else {
+        result->identity = NULL;
+    }
+
+    if (software || software_version || os || os_version) {
+        SoftwareVersion *software_versionp = (SoftwareVersion*)malloc(sizeof(SoftwareVersion));
+        software_versionp->software = software ? strdup(software) : NULL;
+        software_versionp->software_version = software_version ? strdup(software_version) : NULL;
+        software_versionp->os = os ? strdup(os) : NULL;
+        software_versionp->os_version = os_version ? strdup(os_version) : NULL;
+        result->software_version = software_versionp;
+    } else {
+        result->software_version = NULL;
+    }
+
+    result->features = NULL;
+    GSList *curr = features;
+    while (curr) {
+        result->features = g_slist_append(result->features, strdup(curr->data));
+        curr = g_slist_next(curr);
+    }
+
+    return result;
+}
+
 void
 caps_add_by_ver(const char *const ver, EntityCapabilities *caps)
 {
@@ -223,45 +262,6 @@ caps_lookup(const char *const jid)
     return NULL;
 }
 
-EntityCapabilities*
-_caps_copy(EntityCapabilities *caps)
-{
-    if (!caps) {
-        return NULL;
-    }
-
-    EntityCapabilities *result = (EntityCapabilities *)malloc(sizeof(EntityCapabilities));
-
-    if (caps->identity) {
-        DiscoIdentity *identity = (DiscoIdentity*)malloc(sizeof(DiscoIdentity));
-        identity->category = caps->identity->category ? strdup(caps->identity->category) : NULL;
-        identity->type = caps->identity->type ? strdup(caps->identity->type) : NULL;
-        identity->name = caps->identity->name ? strdup(caps->identity->name) : NULL;
-        result->identity = identity;
-    } else {
-        result->identity = NULL;
-    }
-
-    if (caps->software_version) {
-        SoftwareVersion *software_version = (SoftwareVersion*)malloc(sizeof(SoftwareVersion));
-        software_version->software = caps->software_version->software ? strdup(caps->software_version->software) : NULL;
-        software_version->software_version = caps->software_version->software_version ? strdup(caps->software_version->software_version) : NULL;
-        software_version->os = caps->software_version->os ? strdup(caps->software_version->os) : NULL;
-        software_version->os_version = caps->software_version->os_version ? strdup(caps->software_version->os_version) : NULL;
-    } else {
-        result->software_version = NULL;
-    }
-
-    result->features = NULL;
-    GSList *curr = caps->features;
-    while (curr) {
-        result->features = g_slist_append(result->features, strdup(curr->data));
-        curr = g_slist_next(curr);
-    }
-
-    return result;
-}
-
 char*
 caps_get_my_sha1(xmpp_ctx_t *const ctx)
 {
@@ -303,50 +303,43 @@ _caps_by_ver(const char *const ver)
         return NULL;
     }
 
-    EntityCapabilities *new_caps = malloc(sizeof(struct entity_capabilities_t));
-
     char *category = g_key_file_get_string(cache, ver, "category", NULL);
     char *type = g_key_file_get_string(cache, ver, "type", NULL);
     char *name = g_key_file_get_string(cache, ver, "name", NULL);
-    if (category || type || name) {
-        DiscoIdentity *identity = malloc(sizeof(struct disco_identity_t));
-        identity->category = category;
-        identity->type = type;
-        identity->name = name;
-        new_caps->identity = identity;
-    } else {
-        new_caps->identity = NULL;
-    }
 
     char *software = g_key_file_get_string(cache, ver, "software", NULL);
     char *software_version = g_key_file_get_string(cache, ver, "software_version", NULL);
     char *os = g_key_file_get_string(cache, ver, "os", NULL);
     char *os_version = g_key_file_get_string(cache, ver, "os_version", NULL);
-    if (software || software_version || os || os_version) {
-        SoftwareVersion *software_versionp = malloc(sizeof(struct software_version_t));
-        software_versionp->software = software;
-        software_versionp->software_version = software_version;
-        software_versionp->os = os;
-        software_versionp->os_version = os_version;
-        new_caps->software_version = software_versionp;
-    } else {
-        new_caps->software_version = NULL;
-    }
 
     gsize features_len = 0;
-    gchar **features = g_key_file_get_string_list(cache, ver, "features", &features_len, NULL);
-    if (features && features_len > 0) {
-        GSList *features_list = NULL;
+    gchar **features_list = g_key_file_get_string_list(cache, ver, "features", &features_len, NULL);
+    GSList *features = NULL;
+    if (features_list && features_len > 0) {
         int i;
         for (i = 0; i < features_len; i++) {
-            features_list = g_slist_append(features_list, strdup(features[i]));
+            features = g_slist_append(features, features_list[i]);
         }
-        new_caps->features = features_list;
-        g_strfreev(features);
-    } else {
-        new_caps->features = NULL;
     }
-    return new_caps;
+
+    EntityCapabilities *result = caps_create(
+        category, type, name,
+        software, software_version, os, os_version,
+        features);
+
+    g_free(category);
+    g_free(type);
+    g_free(name);
+    g_free(software);
+    g_free(software_version);
+    g_free(os);
+    g_free(os_version);
+    if (features_list) {
+        g_strfreev(features_list);
+    }
+    g_slist_free(features);
+
+    return result;
 }
 
 static EntityCapabilities*
@@ -355,6 +348,25 @@ _caps_by_jid(const char *const jid)
     return g_hash_table_lookup(jid_to_caps, jid);
 }
 
+static EntityCapabilities*
+_caps_copy(EntityCapabilities *caps)
+{
+    if (!caps) {
+        return NULL;
+    }
+
+    const char *const categoty = caps->identity ? caps->identity->category : NULL;
+    const char *const type = caps->identity ? caps->identity->type : NULL;
+    const char *const name = caps->identity ? caps->identity->name : NULL;
+
+    const char *const software = caps->software_version ? caps->software_version->software : NULL;
+    const char *const software_version = caps->software_version ? caps->software_version->software_version : NULL;
+    const char *const os = caps->software_version ? caps->software_version->os : NULL;
+    const char *const os_version = caps->software_version ? caps->software_version->os_version : NULL;
+
+    return caps_create(categoty, type, name, software, software_version, os, os_version, caps->features);
+}
+
 static void
 _disco_identity_destroy(DiscoIdentity *disco_identity)
 {
diff --git a/src/xmpp/capabilities.h b/src/xmpp/capabilities.h
index b4065825..9b77734e 100644
--- a/src/xmpp/capabilities.h
+++ b/src/xmpp/capabilities.h
@@ -49,6 +49,10 @@
 
 void caps_init(void);
 
+EntityCapabilities* caps_create(const char *const category, const char *const type, const char *const name,
+    const char *const software, const char *const software_version,
+    const char *const os, const char *const os_version,
+    GSList *features);
 void caps_add_by_ver(const char *const ver, EntityCapabilities *caps);
 void caps_add_by_jid(const char *const jid, EntityCapabilities *caps);
 void caps_map_jid_to_ver(const char *const jid, const char *const ver);
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index f883d8ed..0853a345 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -1743,13 +1743,13 @@ stanza_create_caps_from_query_element(xmpp_stanza_t *query)
                 formField = field->data;
                 if (formField->values) {
                     if (strcmp(formField->var, "software") == 0) {
-                        software = strdup(formField->values->data);
+                        software = formField->values->data;
                     } else if (strcmp(formField->var, "software_version") == 0) {
-                        software_version = strdup(formField->values->data);
+                        software_version = formField->values->data;
                     } else if (strcmp(formField->var, "os") == 0) {
-                        os = strdup(formField->values->data);
+                        os = formField->values->data;
                     } else if (strcmp(formField->var, "os_version") == 0) {
-                        os_version = strdup(formField->values->data);
+                        os_version = formField->values->data;
                     }
                 }
                 field = g_slist_next(field);
@@ -1829,33 +1829,10 @@ stanza_create_caps_from_query_element(xmpp_stanza_t *query)
         name = xmpp_stanza_get_attribute(found, "name");
     }
 
-    EntityCapabilities *new_caps = malloc(sizeof(struct entity_capabilities_t));
+    EntityCapabilities *result = caps_create(category, type, name, software, software_version, os, os_version, features);
+    g_slist_free_full(features, free);
 
-    if (category || type || name) {
-        DiscoIdentity *identity = malloc(sizeof(struct disco_identity_t));
-        identity->category = category ? strdup(category) : NULL;
-        identity->type = type ? strdup(type) : NULL;
-        identity->name = name ? strdup(name) : NULL;
-        new_caps->identity = identity;
-    } else {
-        new_caps->identity = NULL;
-    }
-
-    if (software || software_version || os || os_version) {
-        SoftwareVersion *software_versionp = malloc(sizeof(struct software_version_t));
-        software_versionp->software = software;
-        software_versionp->software_version = software_version;
-        software_versionp->os = os;
-        software_versionp->os_version = os_version;
-    }
-
-    if (features) {
-        new_caps->features = features;
-    } else {
-        new_caps->features = NULL;
-    }
-
-    return new_caps;
+    return result;
 }
 
 char*