diff options
Diffstat (limited to 'src/mm-modem-gsm-sms.c')
-rw-r--r-- | src/mm-modem-gsm-sms.c | 153 |
1 files changed, 147 insertions, 6 deletions
diff --git a/src/mm-modem-gsm-sms.c b/src/mm-modem-gsm-sms.c index d74c7b3..ab20d3e 100644 --- a/src/mm-modem-gsm-sms.c +++ b/src/mm-modem-gsm-sms.c @@ -103,6 +103,34 @@ async_call_not_supported (MMModemGsmSms *self, mm_callback_info_schedule (info); } +static void +sms_get_done (MMModemGsmSms *self, + GHashTable *properties, + GError *error, + gpointer user_data) +{ + DBusGMethodInvocation *context = (DBusGMethodInvocation *) user_data; + + if (error) + dbus_g_method_return_error (context, error); + else + dbus_g_method_return (context, properties); +} + +static void +sms_list_done (MMModemGsmSms *self, + GPtrArray *results, + GError *error, + gpointer user_data) +{ + DBusGMethodInvocation *context = (DBusGMethodInvocation *) user_data; + + if (error) + dbus_g_method_return_error (context, error); + else + dbus_g_method_return (context, results); +} + /*****************************************************************************/ void @@ -127,6 +155,110 @@ mm_modem_gsm_sms_send (MMModemGsmSms *self, } +static void +sms_get_invoke (MMCallbackInfo *info) +{ + MMModemGsmSmsGetFn callback = (MMModemGsmSmsGetFn) info->callback; + + callback (MM_MODEM_GSM_SMS (info->modem), NULL, info->error, info->user_data); +} + +void +mm_modem_gsm_sms_get (MMModemGsmSms *self, + guint idx, + MMModemGsmSmsGetFn callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MODEM_GSM_SMS (self)); + g_return_if_fail (callback != NULL); + + if (MM_MODEM_GSM_SMS_GET_INTERFACE (self)->get) + MM_MODEM_GSM_SMS_GET_INTERFACE (self)->get (self, idx, callback, user_data); + else { + MMCallbackInfo *info; + + info = mm_callback_info_new_full (MM_MODEM (self), + sms_get_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_gsm_sms_delete (MMModemGsmSms *self, + guint idx, + MMModemFn callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MODEM_GSM_SMS (self)); + g_return_if_fail (callback != NULL); + + if (MM_MODEM_GSM_SMS_GET_INTERFACE (self)->delete) + MM_MODEM_GSM_SMS_GET_INTERFACE (self)->delete (self, idx, callback, user_data); + else + async_call_not_supported (self, callback, user_data); +} + +static void +sms_list_invoke (MMCallbackInfo *info) +{ + MMModemGsmSmsListFn callback = (MMModemGsmSmsListFn) info->callback; + + callback (MM_MODEM_GSM_SMS (info->modem), NULL, info->error, info->user_data); +} + +void +mm_modem_gsm_sms_list (MMModemGsmSms *self, + MMModemGsmSmsListFn callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MODEM_GSM_SMS (self)); + g_return_if_fail (callback != NULL); + + if (MM_MODEM_GSM_SMS_GET_INTERFACE (self)->list) + MM_MODEM_GSM_SMS_GET_INTERFACE (self)->list (self, callback, user_data); + else { + MMCallbackInfo *info; + + info = mm_callback_info_new_full (MM_MODEM (self), + sms_list_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_gsm_sms_received (MMModemGsmSms *self, + guint idx, + gboolean complete) +{ + g_return_if_fail (MM_IS_MODEM_GSM_SMS (self)); + + g_signal_emit (self, signals[SMS_RECEIVED], 0, + idx, + complete); +} + +void +mm_modem_gsm_sms_completed (MMModemGsmSms *self, + guint idx, + gboolean complete) +{ + g_return_if_fail (MM_IS_MODEM_GSM_SMS (self)); + + g_signal_emit (self, signals[COMPLETED], 0, + idx, + complete); +} + /*****************************************************************************/ typedef struct { @@ -144,7 +276,8 @@ sms_auth_info_destroy (gpointer data) { SmsAuthInfo *info = data; - g_hash_table_destroy (info->hash); + if (info->hash) + g_hash_table_destroy (info->hash); g_free (info->str); memset (info, 0, sizeof (SmsAuthInfo)); g_free (info); @@ -211,14 +344,18 @@ sms_delete_auth_cb (MMAuthRequest *req, gpointer user_data) { MMModemGsmSms *self = MM_MODEM_GSM_SMS (owner); + SmsAuthInfo *info = user_data; GError *error = NULL; + guint idx; /* Return any authorization error, otherwise delete the SMS */ if (!mm_modem_auth_finish (MM_MODEM (self), req, &error)) { dbus_g_method_return_error (context, error); g_error_free (error); - } else - async_call_not_supported (self, async_call_done, context); + } else { + idx = info->num1; + mm_modem_gsm_sms_delete (self, idx, async_call_done, context); + } } static void @@ -253,14 +390,18 @@ sms_get_auth_cb (MMAuthRequest *req, gpointer user_data) { MMModemGsmSms *self = MM_MODEM_GSM_SMS (owner); + SmsAuthInfo *info = user_data; + guint idx; GError *error = NULL; /* Return any authorization error, otherwise get the SMS */ if (!mm_modem_auth_finish (MM_MODEM (self), req, &error)) { dbus_g_method_return_error (context, error); g_error_free (error); - } else - async_call_not_supported (self, async_call_done, context); + } else { + idx = info->num1; + mm_modem_gsm_sms_get (self, idx, sms_get_done, context); + } } static void @@ -368,7 +509,7 @@ sms_list_auth_cb (MMAuthRequest *req, dbus_g_method_return_error (context, error); g_error_free (error); } else - async_call_not_supported (self, async_call_done, context); + mm_modem_gsm_sms_list (self, sms_list_done, context); } static void |