diff --git a/obexd/client/transfer.c b/obexd/client/transfer.c
index bd2b1ab..0b5735b 100644
--- a/obexd/client/transfer.c
+++ b/obexd/client/transfer.c
TRANSFER_STATUS_ACTIVE,
TRANSFER_STATUS_SUSPENDED,
TRANSFER_STATUS_COMPLETE,
+ TRANSFER_STATUS_SUSPENDED_QUEUED,
TRANSFER_STATUS_ERROR
};
{
struct obc_transfer *transfer = user_data;
const char *sender;
+ uint8_t status;
sender = dbus_message_get_sender(message);
if (g_strcmp0(transfer->owner, sender) != 0)
ERROR_INTERFACE ".NotAuthorized",
"Not Authorized");
- if (transfer->xfer == 0)
+ switch (transfer->status) {
+ case TRANSFER_STATUS_QUEUED:
+ status = TRANSFER_STATUS_SUSPENDED_QUEUED;
+ break;
+ case TRANSFER_STATUS_ACTIVE:
+ if (transfer->xfer)
+ g_obex_suspend(transfer->obex);
+ status = TRANSFER_STATUS_SUSPENDED;
+ break;
+ default:
return g_dbus_create_error(message,
ERROR_INTERFACE ".NotInProgress",
"Not in progress");
+ }
- g_obex_suspend(transfer->obex);
-
- transfer_set_status(transfer, TRANSFER_STATUS_SUSPENDED);
+ transfer_set_status(transfer, status);
return g_dbus_create_reply(message, DBUS_TYPE_INVALID);
}
{
struct obc_transfer *transfer = user_data;
const char *sender;
+ uint8_t status;
sender = dbus_message_get_sender(message);
if (g_strcmp0(transfer->owner, sender) != 0)
ERROR_INTERFACE ".NotAuthorized",
"Not Authorized");
- if (transfer->xfer == 0)
+ switch (transfer->status) {
+ case TRANSFER_STATUS_SUSPENDED_QUEUED:
+ status = TRANSFER_STATUS_QUEUED;
+ break;
+ case TRANSFER_STATUS_SUSPENDED:
+ if (transfer->xfer)
+ g_obex_resume(transfer->obex);
+ else
+ obc_transfer_start(transfer, NULL, NULL);
+ status = TRANSFER_STATUS_ACTIVE;
+ break;
+ default:
return g_dbus_create_error(message,
ERROR_INTERFACE ".NotInProgress",
"Not in progress");
+ }
- g_obex_resume(transfer->obex);
-
- transfer_set_status(transfer, TRANSFER_STATUS_ACTIVE);
+ transfer_set_status(transfer, status);
return g_dbus_create_reply(message, DBUS_TYPE_INVALID);
}
return "queued";
case TRANSFER_STATUS_ACTIVE:
return "active";
+ case TRANSFER_STATUS_SUSPENDED_QUEUED:
case TRANSFER_STATUS_SUSPENDED:
return "suspended";
case TRANSFER_STATUS_COMPLETE:
gboolean obc_transfer_start(struct obc_transfer *transfer, void *obex,
GError **err)
{
- transfer->obex = g_obex_ref(obex);
+ if (!transfer->obex)
+ transfer->obex = g_obex_ref(obex);
+
+ if (transfer->status == TRANSFER_STATUS_SUSPENDED_QUEUED) {
+ /* Reset status so the transfer can be resumed */
+ transfer->status = TRANSFER_STATUS_SUSPENDED;
+ return TRUE;
+ }
switch (transfer->op) {
case G_OBEX_OP_GET: