diff options
author | Olliver Schinagl <o.schinagl@ultimaker.com> | 2015-04-29 12:57:26 (GMT) |
---|---|---|
committer | Olliver Schinagl <o.schinagl@ultimaker.com> | 2015-04-29 12:57:26 (GMT) |
commit | 05c3a1d3403ac0187ebdd7b08455832bda0055d1 (patch) | |
tree | d15d23e42bfe316986ce661193eaa5790c26e919 /src/eulogium.c | |
parent | 5cc2a7e330bba889852823c58266bdf3108b50bd (diff) | |
download | eulogium-05c3a1d3403ac0187ebdd7b08455832bda0055d1.zip eulogium-05c3a1d3403ac0187ebdd7b08455832bda0055d1.tar.gz eulogium-05c3a1d3403ac0187ebdd7b08455832bda0055d1.tar.bz2 |
Get and store printer status
The printer service constantly emits a signal whenever the signal
changes. If we connect however and if the status is for example IDLE,
we won't know about this state until the signal gets emitted via a
status change. To counter this, we also add a method to get the initial
status. Right now, we store only the actual state.
Signed-off-by: Olliver Schinagl <o.schinagl@ultimaker.com>
Diffstat (limited to '')
-rw-r--r-- | src/eulogium.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/eulogium.c b/src/eulogium.c index f93567d..b7ecf50 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -990,6 +990,47 @@ static void on_name_owner_changed(void *data EINA_UNUSED, const char *bus, const printf("Bus=%s | old=%s | new=%s\n", bus, old_id, new_id); } +struct _status_msg { + int16_t i; + char *s; +}; + +static void eulogium_printer_status_set(struct printer_data *printer, struct _status_msg *status) +{ + EINA_LOG_INFO("Printer status: %s", status->s); + printer->status = status->i; +} + +static void _on_get_status_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + const char *errname, *errmsg; + struct eulogium_data *eulogium = data; + struct _status_msg status; + + if (eldbus_message_error_get(msg, &errname, &errmsg)) { + EINA_LOG_ERR("%s %s", errname, errmsg); + } else if (eldbus_message_arguments_get(msg, "(ns)", &status)) { + EINA_LOG_ERR("Failed to get printer status."); + } else { + eulogium_printer_status_set(&eulogium->printer, &status); + } +} + +static void _on_status_changed_ret(void *data, const Eldbus_Message *msg) +{ + const char *errname, *errmsg; + struct eulogium_data *eulogium = data; + struct _status_msg status; + + if (eldbus_message_error_get(msg, &errname, &errmsg)) { + EINA_LOG_ERR("%s %s", errname, errmsg); + } else if (eldbus_message_arguments_get(msg, "(ns)", &status)) { + EINA_LOG_ERR("Failed to get printer status."); + } else { + eulogium_printer_status_set(&eulogium->printer, &status); + } +} + static int eulogium_dbus_init(struct eulogium_data *eulogium) { Eldbus_Object *obj; @@ -1039,6 +1080,12 @@ static int eulogium_dbus_init(struct eulogium_data *eulogium) return -EFAULT; } eldbus_name_owner_changed_callback_add(eulogium->dbus.conn, "nl.ultimaker.printer", on_name_owner_changed, eulogium->dbus.conn, EINA_TRUE); + /* First query the status and store it, we don't know the initial status, + * 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[PRINTER], "getStatus", _on_get_status_ret, eulogium, -1, ""); + eldbus_proxy_signal_handler_add(eulogium->dbus.proxy[PRINTER], "statusChanged", _on_status_changed_ret, eulogium); return 0; } |