summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/network.c77
1 files changed, 65 insertions, 12 deletions
diff --git a/src/network.c b/src/network.c
index 46f294ab..8f994905 100644
--- a/src/network.c
+++ b/src/network.c
@@ -825,12 +825,32 @@ static DBusMessage *network_deregister(DBusConnection *conn,
return NULL;
}
+static DBusMessage *network_propose_scan(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct ofono_netreg *netreg = data;
+
+ if (netreg->pending)
+ return __ofono_error_busy(msg);
+
+ if (netreg->driver->list_operators == NULL)
+ return __ofono_error_not_implemented(msg);
+
+ netreg->pending = dbus_message_ref(msg);
+
+ netreg->driver->list_operators(netreg, operator_list_callback, netreg);
+
+ return NULL;
+}
+
static GDBusMethodTable network_registration_methods[] = {
{ "GetProperties", "", "a{sv}", network_get_properties },
{ "Register", "", "", network_register,
G_DBUS_METHOD_FLAG_ASYNC },
{ "Deregister", "", "", network_deregister,
G_DBUS_METHOD_FLAG_ASYNC },
+ { "ProposeScan", "", "ao", network_propose_scan,
+ G_DBUS_METHOD_FLAG_ASYNC },
{ }
};
@@ -1058,21 +1078,14 @@ static GSList *compress_operator_list(const struct ofono_network_operator *list,
return oplist;
}
-static void operator_list_callback(const struct ofono_error *error, int total,
- const struct ofono_network_operator *list,
- void *data)
+static gboolean update_operator_list(struct ofono_netreg *netreg, int total,
+ const struct ofono_network_operator *list)
{
- struct ofono_netreg *netreg = data;
GSList *n = NULL;
GSList *o;
GSList *compressed;
GSList *c;
- gboolean need_to_emit = FALSE;
-
- if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
- ofono_debug("Error occurred during operator list");
- return;
- }
+ gboolean changed = FALSE;
compressed = compress_operator_list(list, total);
@@ -1103,7 +1116,7 @@ static void operator_list_callback(const struct ofono_error *error, int total,
}
n = g_slist_prepend(n, opd);
- need_to_emit = TRUE;
+ changed = TRUE;
}
}
@@ -1114,7 +1127,7 @@ static void operator_list_callback(const struct ofono_error *error, int total,
n = g_slist_reverse(n);
if (netreg->operator_list)
- need_to_emit = TRUE;
+ changed = TRUE;
for (o = netreg->operator_list; o; o = o->next)
network_operator_dbus_unregister(netreg, o->data);
@@ -1123,6 +1136,46 @@ static void operator_list_callback(const struct ofono_error *error, int total,
netreg->operator_list = n;
+ return changed;
+}
+
+static void operator_list_callback(const struct ofono_error *error, int total,
+ const struct ofono_network_operator *list,
+ void *data)
+{
+ struct ofono_netreg *netreg = data;
+ DBusMessage *reply;
+ char **network_operators;
+ DBusMessageIter iter;
+ DBusMessageIter array_iter;
+ int i;
+ gboolean need_to_emit;
+
+ if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
+ ofono_debug("Error occurred during operator list");
+ __ofono_dbus_pending_reply(&netreg->pending,
+ __ofono_error_failed(netreg->pending));
+ return;
+ }
+
+ need_to_emit = update_operator_list(netreg, total, list);
+
+ reply = dbus_message_new_method_return(netreg->pending);
+ network_operator_populate_registered(netreg, &network_operators);
+
+ dbus_message_iter_init_append(reply, &iter);
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+ DBUS_TYPE_OBJECT_PATH_AS_STRING, &array_iter);
+
+ for (i = 0; network_operators[i]; i++)
+ dbus_message_iter_append_basic(&array_iter,
+ DBUS_TYPE_OBJECT_PATH, &network_operators[i]);
+
+ dbus_message_iter_close_container(&iter, &array_iter);
+ __ofono_dbus_pending_reply(&netreg->pending, reply);
+
+ g_strfreev(network_operators);
+
if (need_to_emit)
network_operator_emit_available_operators(netreg);
}