summaryrefslogtreecommitdiffstats
path: root/telephony-binding/gdbus/ofono_manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'telephony-binding/gdbus/ofono_manager.c')
-rw-r--r--telephony-binding/gdbus/ofono_manager.c78
1 files changed, 76 insertions, 2 deletions
diff --git a/telephony-binding/gdbus/ofono_manager.c b/telephony-binding/gdbus/ofono_manager.c
index 49a2452..a77623d 100644
--- a/telephony-binding/gdbus/ofono_manager.c
+++ b/telephony-binding/gdbus/ofono_manager.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 Konsulko Group
+ * Copyright (C) 2017-2018 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,24 +26,81 @@
struct ofono_manager_modem
{
+ const gchar *address;
const gchar *path;
const gchar *name;
const gchar *type;
gboolean powered;
gboolean online;
+ gboolean valid;
};
static OrgOfonoManager *manager;
static struct ofono_manager_modem default_modem;
-int ofono_manager_init()
+void ofono_manager_invalidate_default_modem()
+{
+ default_modem.valid = FALSE;
+}
+
+int ofono_manager_set_default_modem(const char *address)
{
GVariant *out_arg = NULL, *next, *value;
GError *error = NULL;
gchar *path, *key;
+ const gchar *name = NULL, *type = NULL, *serial = NULL;
+ gboolean powered = FALSE, online = FALSE;
+
GVariantIter *iter, *iter2 = NULL;
int ret = 0;
+ /* Fetch all visible modems */
+ org_ofono_manager_call_get_modems_sync(manager, &out_arg, NULL, &error);
+ if (error == NULL) {
+ g_variant_get(out_arg, "a(oa{sv})", &iter);
+ /* Iterate over each modem */
+ while ((next = g_variant_iter_next_value(iter))) {
+ g_variant_get(next, "(oa{sv})", &path, &iter2);
+ while (g_variant_iter_loop(iter2, "{sv}", &key, &value)) {
+ if (!strcmp(key, "Name"))
+ name = g_variant_get_string(value, NULL);
+ else if (!strcmp(key, "Online"))
+ online = g_variant_get_boolean(value);
+ else if (!strcmp(key, "Powered"))
+ powered = g_variant_get_boolean(value);
+ else if (!strcmp(key, "Serial"))
+ serial = g_variant_get_string(value, NULL);
+ else if (!strcmp(key, "Type"))
+ type = g_variant_get_string(value, NULL);
+ }
+ /* If the HFP modem matches the BT address, is powered, and online then set as default */
+ if (!strcmp(type, "hfp") && !strcmp(address, serial) && powered && online) {
+ default_modem.address = serial;
+ default_modem.path = path;
+ default_modem.name = name;
+ default_modem.type = type;
+ default_modem.powered = powered;
+ default_modem.online = online;
+ default_modem.valid = TRUE;
+ AFB_NOTICE("New modem: %s (%s)", name, address);
+ break;
+ }
+ }
+ } else {
+ ret = -1;
+ }
+
+ return ret;
+}
+
+int ofono_manager_init()
+{
+ GVariant *out_arg = NULL, *next, *value;
+ GError *error = NULL;
+ GVariantIter *iter, *iter2 = NULL;
+ gchar *path, *key;
+ int ret = 0;
+
if (manager) {
AFB_ERROR("Ofono Manager already initialized\n");
return -1;
@@ -85,6 +142,14 @@ int ofono_manager_init()
return ret;
}
+const gchar *ofono_manager_get_default_modem_address(void)
+{
+ if (!manager) {
+ AFB_ERROR("Ofono Manager not initialized\n");
+ }
+
+ return default_modem.address;
+}
const gchar *ofono_manager_get_default_modem_path(void)
{
@@ -130,3 +195,12 @@ gboolean ofono_manager_get_default_modem_online(void)
return default_modem.online;
}
+
+gboolean ofono_manager_get_default_modem_valid(void)
+{
+ if (!manager) {
+ AFB_ERROR("Ofono Manager not initialized\n");
+ }
+
+ return default_modem.valid;
+}