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
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);
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;
}
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;
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);
}
int
efreet_desktop_save(Efreet_Desktop *desktop)
{
+ Efreet_Desktop_Type_Info *info;
Efreet_Ini *ini;
int ok = 1;
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;
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);
}
/**
* @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;
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;
}
/**
* @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;
}
/**
* @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;
desktop->terminal = efreet_ini_boolean_get(ini, "Terminal");
desktop->startup_notify = efreet_ini_boolean_get(ini, "StartupNotify");
- return 1;
+ return NULL;
}
/**
* @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;
}
/**
* @{
*/
-/**
- * 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
/**
* 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
*/
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 */
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);
/**
* @}