about summary refs log tree commit diff stats
path: root/src/contact.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/contact.c')
-rw-r--r--src/contact.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/src/contact.c b/src/contact.c
index dd0205ee..801e4539 100644
--- a/src/contact.c
+++ b/src/contact.c
@@ -64,8 +64,10 @@ p_contact_new(const char * const barejid, const char * const name,
     contact->resources = g_hash_table_new_full(g_str_hash, g_str_equal, free,
         (GDestroyNotify)resource_destroy);
     // TODO, priority, last activity
-    Resource *resource = resource_new("default", presence, status, 0, caps_str);
-    g_hash_table_insert(contact->resources, strdup(resource->name), resource);
+    if (g_strcmp0(presence, "offline") != 0) {
+        Resource *resource = resource_new("default", presence, status, 0, caps_str);
+        g_hash_table_insert(contact->resources, strdup(resource->name), resource);
+    }
 
     return contact;
 }
@@ -127,15 +129,23 @@ p_contact_name(const PContact contact)
 const char *
 p_contact_presence(const PContact contact)
 {
-    Resource *resource = g_hash_table_lookup(contact->resources, "default");
-    return resource->show;
+    if (g_hash_table_size(contact->resources) == 0) {
+        return "offline";
+    } else {
+        Resource *resource = g_hash_table_lookup(contact->resources, "default");
+        return resource->show;
+    }
 }
 
 const char *
 p_contact_status(const PContact contact)
 {
-    Resource *resource = g_hash_table_lookup(contact->resources, "default");
-    return resource->status;
+    if (g_hash_table_size(contact->resources) == 0) {
+        return NULL;
+    } else {
+        Resource *resource = g_hash_table_lookup(contact->resources, "default");
+        return resource->status;
+    }
 }
 
 const char *
@@ -159,17 +169,32 @@ p_contact_last_activity(const PContact contact)
 const char *
 p_contact_caps_str(const PContact contact)
 {
-    Resource *resource = g_hash_table_lookup(contact->resources, "default");
-    return resource->caps_str;
+    if (g_hash_table_size(contact->resources) == 0) {
+        return NULL;
+    } else {
+        Resource *resource = g_hash_table_lookup(contact->resources, "default");
+        return resource->caps_str;
+    }
 }
 
 void
 p_contact_set_presence(const PContact contact, const char * const presence)
 {
-    Resource *resource = g_hash_table_lookup(contact->resources, "default");
-    FREE_SET_NULL(resource->show);
-    if (presence != NULL) {
-        resource->show = strdup(presence);
+    if (g_strcmp0(presence, "offline") == 0) {
+        g_hash_table_remove(contact->resources, "default");
+    } else {
+        if (g_hash_table_size(contact->resources) == 0) {
+            Resource *resource = resource_new("default", presence, NULL, 0, NULL);
+            g_hash_table_insert(contact->resources, strdup(resource->name), resource);
+        } else {
+            Resource *resource = g_hash_table_lookup(contact->resources, "default");
+            if (presence != NULL) {
+                FREE_SET_NULL(resource->show);
+                resource->show = strdup(presence);
+            } else {
+                resource->show = NULL;
+            }
+        }
     }
 }