daemon: IdentityInfo - support for selective copy of fields
authorAmarnath Valluri <amarnath.valluri@linux.intel.com>
Thu, 5 Sep 2013 10:27:08 +0000 (13:27 +0300)
committerAmarnath Valluri <amarnath.valluri@linux.intel.com>
Thu, 5 Sep 2013 13:15:25 +0000 (16:15 +0300)
src/common/gsignond-identity-info-internal.h
src/common/gsignond-identity-info.c
src/daemon/gsignond-identity.c

index 6eb1847..1348a1d 100644 (file)
@@ -55,11 +55,13 @@ G_BEGIN_DECLS
 typedef enum {
     IDENTITY_INFO_PROP_NONE = 0x0000,
     
-    IDENTITY_INFO_PROP_ID = 0x0001,
-    IDENTITY_INFO_PROP_TYPE = 0x0002,
-    IDENTITY_INFO_PROP_CAPTION = 0x0004,
-    IDENTITY_INFO_PROP_USERNAME = 0x0008,
-    IDENTITY_INFO_PROP_SECRET = 0x0010,
+    /* Secret fields */
+    IDENTITY_INFO_PROP_USERNAME = 0x0001,
+    IDENTITY_INFO_PROP_SECRET = 0x0002,
+
+    IDENTITY_INFO_PROP_ID = 0x0004,
+    IDENTITY_INFO_PROP_TYPE = 0x0008,
+    IDENTITY_INFO_PROP_CAPTION = 0x0010,
     IDENTITY_INFO_PROP_STORE_SECRET = 0x0020,
     IDENTITY_INFO_PROP_USERNAME_IS_SECRET = 0x0040,
     IDENTITY_INFO_PROP_OWNER = 0x0080,
@@ -69,6 +71,7 @@ typedef enum {
     IDENTITY_INFO_PROP_REF_COUNT = 0x0800,
     IDENTITY_INFO_PROP_VALIDATED = 0x1000,
 
+    IDENTITY_INFO_PROP_MAX = 0x2000,
     IDENTITY_INFO_PROP_ALL = 0x1ffff
 
 } GSignondIdentityInfoPropFlags;
@@ -88,6 +91,10 @@ gboolean
 gsignond_identity_info_unset_edit_flags (GSignondIdentityInfo *info,
                                          GSignondIdentityInfoPropFlags flags);
 
+GSignondIdentityInfoPropFlags
+gsignond_identity_info_selective_copy (GSignondIdentityInfo *dest,
+                                       const GSignondIdentityInfo *src,
+                                       GSignondIdentityInfoPropFlags flags);
 
 G_END_DECLS
 
index 34f74e5..ff2ce29 100644 (file)
@@ -285,6 +285,60 @@ gsignond_identity_info_unset_edit_flags (
     return TRUE;
 }
 
+GSignondIdentityInfoPropFlags
+gsignond_identity_info_selective_copy (GSignondIdentityInfo *dest,
+                                       const GSignondIdentityInfo *src,
+                                       GSignondIdentityInfoPropFlags flags)
+{
+    GSignondIdentityInfoPropFlags tmp_flag;
+    guint i;
+    g_return_val_if_fail (src, IDENTITY_INFO_PROP_NONE);
+    g_return_val_if_fail (dest, IDENTITY_INFO_PROP_NONE);
+    g_return_val_if_fail (flags != IDENTITY_INFO_PROP_NONE, flags);
+
+    /* This table should match to GSignondIdentityInfoPropFlags order */
+    const gchar *keys[] = {
+        GSIGNOND_IDENTITY_INFO_ID,
+        GSIGNOND_IDENTITY_INFO_TYPE,
+        GSIGNOND_IDENTITY_INFO_CAPTION,
+        GSIGNOND_IDENTITY_INFO_STORESECRET,
+        GSIGNOND_IDENTITY_INFO_USERNAME_IS_SECRET,
+        GSIGNOND_IDENTITY_INFO_OWNER,
+        GSIGNOND_IDENTITY_INFO_ACL,
+        GSIGNOND_IDENTITY_INFO_AUTHMETHODS,
+        GSIGNOND_IDENTITY_INFO_REALMS,
+        GSIGNOND_IDENTITY_INFO_REFCOUNT,
+        GSIGNOND_IDENTITY_INFO_VALIDATED
+    };
+
+    for (i= 0, tmp_flag = IDENTITY_INFO_PROP_ID; 
+         tmp_flag < IDENTITY_INFO_PROP_MAX;
+         tmp_flag <<= 1, i++) {
+        if (flags & tmp_flag && 
+            gsignond_dictionary_contains (src->map, keys[i])) {
+            gsignond_dictionary_set (dest->map, keys[i],
+               g_variant_ref (gsignond_dictionary_get (src->map, keys[i])));
+        }
+        else {
+            flags &= ~tmp_flag;
+        }
+    }
+
+    if (flags & IDENTITY_INFO_PROP_USERNAME) {
+        g_free (dest->username);
+        dest->username = g_strdup (src->username);
+    }
+
+    if (flags & IDENTITY_INFO_PROP_SECRET) {
+        g_free (dest->secret);
+        dest->secret = g_strdup (src->secret);
+    }
+
+    dest->edit_flags |= flags;
+
+    return flags;
+}
+
 /**
  * gsignond_identity_info_new:
  *
index 4507bfb..f8b5bd0 100644 (file)
@@ -866,36 +866,16 @@ gsignond_identity_store (GSignondIdentity *identity,
    
     flags = gsignond_identity_info_get_edit_flags (identity_info);
 
-    if (flags & IDENTITY_INFO_PROP_USERNAME)
-        gsignond_identity_info_set_username (priv->info,
-            gsignond_identity_info_get_username(identity_info));
-    if (flags & IDENTITY_INFO_PROP_USERNAME_IS_SECRET)
-        gsignond_identity_info_set_username_secret (priv->info,
-            gsignond_identity_info_get_is_username_secret (identity_info));
-    if (flags & IDENTITY_INFO_PROP_SECRET)
-        gsignond_identity_info_set_secret (priv->info,
-            gsignond_identity_info_get_secret (identity_info));
-    if (flags & IDENTITY_INFO_PROP_STORE_SECRET)
-        gsignond_identity_info_set_store_secret (priv->info,
-            gsignond_identity_info_get_store_secret (identity_info));
-    if (flags & IDENTITY_INFO_PROP_CAPTION)
-        gsignond_identity_info_set_caption (priv->info,
-            gsignond_identity_info_get_caption (identity_info));
-    if (flags & IDENTITY_INFO_PROP_TYPE)
-        gsignond_identity_info_set_identity_type (priv->info,
-            gsignond_identity_info_get_identity_type (identity_info));
-    if (flags & IDENTITY_INFO_PROP_METHODS) {
-        GHashTable *methods = 
-            gsignond_identity_info_get_methods (identity_info);
-        gsignond_identity_info_set_methods (priv->info, methods);
-        g_hash_table_unref (methods);
-    }
-    if (flags & IDENTITY_INFO_PROP_REALMS) {
-        GSequence *realms = 
-            gsignond_identity_info_get_realms (identity_info);
-        gsignond_identity_info_set_realms (priv->info, realms);
-        g_sequence_free (realms);
-    }
+    /* select only interested field */
+    flags &= (IDENTITY_INFO_PROP_USERNAME |
+              IDENTITY_INFO_PROP_USERNAME_IS_SECRET |
+              IDENTITY_INFO_PROP_SECRET |
+              IDENTITY_INFO_PROP_STORE_SECRET |
+              IDENTITY_INFO_PROP_CAPTION |
+              IDENTITY_INFO_PROP_TYPE |
+              IDENTITY_INFO_PROP_METHODS |
+              IDENTITY_INFO_PROP_REALMS);
+    gsignond_identity_info_selective_copy (priv->info, identity_info, flags);
 
     /* FIXME : either username/secret changed reset the identity
      * valdated state to FALSE ???