aboutsummaryrefslogtreecommitdiff
path: root/src/mm-generic-gsm.c
diff options
context:
space:
mode:
authorTambet Ingo <tambet@gmail.com>2009-03-23 13:28:22 +0200
committerTambet Ingo <tambet@gmail.com>2009-03-23 15:05:15 +0200
commit45f32e7e09aa3e35ff89b224df55c89c7beaa026 (patch)
tree317da3b198fd955985f45ba03e223bf584dee20d /src/mm-generic-gsm.c
parent697b5f0364cee038a685ac82b211993e2809eb75 (diff)
Implement sending SMS messages.
Add a test program to use the newly added method.
Diffstat (limited to 'src/mm-generic-gsm.c')
-rw-r--r--src/mm-generic-gsm.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c
index 250b8cf6..4520b8eb 100644
--- a/src/mm-generic-gsm.c
+++ b/src/mm-generic-gsm.c
@@ -6,6 +6,7 @@
#include "mm-generic-gsm.h"
#include "mm-modem-gsm-card.h"
#include "mm-modem-gsm-network.h"
+#include "mm-modem-gsm-sms.h"
#include "mm-modem-simple.h"
#include "mm-errors.h"
#include "mm-callback-info.h"
@@ -1153,6 +1154,46 @@ get_signal_quality (MMModemGsmNetwork *modem,
}
/*****************************************************************************/
+/* MMModemGsmSms interface */
+
+static void
+sms_send_done (MMSerial *serial,
+ GString *response,
+ GError *error,
+ gpointer user_data)
+{
+ MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+
+ if (error)
+ info->error = g_error_copy (error);
+
+ mm_callback_info_schedule (info);
+}
+
+static void
+sms_send (MMModemGsmSms *modem,
+ const char *number,
+ const char *text,
+ const char *smsc,
+ guint validity,
+ guint class,
+ MMModemFn callback,
+ gpointer user_data)
+{
+ MMCallbackInfo *info;
+ char *command;
+
+ info = mm_callback_info_new (MM_MODEM (modem), callback, user_data);
+
+ /* FIXME: use the PDU mode instead */
+ mm_serial_queue_command (MM_SERIAL (modem), "AT+CMGF=1", 3, NULL, NULL);
+
+ command = g_strdup_printf ("+CMGS=\"%s\"\r%s\x1a", number, text);
+ mm_serial_queue_command (MM_SERIAL (modem), command, 10, sms_send_done, info);
+ g_free (command);
+}
+
+/*****************************************************************************/
/* MMModemSimple interface */
typedef enum {
@@ -1427,6 +1468,12 @@ modem_gsm_network_init (MMModemGsmNetwork *class)
}
static void
+modem_gsm_sms_init (MMModemGsmSms *class)
+{
+ class->send = sms_send;
+}
+
+static void
modem_simple_init (MMModemSimple *class)
{
class->connect = simple_connect;
@@ -1580,6 +1627,10 @@ mm_generic_gsm_get_type (void)
(GInterfaceInitFunc) modem_gsm_network_init
};
+ static const GInterfaceInfo modem_gsm_sms_info = {
+ (GInterfaceInitFunc) modem_gsm_sms_init
+ };
+
static const GInterfaceInfo modem_simple_info = {
(GInterfaceInitFunc) modem_simple_init
};
@@ -1589,6 +1640,7 @@ mm_generic_gsm_get_type (void)
g_type_add_interface_static (generic_gsm_type, MM_TYPE_MODEM, &modem_iface_info);
g_type_add_interface_static (generic_gsm_type, MM_TYPE_MODEM_GSM_CARD, &modem_gsm_card_info);
g_type_add_interface_static (generic_gsm_type, MM_TYPE_MODEM_GSM_NETWORK, &modem_gsm_network_info);
+ g_type_add_interface_static (generic_gsm_type, MM_TYPE_MODEM_GSM_SMS, &modem_gsm_sms_info);
g_type_add_interface_static (generic_gsm_type, MM_TYPE_MODEM_SIMPLE, &modem_simple_info);
}