aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2009-06-19 12:43:37 -0400
committerDan Williams <dcbw@redhat.com>2009-06-19 12:43:37 -0400
commit6d4616c1d3641d5074e3df6b04c99a593bbfe2bc (patch)
treee8df6d02b3e88be1fd7d6598f5f2408e21fb5aaa
parent88bdb5d29ac291589489f9b646f95fed0b87d281 (diff)
modem: move GetInfo from GsmCard -> Modem interface
It's generic, everything implements some variant of +GMM, +GMR, and +GMI.
-rw-r--r--introspection/mm-modem-gsm-card.xml13
-rw-r--r--introspection/mm-modem.xml13
-rw-r--r--src/mm-generic-cdma.c95
-rw-r--r--src/mm-generic-gsm.c14
-rw-r--r--src/mm-modem-gsm-card.c86
-rw-r--r--src/mm-modem-gsm-card.h15
-rw-r--r--src/mm-modem.c83
-rw-r--r--src/mm-modem.h15
-rwxr-xr-xtest/mm-test.py8
9 files changed, 218 insertions, 124 deletions
diff --git a/introspection/mm-modem-gsm-card.xml b/introspection/mm-modem-gsm-card.xml
index 91b0c00e..b7f66d6f 100644
--- a/introspection/mm-modem-gsm-card.xml
+++ b/introspection/mm-modem-gsm-card.xml
@@ -28,19 +28,6 @@
</arg>
</method>
- <method name="GetInfo">
- <tp:docstring>
- Get the card information (manufacturer, modem, version).
- </tp:docstring>
- <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
- <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_gsm_modem_get_info"/>
- <arg name="info" type="(sss)" direction="out">
- <tp:docstring>
- Structure containing manufacturer, model, and version (revision) of the card.
- </tp:docstring>
- </arg>
- </method>
-
<method name="SendPuk">
<tp:docstring>
Send the PUK and a new PIN to unlock the SIM card.
diff --git a/introspection/mm-modem.xml b/introspection/mm-modem.xml
index 470b4a3d..802c46b2 100644
--- a/introspection/mm-modem.xml
+++ b/introspection/mm-modem.xml
@@ -49,6 +49,19 @@
</arg>
</method>
+ <method name="GetInfo">
+ <tp:docstring>
+ Get the card information (manufacturer, modem, version).
+ </tp:docstring>
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_modem_get_info"/>
+ <arg name="info" type="(sss)" direction="out">
+ <tp:docstring>
+ Structure containing manufacturer, model, and version (revision) of the card.
+ </tp:docstring>
+ </arg>
+ </method>
+
<property name="Device" type="s" access="read">
<tp:docstring>
The modem port to use for IP configuration and traffic.
diff --git a/src/mm-generic-cdma.c b/src/mm-generic-cdma.c
index 984b8aa8..2ee811a7 100644
--- a/src/mm-generic-cdma.c
+++ b/src/mm-generic-cdma.c
@@ -249,6 +249,100 @@ disconnect (MMModem *modem,
}
static void
+card_info_invoke (MMCallbackInfo *info)
+{
+ MMModemInfoFn callback = (MMModemInfoFn) info->callback;
+
+ callback (info->modem,
+ (char *) mm_callback_info_get_data (info, "card-info-manufacturer"),
+ (char *) mm_callback_info_get_data (info, "card-info-model"),
+ (char *) mm_callback_info_get_data (info, "card-info-version"),
+ info->error, info->user_data);
+}
+
+static const char *
+strip_info_response (const char *resp, const char *cmd)
+{
+ const char *p = resp;
+
+ if (p) {
+ if (!strncmp (p, cmd, strlen (cmd)))
+ p += strlen (cmd);
+ }
+ return p;
+}
+
+static void
+get_version_done (MMSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+ const char *p;
+
+ if (!error) {
+ p = strip_info_response (response->str, "+GMR:");
+ mm_callback_info_set_data (info, "card-info-version", g_strdup (p), g_free);
+ } else if (!info->error)
+ info->error = g_error_copy (error);
+
+ mm_callback_info_schedule (info);
+}
+
+static void
+get_model_done (MMSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+ const char *p;
+
+ if (!error) {
+ p = strip_info_response (response->str, "+GMM:");
+ mm_callback_info_set_data (info, "card-info-model", g_strdup (p), g_free);
+ } else if (!info->error)
+ info->error = g_error_copy (error);
+}
+
+static void
+get_manufacturer_done (MMSerialPort *port,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+ const char *p;
+
+ if (!error) {
+ p = strip_info_response (response->str, "+GMI:");
+ mm_callback_info_set_data (info, "card-info-manufacturer", g_strdup (p), g_free);
+ } else
+ info->error = g_error_copy (error);
+}
+
+static void
+get_card_info (MMModem *modem,
+ MMModemInfoFn callback,
+ gpointer user_data)
+{
+ MMGenericCdmaPrivate *priv = MM_GENERIC_CDMA_GET_PRIVATE (modem);
+ MMCallbackInfo *info;
+
+ info = mm_callback_info_new_full (MM_MODEM (modem),
+ card_info_invoke,
+ G_CALLBACK (callback),
+ user_data);
+
+ mm_serial_port_queue_command_cached (priv->primary, "+GMI", 3, get_manufacturer_done, info);
+ mm_serial_port_queue_command_cached (priv->primary, "+GMM", 3, get_model_done, info);
+ mm_serial_port_queue_command_cached (priv->primary, "+GMR", 3, get_version_done, info);
+}
+
+/*****************************************************************************/
+
+static void
get_signal_quality_done (MMSerialPort *port,
GString *response,
GError *error,
@@ -456,6 +550,7 @@ modem_init (MMModem *modem_class)
modem_class->enable = enable;
modem_class->connect = connect;
modem_class->disconnect = disconnect;
+ modem_class->get_info = get_card_info;
}
static void
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c
index 9c0a6a51..0a5ee92b 100644
--- a/src/mm-generic-gsm.c
+++ b/src/mm-generic-gsm.c
@@ -421,11 +421,11 @@ get_imsi (MMModemGsmCard *modem,
}
static void
-gsm_card_info_invoke (MMCallbackInfo *info)
+card_info_invoke (MMCallbackInfo *info)
{
- MMModemGsmCardInfoFn callback = (MMModemGsmCardInfoFn) info->callback;
+ MMModemInfoFn callback = (MMModemInfoFn) info->callback;
- callback (MM_MODEM_GSM_CARD (info->modem),
+ callback (info->modem,
(char *) mm_callback_info_get_data (info, "card-info-manufacturer"),
(char *) mm_callback_info_get_data (info, "card-info-model"),
(char *) mm_callback_info_get_data (info, "card-info-version"),
@@ -477,15 +477,15 @@ get_manufacturer_done (MMSerialPort *port,
}
static void
-get_card_info (MMModemGsmCard *modem,
- MMModemGsmCardInfoFn callback,
+get_card_info (MMModem *modem,
+ MMModemInfoFn callback,
gpointer user_data)
{
MMGenericGsmPrivate *priv = MM_GENERIC_GSM_GET_PRIVATE (modem);
MMCallbackInfo *info;
info = mm_callback_info_new_full (MM_MODEM (modem),
- gsm_card_info_invoke,
+ card_info_invoke,
G_CALLBACK (callback),
user_data);
@@ -1662,6 +1662,7 @@ modem_init (MMModem *modem_class)
modem_class->enable = enable;
modem_class->connect = connect;
modem_class->disconnect = disconnect;
+ modem_class->get_info = get_card_info;
}
static void
@@ -1669,7 +1670,6 @@ modem_gsm_card_init (MMModemGsmCard *class)
{
class->get_imei = get_imei;
class->get_imsi = get_imsi;
- class->get_info = get_card_info;
class->send_pin = send_pin;
class->send_puk = send_puk;
class->enable_pin = enable_pin;
diff --git a/src/mm-modem-gsm-card.c b/src/mm-modem-gsm-card.c
index 85385b25..1ad48cd5 100644
--- a/src/mm-modem-gsm-card.c
+++ b/src/mm-modem-gsm-card.c
@@ -12,9 +12,6 @@ static void impl_gsm_modem_get_imei (MMModemGsmCard *modem,
static void impl_gsm_modem_get_imsi (MMModemGsmCard *modem,
DBusGMethodInvocation *context);
-static void impl_gsm_modem_get_info (MMModemGsmCard *modem,
- DBusGMethodInvocation *context);
-
static void impl_gsm_modem_send_pin (MMModemGsmCard *modem,
const char *pin,
DBusGMethodInvocation *context);
@@ -64,68 +61,6 @@ str_call_not_supported (MMModemGsmCard *self,
}
static void
-info_call_done (MMModemGsmCard *self,
- const char *manufacturer,
- const char *model,
- const char *version,
- GError *error,
- gpointer user_data)
-{
- DBusGMethodInvocation *context = (DBusGMethodInvocation *) user_data;
-
- if (error)
- dbus_g_method_return_error (context, error);
- else {
- GValueArray *array;
- GValue value = { 0, };
-
- array = g_value_array_new (3);
-
- /* Manufacturer */
- g_value_init (&value, G_TYPE_STRING);
- g_value_set_string (&value, manufacturer);
- g_value_array_append (array, &value);
- g_value_unset (&value);
-
- /* Model */
- g_value_init (&value, G_TYPE_STRING);
- g_value_set_string (&value, model);
- g_value_array_append (array, &value);
- g_value_unset (&value);
-
- /* Version */
- g_value_init (&value, G_TYPE_STRING);
- g_value_set_string (&value, version);
- g_value_array_append (array, &value);
- g_value_unset (&value);
-
- dbus_g_method_return (context, array);
- }
-}
-
-static void
-info_invoke (MMCallbackInfo *info)
-{
- MMModemGsmCardInfoFn callback = (MMModemGsmCardInfoFn) info->callback;
-
- callback (MM_MODEM_GSM_CARD (info->modem), NULL, NULL, NULL, info->error, info->user_data);
-}
-
-static void
-info_call_not_supported (MMModemGsmCard *self,
- MMModemGsmCardInfoFn callback,
- gpointer user_data)
-{
- MMCallbackInfo *info;
-
- info = mm_callback_info_new_full (MM_MODEM (self), info_invoke, G_CALLBACK (callback), user_data);
- info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED,
- "Operation not supported");
-
- mm_callback_info_schedule (info);
-}
-
-static void
async_call_done (MMModem *modem, GError *error, gpointer user_data)
{
DBusGMethodInvocation *context = (DBusGMethodInvocation *) user_data;
@@ -180,20 +115,6 @@ mm_modem_gsm_card_get_imsi (MMModemGsmCard *self,
}
void
-mm_modem_gsm_card_get_info (MMModemGsmCard *self,
- MMModemGsmCardInfoFn callback,
- gpointer user_data)
-{
- g_return_if_fail (MM_IS_MODEM_GSM_CARD (self));
- g_return_if_fail (callback != NULL);
-
- if (MM_MODEM_GSM_CARD_GET_INTERFACE (self)->get_info)
- MM_MODEM_GSM_CARD_GET_INTERFACE (self)->get_info (self, callback, user_data);
- else
- info_call_not_supported (self, callback, user_data);
-}
-
-void
mm_modem_gsm_card_send_puk (MMModemGsmCard *self,
const char *puk,
const char *pin,
@@ -279,13 +200,6 @@ impl_gsm_modem_get_imsi (MMModemGsmCard *modem,
}
static void
-impl_gsm_modem_get_info (MMModemGsmCard *modem,
- DBusGMethodInvocation *context)
-{
- mm_modem_gsm_card_get_info (modem, info_call_done, context);
-}
-
-static void
impl_gsm_modem_send_puk (MMModemGsmCard *modem,
const char *puk,
const char *pin,
diff --git a/src/mm-modem-gsm-card.h b/src/mm-modem-gsm-card.h
index 50323810..5c6f55f4 100644
--- a/src/mm-modem-gsm-card.h
+++ b/src/mm-modem-gsm-card.h
@@ -12,13 +12,6 @@
typedef struct _MMModemGsmCard MMModemGsmCard;
-typedef void (*MMModemGsmCardInfoFn) (MMModemGsmCard *self,
- const char *manufacturer,
- const char *model,
- const char *version,
- GError *error,
- gpointer user_data);
-
struct _MMModemGsmCard {
GTypeInterface g_iface;
@@ -31,10 +24,6 @@ struct _MMModemGsmCard {
MMModemStringFn callback,
gpointer user_data);
- void (*get_info) (MMModemGsmCard *self,
- MMModemGsmCardInfoFn callback,
- gpointer user_data);
-
void (*send_puk) (MMModemGsmCard *self,
const char *puk,
const char *pin,
@@ -69,10 +58,6 @@ void mm_modem_gsm_card_get_imsi (MMModemGsmCard *self,
MMModemStringFn callback,
gpointer user_data);
-void mm_modem_gsm_card_get_info (MMModemGsmCard *self,
- MMModemGsmCardInfoFn callback,
- gpointer user_data);
-
void mm_modem_gsm_card_send_puk (MMModemGsmCard *self,
const char *puk,
const char *pin,
diff --git a/src/mm-modem.c b/src/mm-modem.c
index be87b79f..63a8929e 100644
--- a/src/mm-modem.c
+++ b/src/mm-modem.c
@@ -10,6 +10,7 @@ static void impl_modem_enable (MMModem *modem, gboolean enable, DBusGMethodInvoc
static void impl_modem_connect (MMModem *modem, const char *number, DBusGMethodInvocation *context);
static void impl_modem_disconnect (MMModem *modem, DBusGMethodInvocation *context);
static void impl_modem_get_ip4_config (MMModem *modem, DBusGMethodInvocation *context);
+static void impl_modem_get_info (MMModem *modem, DBusGMethodInvocation *context);
#include "mm-modem-glue.h"
@@ -196,6 +197,88 @@ impl_modem_disconnect (MMModem *modem,
mm_modem_disconnect (modem, async_call_done, context);
}
+static void
+info_call_done (MMModem *self,
+ const char *manufacturer,
+ const char *model,
+ const char *version,
+ GError *error,
+ gpointer user_data)
+{
+ DBusGMethodInvocation *context = (DBusGMethodInvocation *) user_data;
+
+ if (error)
+ dbus_g_method_return_error (context, error);
+ else {
+ GValueArray *array;
+ GValue value = { 0, };
+
+ array = g_value_array_new (3);
+
+ /* Manufacturer */
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, manufacturer);
+ g_value_array_append (array, &value);
+ g_value_unset (&value);
+
+ /* Model */
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, model);
+ g_value_array_append (array, &value);
+ g_value_unset (&value);
+
+ /* Version */
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, version);
+ g_value_array_append (array, &value);
+ g_value_unset (&value);
+
+ dbus_g_method_return (context, array);
+ }
+}
+
+static void
+info_invoke (MMCallbackInfo *info)
+{
+ MMModemInfoFn callback = (MMModemInfoFn) info->callback;
+
+ callback (info->modem, NULL, NULL, NULL, info->error, info->user_data);
+}
+
+static void
+info_call_not_supported (MMModem *self,
+ MMModemInfoFn callback,
+ gpointer user_data)
+{
+ MMCallbackInfo *info;
+
+ info = mm_callback_info_new_full (MM_MODEM (self), info_invoke, G_CALLBACK (callback), user_data);
+ info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED,
+ "Operation not supported");
+
+ mm_callback_info_schedule (info);
+}
+
+void
+mm_modem_get_info (MMModem *self,
+ MMModemInfoFn callback,
+ gpointer user_data)
+{
+ g_return_if_fail (MM_IS_MODEM (self));
+ g_return_if_fail (callback != NULL);
+
+ if (MM_MODEM_GET_INTERFACE (self)->get_info)
+ MM_MODEM_GET_INTERFACE (self)->get_info (self, callback, user_data);
+ else
+ info_call_not_supported (self, callback, user_data);
+}
+
+static void
+impl_modem_get_info (MMModem *modem,
+ DBusGMethodInvocation *context)
+{
+ mm_modem_get_info (modem, info_call_done, context);
+}
/*****************************************************************************/
diff --git a/src/mm-modem.h b/src/mm-modem.h
index 19ec284d..5a2c3a8a 100644
--- a/src/mm-modem.h
+++ b/src/mm-modem.h
@@ -60,6 +60,13 @@ typedef void (*MMModemIp4Fn) (MMModem *modem,
GError *error,
gpointer user_data);
+typedef void (*MMModemInfoFn) (MMModem *modem,
+ const char *manufacturer,
+ const char *model,
+ const char *version,
+ GError *error,
+ gpointer user_data);
+
struct _MMModem {
GTypeInterface g_iface;
@@ -94,6 +101,10 @@ struct _MMModem {
void (*disconnect) (MMModem *self,
MMModemFn callback,
gpointer user_data);
+
+ void (*get_info) (MMModem *self,
+ MMModemInfoFn callback,
+ gpointer user_data);
};
GType mm_modem_get_type (void);
@@ -129,6 +140,10 @@ void mm_modem_disconnect (MMModem *self,
MMModemFn callback,
gpointer user_data);
+void mm_modem_get_info (MMModem *self,
+ MMModemInfoFn callback,
+ gpointer user_data);
+
gboolean mm_modem_get_valid (MMModem *self);
char *mm_modem_get_device (MMModem *self);
diff --git a/test/mm-test.py b/test/mm-test.py
index 62685796..67322984 100755
--- a/test/mm-test.py
+++ b/test/mm-test.py
@@ -71,9 +71,6 @@ def inspect_gsm(proxy):
pass
print "IMSI: %s" % card.GetImsi()
- info = card.GetInfo()
- print "Vendor: '%s' Model: '%s' Version: '%s'" % info
-
# Gsm.Network interface
net = dbus.Interface(proxy, dbus_interface=MM_DBUS_INTERFACE_MODEM_GSM_NETWORK)
print "Signal quality: %d" % net.GetSignalQuality()
@@ -130,6 +127,11 @@ for m in modems:
modem = dbus.Interface(proxy, dbus_interface=MM_DBUS_INTERFACE_MODEM)
modem.Enable(True)
+ info = modem.GetInfo()
+ print "Vendor: %s" % info[0]
+ print "Model: %s" % info[1]
+ print "Version: %s" % info[2]
+
if type == 1:
inspect_gsm(proxy)
elif type == 2: