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,
IDENTITY_INFO_PROP_REF_COUNT = 0x0800,
IDENTITY_INFO_PROP_VALIDATED = 0x1000,
+ IDENTITY_INFO_PROP_MAX = 0x2000,
IDENTITY_INFO_PROP_ALL = 0x1ffff
} GSignondIdentityInfoPropFlags;
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
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:
*
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 ???