cli: allow option groups to force async/sync operations

Some operations are clearly asynchronous (e.g. monitoring modem state), while
others are clearly synchronous (e.g. printing modem info). So just allow option
groups to force the operation to be async or sync based on the detected action.
This commit is contained in:
Aleksander Morgado
2012-03-15 14:14:33 +01:00
parent ec8da67921
commit 6246944510
4 changed files with 40 additions and 26 deletions
+3
View File
@@ -98,6 +98,9 @@ mmcli_manager_options_enabled (void)
exit (EXIT_FAILURE);
}
if (monitor_modems_flag)
mmcli_force_async_operation ();
return !!n_actions;
}
+10 -14
View File
@@ -115,6 +115,12 @@ mmcli_modem_options_enabled (void)
exit (EXIT_FAILURE);
}
if (monitor_state_flag)
mmcli_force_async_operation ();
if (info_flag)
mmcli_force_sync_operation ();
return !!n_actions;
}
@@ -436,16 +442,8 @@ get_modem_ready (GObject *source,
ctx->object = mmcli_get_modem_finish (result);
ctx->modem = mm_object_get_modem (ctx->object);
/* Request to get info from modem? */
if (info_flag) {
/* TODO */
/* mm_modem_get_info_async (ctxt.modem, */
/* cancellable, */
/* (GAsyncReadyCallback)get_info_ready, */
/* NULL); */
return;
}
if (info_flag)
g_assert_not_reached ();
/* Request to monitor modems? */
if (monitor_state_flag) {
@@ -530,10 +528,8 @@ mmcli_modem_run_synchronous (GDBusConnection *connection)
{
GError *error = NULL;
if (monitor_state_flag) {
g_printerr ("error: monitoring state cannot be done synchronously\n");
exit (EXIT_FAILURE);
}
if (monitor_state_flag)
g_assert_not_reached ();
/* Initialize context */
ctx = g_new0 (Context, 1);
+24 -11
View File
@@ -144,6 +144,24 @@ mmcli_async_operation_done (void)
g_main_loop_quit (loop);
}
void
mmcli_force_async_operation (void)
{
if (!async_flag) {
g_debug ("Forcing request to be run asynchronously");
async_flag = TRUE;
}
}
void
mmcli_force_sync_operation (void)
{
if (async_flag) {
g_debug ("Ignoring request to run asynchronously");
async_flag = FALSE;
}
}
gint
main (gint argc, gchar **argv)
{
@@ -184,12 +202,9 @@ main (gint argc, gchar **argv)
exit (EXIT_FAILURE);
}
/* Setup context for asynchronous operations */
if (async_flag) {
g_debug ("Running asynchronous operations...");
loop = g_main_loop_new (NULL, FALSE);
cancellable = g_cancellable_new ();
}
/* Create requirements for async options */
cancellable = g_cancellable_new ();
loop = g_main_loop_new (NULL, FALSE);
/* Manager options? */
if (mmcli_manager_options_enabled ()) {
@@ -219,12 +234,8 @@ main (gint argc, gchar **argv)
}
/* Run loop only in async operations */
if (async_flag) {
if (async_flag)
g_main_loop_run (loop);
if (cancellable)
g_object_unref (cancellable);
g_main_loop_unref (loop);
}
if (mmcli_manager_options_enabled ()) {
mmcli_manager_shutdown ();
@@ -232,6 +243,8 @@ main (gint argc, gchar **argv)
mmcli_modem_shutdown ();
}
g_object_unref (cancellable);
g_main_loop_unref (loop);
g_object_unref (connection);
return EXIT_SUCCESS;
+3 -1
View File
@@ -24,7 +24,9 @@
#define __MMCLI_H__
/* Common */
void mmcli_async_operation_done (void);
void mmcli_async_operation_done (void);
void mmcli_force_async_operation (void);
void mmcli_force_sync_operation (void);
/* Manager group */
GOptionGroup *mmcli_manager_get_option_group (void);