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

Reply via email to