summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Porter <mporter@konsulko.com>2017-05-24 11:47:22 -0400
committerMatt Porter <mporter@konsulko.com>2017-05-24 12:01:11 -0400
commit597ed5434f369ab614fa2ce543aab3f49101b5f1 (patch)
tree3bb30709ec98852495a9b4e94a88be153fb3ad5a
parent07502ed69e6d6a1830c168aada4c59ab0220bd24 (diff)
Add additional error checking/reporting to the telephony bindingdab_3.99.1dab/3.99.13.99.1
Adds additional error checking and reporting to the binding so that errors resulting from lack of a telephony modem can be reported at init. This fixes the issue where the phone app crashes and the afb-daemon can only report a segfault on start. AGL-Bug: SPEC-621 Change-Id: Ie3e12cb69a2a04cf7308e6bd244add581b8578db Signed-off-by: Matt Porter <mporter@konsulko.com>
-rw-r--r--telephony-binding/gdbus/ofono_manager.c39
-rw-r--r--telephony-binding/gdbus/ofono_manager.h2
-rw-r--r--telephony-binding/telephony-binding.c30
3 files changed, 45 insertions, 26 deletions
diff --git a/telephony-binding/gdbus/ofono_manager.c b/telephony-binding/gdbus/ofono_manager.c
index 2f8c4df..bb99a43 100644
--- a/telephony-binding/gdbus/ofono_manager.c
+++ b/telephony-binding/gdbus/ofono_manager.c
@@ -36,18 +36,19 @@ static OrgOfonoManager *manager;
static struct ofono_manager_modem default_modem;
static const struct afb_binding_interface *interface;
-void ofono_manager_init(const struct afb_binding_interface *iface)
+int ofono_manager_init(const struct afb_binding_interface *iface)
{
GVariant *out_arg = NULL, *next, *value;
GError *error = NULL;
gchar *path, *key;
- GVariantIter *iter, *iter2;
+ GVariantIter *iter, *iter2 = NULL;
+ int ret = 0;
interface = iface;
if (manager) {
ERROR(interface, "Ofono Manager already initialized\n");
- return;
+ return -1;
}
manager = org_ofono_manager_proxy_new_for_bus_sync(
@@ -56,26 +57,34 @@ void ofono_manager_init(const struct afb_binding_interface *iface)
if (!manager) {
ERROR(interface, "Ofono Manager not initialized\n");
- return;
+ return -1;
}
org_ofono_manager_call_get_modems_sync(manager, &out_arg, NULL, &error);
if (error == NULL) {
g_variant_get(out_arg, "a(oa{sv})", &iter);
next = g_variant_iter_next_value(iter);
- g_variant_get(next, "(oa{sv})", &path, &iter2);
- default_modem.path = path;
- while (g_variant_iter_loop(iter2, "{sv}", &key, &value)) {
- if (!strcmp(key, "Name"))
- default_modem.name = g_variant_get_string(value, NULL);
- else if (!strcmp(key, "Type"))
- default_modem.type = g_variant_get_string(value, NULL);
- else if (!strcmp(key, "Powered"))
- default_modem.powered = g_variant_get_boolean(value);
- else if (!strcmp(key, "Online"))
- default_modem.online = g_variant_get_boolean(value);
+ if (next) {
+ g_variant_get(next, "(oa{sv})", &path, &iter2);
+ default_modem.path = path;
+ while (g_variant_iter_loop(iter2, "{sv}", &key, &value)) {
+ if (!strcmp(key, "Name"))
+ default_modem.name = g_variant_get_string(value, NULL);
+ else if (!strcmp(key, "Type"))
+ default_modem.type = g_variant_get_string(value, NULL);
+ else if (!strcmp(key, "Powered"))
+ default_modem.powered = g_variant_get_boolean(value);
+ else if (!strcmp(key, "Online"))
+ default_modem.online = g_variant_get_boolean(value);
+ }
+ } else {
+ ret = -1;
}
+ } else {
+ ret = -1;
}
+
+ return ret;
}
diff --git a/telephony-binding/gdbus/ofono_manager.h b/telephony-binding/gdbus/ofono_manager.h
index 3b55547..6454246 100644
--- a/telephony-binding/gdbus/ofono_manager.h
+++ b/telephony-binding/gdbus/ofono_manager.h
@@ -20,7 +20,7 @@
#include <afb/afb-binding.h>
#include <afb/afb-service-itf.h>
-void ofono_manager_init(const struct afb_binding_interface *iface);
+int ofono_manager_init(const struct afb_binding_interface *iface);
const gchar *ofono_manager_get_default_modem_path(void);
const gchar *ofono_manager_get_default_modem_name(void);
const gchar *ofono_manager_get_default_modem_type(void);
diff --git a/telephony-binding/telephony-binding.c b/telephony-binding/telephony-binding.c
index e3c6d2f..d58aeab 100644
--- a/telephony-binding/telephony-binding.c
+++ b/telephony-binding/telephony-binding.c
@@ -141,16 +141,26 @@ static int ofono_init(void)
/* Start the main loop thread */
pthread_create(&tid, NULL, main_loop_thread, NULL);
- ofono_manager_init(interface);
- const gchar *modem_path = ofono_manager_get_default_modem_path();
- DEBUG(interface, "modem_path: %s\n", modem_path);
- vcm = ofono_voicecallmanager_init(interface, modem_path,
- incoming_call_cb,
- dialing_call_cb,
- terminated_call_cb);
- if (!vcm) {
- ERROR(interface, "Failed to initialize voice call manager\n");
- ret = -1;
+ ret = ofono_manager_init(interface);
+ if (ret == 0) {
+ const gchar *modem_path = ofono_manager_get_default_modem_path();
+ if (modem_path) {
+ DEBUG(interface, "modem_path: %s\n", modem_path);
+ vcm = ofono_voicecallmanager_init(interface, modem_path,
+ incoming_call_cb,
+ dialing_call_cb,
+ terminated_call_cb);
+ if (!vcm) {
+ ERROR(interface, "[telephony] failed to initialize voice call manager\n");
+ ret = -1;
+ }
+ } else {
+ ERROR(interface, "[telephony] default modem not set\n");
+ ret = -1;
+ }
+ } else {
+ ERROR(interface, "[telephony] failed to initialize ofono manager: " \
+ "HFP device not connected or Bluetooth disabled\n");
}
return ret;