+static void modem_gprs_changed(struct modem_data *modem,
+ DBusMessageIter *entry)
+{
+ DBusMessageIter iter;
+ const char *key;
+ int type;
+ dbus_bool_t value;
+
+ dbus_message_iter_get_basic(entry, &key);
+
+ DBG("key %s", key);
+
+ dbus_message_iter_next(entry);
+
+ dbus_message_iter_recurse(entry, &iter);
+
+ type = dbus_message_iter_get_arg_type(&iter);
+
+ if (type != DBUS_TYPE_BOOLEAN)
+ return;
+
+ dbus_message_iter_get_basic(&iter, &value);
+
+ if (g_str_equal(key, "Attached") == TRUE) {
+ DBG("Attached %d", value);
+
+ modem->attached = value;
+
+ if (value)
+ modem_clear_network_errors(modem);
+ } else if (g_str_equal(key, "Powered") == TRUE) {
+ DBG("Powered %d", value);
+
+ modem->powered = value;
+ } else if (g_str_equal(key, "RoamingAllowed") == TRUE) {
+ DBG("RoamingAllowed %d", value);
+
+ modem->roaming_allowed = value;
+ }
+}
+
+static void check_gprs_reply(DBusPendingCall *call, void *user_data)
+{
+ char const *path = user_data;
+ struct modem_data *modem;
+ DBusMessage *reply;
+ DBusMessageIter array, dict, entry;
+
+ DBG("path %s", path);
+
+ modem = g_hash_table_lookup(modem_hash, path);
+ if (modem == NULL)
+ return;
+
+ reply = dbus_pending_call_steal_reply(call);
+
+ if (dbus_message_iter_init(reply, &array) == FALSE)
+ goto done;
+
+ if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_ARRAY)
+ goto done;
+
+ dbus_message_iter_recurse(&array, &dict);
+ while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
+ dbus_message_iter_recurse(&dict, &entry);
+ modem_gprs_changed(modem, &entry);
+ dbus_message_iter_next(&dict);
+ }
+
+done:
+ dbus_message_unref(reply);
+
+ dbus_pending_call_unref(call);
+
+ check_networks(modem);
+}
+
+static void check_gprs(struct modem_data *modem)
+{
+ char const *path = modem->path;
+
+ DBG("modem %p path %s", modem, path);
+
+ call_ofono(path, OFONO_GPRS_INTERFACE, GET_PROPERTIES,
+ check_gprs_reply, g_strdup(path), g_free,
+ DBUS_TYPE_INVALID);
+}
+