forked from enlightenment/efl
- setup the internal types (APPLICATION, DIRECTORY and LINK) to use the type
registration system SVN revision: 28257
This commit is contained in:
parent
bbd63d7f6b
commit
1ebb0bad20
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
|
Loading…
Reference in New Issue