aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathan Williams <njw@chromium.org>2012-01-23 11:04:49 -0500
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:15:06 +0100
commit3c41ce5d8b238e6a3a2cf101885e3a2df8efae0e (patch)
tree00a8151142494e9ca310e3d8b72093781650aea9 /src
parent54c2daf937e3bc6062d5b867c1b0490381de711e (diff)
api,dbus: new `Command' method in the API to send arbitrary AT commands
BUG=chromium-os:25348 TEST="mmcli -m 0 --command='E0'" Change-Id: I320587560fde5780f9d5a4998e32364d36a71ed7
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem.c31
-rw-r--r--src/mm-iface-modem.c56
-rw-r--r--src/mm-iface-modem.h10
3 files changed, 97 insertions, 0 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 6d9b16fa..0baff2d5 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -1862,6 +1862,35 @@ modem_power_up (MMIfaceModem *self,
}
/*****************************************************************************/
+/* Sending a command to the modem (Modem interface) */
+
+static const gchar *
+modem_command_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return mm_base_modem_at_command_finish (MM_BASE_MODEM (self),
+ res,
+ error);
+}
+
+static void
+modem_command (MMIfaceModem *self,
+ const gchar *cmd,
+ guint timeout,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+
+ mm_base_modem_at_command (MM_BASE_MODEM (self), cmd, timeout,
+ FALSE,
+ NULL, /* cancellable */
+ callback,
+ user_data);
+}
+
+
+/*****************************************************************************/
/* Initializing the modem (Modem interface) */
static gboolean
@@ -6668,6 +6697,8 @@ iface_modem_init (MMIfaceModem *iface)
iface->load_signal_quality_finish = modem_load_signal_quality_finish;
iface->create_bearer = modem_create_bearer;
iface->create_bearer_finish = modem_create_bearer_finish;
+ iface->command = modem_command;
+ iface->command_finish = modem_command_finish;
}
static void
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index 17bf93a8..a6e1968c 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -20,6 +20,7 @@
#include "mm-modem-helpers.h"
#include "mm-iface-modem.h"
#include "mm-base-modem.h"
+#include "mm-base-modem-at.h"
#include "mm-sim.h"
#include "mm-bearer-list.h"
#include "mm-log.h"
@@ -302,6 +303,57 @@ handle_create_bearer (MmGdbusModem *skeleton,
return TRUE;
}
+static void
+command_done (MMIfaceModem *self,
+ GAsyncResult *res,
+ DbusCallContext *ctx)
+{
+ GError *error = NULL;
+ const gchar *result;
+
+ result = MM_IFACE_MODEM_GET_INTERFACE (self)->command_finish (self,
+ res,
+ &error);
+ if (error)
+ g_dbus_method_invocation_take_error (ctx->invocation,
+ error);
+ else
+ mm_gdbus_modem_complete_command (ctx->skeleton,
+ ctx->invocation,
+ result);
+ dbus_call_context_free (ctx);
+}
+
+static gboolean
+handle_command (MmGdbusModem *skeleton,
+ GDBusMethodInvocation *invocation,
+ const gchar *cmd,
+ guint timeout,
+ MMIfaceModem *self)
+{
+
+ /* If command is not implemented, report an error */
+ if (!MM_IFACE_MODEM_GET_INTERFACE (self)->command ||
+ !MM_IFACE_MODEM_GET_INTERFACE (self)->command_finish) {
+ g_dbus_method_invocation_return_error (invocation,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_UNSUPPORTED,
+ "Cannot send AT command to modem: "
+ "operation not supported");
+ return TRUE;
+ }
+
+ MM_IFACE_MODEM_GET_INTERFACE (self)->command (self,
+ cmd,
+ timeout,
+ (GAsyncReadyCallback)command_done,
+ dbus_call_context_new (skeleton,
+ invocation,
+ self));
+
+ return TRUE;
+}
+
/*****************************************************************************/
static gboolean
@@ -2921,6 +2973,10 @@ interface_initialization_step (InitializationContext *ctx)
G_CALLBACK (handle_create_bearer),
ctx->self);
g_signal_connect (ctx->skeleton,
+ "handle-command",
+ G_CALLBACK (handle_command),
+ ctx->self);
+ g_signal_connect (ctx->skeleton,
"handle-delete-bearer",
G_CALLBACK (handle_delete_bearer),
ctx->self);
diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h
index de2564ec..f5a16252 100644
--- a/src/mm-iface-modem.h
+++ b/src/mm-iface-modem.h
@@ -163,6 +163,16 @@ struct _MMIfaceModem {
GAsyncResult *res,
GError **error);
+ /* Asynchronous command operation */
+ void (*command) (MMIfaceModem *self,
+ const gchar *cmd,
+ guint timeout,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+ const gchar * (*command_finish) (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error);
+
/* Asynchronous allowed band setting operation */
void (*set_allowed_bands) (MMIfaceModem *self,
GArray *bands_array,