diff --git a/include/Desktop/mimehandler.h b/include/Desktop/mimehandler.h index c649de5..008f5f6 100644 --- a/include/Desktop/mimehandler.h +++ b/include/Desktop/mimehandler.h @@ -51,20 +51,28 @@ typedef enum _MimeHandlerType /* functions */ MimeHandler * mimehandler_new(void); MimeHandler * mimehandler_new_load(String const * name); +MimeHandler * mimehandler_new_open(String const * filename); void mimehandler_delete(MimeHandler * handler); /* accessors */ int mimehandler_can_display(MimeHandler * handler); int mimehandler_can_execute(MimeHandler * handler); +int mimehandler_can_open(MimeHandler * handler); +String const * mimehandler_get_comment(MimeHandler * handler); +String const * mimehandler_get_generic_name(MimeHandler * handler); +String const * mimehandler_get_icon(MimeHandler * handler); String const * mimehandler_get_name(MimeHandler * handler); +String const * mimehandler_get_path(MimeHandler * handler); String const * mimehandler_get_program(MimeHandler * handler); MimeHandlerType mimehandler_get_type(MimeHandler * handler); String ** mimehandler_get_types(MimeHandler * handler); +String const * mimehandler_get_url(MimeHandler * handler); int mimehandler_is_hidden(MimeHandler * handler); /* useful */ +int mimehandler_load(MimeHandler * handler, String const * filename); int mimehandler_load_by_name(MimeHandler * handler, String const * name); int mimehandler_save(MimeHandler * handler); diff --git a/src/mimehandler.c b/src/mimehandler.c index 8739ba6..358c9f1 100644 --- a/src/mimehandler.c +++ b/src/mimehandler.c @@ -72,6 +72,22 @@ MimeHandler * mimehandler_new_load(String const * name) } +/* mimehandler_new_open */ +MimeHandler * mimehandler_new_open(String const * filename) +{ + MimeHandler * handler; + + if((handler = mimehandler_new()) == NULL) + return NULL; + if(mimehandler_load(handler, filename) != 0) + { + mimehandler_delete(handler); + return NULL; + } + return handler; +} + + /* mimehandler_delete */ void mimehandler_delete(MimeHandler * handler) { @@ -102,9 +118,10 @@ int mimehandler_can_execute(MimeHandler * handler) if(mimehandler_get_type(handler) != MIME_HANDLER_TYPE_APPLICATION) return 0; - if((p = config_get(handler, SECTION, "TryExec")) == NULL) - return 1; - return _can_execute_access(p, X_OK); + if((p = config_get(handler, SECTION, "TryExec")) != NULL + && _can_execute_access(p, X_OK) == 0) + return 0; + return (config_get(handler, SECTION, "Exec") != NULL) ? 1 : 0; } static int _can_execute_access(String const * path, int mode) @@ -141,6 +158,47 @@ static int _can_execute_access_path(String const * path, } +/* mimehandler_can_open */ +int mimehandler_can_open(MimeHandler * handler) +{ + switch(mimehandler_get_type(handler)) + { + case MIME_HANDLER_TYPE_APPLICATION: + return mimehandler_can_execute(handler); + case MIME_HANDLER_TYPE_DIRECTORY: + /* let errors be handled by the API user */ + return 1; + case MIME_HANDLER_TYPE_URL: + /* FIXME implement */ + return 0; + case MIME_HANDLER_TYPE_UNKNOWN: + return 0; + } + return 0; +} + + +/* mimehandler_get_comment */ +String const * mimehandler_get_comment(MimeHandler * handler) +{ + return config_get(handler, SECTION, "Comment"); +} + + +/* mimehandler_get_generic_name */ +String const * mimehandler_get_generic_name(MimeHandler * handler) +{ + return config_get(handler, SECTION, "GenericName"); +} + + +/* mimehandler_get_icon */ +String const * mimehandler_get_icon(MimeHandler * handler) +{ + return config_get(handler, SECTION, "Icon"); +} + + /* mimehandler_get_name */ String const * mimehandler_get_name(MimeHandler * handler) { @@ -148,6 +206,20 @@ String const * mimehandler_get_name(MimeHandler * handler) } +/* mimehandler_get_path */ +String const * mimehandler_get_path(MimeHandler * handler) +{ + switch(mimehandler_get_type(handler)) + { + case MIME_HANDLER_TYPE_APPLICATION: + case MIME_HANDLER_TYPE_DIRECTORY: + return config_get(handler, SECTION, "Path"); + default: + return NULL; + } +} + + /* mimehandler_get_program */ String const * mimehandler_get_program(MimeHandler * handler) { @@ -235,6 +307,15 @@ String ** mimehandler_get_types(MimeHandler * handler) } +/* mimehandler_get_url */ +String const * mimehandler_get_url(MimeHandler * handler) +{ + if(mimehandler_get_type(handler) == MIME_HANDLER_TYPE_URL) + return config_get(handler, SECTION, "URL"); + return NULL; +} + + /* mimehandler_is_hidden */ int mimehandler_is_hidden(MimeHandler * handler) { @@ -247,6 +328,19 @@ int mimehandler_is_hidden(MimeHandler * handler) /* useful */ +/* mimehandler_load */ +int mimehandler_load(MimeHandler * handler, String const * filename) +{ + return (config_reset(handler) == 0 + && config_load(handler, filename) == 0 + && mimehandler_get_type(handler) + != MIME_HANDLER_TYPE_UNKNOWN + && mimehandler_get_name(handler) != NULL + && mimehandler_is_hidden(handler) == 0) + ? 0 : -1; +} + + /* mimehandler_load_by_name */ static int _load_by_name_path(MimeHandler * handler, String const * name, String const * path); @@ -292,18 +386,12 @@ static int _load_by_name_path(MimeHandler * handler, String const * name, { int ret; String const applications[] = "/applications/"; - String * pathname; + String * filename; - if((pathname = string_new_append(path, applications, name, EXTENSION, + if((filename = string_new_append(path, applications, name, EXTENSION, NULL)) == NULL) return -1; - ret = (config_reset(handler) == 0 - && config_load(handler, pathname) == 0 - && mimehandler_get_type(handler) - != MIME_HANDLER_TYPE_UNKNOWN - && mimehandler_get_name(handler) != NULL - && mimehandler_is_hidden(handler) == 0) - ? 0 : -1; - string_delete(pathname); + ret = mimehandler_load(handler, filename); + string_delete(filename); return ret; } diff --git a/tests/mimehandler.c b/tests/mimehandler.c index d658dac..5e7a363 100644 --- a/tests/mimehandler.c +++ b/tests/mimehandler.c @@ -62,7 +62,8 @@ int main(void) return 6; } mimehandler_delete(handler); - if((handler = mimehandler_new_load("Widget")) == NULL) + if((handler = mimehandler_new_open("applications/Widget.desktop")) + == NULL) return 7; if((types = mimehandler_get_types(handler)) == NULL || types[0] != NULL)