- setup the internal types (APPLICATION, DIRECTORY and LINK) to use the type
authorDan Sinclair <dj2>
Mon, 5 Feb 2007 21:16:55 +0000 (21:16 +0000)
committerDan Sinclair <dj2@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 5 Feb 2007 21:16:55 +0000 (21:16 +0000)
  registration system

SVN revision: 28257

legacy/efreet/src/bin/ef_desktop.c
legacy/efreet/src/lib/efreet_desktop.c
legacy/efreet/src/lib/efreet_desktop.h

index c731bb1..6127dd3 100644 (file)
@@ -125,6 +125,12 @@ ef_cb_desktop_save(void)
 
     printf("\n");
     desktop = efreet_desktop_get(PACKAGE_DATA_DIR"/efreet/test/test.desktop");
+    if (!desktop)
+    {
+        printf("Failed to get Desktop file\n");
+        return 0;
+    }
+
     printf("save data: %d\n", efreet_desktop_save(desktop));
 
     desktop = efreet_desktop_empty_new("/tmp/test.desktop");
@@ -361,12 +367,8 @@ ef_cb_desktop_type_parse(void)
     char *val;
 
     /* add my custom desktop type to efreet */
-    my_type = efreet_desktop_type_add("My_Type", cb_type_parse, (Efreet_Desktop_Type_Free_Cb)free); 
-    if (my_type <= EFREET_DESKTOP_TYPE_MAX)
-    {
-        printf("Error adding desktop type.");
-        return 0;
-    }
+    my_type = efreet_desktop_type_add("My_Type", cb_type_parse, NULL,
+                                        (Efreet_Desktop_Type_Free_Cb)free); 
 
     desktop = efreet_desktop_get(PACKAGE_DATA_DIR"/efreet/test/test_type.desktop");
     if (!desktop) 
index 30b0c68..0382c9e 100644 (file)
@@ -30,6 +30,10 @@ static int efreet_desktop_command_file_id = 0;
 
 static int init = 0;
 
+int EFREET_DESKTOP_TYPE_APPLICATION = 0;
+int EFREET_DESKTOP_TYPE_LINK = 0;
+int EFREET_DESKTOP_TYPE_DIRECTORY = 0;
+
 /**
  * @internal
  * Information about custom types
@@ -37,20 +41,22 @@ static int init = 0;
 typedef struct Efreet_Desktop_Type_Info Efreet_Desktop_Type_Info;
 struct Efreet_Desktop_Type_Info
 {
+    int id;
     char *type;
     Efreet_Desktop_Type_Parse_Cb parse_func;
+    Efreet_Desktop_Type_Save_Cb save_func;
     Efreet_Desktop_Type_Free_Cb free_func;
 };
 
 static Efreet_Desktop *efreet_desktop_new(const char *file);
-static Efreet_Desktop_Type efreet_desktop_type_parse(const char *type_str);
+static Efreet_Desktop_Type_Info *efreet_desktop_type_parse(const char *type_str);
 static Ecore_List *efreet_desktop_string_list_parse(const char *string);
 static char *efreet_desktop_string_list_join(Ecore_List *list);
-static int efreet_desktop_application_fields_parse(Efreet_Desktop *desktop, 
+static void *efreet_desktop_application_fields_parse(Efreet_Desktop *desktop, 
                                                     Efreet_Ini *ini);
 static void efreet_desktop_application_fields_save(Efreet_Desktop *desktop, 
                                                     Efreet_Ini *ini);
-static int efreet_desktop_link_fields_parse(Efreet_Desktop *desktop,
+static void *efreet_desktop_link_fields_parse(Efreet_Desktop *desktop,
                                                 Efreet_Ini *ini);
 static void efreet_desktop_link_fields_save(Efreet_Desktop *desktop, 
                                                 Efreet_Ini *ini);
@@ -115,7 +121,18 @@ efreet_desktop_init(void)
                                 ECORE_FREE_CB(efreet_desktop_free));
 
     efreet_desktop_types = ecore_list_new();
-    ecore_list_set_free_cb(efreet_desktop_types, ECORE_FREE_CB(efreet_desktop_type_info_free));
+    ecore_list_set_free_cb(efreet_desktop_types, 
+                            ECORE_FREE_CB(efreet_desktop_type_info_free));
+
+    EFREET_DESKTOP_TYPE_APPLICATION = efreet_desktop_type_add("Application", 
+                                        efreet_desktop_application_fields_parse, 
+                                        efreet_desktop_application_fields_save, 
+                                        NULL);
+    EFREET_DESKTOP_TYPE_LINK = efreet_desktop_type_add("Link", 
+                                    efreet_desktop_link_fields_parse, 
+                                    efreet_desktop_link_fields_save, NULL);
+    EFREET_DESKTOP_TYPE_DIRECTORY = efreet_desktop_type_add("Directory", NULL, 
+                                                                NULL, NULL);
 
     return init;
 }
@@ -186,11 +203,6 @@ efreet_desktop_get(const char *file)
 
     desktop = efreet_desktop_new(file);
     if (!desktop) return NULL;
-    if (!desktop->type)
-    {
-        efreet_desktop_free(desktop);
-        return NULL;
-    }
 
     ecore_hash_set(efreet_desktop_cache, strdup(file), desktop);
     return desktop;
@@ -253,29 +265,14 @@ efreet_desktop_new(const char *file)
 
     if (!error)
     {
-        desktop->type = efreet_desktop_type_parse(
-                                efreet_ini_string_get(ini, "Type"));
-        desktop->version = efreet_ini_double_get(ini, "Version");
+        Efreet_Desktop_Type_Info *info;
 
-        if (desktop->type == EFREET_DESKTOP_TYPE_APPLICATION)
-        {
-            if (!efreet_desktop_application_fields_parse(desktop, ini)) 
-                error = 1;
-        }
-        else if (desktop->type == EFREET_DESKTOP_TYPE_LINK)
-        {
-            if (!efreet_desktop_link_fields_parse(desktop, ini)) 
-                error = 1;
-        }
-        else if (desktop->type == EFREET_DESKTOP_TYPE_DIRECTORY)
+        info = efreet_desktop_type_parse(efreet_ini_string_get(ini, "Type"));
+        if (info)
         {
-            /* there are no directory specific fields */
-        }
-        else if (desktop->type >= (EFREET_DESKTOP_TYPE_MAX + 1))
-        {
-            Efreet_Desktop_Type_Info *info;
-            info = ecore_list_goto_index(efreet_desktop_types, 
-                            (desktop->type - (EFREET_DESKTOP_TYPE_MAX + 1)));
+            desktop->type = info->id;
+            desktop->version = efreet_ini_double_get(ini, "Version");
+
             if (info->parse_func)
                 desktop->type_data = info->parse_func(desktop, ini); 
         }
@@ -307,6 +304,7 @@ efreet_desktop_new(const char *file)
 int
 efreet_desktop_save(Efreet_Desktop *desktop)
 {
+    Efreet_Desktop_Type_Info *info;
     Efreet_Ini *ini;
     int ok = 1;
 
@@ -314,27 +312,11 @@ efreet_desktop_save(Efreet_Desktop *desktop)
     efreet_ini_section_add(ini, "Desktop Entry");
     efreet_ini_section_set(ini, "Desktop Entry");
 
-    if (desktop->type == EFREET_DESKTOP_TYPE_APPLICATION)
+    info = ecore_list_goto_index(efreet_desktop_types, desktop->type);
+    if (info) 
     {
-        efreet_ini_string_set(ini, "Type", "Application");
-        efreet_desktop_application_fields_save(desktop, ini);
-    }
-    else if (desktop->type == EFREET_DESKTOP_TYPE_LINK)
-    {
-        efreet_ini_string_set(ini, "Type", "Link");
-        efreet_desktop_link_fields_save(desktop, ini);
-    }
-    else if (desktop->type == EFREET_DESKTOP_TYPE_DIRECTORY)
-    {
-        efreet_ini_string_set(ini, "Type", "Directory");
-    }
-    else if (desktop->type > EFREET_DESKTOP_TYPE_MAX + 1)
-    {
-        Efreet_Desktop_Type_Info *info;
-        info = ecore_list_goto_index(efreet_desktop_types, 
-                            (desktop->type - (EFREET_DESKTOP_TYPE_MAX + 1)));
-        if (info) 
-            efreet_ini_string_set(ini, "Type", info->type);
+        efreet_ini_string_set(ini, "Type", info->type);
+        if (info->save_func) info->save_func(desktop, ini);
     }
     else
         ok = 0;
@@ -419,11 +401,10 @@ efreet_desktop_free(Efreet_Desktop *desktop)
 
     IF_FREE_HASH(desktop->x);
 
-    if (desktop->type >= EFREET_DESKTOP_TYPE_MAX + 1 && desktop->type_data)
+    if (desktop->type_data)
     {
         Efreet_Desktop_Type_Info *info;
-        info = ecore_list_goto_index(efreet_desktop_types, 
-            (desktop->type - (EFREET_DESKTOP_TYPE_MAX + 1)));
+        info = ecore_list_goto_index(efreet_desktop_types, desktop->type);
         if (info->free_func)
             info->free_func(desktop->type_data); 
     }
@@ -527,12 +508,14 @@ efreet_desktop_category_del(Efreet_Desktop *desktop, const char *category)
 /**
  * @param type: The type to add to the list of matching types
  * @param parse_func: a function to parse out custom fields
+ * @param save_func: a function to save data returned from @a parse_func
  * @param free_func: a function to free data returned from @a parse_func
  * @return Returns the id of the new type 
  * @brief Adds the given type to the list of types in the system
  */
 int
 efreet_desktop_type_add(const char *type, Efreet_Desktop_Type_Parse_Cb parse_func,
+                        Efreet_Desktop_Type_Save_Cb save_func,
                         Efreet_Desktop_Type_Free_Cb free_func)
 {
     int id;
@@ -541,14 +524,17 @@ efreet_desktop_type_add(const char *type, Efreet_Desktop_Type_Parse_Cb parse_fun
     info = NEW(Efreet_Desktop_Type_Info, 1);
     if (!info) return 0;
 
+    id = ecore_list_nodes(efreet_desktop_types);
+
+    info->id = id;
     info->type = strdup(type);
     info->parse_func = parse_func;
+    info->save_func = save_func;
     info->free_func = free_func;
 
-    id = ecore_list_nodes(efreet_desktop_types);
     ecore_list_append(efreet_desktop_types, info);
 
-    return (id + EFREET_DESKTOP_TYPE_MAX + 1);
+    return id;
 }
 
 /**
@@ -580,31 +566,21 @@ efreet_desktop_type_data_get(Efreet_Desktop *desktop)
  * @return the parsed type
  * @brief parse the type string into an Efreet_Desktop_Type
  */
-static Efreet_Desktop_Type
+static Efreet_Desktop_Type_Info *
 efreet_desktop_type_parse(const char *type_str)
 {
     Efreet_Desktop_Type_Info *info;
-    int count = 0;
-
-    if (!type_str) return EFREET_DESKTOP_TYPE_UNKNOWN;
-
-    if (!strcmp("Application", type_str)) 
-        return EFREET_DESKTOP_TYPE_APPLICATION;
-    if (!strcmp("Link", type_str)) 
-        return EFREET_DESKTOP_TYPE_LINK;
-    if (!strcmp("Directory", type_str)) 
-        return EFREET_DESKTOP_TYPE_DIRECTORY;
-   
-    /* check the user added types */
+
+    if (!type_str) return NULL;
+
     ecore_list_goto_first(efreet_desktop_types);
     while ((info = ecore_list_next(efreet_desktop_types)))
     {
         if (!strcmp(info->type, type_str))
-            return (count + EFREET_DESKTOP_TYPE_MAX + 1);
-        count ++;
+            return info;
     }
 
-    return EFREET_DESKTOP_TYPE_UNKNOWN;
+    return NULL;
 }
 
 /**
@@ -693,10 +669,10 @@ efreet_desktop_string_list_join(Ecore_List *list)
  * @internal
  * @param desktop: the Efreet_Desktop to store parsed fields in
  * @param ini: the Efreet_Ini to parse fields from
- * @return 1 if parsed succesfully, 0 otherwise
+ * @return No value
  * @brief Parse application specific desktop fields
  */
-static int
+static void *
 efreet_desktop_application_fields_parse(Efreet_Desktop *desktop, Efreet_Ini *ini)
 {
     const char *val;
@@ -721,7 +697,7 @@ efreet_desktop_application_fields_parse(Efreet_Desktop *desktop, Efreet_Ini *ini
     desktop->terminal = efreet_ini_boolean_get(ini, "Terminal");
     desktop->startup_notify = efreet_ini_boolean_get(ini, "StartupNotify");
 
-    return 1;
+    return NULL;
 }
 
 /**
@@ -770,17 +746,17 @@ efreet_desktop_application_fields_save(Efreet_Desktop *desktop, Efreet_Ini *ini)
  * @internal
  * @param desktop: the Efreet_Desktop to store parsed fields in
  * @param ini: the Efreet_Ini to parse fields from
- * @return 1 if parsed succesfully, 0 otherwise
+ * @return Returns no value
  * @brief Parse link specific desktop fields
  */
-static int
+static void *
 efreet_desktop_link_fields_parse(Efreet_Desktop *desktop, Efreet_Ini *ini)
 {
     const char *val;
 
     val = efreet_ini_string_get(ini, "URL");
     if (val) desktop->url = strdup(val);
-    return 1;
+    return NULL;
 }
 
 /**
index 976bb10..bb2fb22 100644 (file)
  * @{
  */
 
-/**
- * Possible types of .desktop files. Unknown files are ignored.
- */
-enum Efreet_Desktop_Type
-{
-    EFREET_DESKTOP_TYPE_UNKNOWN,
-    EFREET_DESKTOP_TYPE_APPLICATION,
-    EFREET_DESKTOP_TYPE_LINK,
-    EFREET_DESKTOP_TYPE_DIRECTORY,
-    EFREET_DESKTOP_TYPE_MAX
-};
+extern int EFREET_DESKTOP_TYPE_APPLICATION;
+extern int EFREET_DESKTOP_TYPE_LINK;
+extern int EFREET_DESKTOP_TYPE_DIRECTORY;
 
 /**
  * Efreet_Desktop_Type
@@ -39,12 +31,14 @@ typedef struct Efreet_Desktop Efreet_Desktop;
 /**
  * A callback used with efreet_desktop_command_get()
  */
-typedef void (*Efreet_Desktop_Command_Cb) (void *data, Efreet_Desktop *desktop, char *command, int remaining);
+typedef void (*Efreet_Desktop_Command_Cb) (void *data, Efreet_Desktop *desktop, 
+                                            char *command, int remaining);
 
 /**
  * A callback used to get download progress of remote uris
  */
-typedef int (*Efreet_Desktop_Progress_Cb) (void *data, Efreet_Desktop *desktop, char *uri, long int total, long int current);
+typedef int (*Efreet_Desktop_Progress_Cb) (void *data, Efreet_Desktop *desktop, 
+                                            char *uri, long int total, long int current);
 
 /**
  * A callback used to parse data for custom types
@@ -52,6 +46,11 @@ typedef int (*Efreet_Desktop_Progress_Cb) (void *data, Efreet_Desktop *desktop,
 typedef void *(*Efreet_Desktop_Type_Parse_Cb) (Efreet_Desktop *desktop, Efreet_Ini *ini);
 
 /**
+ * A callback used to save data for custom types
+ */
+typedef void (*Efreet_Desktop_Type_Save_Cb) (Efreet_Desktop *desktop, Efreet_Ini *ini);
+
+/**
  * A callback used to free data for custom types
  */
 typedef void *(*Efreet_Desktop_Type_Free_Cb) (void *data);
@@ -62,7 +61,7 @@ typedef void *(*Efreet_Desktop_Type_Free_Cb) (void *data);
  */
 struct Efreet_Desktop
 {
-    Efreet_Desktop_Type type; /**< type of desktop file */
+    int type;               /**< type of desktop file */
 
     double version;         /**< version of spec file conforms to */
 
@@ -124,7 +123,10 @@ void              efreet_desktop_category_add(Efreet_Desktop *desktop,
 int               efreet_desktop_category_del(Efreet_Desktop *desktop,
                                               const char *category);
 
-int               efreet_desktop_type_add(const char *type, Efreet_Desktop_Type_Parse_Cb parse_func, Efreet_Desktop_Type_Free_Cb free_func);
+int               efreet_desktop_type_add(const char *type, 
+                                    Efreet_Desktop_Type_Parse_Cb parse_func, 
+                                    Efreet_Desktop_Type_Save_Cb save_func, 
+                                    Efreet_Desktop_Type_Free_Cb free_func);
 
 /** 
  * @}