From 7b6d9fe9b6e9ef8505ee89330dd5daf06d15ec7c Mon Sep 17 00:00:00 2001 From: Olliver Schinagl Date: Mon, 11 May 2015 14:39:03 +0200 Subject: [displayService] Query harmaService for file handlers Harma is the only service that knows which file types are supported by the installed engine. With this patch harma is queried for the supported file handlers. Note. We cache the result and is valid for the lifetime of the displayService. To change this a signal could be added to harma to notify the users of a changed file handler support Signed-off-by: Olliver Schinagl --- src/eulogium.c | 45 +++++++++++++++++++++++++++++++-------------- src/eulogium.h | 1 + 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/eulogium.c b/src/eulogium.c index 0aa237a..1fa272f 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -769,13 +769,15 @@ static void _cb_populate_filelist(const char *name, const char *path, void *data snprintf(filepath, dir_len, "%s/%s", path, name); if (!ecore_file_is_dir(filepath)) { - int len; + int i, valid_ext = 0; ext = ecore_file_ext_get(name); if (!ext) return; - len = strlen(ext); - if (strncmp(ext, "gcode", len) != 0) /* TODO: compare to list of filetypes/filterlist/mimetype. Get from griffin. */ + for (i = 0; eulogium->printer.file_handlers[i] != NULL; i++) + if (strncmp(ext, eulogium->printer.file_handlers[i], strlen(ext)) == 0) + valid_ext++; + if (!valid_ext) return; } @@ -1132,6 +1134,7 @@ static void eulogium_setup(struct eulogium_data *eulogium) eulogium->print.file = NULL; eulogium_print_data_clear(eulogium); eulogium->printer.status = DISCONNECTED; + eulogium->printer.file_handlers = NULL; eulogium_button_cb_data_set(&but_return, eulogium); eulogium_button_cb_data_set(&but_print_abort, eulogium); eulogium_button_cb_data_set(&but_print_progress_tune, eulogium); @@ -1242,28 +1245,38 @@ static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _ eulogium->printer.status = status->i; } -static void _on_get_file_handlers_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +static void _on_get_file_handlers_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { const char *errname, *errmsg; Eldbus_Message_Iter *array; - uint_fast8_t num_file_handlers, i; - char **file_handlers; + uint_fast8_t i; + char *file_handler; + char **file_handlers = NULL; + struct eulogium_data *eulogium = data; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); return; } - if (!eldbus_message_arguments_get(msg, "yas", &num_file_handlers, &array)) { + if (!eldbus_message_arguments_get(msg, "as", &array)) { EINA_LOG_ERR("Message content does not match expected \"as\" signature."); return; } - file_handlers = malloc(num_file_handlers * sizeof(char *)); - for (i = 0; i < num_file_handlers; i++) { - if (!eldbus_message_iter_get_and_next(array, 's', &file_handlers[i])) - EINA_LOG_ERR("Message content does not match expected \"s\" signature."); - printf("fh: %s\n", file_handlers[i]); + for (i = 0; (eldbus_message_iter_get_and_next(array, 's', &file_handler)); i++) { + int fhandler_size = strlen(file_handler) + 1; + + file_handlers = realloc(file_handlers, (i + 1) * sizeof(char *)); + if (!file_handlers) + EINA_LOG_ERR("Unable to allocate memory."); + else + file_handlers[i] = malloc(fhandler_size); + if (!file_handlers[i]) + EINA_LOG_ERR("Unable to allocate memory."); + else + strncpy(file_handlers[i], file_handler, fhandler_size); } - free(file_handlers); /* TODO: Return filehandlers via data, free array after use there. Cache results during runtime prob. */ + file_handlers[i] = NULL; /* sentinel */ + eulogium->printer.file_handlers = file_handlers; } static void _on_get_status_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) @@ -1364,7 +1377,7 @@ static int eulogium_dbus_init(struct eulogium_data *eulogium) * and the statusChanged signal may not have been fired yet */ /* TODO: put signal/method name strings in macro/LUT */ - eldbus_proxy_call(eulogium->dbus.proxy[HARMA], "getFileHandlers", _on_get_file_handlers_ret, NULL, -1, ""); + eldbus_proxy_call(eulogium->dbus.proxy[HARMA], "getFileHandlers", _on_get_file_handlers_ret, eulogium, -1, ""); eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getStatus", _on_get_status_ret, eulogium, -1, ""); eldbus_proxy_signal_handler_add(eulogium->dbus.proxy[PRINTER], "statusChanged", _on_status_changed_ret, eulogium); @@ -1398,6 +1411,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) ECORE_GETOPT_VALUE_NONE }; int args; + uint_fast8_t i; struct eulogium_data eulogium; Evas_Object *window, *object; // Evas_Object *splash_window; @@ -1490,6 +1504,9 @@ EAPI_MAIN int elm_main(int argc, char **argv) elm_run(); eldbus_connection_unref(eulogium.dbus.conn); + for (i = 0; eulogium.printer.file_handlers[i] != NULL; i++) + free(eulogium.printer.file_handlers[i]); + free(eulogium.printer.file_handlers); /* TODO: Cleanup function? */ elm_shutdown(); diff --git a/src/eulogium.h b/src/eulogium.h index cae6200..29c6aaf 100644 --- a/src/eulogium.h +++ b/src/eulogium.h @@ -44,6 +44,7 @@ char *griffin_print_status[] = { struct printer_data { enum printer_status status; + char **file_handlers; uint_fast8_t hotend_count; double *hotend_temp; double *hotend_target_temp; -- cgit v0.12