diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index c3a4193..b7f16f1 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
return os_prepare_get(os, file, size);
}
-static void ftp_connect(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t ftp_connect(struct OBEX_session *os)
{
- struct obex_session *os = OBEX_GetUserData(obex);
- obex_headerdata_t hd;
-
- register_session(os->cid, os);
- emit_session_created(os->cid);
-
- /* Append received UUID in WHO header */
- hd.bs = FTP_TARGET;
- OBEX_ObjectAddHeader(obex, obj,
- OBEX_HDR_WHO, hd, sizeof(FTP_TARGET),
- OBEX_FL_FIT_ONE_PACKET);
- hd.bq4 = os->cid;
- OBEX_ObjectAddHeader(obex, obj,
- OBEX_HDR_CONNECTION, hd, 4,
- OBEX_FL_FIT_ONE_PACKET);
-
- OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+ manager_register_session(os);
+
+ return OBEX_RSP_SUCCESS;
}
static void ftp_get(obex_t *obex, obex_object_t *obj)
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index d531e3c..aa690f8 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
#include <glib.h>
#include "plugin.h"
+#include "obex.h"
#include "service.h"
#include "logging.h"
-#include "obex.h"
#include "dbus.h"
#define VCARD_TYPE "text/x-vcard"
</attribute> \
</record>"
-static void opp_connect(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t opp_connect(struct OBEX_session *os)
{
- struct obex_session *os = OBEX_GetUserData(obex);
+ manager_register_transfer(os);
- register_transfer(os->cid, os);
- /* OPP doesn't contains target or connection id. */
- OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+ return OBEX_RSP_SUCCESS;
}
static void opp_progress(obex_t *obex, obex_object_t *obj)
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index 807e68f..43d4214 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
return err;
}
-static void pbap_connect(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t pbap_connect(struct OBEX_session *os)
{
- struct obex_session *os = OBEX_GetUserData(obex);
- obex_headerdata_t hd;
-
- register_session(os->cid, os);
- emit_session_created(os->cid);
+ manager_register_session(os);
- /* Append received UUID in WHO header */
- hd.bs = PBAP_TARGET;
- OBEX_ObjectAddHeader(obex, obj,
- OBEX_HDR_WHO, hd, sizeof(PBAP_TARGET),
- OBEX_FL_FIT_ONE_PACKET);
- hd.bq4 = os->cid;
- OBEX_ObjectAddHeader(obex, obj,
- OBEX_HDR_CONNECTION, hd, 4,
- OBEX_FL_FIT_ONE_PACKET);
-
- OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+ return OBEX_RSP_SUCCESS;
}
static void pbap_get(obex_t *obex, obex_object_t *obj)
diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c
index 711b5a0..9b77492 100644
--- a/obexd/plugins/syncevolution.c
+++ b/obexd/plugins/syncevolution.c
g_free(cb_data);
/* Append received UUID in WHO header */
- register_session(os->cid, os);
- emit_session_created(os->cid);
+ manager_register_session(os);
hd.bs = SYNCML_TARGET;
OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_WHO, hd, SYNCML_TARGET_SIZE,
dbus_message_unref(reply);
}
-static void synce_connect(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t synce_connect(struct OBEX_session *os)
{
- struct obex_session *os = OBEX_GetUserData(obex);
DBusConnection *conn;
GError *err = NULL;
gchar address[18], id[36], transport[36], transport_description[24];
goto failed;
}
+ /* FIXME: completely broken */
+
cb_data = g_malloc0(sizeof(struct callback_data));
- cb_data->obex = obex;
- cb_data->obj = obj;
+#if 0
+ cb_data->obex = os->obex;
+ cb_data->obj = os->obj;
+#endif
dbus_pending_call_set_notify(call, connect_cb, cb_data, NULL);
context = g_new0(struct synce_context, 1);
dbus_pending_call_unref(call);
dbus_message_unref(msg);
+#if 0
+ /* FIXME: broken */
OBEX_SuspendRequest(obex, obj);
-
- return;
+#endif
+ return OBEX_RSP_SUCCESS;
failed:
- OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+ return OBEX_RSP_FORBIDDEN;
}
static void synce_put(obex_t *obex, obex_object_t *obj)
diff --git a/obexd/src/dbus.h b/obexd/src/dbus.h
index 7c3d360..d24085b 100644
--- a/obexd/src/dbus.h
+++ b/obexd/src/dbus.h
void register_session(guint32 id, struct obex_session *os);
void unregister_session(guint32 id);
+
+void manager_register_session(struct OBEX_session *os);
+void manager_register_transfer(struct OBEX_session *os);
diff --git a/obexd/src/manager.c b/obexd/src/manager.c
index 28ad0e1..962cd4e 100644
--- a/obexd/src/manager.c
+++ b/obexd/src/manager.c
g_free(path);
}
+void manager_register_transfer(struct OBEX_session *os)
+{
+ register_transfer(os->cid, os);
+}
+
void register_transfer(guint32 id, struct obex_session *os)
{
gchar *path = g_strdup_printf("/transfer%u", id);
g_free(path);
}
+void manager_register_session(struct OBEX_session *os)
+{
+ register_session(os->cid, os);
+ emit_session_created(os->cid);
+}
+
void unregister_session(guint32 id)
{
gchar *path = g_strdup_printf("/session%u", id);
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index 3035b1f..bd83917 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
guint16 mtu;
} __attribute__ ((packed)) obex_connect_hdr_t;
+static void os_set_response(obex_object_t *obj, obex_rsp_t lastrsp)
+{
+ guint8 rsp;
+
+ switch (lastrsp) {
+ case OBEX_RSP_SUCCESS:
+ rsp = OBEX_RSP_CONTINUE;
+ break;
+ default:
+ rsp = lastrsp;
+ }
+
+ OBEX_ObjectSetRsp(obj, rsp, lastrsp);
+}
+
static void os_reset_session(struct obex_session *os)
{
if (os->object) {
guint8 hi;
const guint8 *target = NULL, *who = NULL;
guint target_size = 0, who_size = 0;
+ obex_rsp_t rsp;
if (OBEX_ObjectGetNonHdrData(obj, &buffer) != sizeof(*nonhdr)) {
OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
debug("Selected driver: %s", os->service->name);
- if (os->service->connect)
- os->service->connect(obex, obj);
+ if (!os->service->connect) {
+ OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+ return;
+ }
+
+ rsp = os->service->connect(os);
+ if (rsp == OBEX_RSP_SUCCESS && os->service->target) {
+ hd.bs = os->service->target;
+ OBEX_ObjectAddHeader(obex, obj,
+ OBEX_HDR_WHO, hd, 16,
+ OBEX_FL_FIT_ONE_PACKET);
+ hd.bq4 = os->cid;
+ OBEX_ObjectAddHeader(obex, obj,
+ OBEX_HDR_CONNECTION, hd, 4,
+ OBEX_FL_FIT_ONE_PACKET);
+ }
+
+ os_set_response(obj, rsp);
}
static gboolean chk_cid(obex_t *obex, obex_object_t *obj, guint32 cid)
diff --git a/obexd/src/obex.h b/obexd/src/obex.h
index 3e206ad..76dbdc1 100644
--- a/obexd/src/obex.h
+++ b/obexd/src/obex.h
gboolean finished;
};
+/* FIXME: first step to obsfuscate */
+#define OBEX_session obex_session
+
gint obex_session_start(GIOChannel *io, struct server *server);
struct obex_session *obex_get_session(gpointer object);
gint obex_tty_session_stop(void);
diff --git a/obexd/src/service.c b/obexd/src/service.c
index c6ce101..2a376be 100644
--- a/obexd/src/service.c
+++ b/obexd/src/service.c
#include <openobex/obex.h>
#include <openobex/obex_const.h>
+#include "obex.h"
#include "service.h"
#include "logging.h"
-#include "obex.h"
static GSList *drivers = NULL;
diff --git a/obexd/src/service.h b/obexd/src/service.h
index 94017ad..a4f3e34 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
*
*/
+typedef guint8 obex_rsp_t;
+
struct obex_service_driver {
const char *name;
guint16 service;
const guint8 *who;
guint who_size;
const gchar *record;
- void (*connect) (obex_t *obex, obex_object_t *obj);
+ obex_rsp_t (*connect) (struct OBEX_session *os);
void (*progress) (obex_t *obex, obex_object_t *obj);
void (*get) (obex_t *obex, obex_object_t *obj);
void (*put) (obex_t *obex, obex_object_t *obj);