GHashTable* gkm_secret_item_get_fields (GkmSecretItem *self) { g_return_val_if_fail (GKM_IS_SECRET_ITEM (self), NULL); if (self->fields == NULL) self->fields = gkm_secret_fields_new (); return self->fields; }
static gboolean buffer_get_attributes (EggBuffer *buffer, gsize offset, gsize *next_offset, GHashTable **attributes_out, gboolean hashed) { guint32 list_size; GHashTable *attributes; char *name; guint32 type; char *str; guint32 val; int i; attributes = NULL; if (!egg_buffer_get_uint32 (buffer, offset, &offset, &list_size)) goto bail; attributes = gkm_secret_fields_new (); for (i = 0; i < list_size; i++) { if (!buffer_get_utf8_string (buffer, offset, &offset, &name)) goto bail; if (!egg_buffer_get_uint32 (buffer, offset, &offset, &type)) { g_free (name); goto bail; } switch (type) { case 0: /* A string */ if (!buffer_get_utf8_string (buffer, offset, &offset, &str)) { g_free (name); goto bail; } if (hashed) { gkm_secret_fields_add_compat_hashed_string (attributes, name, str); g_free (name); g_free (str); } else { gkm_secret_fields_take (attributes, name, str); } break; case 1: /* A uint32 */ if (!egg_buffer_get_uint32 (buffer, offset, &offset, &val)) { g_free (name); goto bail; } if (hashed) gkm_secret_fields_add_compat_hashed_uint32 (attributes, name, val); else gkm_secret_fields_add_compat_uint32 (attributes, name, val); g_free (name); break; default: g_free (name); goto bail; } } *attributes_out = attributes; *next_offset = offset; return TRUE; bail: g_hash_table_unref (attributes); return FALSE; }