+ if (!(type = g_hash_table_lookup(keys, "Type")))
+ { g_hash_table_destroy(groups); return NULL; }
+ if (!(name = g_hash_table_lookup(keys, "Name")))
+ { g_hash_table_destroy(groups); return NULL; }
+
+ if (type->value.enumerable == OBT_LINK_TYPE_APPLICATION) {
+ if (!(target = g_hash_table_lookup(keys, "Exec")))
+ { g_hash_table_destroy(groups); return NULL; }
+ }
+ else if (type->value.enumerable == OBT_LINK_TYPE_URL) {
+ if (!(target = g_hash_table_lookup(keys, "URL")))
+ { g_hash_table_destroy(groups); return NULL; }
+ }
+ else
+ target = NULL;
+
+ /* parse all the optional keys and build ObtLink (steal the strings) */
+ link = g_slice_new0(ObtLink);
+ link->ref = 1;
+ link->type = type->value.enumerable;
+ if (link->type == OBT_LINK_TYPE_APPLICATION)
+ link->d.app.exec = target->value.string, target->value.string = NULL;
+ else if (link->type == OBT_LINK_TYPE_URL)
+ link->d.url.addr = target->value.string, target->value.string = NULL;
+ link->display = TRUE;
+
+ if ((v = g_hash_table_lookup(keys, "Hidden")))
+ link->deleted = v->value.boolean;
+
+ if ((v = g_hash_table_lookup(keys, "NoDisplay")))
+ link->display = !v->value.boolean;
+
+ if ((v = g_hash_table_lookup(keys, "GenericName")))
+ link->generic = v->value.string, v->value.string = NULL;
+
+ if ((v = g_hash_table_lookup(keys, "Comment")))
+ link->comment = v->value.string, v->value.string = NULL;
+
+ if ((v = g_hash_table_lookup(keys, "Icon")))
+ link->icon = v->value.string, v->value.string = NULL;
+
+ /* XXX handle Only/NotShowIn, better know the current environment */
+
+ if (link->type == OBT_LINK_TYPE_APPLICATION) {
+ if ((v = g_hash_table_lookup(keys, "TryExec"))) {
+ /* XXX spawn a thread to check TryExec? */
+ link->display = link->display &&
+ obt_paths_try_exec(p, v->value.string);
+ }
+
+ /* XXX there's more app specific stuff */
+ }
+
+ else if (link->type == OBT_LINK_TYPE_URL) {
+ /* XXX there's URL specific stuff */
+ }
+
+ return link;