From: <enl...@li...> - 2006-03-16 12:22:40
|
Enlightenment CVS committal Author : lordchaos Project : e17 Module : proto Dir : e17/proto/entropy/src Modified Files: entropy_config.c Log Message: * Begin the slow, yet necessary migration from ecore_config -> eet * Support multiple application binding per mimetype =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/entropy/src/entropy_config.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- entropy_config.c 26 Feb 2006 04:49:43 -0000 1.8 +++ entropy_config.c 16 Mar 2006 12:22:01 -0000 1.9 @@ -4,39 +4,303 @@ #include <sys/stat.h> #include <unistd.h> #include "entropy_gui.h" +#include <Eet.h> +#include <stdarg.h> + +static Entropy_Config* _Entropy_Config = NULL; #define HEADER_CONFIG_MAX 2048 +static Eet_Data_Descriptor *_entropy_config_mimes_edd; +static Eet_Data_Descriptor *_entropy_config_mime_binding_edd; +static Eet_Data_Descriptor *_entropy_config_mime_binding_action_edd; + + +Entropy_Config_Mime_Binding* +entropy_config_mime_binding_for_type_get(char* type) +{ + Entropy_Config_Mime_Binding* rbinding = NULL; + Entropy_Config_Mime_Binding* binding = NULL; + + Evas_List* l; + + /*Do a scan for now, we should dynamically load this into a hash*/ + for (l = _Entropy_Config->Config_Mimes->mime_bindings; l; ) { + binding = l->data; + + if (!strcmp(binding->mime_type, type)) { + rbinding = binding; + } + + l = l->next; + + } + + + return rbinding; +} -entropy_config* entropy_config_init(entropy_core* core) { - entropy_config* config = entropy_malloc(sizeof(entropy_config)); +void +entropy_config_mimes_print(Entropy_Config_Mime* mimes) +{ + Entropy_Config_Mime_Binding* binding; + Entropy_Config_Mime_Binding_Action* action; + Evas_List* l, *l2; + + for (l = mimes->mime_bindings; l; ) { + binding = l->data; + + printf("MIME Type: '%s' ->\n", binding->mime_type); + for (l2 = binding->actions; l2; ) { + action = l2->data; + + printf(" %s, %s, %s\n", action->app_description, action->executable, action->args); + + l2 = l2->next; + } + + l = l->next; + } +} + +Entropy_Config_Mime_Binding* +entropy_config_binding_new(char* mime_type, Entropy_Config_Mime_Binding_Action* action1, ...) +{ + va_list args; + Entropy_Config_Mime_Binding_Action* action; + Entropy_Config_Mime_Binding* binding = calloc(1,sizeof(Entropy_Config_Mime_Binding)); + + va_start(args, action1); + for (action = action1; action; action = va_arg(args, Entropy_Config_Mime_Binding_Action*)) { + binding->actions = evas_list_append(binding->actions, action); + } + + va_end(args); + + binding->mime_type = strdup(mime_type); + + return binding; +} + + +Entropy_Config_Mime_Binding_Action* +entropy_config_binding_action_new(char* description, char* executable, char* args) +{ + Entropy_Config_Mime_Binding_Action* action = calloc(1,sizeof(Entropy_Config_Mime_Binding_Action)); + + action->app_description = strdup(description); + action->executable = strdup(executable); + action->args = strdup(args); + + return action; +} + +Entropy_Config* entropy_config_init(entropy_core* core) { struct stat config_dir_stat; int i; + Eet_File* conf_file; + Entropy_Config_Mime* mimes = calloc(1,sizeof(Entropy_Config_Mime)); + + + if (_Entropy_Config) return _Entropy_Config; + + _Entropy_Config = entropy_malloc(sizeof(Entropy_Config)); + i = strlen(entropy_core_home_dir_get()) + strlen("/.e/apps/entropy") + 2; - config->config_dir = entropy_malloc(i * sizeof(char)); - snprintf(config->config_dir, i, "%s/%s", entropy_core_home_dir_get(), "/.e/apps/entropy"); + _Entropy_Config->config_dir = entropy_malloc(i * sizeof(char)); + snprintf(_Entropy_Config->config_dir, i, "%s/%s", entropy_core_home_dir_get(), "/.e/apps/entropy"); + + printf("Config dir is: '%s'\n", _Entropy_Config->config_dir); + + _Entropy_Config->config_dir_and_file = entropy_malloc((strlen(_Entropy_Config->config_dir) * sizeof(char)) + (13 * sizeof(char))); + snprintf(_Entropy_Config->config_dir_and_file, strlen(_Entropy_Config->config_dir) + 13, "%s/%s", + _Entropy_Config->config_dir, "entropy.cfg"); + + _Entropy_Config->config_dir_and_file_eet = entropy_malloc((strlen(_Entropy_Config->config_dir) * sizeof(char)) + (16 * sizeof(char))); + snprintf(_Entropy_Config->config_dir_and_file_eet, strlen(_Entropy_Config->config_dir) + 16, "%s/%s", + _Entropy_Config->config_dir, "eetentropy.cfg"); + + /*Build the EDDs*/ + _entropy_config_mime_binding_action_edd = + eet_data_descriptor_new("entropy_config_mime_binding_action", sizeof(Entropy_Config_Mime_Binding_Action), + (void *(*)(void *))evas_list_next, + (void *(*)(void *, void *))evas_list_append, + (void *(*)(void *))evas_list_data, + (void *(*)(void *))evas_list_free, + (void (*) + (void *, + int (*)(void *, const char *, void *, void *), + void *))evas_hash_foreach, (void *(*)(void *, + const char + *, + void *)) + evas_hash_add, (void (*)(void *))evas_hash_free); + + EET_DATA_DESCRIPTOR_ADD_BASIC(_entropy_config_mime_binding_action_edd, Entropy_Config_Mime_Binding_Action, + "app_description", app_description, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(_entropy_config_mime_binding_action_edd, Entropy_Config_Mime_Binding_Action, + "executable", executable, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(_entropy_config_mime_binding_action_edd, Entropy_Config_Mime_Binding_Action, + "args", args, EET_T_STRING); + + + _entropy_config_mime_binding_edd = + eet_data_descriptor_new("entropy_config_mime_binding", sizeof(Entropy_Config_Mime_Binding), + (void *(*)(void *))evas_list_next, + (void *(*)(void *, void *))evas_list_append, + (void *(*)(void *))evas_list_data, + (void *(*)(void *))evas_list_free, + (void (*) + (void *, + int (*)(void *, const char *, void *, void *), + void *))evas_hash_foreach, (void *(*)(void *, + const char + *, + void *)) + evas_hash_add, (void (*)(void *))evas_hash_free); + + EET_DATA_DESCRIPTOR_ADD_BASIC(_entropy_config_mime_binding_edd, Entropy_Config_Mime_Binding, + "mime_type", mime_type, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_LIST(_entropy_config_mime_binding_edd, Entropy_Config_Mime_Binding, "actions", actions, + _entropy_config_mime_binding_action_edd); + + + _entropy_config_mimes_edd = + eet_data_descriptor_new("entropy_config_mime", sizeof(Entropy_Config_Mime), + (void *(*)(void *))evas_list_next, + (void *(*)(void *, void *))evas_list_append, + (void *(*)(void *))evas_list_data, + (void *(*)(void *))evas_list_free, + (void (*) + (void *, + int (*)(void *, const char *, void *, void *), + void *))evas_hash_foreach, (void *(*)(void *, + const char + *, + void *)) + evas_hash_add, (void (*)(void *))evas_hash_free); + EET_DATA_DESCRIPTOR_ADD_LIST(_entropy_config_mimes_edd, Entropy_Config_Mime, "mime_bindings", mime_bindings, + _entropy_config_mime_binding_edd); + + + - printf("Config dir is: '%s'\n", config->config_dir); - config->config_dir_and_file = entropy_malloc((strlen(config->config_dir) * sizeof(char)) + (13 * sizeof(char))); - snprintf(config->config_dir_and_file, strlen(config->config_dir) + 13, "%s/%s", config->config_dir, "entropy.cfg"); + mimes->mime_bindings = evas_list_append(mimes->mime_bindings, + entropy_config_binding_new("image/jpeg", + entropy_config_binding_action_new("Exhibit (Single File)", "exhibit", "\%pf"), + entropy_config_binding_action_new("Exhibit (Directory)", "exhibit", "\%p"), + NULL + )); + mimes->mime_bindings = evas_list_append(mimes->mime_bindings, + entropy_config_binding_new("image/png", + entropy_config_binding_action_new("Exhibit (Single File)", "exhibit", "\%pf"), + entropy_config_binding_action_new("Exhibit (Directory)", "exhibit", "\%p"), + NULL + )); + + mimes->mime_bindings = evas_list_append(mimes->mime_bindings, + entropy_config_binding_new("image/gif", + entropy_config_binding_action_new("Exhibit (Single File)", "exhibit", "\%pf"), + entropy_config_binding_action_new("Exhibit (Directory)", "exhibit", "\%p"), + NULL + )); + + mimes->mime_bindings = evas_list_append(mimes->mime_bindings, + entropy_config_binding_new("text/csrc", + entropy_config_binding_action_new("Gvim", "gvim", "\%pf"), + NULL + )); + + mimes->mime_bindings = evas_list_append(mimes->mime_bindings, + entropy_config_binding_new("text/html", + entropy_config_binding_action_new("Firefox", "firefox", "\%pf"), + NULL + )); + + mimes->mime_bindings = evas_list_append(mimes->mime_bindings, + entropy_config_binding_new("audio/x-mp3", + entropy_config_binding_action_new("Xmms", "xmms", "\%pf"), + entropy_config_binding_action_new("Mpg123 (via eVFS)", "evfscat \"%u\" | mpg123 -", ""), + NULL + )); + + mimes->mime_bindings = evas_list_append(mimes->mime_bindings, + entropy_config_binding_new("video/x-ms-wmv", + entropy_config_binding_action_new("MPlayer", "mplayer", "\%pf"), + entropy_config_binding_action_new("MPlayer (via evfs)", "evfscat \"%u\" | mplayer -cache 4096 -", ""), + entropy_config_binding_action_new("Xine", "xine", "%pf"), + NULL + )); + + mimes->mime_bindings = evas_list_append(mimes->mime_bindings, + entropy_config_binding_new("video/mpeg", + entropy_config_binding_action_new("MPlayer", "mplayer", "\%pf"), + entropy_config_binding_action_new("MPlayer (via evfs)", "evfscat \"%u\" | mplayer -cache 4096 -", ""), + entropy_config_binding_action_new("Xine", "xine", "%pf"), + NULL + )); + + mimes->mime_bindings = evas_list_append(mimes->mime_bindings, + entropy_config_binding_new("video/x-msvideo", + entropy_config_binding_action_new("MPlayer", "mplayer", "\%pf"), + entropy_config_binding_action_new("MPlayer (via evfs)", "evfscat \"%u\" | mplayer -cache 4096 -", ""), + entropy_config_binding_action_new("Xine", "xine", "%pf"), + NULL + )); + + /*ecore_list_append(mime_type_actions, "application/msword:abiword"); + ecore_list_append(mime_type_actions, "application/vnd.ms-excel:gnumeric");*/ + + conf_file = eet_open(_Entropy_Config->config_dir_and_file_eet, EET_FILE_MODE_WRITE); + if (conf_file) { + char* data; + int size_ret; + int ok; + + printf("Conf file loaded to: %p\n", conf_file); + + data = + eet_data_descriptor_encode(_entropy_config_mimes_edd, mimes, &size_ret); + + printf("Write data: %p\n", data); + + if ( !(ok = eet_write(conf_file, "/config_action", data, + size_ret, 0))) { + printf("Error writing data!\n"); + + } + + free(data); + eet_close(conf_file); + + conf_file = eet_open(_Entropy_Config->config_dir_and_file_eet, EET_FILE_MODE_READ); + + + data = eet_read(conf_file, "/config_action", &size_ret); + printf("Data is %p\n", data); + + _Entropy_Config->Config_Mimes = eet_data_descriptor_decode(_entropy_config_mimes_edd, data, size_ret); + + } + + /*Print them out..*/ + entropy_config_mimes_print(_Entropy_Config->Config_Mimes); - //printf ("Config dir set to '%s'\n", config->config_dir); - //printf ("Config file at '%s'\n", config->config_dir_and_file); //Does the config dir exist? - if (stat(config->config_dir, &config_dir_stat)) { + if (stat(_Entropy_Config->config_dir, &config_dir_stat)) { //Make the dir.. - mkdir(config->config_dir, 0777); + mkdir(_Entropy_Config->config_dir, 0777); } //Init ecore_config ecore_config_init("entropy_config"); - ecore_config_file_load(config->config_dir_and_file); + ecore_config_file_load(_Entropy_Config->config_dir_and_file); - return config; + return _Entropy_Config; } int entropy_config_int_get(char* module, char* key) { @@ -88,7 +352,7 @@ -void entropy_config_destroy(entropy_config* config) { +void entropy_config_destroy(Entropy_Config* config) { //printf("Saving config to '%s'\n", config->config_dir_and_file); ecore_config_file_save(config->config_dir_and_file); |