From 1ebb0bad206c6c74c85fbca3e4a7f261991517aa Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Mon, 5 Feb 2007 21:16:55 +0000 Subject: [PATCH] - setup the internal types (APPLICATION, DIRECTORY and LINK) to use the type registration system SVN revision: 28257 --- legacy/efreet/src/bin/ef_desktop.c | 14 +-- legacy/efreet/src/lib/efreet_desktop.c | 126 ++++++++++--------------- legacy/efreet/src/lib/efreet_desktop.h | 32 ++++--- 3 files changed, 76 insertions(+), 96 deletions(-) diff --git a/legacy/efreet/src/bin/ef_desktop.c b/legacy/efreet/src/bin/ef_desktop.c index c731bb1eb0..6127dd3282 100644 --- a/legacy/efreet/src/bin/ef_desktop.c +++ b/legacy/efreet/src/bin/ef_desktop.c @@ -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) diff --git a/legacy/efreet/src/lib/efreet_desktop.c b/legacy/efreet/src/lib/efreet_desktop.c index 30b0c68ffb..0382c9e3d4 100644 --- a/legacy/efreet/src/lib/efreet_desktop.c +++ b/legacy/efreet/src/lib/efreet_desktop.c @@ -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) + info = efreet_desktop_type_parse(efreet_ini_string_get(ini, "Type")); + if (info) { - 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) - { - /* 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 (!type_str) return NULL; - 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 */ 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; } /** diff --git a/legacy/efreet/src/lib/efreet_desktop.h b/legacy/efreet/src/lib/efreet_desktop.h index 976bb1052c..bb2fb222d6 100644 --- a/legacy/efreet/src/lib/efreet_desktop.h +++ b/legacy/efreet/src/lib/efreet_desktop.h @@ -14,17 +14,9 @@ * @{ */ -/** - * 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,18 +31,25 @@ 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 */ 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 */ @@ -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); /** * @}