diff options
-rw-r--r-- | src/eulogium.c | 45 | ||||
-rw-r--r-- | 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; |