diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index 82cb708..a98163d 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
return ret;
}
-static gint ftp_chkput(obex_t *obex, obex_object_t *obj)
+static gint ftp_chkput(struct OBEX_session *os)
{
- struct obex_session *os;
- os = OBEX_GetUserData(obex);
- if (os == NULL)
- return -EINVAL;
-
- if (!os->name)
- return -EINVAL;
-
- if (os->size == OBJECT_SIZE_DELETE)
+ if (obex_get_size(os) == OBJECT_SIZE_DELETE)
return 0;
- return os_prepare_put(os);
+ return obex_prepare_put(os);
}
static obex_rsp_t ftp_put(struct OBEX_session *os)
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index 2df3d12..0a8d9c7 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
manager_emit_transfer_progress(os);
}
-static gint opp_chkput(obex_t *obex, obex_object_t *obj)
+static gint opp_chkput(struct OBEX_session *os)
{
- struct obex_session *os;
gchar *new_folder, *new_name;
gint32 time;
gint ret;
- os = OBEX_GetUserData(obex);
- if (os == NULL)
- return -EINVAL;
-
- if (!os->name)
- return -EINVAL;
-
- if (os->size == OBJECT_SIZE_DELETE)
+ if (obex_get_size(os) == OBJECT_SIZE_DELETE)
return -EINVAL;
if (os->server->auto_accept)
goto skip_auth;
time = 0;
- ret = request_authorization(os->cid, OBEX_GetFD(obex),
- os->name ? os->name : "",
- os->type ? os->type : "",
- os->size, time, &new_folder,
- &new_name);
-
+ ret = manager_request_authorization(os, time, &new_folder, &new_name);
if (ret < 0)
return -EPERM;
if (new_folder) {
- g_free(os->current_folder);
- os->current_folder = new_folder;
+ obex_set_folder(os, new_folder);
+ g_free(new_folder);
}
if (new_name) {
- g_free(os->name);
- os->name = new_name;
+ obex_set_name(os, new_name);
+ g_free(new_name);
}
skip_auth:
- emit_transfer_started(os->cid);
- return os_prepare_put(os);
+ manager_emit_transfer_started(os);
+ return obex_prepare_put(os);
}
static obex_rsp_t opp_put(struct OBEX_session *os)
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index 90c427f..53d4a9c 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
manager_unregister_session(os);
}
-static gint pbap_chkput(obex_t *obex, obex_object_t *obj)
+static gint pbap_chkput(struct OBEX_session *os)
{
/* Rejects all PUTs */
return -EINVAL;
diff --git a/obexd/src/dbus.h b/obexd/src/dbus.h
index 965a66d..288ef33 100644
--- a/obexd/src/dbus.h
+++ b/obexd/src/dbus.h
#define OPENOBEX_MANAGER_INTERFACE OPENOBEX_SERVICE ".Manager"
#define ERROR_INTERFACE OPENOBEX_SERVICE ".Error"
-void emit_transfer_started(guint32 id);
-
void emit_transfer_progress(guint32 id, guint32 total, guint32 transfered);
-int request_authorization(gint32 cid, int fd, const gchar *filename,
- const gchar *type, gint32 length, gint32 time,
- gchar **new_folder, gchar **new_name);
-
void register_record(struct server *server, gpointer user_data);
gint request_service_authorization(struct server *server, GIOChannel *io,
void manager_unregister_session(struct OBEX_session *os);
void manager_register_transfer(struct OBEX_session *os);
void manager_unregister_transfer(struct OBEX_session *os);
+void manager_emit_transfer_started(struct OBEX_session *os);
void manager_emit_transfer_progress(struct OBEX_session *os);
void manager_emit_transfer_completed(struct OBEX_session *os);
+int manager_request_authorization(struct OBEX_session *os, gint32 time,
+ gchar **new_folder, gchar **new_name);
DBusConnection *obex_dbus_get_connection(void);
diff --git a/obexd/src/manager.c b/obexd/src/manager.c
index fd23537..f8c0c98 100644
--- a/obexd/src/manager.c
+++ b/obexd/src/manager.c
dbus_connection_unref(connection);
}
-void emit_transfer_started(guint32 id)
+void manager_emit_transfer_started(struct OBEX_session *os)
{
- gchar *path = g_strdup_printf("/transfer%u", id);
+ gchar *path = g_strdup_printf("/transfer%u", os->cid);
g_dbus_emit_signal(connection, OPENOBEX_MANAGER_PATH,
OPENOBEX_MANAGER_INTERFACE, "TransferStarted",
return FALSE;
}
-int request_authorization(gint32 cid, int fd, const gchar *filename,
- const gchar *type, gint32 length, gint32 time,
- gchar **new_folder, gchar **new_name)
+int manager_request_authorization(struct OBEX_session *os, gint32 time,
+ gchar **new_folder, gchar **new_name)
{
DBusMessage *msg;
DBusPendingCall *call;
socklen_t addrlen;
gchar address[18];
const gchar *bda = address;
+ const gchar *filename = (os->name ? os->name : "");
+ const gchar *type = (os->type ? os->type : "");
gchar *path;
- guint watch;
+ guint watch, fd;
gboolean got_reply;
if (!agent)
memset(&addr, 0, sizeof(addr));
addrlen = sizeof(addr);
+ fd = OBEX_GetFD(os->obex);
if (getpeername(fd, (struct sockaddr *) &addr, &addrlen) < 0)
return -errno;
ba2str(&addr.rc_bdaddr, address);
- path = g_strdup_printf("/transfer%d", cid);
+ path = g_strdup_printf("/transfer%d", os->cid);
msg = dbus_message_new_method_call(agent->bus_name, agent->path,
"org.openobex.Agent", "Authorize");
DBUS_TYPE_STRING, &bda,
DBUS_TYPE_STRING, &filename,
DBUS_TYPE_STRING, &type,
- DBUS_TYPE_INT32, &length,
+ DBUS_TYPE_INT32, &os->size,
DBUS_TYPE_INT32, &time,
DBUS_TYPE_INVALID);
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index addfc2a..9587388 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
return len;
}
-gint os_prepare_put(struct obex_session *os)
+gint obex_prepare_put(struct obex_session *os)
{
gchar *path;
gint len;
obex_headerdata_t hd;
guint hlen;
guint8 hi;
- int ret;
+ gint ret;
os = OBEX_GetUserData(obex);
if (!os->service->chkput)
goto done;
- ret = os->service->chkput(obex, obj);
- switch (ret) {
- case 0:
- break;
- case -EINVAL:
+ if (!os->name) {
OBEX_ObjectSetRsp(obj, OBEX_RSP_BAD_REQUEST,
OBEX_RSP_BAD_REQUEST);
return FALSE;
+ }
+
+ ret = os->service->chkput(os);
+ switch (ret) {
case -EPERM:
OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
return FALSE;
OBEX_ObjectSetRsp(obj, OBEX_RSP_INTERNAL_SERVER_ERROR,
OBEX_RSP_INTERNAL_SERVER_ERROR);
return FALSE;
+
}
if (os->size == OBJECT_SIZE_DELETE || os->size == OBJECT_SIZE_UNKNOWN) {
return os->name;
}
+void obex_set_name(struct OBEX_session *os, const gchar *name)
+{
+ g_free(os->name);
+
+ os->name = (name ? g_strdup(name) : NULL);
+}
+
ssize_t obex_get_size(struct OBEX_session *os)
{
return os->size;
diff --git a/obexd/src/obex.h b/obexd/src/obex.h
index d352349..4346657 100644
--- a/obexd/src/obex.h
+++ b/obexd/src/obex.h
gint obex_session_start(GIOChannel *io, struct server *server);
struct obex_session *obex_get_session(gpointer object);
int obex_stream_start(struct OBEX_session *os, gchar *filename);
-gint os_prepare_put(struct obex_session *os);
+gint obex_prepare_put(struct obex_session *os);
const char *obex_get_name(struct OBEX_session *os);
+void obex_set_name(struct OBEX_session *os, const gchar *name);
ssize_t obex_get_size(struct OBEX_session *os);
const char *obex_get_type(struct OBEX_session *os);
const char *obex_get_folder(struct OBEX_session *os);
diff --git a/obexd/src/service.h b/obexd/src/service.h
index 8e625fc..4bd78fe 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
void (*progress) (struct OBEX_session *os);
obex_rsp_t (*get) (struct OBEX_session *os);
obex_rsp_t (*put) (struct OBEX_session *os);
- gint (*chkput) (obex_t *obex, obex_object_t *obj);
+ gint (*chkput) (struct OBEX_session *os);
obex_rsp_t (*setpath) (struct OBEX_session *os, obex_object_t *obj);
void (*disconnect) (struct OBEX_session *os);
void (*reset) (struct OBEX_session *os);