diff --git a/obexd/src/manager.c b/obexd/src/manager.c
index 8c14061..791b3c1 100644
--- a/obexd/src/manager.c
+++ b/obexd/src/manager.c
if (strcmp(agent->bus_name, sender) != 0)
return not_authorized(msg);
- os->cancelled = TRUE;
+ os->aborted = TRUE;
return dbus_message_new_method_return(msg);
}
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index 0e8bff0..75fbc1a 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
.chkput = ftp_chkput,
};
-static void os_reset_session(struct obex_session *os, gboolean aborted)
+static void os_reset_session(struct obex_session *os)
{
if (os->fd > 0) {
close(os->fd);
os->fd = -1;
- if (aborted && os->cmd == OBEX_CMD_PUT && os->current_folder) {
+ if (os->aborted && os->cmd == OBEX_CMD_PUT && os->current_folder) {
gchar *path;
path = g_build_filename(os->current_folder, os->name, NULL);
unlink(path);
g_free(os->buf);
os->buf = NULL;
}
+ os->aborted = FALSE;
os->offset = 0;
os->size = OBJECT_SIZE_DELETE;
}
+static void os_session_mark_aborted(struct obex_session *os)
+{
+ /* the session was alredy cancelled/aborted */
+ if (os->aborted)
+ return;
+
+ os->aborted = os->size == OBJECT_SIZE_UNKNOWN ? FALSE :
+ os->size != os->offset;
+}
+
static void obex_session_free(struct obex_session *os)
{
- os_reset_session(os, os->offset != os->size);
+ os_reset_session(os);
if (os->current_folder)
g_free(os->current_folder);
os->name ? os->name : "", os->type ? os->type : "",
os->tx_mtu, os->fd);
- if (os->cancelled)
+ if (os->aborted)
return -EPERM;
if (os->fd < 0) {
gint32 len = 0;
const guint8 *buffer;
- if (os->cancelled)
+ if (os->aborted)
return -EPERM;
+ /* workaround: client didn't send the object lenght */
+ if (os->size == OBJECT_SIZE_DELETE)
+ os->size = OBJECT_SIZE_UNKNOWN;
+
size = OBEX_ObjectReadStream(obex, obj, &buffer);
if (size < 0) {
error("Error on OBEX stream");
return FALSE;
}
- if (os->size == OBJECT_SIZE_DELETE)
+ if (os->size == OBJECT_SIZE_DELETE || os->size == OBJECT_SIZE_UNKNOWN) {
+ debug("Got a PUT without a Length");
goto done;
+ }
if (fstatvfs(os->fd, &buf) < 0) {
int err = errno;
emit_transfer_progress(os->cid, os->size, os->offset);
break;
case OBEX_EV_ABORT:
+ os->aborted = TRUE;
if (os->target == NULL)
emit_transfer_completed(os->cid, FALSE);
- os_reset_session(os, TRUE);
+
+ os_reset_session(os);
OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
break;
case OBEX_EV_REQDONE:
break;
case OBEX_CMD_PUT:
case OBEX_CMD_GET:
+ os_session_mark_aborted(os);
if (os->target == NULL)
- emit_transfer_completed(os->cid,
- os->offset == os->size);
- os_reset_session(os, os->offset != os->size);
+ emit_transfer_completed(os->cid, !os->aborted);
+ os_reset_session(os);
break;
default:
break;
diff --git a/obexd/src/obex.h b/obexd/src/obex.h
index 006d314..a58bd69 100644
--- a/obexd/src/obex.h
+++ b/obexd/src/obex.h
gint32 offset;
gint32 size;
gint fd;
- gboolean cancelled;
+ gboolean aborted;
const guint8 *target;
struct obex_commands *cmds;
struct server *server;