diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index 5da0a1b..354eaad 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
static const guint8 PCSUITE_WHO[PCSUITE_WHO_SIZE] = {
'P','C',' ','S','u','i','t','e' };
-static gint get_by_type(struct obex_session *os, gchar *type, size_t *size)
+static gint get_by_type(struct OBEX_session *os, gchar *type)
{
if (type == NULL)
return -ENOENT;
if (g_str_equal(type, CAP_TYPE))
- return os_prepare_get(os, os->server->capability, size);
+ return obex_stream_start(os, os->server->capability);
if (g_str_equal(type, LST_TYPE))
- return os_prepare_get(os, os->current_folder, size);
+ return obex_stream_start(os, os->current_folder);
return -ENOENT;
}
-static gint ftp_prepare_get(struct obex_session *os, gchar *file,
- size_t *size)
+static gint ftp_prepare_get(struct obex_session *os, gchar *file)
{
gboolean root;
return -EPERM;
}
- return os_prepare_get(os, file, size);
+ return obex_stream_start(os, file);
}
static obex_rsp_t ftp_connect(struct OBEX_session *os)
return OBEX_RSP_SUCCESS;
}
-static void ftp_get(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t ftp_get(struct OBEX_session *os)
{
- obex_headerdata_t hv;
- struct obex_session *os;
- size_t size;
gint err;
gchar *path;
- os = OBEX_GetUserData(obex);
- if (os == NULL)
- return;
-
if (os->current_folder == NULL) {
err = -ENOENT;
goto fail;
}
- err = get_by_type(os, os->type, &size);
+ err = get_by_type(os, os->type);
if (err < 0) {
if (!os->name)
goto fail;
path = g_build_filename(os->current_folder, os->name, NULL);
- err = ftp_prepare_get(os, path, &size);
+ err = ftp_prepare_get(os, path);
g_free(path);
goto fail;
}
- hv.bq4 = size;
- os->size = size;
- OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_LENGTH, hv, 4, 0);
-
- /* Add body header */
- hv.bs = NULL;
- if (size == 0)
- OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY,
- hv, 0, OBEX_FL_FIT_ONE_PACKET);
- else
- OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY,
- hv, 0, OBEX_FL_STREAM_START);
-
- OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE,
- OBEX_RSP_SUCCESS);
-
- return;
+ return OBEX_RSP_SUCCESS;
fail:
switch (err) {
case -ENOENT:
- OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND, OBEX_RSP_NOT_FOUND);
- break;
+ return OBEX_RSP_NOT_FOUND;
+
default:
- OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+ return OBEX_RSP_FORBIDDEN;
}
}
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index 34bdbdb..04bd57a 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
}
-static void opp_get(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t opp_get(struct OBEX_session *os)
{
- struct obex_session *os;
- obex_headerdata_t hv;
- size_t size;
+ const char *type;
- os = OBEX_GetUserData(obex);
- if (os == NULL)
- return;
+ if (obex_session_get_name(os) == NULL)
+ return OBEX_RSP_FORBIDDEN;
- if (os->name)
- goto fail;
+ type = obex_session_get_type(os);
- if (os->type == NULL)
- goto fail;
+ if (type == NULL)
+ return OBEX_RSP_FORBIDDEN;
if (g_str_equal(os->type, VCARD_TYPE)) {
- if (os_prepare_get(os, VCARD_FILE, &size) < 0) {
- OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND,
- OBEX_RSP_NOT_FOUND);
- return;
- }
- } else
- goto fail;
-
+ if (obex_stream_start(os, VCARD_FILE) < 0)
+ return OBEX_RSP_NOT_FOUND;
- hv.bq4 = size;
- OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_LENGTH, hv, 4, 0);
-
- /* Add body header */
- hv.bs = NULL;
- if (size == 0)
- OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY,
- hv, 0, OBEX_FL_FIT_ONE_PACKET);
- else
- OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY,
- hv, 0, OBEX_FL_STREAM_START);
-
- OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
-
- return;
+ } else
+ return OBEX_RSP_FORBIDDEN;
-fail:
- OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+ return OBEX_RSP_SUCCESS;
}
static void opp_disconnect(struct OBEX_session *os)
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index 10fe863..bb518fa 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
return OBEX_RSP_SUCCESS;
}
-static void pbap_get(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t pbap_get(struct OBEX_session *os)
{
- struct obex_session *session = OBEX_GetUserData(obex);
- obex_headerdata_t hd;
- gboolean addbody = TRUE;
+ int addbody = TRUE;
+ const char *type = obex_session_get_type(os);
+ const char *name = obex_session_get_name(os);
int err;
- if (session == NULL)
- return;
-
- if (session->type == NULL)
+ if (type == NULL)
goto fail;
- if (g_str_equal(session->type, VCARDLISTING_TYPE) == FALSE
- && session->name == NULL)
+ if (g_str_equal(type, VCARDLISTING_TYPE) == FALSE
+ && name == NULL)
goto fail;
- OBEX_ObjectReParseHeaders(obex, obj);
-
- if (g_str_equal(session->type, PHONEBOOK_TYPE) == TRUE)
- err = pbap_pullphonebook(obex, obj, &addbody);
- else if (g_str_equal(session->type, VCARDLISTING_TYPE) == TRUE)
- err = pbap_pullvcardlisting(obex, obj, &addbody);
- else if (g_str_equal(session->type, VCARDENTRY_TYPE) == TRUE)
- err = pbap_pullvcardentry(obex, obj);
+ /* FIXME: broken */
+#if 0
+ OBEX_ObjectReParseHeaders(, obj);
+#endif
+ if (g_str_equal(type, PHONEBOOK_TYPE) == TRUE)
+ err = pbap_pullphonebook(NULL, NULL, NULL);
+ else if (g_str_equal(type, VCARDLISTING_TYPE) == TRUE)
+ err = pbap_pullvcardlisting(NULL, NULL, NULL);
+ else if (g_str_equal(type, VCARDENTRY_TYPE) == TRUE)
+ err = pbap_pullvcardentry(NULL, NULL);
else
goto fail;
goto fail;
if (addbody == TRUE) {
+#if 0
OBEX_SuspendRequest(obex, obj);
session->size = 0;
/* Add body header */
hd.bs = NULL;
OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY,
- hd, 0, OBEX_FL_STREAM_START);
+ hd, 0, OBEX_FL_STREAM_START);
+#endif
}
+#if 0
OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+#endif
- return;
+ return OBEX_RSP_SUCCESS;
fail:
- OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+ return OBEX_RSP_FORBIDDEN;
}
static gboolean pbap_is_valid_folder(struct obex_session *session)
diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c
index 02fb6fb..94bb3b4 100644
--- a/obexd/plugins/syncevolution.c
+++ b/obexd/plugins/syncevolution.c
OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
}
-static void synce_get(obex_t *obex, obex_object_t *obj)
+static obex_rsp_t synce_get(struct OBEX_session *os)
{
- obex_headerdata_t hd;
- struct obex_session *os;
struct synce_context *context;
- os = OBEX_GetUserData(obex);
- if (!os)
- return;
-
context = find_context(os);
if (!context)
- return;
-
- if (!context->reply_received)
- OBEX_SuspendRequest(obex, obj);
-
- hd.bs = NULL;
- OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_BODY, hd, 0,
- OBEX_FL_STREAM_START);
+ return OBEX_RSP_FORBIDDEN;
- OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+ return OBEX_RSP_SUCCESS;
}
static void close_cb(DBusPendingCall *call, void *user_data)
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index b8e8b5d..c07754b 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
obex_headerdata_t hd;
guint hlen;
guint8 hi;
+ guint rsp;
if (!os->service) {
OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
}
}
- os->service->get(obex, obj);
+ rsp = os->service->get(os);
+ if (rsp == OBEX_RSP_SUCCESS) {
+ hd.bq4 = os->size;
+ OBEX_ObjectAddHeader(obex, obj, OBEX_HDR_LENGTH, hd, 4, 0);
+
+ /* Add body header */
+ hd.bs = NULL;
+ if (os->size == 0)
+ OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY,
+ hd, 0, OBEX_FL_FIT_ONE_PACKET);
+ else
+ OBEX_ObjectAddHeader (obex, obj, OBEX_HDR_BODY,
+ hd, 0, OBEX_FL_STREAM_START);
+ }
+
+ os_set_response(obj, rsp);
}
static void cmd_setpath(struct obex_session *os,
os->service->setpath(obex, obj);
}
-int os_prepare_get(struct obex_session *os, gchar *filename, size_t *size)
+int obex_stream_start(struct OBEX_session *os, gchar *filename)
{
gint err;
gpointer object;
+ size_t size;
- object = os->driver->open(filename, O_RDONLY, 0, size, &err);
+ object = os->driver->open(filename, O_RDONLY, 0, &size, &err);
if (object == NULL) {
error("open(%s): %s (%d)", filename, strerror(-err), -err);
goto fail;
os->object = object;
os->offset = 0;
+ os->size = size;
- if (*size > 0)
+ if (size > 0)
os->buf = g_malloc0(os->tx_mtu);
return 0;
return NULL;
}
+
+const char *obex_session_get_name(struct OBEX_session *os)
+{
+ return os->name;
+}
+
+const char *obex_session_get_type(struct OBEX_session *os)
+{
+ return os->type;
+}
+
+ssize_t obex_session_get_size(struct OBEX_session *os)
+{
+ return os->size;
+}
diff --git a/obexd/src/obex.h b/obexd/src/obex.h
index f710a9f..4d4f60a 100644
--- a/obexd/src/obex.h
+++ b/obexd/src/obex.h
struct obex_session *obex_get_session(gpointer object);
gint obex_tty_session_stop(void);
-gint os_prepare_get(struct obex_session *os, gchar *file, size_t *size);
+int obex_stream_start(struct OBEX_session *os, gchar *filename);
gint os_prepare_put(struct obex_session *os);
void server_free(struct server *server);
int tty_init(gint service, const gchar *folder, const gchar *capability,
gboolean symlinks, const gchar *devnode);
void tty_closed(void);
+
+const char *obex_session_get_name(struct OBEX_session *os);
+
+ssize_t obex_session_get_size(struct OBEX_session *os);
+
+const char *obex_session_get_type(struct OBEX_session *os);
diff --git a/obexd/src/service.h b/obexd/src/service.h
index 3f35b80..3b6e4ba 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
const gchar *record;
obex_rsp_t (*connect) (struct OBEX_session *os);
void (*progress) (struct OBEX_session *os);
- void (*get) (obex_t *obex, obex_object_t *obj);
+ obex_rsp_t (*get) (struct OBEX_session *os);
void (*put) (obex_t *obex, obex_object_t *obj);
gint (*chkput) (obex_t *obex, obex_object_t *obj);
void (*setpath) (obex_t *obex, obex_object_t *obj);