Hi,

On 4 February 2011 16:02, Lucas De Marchi <[email protected]> wrote:
> Based on patch from Yang Gu <[email protected]>
> ---
>  src/sms.c |   82 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 82 insertions(+), 0 deletions(-)
>
> diff --git a/src/sms.c b/src/sms.c
> index 7db91cb..91b0a31 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,85 @@ 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;
> +
> +       uuidstr = path + strlen(path) - OFONO_SHA1_UUID_LEN * 2;
> +
> +       if (decode_hex_own_buf(uuidstr, -1, NULL, 0, uuid->uuid) == NULL)
> +               return FALSE;

I think you need to at least check that strlen(path) >=
OFONO_SHA1_UUID_LEN * 2 or we might segfault.

> +
> +       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_failed(msg);

Maybe __ofono_error_not_found?

> +
> +       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);

As you mentioned on IRC we may need to call the "submitted" callback
with ok == FALSE.

I also wonder if we need to check that (entry->flags &
OFONO_SMS_SUBMIT_FLAG_EXPOSE_DBUS) and update some property.

Best regards
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to