summaryrefslogtreecommitdiffstats
path: root/src/eulogium.c
diff options
context:
space:
mode:
authorOlliver Schinagl <o.schinagl@ultimaker.com>2015-04-29 12:57:26 (GMT)
committerOlliver Schinagl <o.schinagl@ultimaker.com>2015-04-29 12:57:26 (GMT)
commit05c3a1d3403ac0187ebdd7b08455832bda0055d1 (patch)
treed15d23e42bfe316986ce661193eaa5790c26e919 /src/eulogium.c
parent5cc2a7e330bba889852823c58266bdf3108b50bd (diff)
downloadeulogium-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.c47
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;
}