Hi Andrzej,
On Fri, Feb 4, 2011 at 1:58 PM, andrzej zaborowski <[email protected]> wrote:
> 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.
Indeed. I'll fix this.
>> +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?
ok.
>
>> +
>> + 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.
ok.
> I also wonder if we need to check that (entry->flags &
> OFONO_SMS_SUBMIT_FLAG_EXPOSE_DBUS) and update some property.
It's already handled inside sms_tx_queue_remove_entry().
thanks,
Lucas De Marchi
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono