summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorDaniel Wagner <daniel.wagner@bmw-carit.de>2011-11-24 08:42:26 +0100
committerDaniel Wagner <daniel.wagner@bmw-carit.de>2011-12-12 17:33:58 +0100
commit5103acd48a4607307b3654f569bc27b3d556b6cb (patch)
tree1d4b27ee14f5e230b1cf7752d32a09e975c84cad /plugins
parent3c4628a1d1a6d3870a6ac025bf8d8e415c6f3583 (diff)
downloadconnman-5103acd48a4607307b3654f569bc27b3d556b6cb.tar.gz
connman-5103acd48a4607307b3654f569bc27b3d556b6cb.tar.bz2
connman-5103acd48a4607307b3654f569bc27b3d556b6cb.zip
ofono: Extract modem properties
Interesting values are Powered, Online and Interfaces. The Serial string has to be tracked only for modems which do not have a SIM interface, e.g. dunmodems. Conflicts: plugins/ofono.c
Diffstat (limited to 'plugins')
-rw-r--r--plugins/ofono.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/plugins/ofono.c b/plugins/ofono.c
index 125e815b..3ffd65c9 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -29,6 +29,7 @@
#include <gdbus.h>
#include <string.h>
+#include <stdint.h>
#define CONNMAN_API_SUBJECT_TO_CHANGE
#include <connman/plugin.h>
@@ -56,14 +57,51 @@
#define TIMEOUT 40000
+enum ofono_api {
+ OFONO_API_SIM = 0x1,
+ OFONO_API_NETREG = 0x2,
+ OFONO_API_CM = 0x4,
+};
+
static DBusConnection *connection;
static GHashTable *modem_hash;
struct modem_data {
char *path;
+
+ /* Modem Interface */
+ char *serial;
+ connman_bool_t powered;
+ connman_bool_t online;
+ uint8_t interfaces;
};
+static uint8_t extract_interfaces(DBusMessageIter *array)
+{
+ DBusMessageIter entry;
+ uint8_t interfaces = 0;
+
+ dbus_message_iter_recurse(array, &entry);
+
+ while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
+ const char *name;
+
+ dbus_message_iter_get_basic(&entry, &name);
+
+ if (g_str_equal(name, OFONO_SIM_INTERFACE) == TRUE)
+ interfaces |= OFONO_API_SIM;
+ else if (g_str_equal(name, OFONO_NETREG_INTERFACE) == TRUE)
+ interfaces |= OFONO_API_NETREG;
+ else if (g_str_equal(name, OFONO_CM_INTERFACE) == TRUE)
+ interfaces |= OFONO_API_CM;
+
+ dbus_message_iter_next(&entry);
+ }
+
+ return interfaces;
+}
+
static gboolean context_changed(DBusConnection *connection,
DBusMessage *message,
void *user_data)
@@ -106,6 +144,47 @@ static gboolean sim_changed(DBusConnection *connection, DBusMessage *message,
static gboolean modem_changed(DBusConnection *connection, DBusMessage *message,
void *user_data)
{
+ const char *path = dbus_message_get_path(message);
+ struct modem_data *modem;
+ DBusMessageIter iter, value;
+ const char *key;
+
+ modem = g_hash_table_lookup(modem_hash, path);
+ if (modem == NULL)
+ return TRUE;
+
+ if (dbus_message_iter_init(message, &iter) == FALSE)
+ return TRUE;
+
+ dbus_message_iter_get_basic(&iter, &key);
+
+ dbus_message_iter_next(&iter);
+ dbus_message_iter_recurse(&iter, &value);
+
+ if (g_str_equal(key, "Powered") == TRUE) {
+ dbus_message_iter_get_basic(&value, &modem->powered);
+
+ DBG("%s Powered %d", modem->path, modem->powered);
+ } else if (g_str_equal(key, "Online") == TRUE) {
+ dbus_message_iter_get_basic(&value, &modem->online);
+
+ DBG("%s Online %d", modem->path, modem->online);
+ } else if (g_str_equal(key, "Interfaces") == TRUE) {
+ modem->interfaces = extract_interfaces(&value);
+
+ DBG("%s Interfaces 0x%02x", modem->path,
+ modem->interfaces);
+ } else if (g_str_equal(key, "Serial") == TRUE) {
+ char *serial;
+
+ dbus_message_iter_get_basic(&value, &serial);
+
+ g_free(modem->serial);
+ modem->serial = g_strdup(serial);
+
+ DBG("%s Serial %s", modem->path, modem->serial);
+ }
+
return TRUE;
}
@@ -132,6 +211,41 @@ static void add_modem(const char *path, DBusMessageIter *prop)
modem->path = g_strdup(path);
g_hash_table_insert(modem_hash, g_strdup(path), modem);
+
+ while (dbus_message_iter_get_arg_type(prop) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter entry, value;
+ const char *key;
+
+ dbus_message_iter_recurse(prop, &entry);
+ dbus_message_iter_get_basic(&entry, &key);
+
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &value);
+
+ if (g_str_equal(key, "Powered") == TRUE) {
+ dbus_message_iter_get_basic(&value, &modem->powered);
+
+ DBG("%s Powered %d", modem->path, modem->powered);
+ } else if (g_str_equal(key, "Online") == TRUE) {
+ dbus_message_iter_get_basic(&value, &modem->online);
+
+ DBG("%s Online %d", modem->path, modem->online);
+ } else if (g_str_equal(key, "Interfaces") == TRUE) {
+ modem->interfaces = extract_interfaces(&value);
+
+ DBG("%s Interfaces 0x%02x", modem->path,
+ modem->interfaces);
+ } else if (g_str_equal(key, "Serial") == TRUE) {
+ char *serial;
+
+ dbus_message_iter_get_basic(&value, &serial);
+ modem->serial = g_strdup(serial);
+
+ DBG("%s Serial %s", modem->path, modem->serial);
+ }
+
+ dbus_message_iter_next(prop);
+ }
}
static void remove_modem(gpointer data)
@@ -140,6 +254,7 @@ static void remove_modem(gpointer data)
DBG("%s", modem->path);
+ g_free(modem->serial);
g_free(modem->path);
g_free(modem);