Based on patch from Yang Gu <gya...@gmail.com>
---
 src/sms.c |   88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/src/sms.c b/src/sms.c
index dfec456..212a470 100644
--- a/src/sms.c
+++ b/src/sms.c
@@ -685,6 +685,8 @@ static gboolean tx_next(gpointer user_data)
                        || (entry->num_pdus - entry->cur_pdu) > 1)
                send_mms = 1;
 
+       sms->tx_state = MESSAGE_STATE_PENDING;
+
        sms->driver->submit(sms, pdu->pdu, pdu->pdu_len, pdu->tpdu_len,
                                send_mms, tx_finished, sms);
 
@@ -970,6 +972,91 @@ static DBusMessage *sms_get_messages(DBusConnection *conn, 
DBusMessage *msg,
        return reply;
 }
 
+static gboolean uuid_from_message_path(const char *path,
+                                               struct ofono_uuid *uuid)
+{
+       const char *uuidstr;
+       size_t len;
+
+       len = strlen(path);
+
+       if (len < OFONO_SHA1_UUID_LEN * 2)
+               return FALSE;
+
+       uuidstr = path + len - OFONO_SHA1_UUID_LEN * 2;
+
+       if (decode_hex_own_buf(uuidstr, -1, NULL, 0, uuid->uuid) == NULL)
+               return FALSE;
+
+       return TRUE;
+}
+
+static gint entry_compare_by_uuid(gconstpointer a, gconstpointer b)
+{
+       const struct tx_queue_entry *entry = a;
+       const char *uuid = b;
+
+       return memcmp(&entry->uuid, uuid, sizeof(entry->uuid));
+}
+
+static DBusMessage *sms_cancel_message(DBusConnection *conn, DBusMessage *msg,
+                                                               void *data)
+{
+       struct ofono_sms *sms = data;
+       char *path;
+       struct ofono_uuid uuid;
+       GList *l;
+       struct tx_queue_entry *entry;
+
+       if (sms->pending)
+               return __ofono_error_busy(msg);
+
+       if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
+                                       DBUS_TYPE_INVALID) == FALSE)
+               return __ofono_error_invalid_args(msg);
+
+       if (path[0] == '\0')
+               return __ofono_error_invalid_args(msg);
+
+       if (uuid_from_message_path(path, &uuid) == FALSE)
+               return __ofono_error_invalid_args(msg);
+
+       l = g_queue_find_custom(sms->txq, uuid.uuid, entry_compare_by_uuid);
+
+       if (l == NULL)
+               return __ofono_error_not_found(msg);
+
+       entry = l->data;
+
+       if (entry == g_queue_peek_head(sms->txq)) {
+               /*
+                * Fail if any pdu was already transmitted or if we are
+                * waiting the answer from driver.
+                */
+               if (entry->cur_pdu > 0 ||
+                                       sms->tx_state == MESSAGE_STATE_PENDING)
+                       return __ofono_error_failed(msg);
+
+               /*
+                * Make sure we don't call tx_next() if there are no entries
+                * and that next entry doesn't have to wait a 'retry time'
+                * from this one.
+                */
+               if (sms->tx_source) {
+                       g_source_remove(sms->tx_source);
+                       sms->tx_source = 0;
+
+                       if (g_queue_get_length(sms->txq) > 1)
+                               sms->tx_source = g_timeout_add(0, tx_next, sms);
+               }
+       }
+
+       sms->tx_state = MESSAGE_STATE_CANCELLED;
+       sms_tx_queue_remove_entry(sms, l);
+
+       return dbus_message_new_method_return(msg);
+}
+
 static GDBusMethodTable sms_manager_methods[] = {
        { "GetProperties",    "",    "a{sv}",        sms_get_properties,
                                                G_DBUS_METHOD_FLAG_ASYNC },
@@ -977,6 +1064,7 @@ static GDBusMethodTable sms_manager_methods[] = {
                                                G_DBUS_METHOD_FLAG_ASYNC },
        { "SendMessage",      "ss",  "o",             sms_send_message,
                                                G_DBUS_METHOD_FLAG_ASYNC },
+       { "CancelMessage",    "o",   "",              sms_cancel_message },
        { "GetMessages",       "",    "a(oa{sv})",    sms_get_messages },
        { }
 };
-- 
1.7.4

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to