aboutsummaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/mmcli-common.c87
1 files changed, 55 insertions, 32 deletions
diff --git a/cli/mmcli-common.c b/cli/mmcli-common.c
index 784dafe2..c072d220 100644
--- a/cli/mmcli-common.c
+++ b/cli/mmcli-common.c
@@ -113,12 +113,15 @@ mmcli_get_manager_sync (GDBusConnection *connection)
/******************************************************************************/
/* Common to all objects */
+#define ANY_OBJECT_STR "any"
+
static void
get_object_lookup_info (const gchar *str,
const gchar *object_type,
const gchar *object_prefix,
gchar **object_path,
- gchar **modem_uid)
+ gchar **modem_uid,
+ gboolean *find_any)
{
gboolean all_numeric;
guint i;
@@ -129,15 +132,18 @@ get_object_lookup_info (const gchar *str,
exit (EXIT_FAILURE);
}
- /* User string may come in three ways:
+ /* User string may come in four ways:
* a) full DBus path
* b) object index
* c) modem UID (for modem or SIM lookup only)
+ * d) "any" string (for modem or SIM lookup only)
*/
*object_path = NULL;
if (modem_uid)
*modem_uid = NULL;
+ if (find_any)
+ *find_any = FALSE;
/* If match the DBus prefix, we have a DBus object path */
if (g_str_has_prefix (str, object_prefix)) {
@@ -160,6 +166,14 @@ get_object_lookup_info (const gchar *str,
return;
}
+ /* If it matches the lookup keyword or any of its substrings, we have
+ * to look for the first available object */
+ if ((find_any) && (g_ascii_strncasecmp (str, ANY_OBJECT_STR, strlen (str)) == 0)) {
+ g_debug ("Will look for first available %s", object_type);
+ *find_any = TRUE;
+ return;
+ }
+
/* Otherwise we have the UID */
if (modem_uid) {
g_debug ("Assuming '%s' is the modem UID", str);
@@ -178,15 +192,13 @@ get_object_lookup_info (const gchar *str,
static MMObject *
find_modem (MMManager *manager,
const gchar *modem_path,
- const gchar *modem_uid)
+ const gchar *modem_uid,
+ gboolean modem_any)
{
GList *modems;
GList *l;
MMObject *found = NULL;
- g_assert (modem_path || modem_uid);
- g_assert (!(modem_path && modem_uid));
-
modems = g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager));
for (l = modems; l; l = g_list_next (l)) {
MMObject *obj;
@@ -195,12 +207,9 @@ find_modem (MMManager *manager,
obj = MM_OBJECT (l->data);
modem = MM_MODEM (mm_object_get_modem (obj));
- if (modem_path && g_str_equal (mm_object_get_path (obj), modem_path)) {
- found = g_object_ref (obj);
- break;
- }
-
- if (modem_uid && g_str_equal (mm_modem_get_device (modem), modem_uid)) {
+ if (modem_any ||
+ (modem_path && g_str_equal (mm_object_get_path (obj), modem_path)) ||
+ (modem_uid && g_str_equal (mm_modem_get_device (modem), modem_uid))) {
found = g_object_ref (obj);
break;
}
@@ -218,8 +227,9 @@ find_modem (MMManager *manager,
}
typedef struct {
- gchar *modem_path;
- gchar *modem_uid;
+ gchar *modem_path;
+ gchar *modem_uid;
+ gboolean modem_any;
} GetModemContext;
typedef struct {
@@ -271,7 +281,7 @@ get_manager_ready (GDBusConnection *connection,
results = g_new (GetModemResults, 1);
results->manager = mmcli_get_manager_finish (res);
- results->object = find_modem (results->manager, ctx->modem_path, ctx->modem_uid);
+ results->object = find_modem (results->manager, ctx->modem_path, ctx->modem_uid, ctx->modem_any);
g_task_return_pointer (task, results, (GDestroyNotify)get_modem_results_free);
g_object_unref (task);
}
@@ -290,8 +300,8 @@ mmcli_get_modem (GDBusConnection *connection,
ctx = g_new0 (GetModemContext, 1);
get_object_lookup_info (str, "modem", MM_DBUS_MODEM_PREFIX,
- &ctx->modem_path, &ctx->modem_uid);
- g_assert (ctx->modem_path || ctx->modem_uid);
+ &ctx->modem_path, &ctx->modem_uid, &ctx->modem_any);
+ g_assert (!!ctx->modem_path + !!ctx->modem_uid + ctx->modem_any == 1);
g_task_set_task_data (task, ctx, (GDestroyNotify) get_modem_context_free);
mmcli_get_manager (connection,
@@ -309,12 +319,13 @@ mmcli_get_modem_sync (GDBusConnection *connection,
MMObject *found;
gchar *modem_path = NULL;
gchar *modem_uid = NULL;
+ gboolean modem_any = FALSE;
manager = mmcli_get_manager_sync (connection);
get_object_lookup_info (str, "modem", MM_DBUS_MODEM_PREFIX,
- &modem_path, &modem_uid);
- g_assert (modem_path || modem_uid);
- found = find_modem (manager, modem_path, modem_uid);
+ &modem_path, &modem_uid, &modem_any);
+ g_assert (!!modem_path + !!modem_uid + modem_any == 1);
+ found = find_modem (manager, modem_path, modem_uid, modem_any);
if (o_manager)
*o_manager = manager;
@@ -579,7 +590,7 @@ mmcli_get_bearer (GDBusConnection *connection,
ctx = g_new0 (GetBearerContext, 1);
get_object_lookup_info (str, "bearer", MM_DBUS_BEARER_PREFIX,
- &ctx->bearer_path, NULL);
+ &ctx->bearer_path, NULL, NULL);
g_assert (ctx->bearer_path);
g_task_set_task_data (task, ctx, (GDestroyNotify) get_bearer_context_free);
@@ -602,7 +613,7 @@ mmcli_get_bearer_sync (GDBusConnection *connection,
gchar *bearer_path = NULL;
get_object_lookup_info (str, "bearer", MM_DBUS_BEARER_PREFIX,
- &bearer_path, NULL);
+ &bearer_path, NULL, NULL);
g_assert (bearer_path);
manager = mmcli_get_manager_sync (connection);
@@ -685,6 +696,7 @@ mmcli_get_bearer_sync (GDBusConnection *connection,
typedef struct {
gchar *sim_path;
gchar *modem_uid;
+ gboolean sim_any;
MMManager *manager;
MMObject *current;
} GetSimContext;
@@ -792,8 +804,13 @@ get_sim_manager_ready (GDBusConnection *connection,
object = MM_OBJECT (l->data);
modem = mm_object_get_modem (object);
+ /* check if we can match the first object found */
+ if (ctx->sim_any) {
+ g_assert (!ctx->sim_path);
+ ctx->sim_path = g_strdup (mm_modem_get_sim_path (modem));
+ }
/* check if modem UID matches */
- if (ctx->modem_uid) {
+ else if (ctx->modem_uid) {
if (g_str_equal (ctx->modem_uid, mm_modem_get_device (modem))) {
g_assert (!ctx->sim_path);
ctx->sim_path = g_strdup (mm_modem_get_sim_path (modem));
@@ -834,8 +851,8 @@ mmcli_get_sim (GDBusConnection *connection,
ctx = g_new0 (GetSimContext, 1);
get_object_lookup_info (str, "SIM", MM_DBUS_SIM_PREFIX,
- &ctx->sim_path, &ctx->modem_uid);
- g_assert (ctx->sim_path || ctx->modem_uid);
+ &ctx->sim_path, &ctx->modem_uid, &ctx->sim_any);
+ g_assert (!!ctx->sim_path + !!ctx->modem_uid + ctx->sim_any == 1);
g_task_set_task_data (task, ctx, (GDestroyNotify) get_sim_context_free);
mmcli_get_manager (connection,
@@ -856,10 +873,11 @@ mmcli_get_sim_sync (GDBusConnection *connection,
MMSim *found = NULL;
gchar *sim_path = NULL;
gchar *modem_uid = NULL;
+ gboolean sim_any = FALSE;
get_object_lookup_info (str, "SIM", MM_DBUS_SIM_PREFIX,
- &sim_path, &modem_uid);
- g_assert (sim_path || modem_uid);
+ &sim_path, &modem_uid, &sim_any);
+ g_assert (!!sim_path + !!modem_uid + sim_any == 1);
manager = mmcli_get_manager_sync (connection);
modems = g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager));
@@ -877,8 +895,13 @@ mmcli_get_sim_sync (GDBusConnection *connection,
object = MM_OBJECT (l->data);
modem = mm_object_get_modem (object);
+ /* check if we can match the first object found */
+ if (sim_any) {
+ g_assert (!sim_path);
+ sim_path = g_strdup (mm_modem_get_sim_path (modem));
+ }
/* check if modem UID matches */
- if (modem_uid) {
+ else if (modem_uid) {
if (g_str_equal (modem_uid, mm_modem_get_device (modem))) {
g_assert (!sim_path);
sim_path = g_strdup (mm_modem_get_sim_path (modem));
@@ -1105,7 +1128,7 @@ mmcli_get_sms (GDBusConnection *connection,
ctx = g_new0 (GetSmsContext, 1);
get_object_lookup_info (str, "SMS", MM_DBUS_SMS_PREFIX,
- &ctx->sms_path, NULL);
+ &ctx->sms_path, NULL, NULL);
g_task_set_task_data (task, ctx, (GDestroyNotify) get_sms_context_free);
mmcli_get_manager (connection,
@@ -1127,7 +1150,7 @@ mmcli_get_sms_sync (GDBusConnection *connection,
gchar *sms_path = NULL;
get_object_lookup_info (str, "SMS", MM_DBUS_SMS_PREFIX,
- &sms_path, NULL);
+ &sms_path, NULL, NULL);
manager = mmcli_get_manager_sync (connection);
modems = g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager));
@@ -1368,7 +1391,7 @@ mmcli_get_call (GDBusConnection *connection,
ctx = g_new0 (GetCallContext, 1);
get_object_lookup_info (str, "call", MM_DBUS_CALL_PREFIX,
- &ctx->call_path, NULL);
+ &ctx->call_path, NULL, NULL);
g_task_set_task_data (task, ctx, (GDestroyNotify) get_call_context_free);
mmcli_get_manager (connection,
@@ -1390,7 +1413,7 @@ mmcli_get_call_sync (GDBusConnection *connection,
gchar *call_path = NULL;
get_object_lookup_info (str, "call", MM_DBUS_CALL_PREFIX,
- &call_path, NULL);
+ &call_path, NULL, NULL);
manager = mmcli_get_manager_sync (connection);
modems = g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager));