aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2009-06-18 22:48:51 -0400
committerDan Williams <dcbw@redhat.com>2009-06-18 22:48:51 -0400
commitaa8d3241e51c32b0582a339eb200ca4fa1bae574 (patch)
tree2dfca5d1c9fac39395907c26dd3945b3410c09fa /src
parent53d6ca970c0a670a14492033674d5e7f93772e8d (diff)
moto-c: add plugin for Motorola C-series phones and BUSlink SCWi275u
Diffstat (limited to 'src')
-rw-r--r--src/mm-generic-gsm.c86
-rw-r--r--src/mm-generic-gsm.h18
2 files changed, 98 insertions, 6 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c
index 3cf8ab8c..0397614c 100644
--- a/src/mm-generic-gsm.c
+++ b/src/mm-generic-gsm.c
@@ -295,6 +295,7 @@ init_done (MMSerialPort *port,
gpointer user_data)
{
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+ char *cmd = NULL;
if (error) {
info->error = g_error_copy (error);
@@ -305,14 +306,24 @@ init_done (MMSerialPort *port,
else
mm_serial_port_queue_command (port, "+CREG=0", 5, NULL, NULL);
- mm_serial_port_queue_command (port, "+CFUN=1", 5, enable_done, user_data);
+ g_object_get (G_OBJECT (info->modem), MM_GENERIC_GSM_POWER_UP_CMD, &cmd, NULL);
+ if (cmd && strlen (cmd))
+ mm_serial_port_queue_command (port, cmd, 5, enable_done, user_data);
+ else
+ enable_done (port, NULL, NULL, user_data);
+ g_free (cmd);
}
}
static void
enable_flash_done (MMSerialPort *port, gpointer user_data)
{
- mm_serial_port_queue_command (port, "Z E0 V1 X4 &C1 +CMEE=1", 3, init_done, user_data);
+ MMCallbackInfo *info = user_data;
+ char *cmd = NULL;
+
+ g_object_get (G_OBJECT (info->modem), MM_GENERIC_GSM_INIT_CMD, &cmd, NULL);
+ mm_serial_port_queue_command (port, cmd, 3, init_done, user_data);
+ g_free (cmd);
}
static void
@@ -328,7 +339,15 @@ disable_done (MMSerialPort *port,
static void
disable_flash_done (MMSerialPort *port, gpointer user_data)
{
- mm_serial_port_queue_command (port, "+CFUN=0", 5, disable_done, user_data);
+ MMCallbackInfo *info = user_data;
+ char *cmd = NULL;
+
+ g_object_get (G_OBJECT (info->modem), MM_GENERIC_GSM_POWER_UP_CMD, &cmd, NULL);
+ if (cmd && strlen (cmd))
+ mm_serial_port_queue_command (port, cmd, 5, disable_done, user_data);
+ else
+ disable_done (port, NULL, NULL, user_data);
+ g_free (cmd);
}
static void
@@ -1018,22 +1037,27 @@ scan_done (MMSerialPort *port,
if (error)
info->error = g_error_copy (error);
- else if (!strncmp (reply, "+COPS: ", 7)) {
+ else if (strstr (reply, "+COPS: ")) {
/* Got valid reply */
GPtrArray *results;
GRegex *r;
GMatchInfo *match_info;
GError *err = NULL;
- reply += 7;
+ reply = strstr (reply, "+COPS: ") + 7;
/* Pattern without crazy escaping using | for matching: (|\d|,"|.+|","|.+|","|.+|"\)?,|\d|) */
/* Quirk: Sony-Ericsson TM-506 sometimes includes a stray ')' like so:
*
* +COPS: (2,"","T-Mobile","31026",0),(1,"AT&T","AT&T","310410"),0)
+ *
+ * Quirk: Motorola C-series (BUSlink SCWi275u) don't include the operator
+ * number, like so:
+ *
+ * +COPS: (2,"T-Mobile","","310260"),(0,"Cingular Wireless","","310410")
*/
- r = g_regex_new ("\\((\\d),\"(.*)\",\"(.*)\",\"(.*)\"\\)?,(\\d)\\)", G_REGEX_UNGREEDY, 0, &err);
+ r = g_regex_new ("\\((\\d),\"(.*)\",\"(.*)\",\"(.*)\"\\)?[,]?[(\\d)]?\\)", G_REGEX_UNGREEDY, 0, &err);
if (err) {
g_error ("Invalid regular expression: %s", err->message);
g_error_free (err);
@@ -1370,6 +1394,21 @@ sms_send (MMModemGsmSms *modem,
g_free (command);
}
+MMSerialPort *
+mm_generic_gsm_get_port (MMGenericGsm *modem,
+ MMSerialPortType ptype)
+{
+ g_return_val_if_fail (MM_IS_GENERIC_GSM (modem), NULL);
+ g_return_val_if_fail (ptype != MM_SERIAL_PORT_TYPE_UNKNOWN, NULL);
+
+ if (ptype == MM_SERIAL_PORT_TYPE_PRIMARY)
+ return MM_GENERIC_GSM_GET_PRIVATE (modem)->primary;
+ else if (ptype == MM_SERIAL_PORT_TYPE_SECONDARY)
+ return MM_GENERIC_GSM_GET_PRIVATE (modem)->secondary;
+
+ return NULL;
+}
+
/*****************************************************************************/
/* MMModemSimple interface */
@@ -1689,6 +1728,8 @@ set_property (GObject *object, guint prop_id,
break;
case MM_MODEM_PROP_TYPE:
case MM_MODEM_PROP_VALID:
+ case MM_GENERIC_GSM_PROP_POWER_UP_CMD:
+ case MM_GENERIC_GSM_PROP_POWER_DOWN_CMD:
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -1727,6 +1768,15 @@ get_property (GObject *object, guint prop_id,
case MM_MODEM_PROP_VALID:
g_value_set_boolean (value, priv->valid);
break;
+ case MM_GENERIC_GSM_PROP_POWER_UP_CMD:
+ g_value_set_string (value, "+CFUN=1");
+ break;
+ case MM_GENERIC_GSM_PROP_POWER_DOWN_CMD:
+ g_value_set_string (value, "+CFUN=0");
+ break;
+ case MM_GENERIC_GSM_PROP_INIT_CMD:
+ g_value_set_string (value, "Z E0 V1 X4 &C1 +CMEE=1");
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1789,6 +1839,30 @@ mm_generic_gsm_class_init (MMGenericGsmClass *klass)
g_object_class_override_property (object_class,
MM_MODEM_PROP_VALID,
MM_MODEM_VALID);
+
+ g_object_class_install_property
+ (object_class, MM_GENERIC_GSM_PROP_POWER_UP_CMD,
+ g_param_spec_string (MM_GENERIC_GSM_POWER_UP_CMD,
+ "PowerUpCommand",
+ "Power up command",
+ "+CFUN=1",
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+ g_object_class_install_property
+ (object_class, MM_GENERIC_GSM_PROP_POWER_DOWN_CMD,
+ g_param_spec_string (MM_GENERIC_GSM_POWER_DOWN_CMD,
+ "PowerDownCommand",
+ "Power down command",
+ "+CFUN=0",
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+ g_object_class_install_property
+ (object_class, MM_GENERIC_GSM_PROP_INIT_CMD,
+ g_param_spec_string (MM_GENERIC_GSM_INIT_CMD,
+ "InitCommand",
+ "Initialization command",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
GType
diff --git a/src/mm-generic-gsm.h b/src/mm-generic-gsm.h
index a98afefa..4178ef1d 100644
--- a/src/mm-generic-gsm.h
+++ b/src/mm-generic-gsm.h
@@ -13,6 +13,21 @@
#define MM_IS_GENERIC_GSM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_GENERIC_GSM))
#define MM_GENERIC_GSM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_GENERIC_GSM, MMGenericGsmClass))
+#define MM_GENERIC_GSM_POWER_UP_CMD "power-up-cmd"
+#define MM_GENERIC_GSM_POWER_DOWN_CMD "power-down-cmd"
+#define MM_GENERIC_GSM_INIT_CMD "init-cmd"
+
+typedef enum {
+ MM_GENERIC_GSM_PROP_FIRST = 0x2000,
+
+ MM_GENERIC_GSM_PROP_POWER_UP_CMD,
+ MM_GENERIC_GSM_PROP_POWER_DOWN_CMD,
+ MM_GENERIC_GSM_PROP_INIT_CMD,
+
+ MM_GENERIC_GSM_LAST_PROP = MM_GENERIC_GSM_PROP_POWER_DOWN_CMD
+} MMGenericGsmProp;
+
+
typedef struct {
MMSerial parent;
} MMGenericGsm;
@@ -43,4 +58,7 @@ void mm_generic_gsm_check_pin (MMGenericGsm *modem,
MMModemFn callback,
gpointer user_data);
+MMSerialPort *mm_generic_gsm_get_port (MMGenericGsm *modem,
+ MMSerialPortType ptype);
+
#endif /* MM_GENERIC_GSM_H */