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