Extend the API

With this, the DeforaOS Panel is closer to complete functionality
without relying on additional code handling desktop entries.
This commit is contained in:
Pierre Pronchery 2017-12-08 16:50:09 +01:00
parent a5f12e50f9
commit 08792869b4
3 changed files with 111 additions and 14 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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)