To be backward compatible, the old obex_event_t callback type is still
supported but the documentation only refers to the new type and its functions.
---
 doc/openobex.coverpage  |   20 +----
 include/openobex/obex.h |   44 ++++++++++--
 lib/obex.c              |  185 ++++++++++++++++++++++-------------------------
 lib/obex.sym            |    3 +
 lib/obex_main.c         |  111 +++++++++++++++++++++++++++-
 lib/obex_main.h         |    6 ++-
 6 files changed, 246 insertions(+), 123 deletions(-)

diff --git a/doc/openobex.coverpage b/doc/openobex.coverpage
index 1f75eb4..1f7715b 100644
--- a/doc/openobex.coverpage
+++ b/doc/openobex.coverpage
@@ -31,9 +31,9 @@ You might also find the OpenOBEX test applications useful.
 
 To be able to use the OpenOBEX API you must include the files 
openobex/obex_const.h and openobex/obex.h.
 
-First of all you must create an OBEX instance by calling #OBEX_Init.
+First of all you must create an OBEX instance by calling #OBEX_New.
 In this call you specify what transport you want to use, an event callback, 
and optional flags.
-#OBEX_Init will return a handle which shall be passed to almost all other 
functions.
+#OBEX_New will return a handle which shall be passed to almost all other 
functions.
 
 To let the parser do some work you must call #OBEX_HandleInput.
 It will block for at-most the specified timeout for read and write actions.
@@ -41,19 +41,7 @@ You can call #OBEX_GetFD if you want to do select() yourself 
(this may not work
 
        \subsection callback_sec The event callback
 
-The event callback shall be a function with the #obex_event_t prototype:
-       \code
-void *obex_event_t(obex_t *handle, obex_object_t *obj, int mode, int event, 
int obex_cmd, int obex_rsp)
-       \endcode
-
-Arguments:
-  - handle : OBEX handle
-  - obj : OBEX object
-  - mode : OBEX_MODE_CLIENT for client event or OBEX_MODE_SERVER, for server 
event
-  - event : The event. See obex_const.h for possible events (OBEX_EV_*)
-  - obex_cmd : Command if any (depending on event type). See obex_const.h for 
commands (OBEX_CMD_*)
-  - obex_rsp : Response if any (depending on event type). See obex_const.h for 
responses (OBEX_RSP_*)
-
+The event callback shall be a function with the #obex_event_cb_t prototype.
 To this function events from the library will be passed to you, for example 
when an operation finishes.
 #OBEX_SetUserData and #OBEX_GetUserData are useful if you need to access your 
own private data from inside the event callback.
 
@@ -125,7 +113,7 @@ generic function #OBEX_ServerRegister or one of the 
specialized:
   - #BtOBEX_ServerRegister.
 
 When an incoming connection is coming you'll get an #OBEX_EV_ACCEPTHINT event.
-If you ignore this event no more incoming connections will be accepted but if 
you call #OBEX_ServerAccept,
+If you ignore this event no more incoming connections will be accepted but if 
you call #OBEX_Accept,
 you'll get back a new OBEX handle and the old handle will still be listening 
to connections.
 
 When an incoming request comes, you will first get an #OBEX_EV_REQHINT event. 
The supplied
diff --git a/include/openobex/obex.h b/include/openobex/obex.h
index 6bf91d4..ae91f6e 100644
--- a/include/openobex/obex.h
+++ b/include/openobex/obex.h
@@ -60,18 +60,52 @@ struct obex_object;
 typedef struct obex obex_t;
 typedef struct obex_object obex_object_t;
 
-typedef void (*obex_event_t)(obex_t *handle, obex_object_t *obj, int mode, int 
event, int obex_cmd, int obex_rsp);
-
 #include <openobex/obex_const.h>
 
 /*
+ *  OBEX API (deprecated)
+ */
+/** The user event callback.
+ *  \deprecated Use #obex_event_cb_t and its functions instead.
+ *  \param handle the obex handle
+ *  \param obj the object that this callback is about
+ *  \param mode one of the OBEX_MODE_*
+ *  \param event one of the OBEX_EV_*
+ *  \param obex_cmd the current OBEX command code
+ *  \param obex_rsp the current OBEX response code (client only)
+ */
+typedef void (*obex_event_t)(obex_t *handle, obex_object_t *obj, int mode,
+                            int event, int obex_cmd, int obex_rsp);
+
+OPENOBEX_SYMBOL(obex_t *) OBEX_Init(int transport, obex_event_t eventcb,
+                                   unsigned int flags);
+OPENOBEX_SYMBOL(void)     OBEX_SetUserCallBack(obex_t *self,
+                                              obex_event_t eventcb,
+                                              void * data);
+OPENOBEX_SYMBOL(obex_t *) OBEX_ServerAccept(obex_t *server,
+                                           obex_event_t eventcb, void * data);
+
+/*
  *  OBEX API
  */
-OPENOBEX_SYMBOL(obex_t *) OBEX_Init(int transport, obex_event_t eventcb, 
unsigned int flags);
+/** The user event callback.
+ *  \param handle the obex handle
+ *  \param obj the object that this callback is about
+ *  \param mode the current #obex_mode
+ *  \param event the current #obex_event
+ *  \param obex_cmd the current OBEX command code
+ *  \param obex_rsp the current OBEX response code (client only)
+ */
+typedef void (*obex_event_cb_t)(obex_t *handle, obex_object_t *obj,
+                               enum obex_mode mode, enum obex_event event,
+                               uint8_t cmd, uint8_t rsp);
+
+OPENOBEX_SYMBOL(obex_t *) OBEX_New(enum obex_transport_type transport,
+                                  obex_event_cb_t eventcb, unsigned int flags);
 OPENOBEX_SYMBOL(void)     OBEX_Cleanup(obex_t *self);
 OPENOBEX_SYMBOL(void)     OBEX_SetUserData(obex_t *self, void * data);
 OPENOBEX_SYMBOL(void *)   OBEX_GetUserData(obex_t *self);
-OPENOBEX_SYMBOL(void)     OBEX_SetUserCallBack(obex_t *self, obex_event_t 
eventcb, void * data);
+OPENOBEX_SYMBOL(void)     OBEX_SetEventCb(obex_t *self, obex_event_cb_t 
eventcb, void * data);
 OPENOBEX_SYMBOL(int)      OBEX_SetTransportMTU(obex_t *self, uint16_t mtu_rx, 
uint16_t mtu_tx_max);
 OPENOBEX_SYMBOL(int)      OBEX_GetFD(obex_t *self);
 
@@ -85,7 +119,7 @@ OPENOBEX_SYMBOL(int) OBEX_CustomDataFeed(obex_t *self, 
uint8_t *inputbuf, int ac
 OPENOBEX_SYMBOL(int) OBEX_HandleInput(obex_t *self, int timeout);
 
 OPENOBEX_SYMBOL(int)      OBEX_ServerRegister(obex_t *self, struct sockaddr 
*saddr, int addrlen);
-OPENOBEX_SYMBOL(obex_t *) OBEX_ServerAccept(obex_t *server, obex_event_t 
eventcb, void * data);
+OPENOBEX_SYMBOL(obex_t *) OBEX_Accept(obex_t *server);
 
 OPENOBEX_SYMBOL(int) OBEX_Request(obex_t *self, obex_object_t *object);
 OPENOBEX_SYMBOL(int) OBEX_CancelRequest(obex_t *self, int nice);
diff --git a/lib/obex.c b/lib/obex.c
index 7bb5bfb..460b0be 100644
--- a/lib/obex.c
+++ b/lib/obex.c
@@ -44,7 +44,6 @@
 #include "obex_main.h"
 #include "obex_object.h"
 #include "obex_connect.h"
-#include "databuffer.h"
 
 #include "fdobex.h"
 #include "customtrans.h"
@@ -66,6 +65,7 @@
 
 /**
        Initialize OBEX.
+       \deprecated Use OBEX_New() instead of this function.
        \param transport Which transport to use. The following transports are 
available :
                        - #OBEX_TRANS_IRDA : Use regular IrDA socket (need an 
IrDA stack)
                        - #OBEX_TRANS_INET : Use regular TCP/IP socket
@@ -89,65 +89,41 @@ obex_t * CALLAPI OBEX_Init(int transport, obex_event_t 
eventcb,
                                                        unsigned int flags)
 {
        obex_t *self;
-       char *env;
 
-#if OBEX_DEBUG
-       obex_debug = OBEX_DEBUG;
-#else
-       obex_debug = -1;
-#endif
-#if OBEX_DUMP
-       obex_dump = OBEX_DUMP;
-#else
-       obex_dump = 0;
-#endif
-
-       env = getenv("OBEX_DEBUG");
-       if (env)
-               obex_debug = atoi(env);
+       obex_return_val_if_fail(eventcb != NULL, NULL);
 
-       env = getenv("OBEX_DUMP");
-       if (env)
-               obex_dump = atoi(env);
+       self = obex_new((enum obex_transport_type)transport, flags);
+       if (self)
+               self->old_eventcb = eventcb;
 
-       obex_return_val_if_fail(eventcb != NULL, NULL);
+       return self;
+}
 
-       self = calloc(1, sizeof(*self));
-       if (self == NULL)
-               return NULL;
+/**
+       Create a new OBEX instance
+       \param transport Which transport to use.
+       \param eventcb Function pointer to your event callback.
+       \param flags Bitmask of flags. The following flags can be used here:
+                       - #OBEX_FL_KEEPSERVER : Keep the server alive after 
incomming request
+                       - #OBEX_FL_FILTERHINT : Filter target devices based on 
Obex hint bit
+                       - #OBEX_FL_FILTERIAS  : Filter target devices based on 
IAS entry
+                       - #OBEX_FL_CLOEXEC   : Open all sockets with SO_CLOEXEC 
set
+                       - #OBEX_FL_NONBLOCK   : Open all sockets non-blocking
+       \return an OBEX handle or NULL on error.
+ */
+LIB_SYMBOL
+obex_t * CALLAPI OBEX_New(enum obex_transport_type transport,
+                         obex_event_cb_t eventcb, unsigned int flags)
+{
+       obex_t *self;
 
-       self->eventcb = eventcb;
-       self->init_flags = flags;
-       self->mode = OBEX_MODE_SERVER;
-       self->state = STATE_IDLE;
-       self->rsp_mode = OBEX_RSP_MODE_NORMAL;
-
-       /* Safe values.
-        * Both self->mtu_rx and self->mtu_tx_max can be increased by app
-        * self->mtu_tx will be whatever the other end sends us - Jean II */
-       self->mtu_rx = OBEX_DEFAULT_MTU;
-       self->mtu_tx = OBEX_MINIMUM_MTU;
-       self->mtu_tx_max = OBEX_DEFAULT_MTU;
-
-       if (obex_transport_init(self, transport) < 0)
-               goto out_err;
-
-       /* Allocate message buffers */
-       /* It's safe to allocate them smaller than OBEX_MAXIMUM_MTU
-        * because buf_t will realloc data as needed. - Jean II */
-       self->rx_msg = buf_new(self->mtu_rx);
-       if (self->rx_msg == NULL)
-               goto out_err;
+       obex_return_val_if_fail(eventcb != NULL, NULL);
 
-       self->tx_msg = buf_new(self->mtu_tx_max);
-       if (self->tx_msg == NULL)
-               goto out_err;
+       self = obex_new(transport, flags);
+       if (self)
+               self->eventcb = eventcb;
 
        return self;
-
-out_err:
-       OBEX_Cleanup(self);
-       return NULL;
 }
 
 /**
@@ -222,6 +198,7 @@ void * CALLAPI OBEX_GetUserData(obex_t *self)
 
 /**
        Change user callback on an OBEX handle.
+       \deprecated Use OBEX_SetEventCb() instead.
        \param self OBEX handle
        \param eventcb Function pointer to your new event callback.
        \param data Pointer to the new user data to pass to the new
@@ -234,6 +211,27 @@ void CALLAPI OBEX_SetUserCallBack(obex_t *self, 
obex_event_t eventcb,
        obex_return_if_fail(self != NULL);
        /* The callback can't be NULL */
        if (eventcb != NULL) {
+               self->old_eventcb = eventcb;
+               /* Optionaly change the user data */
+               if (data != NULL)
+                       self->userdata = data;
+       }
+}
+
+/**
+       Change event callback on an OBEX handle.
+       \param self OBEX handle
+       \param eventcb Function pointer to your new event callback.
+       \param data Pointer to the new user data to pass to the new
+       callback (optional)
+ */
+LIB_SYMBOL
+void CALLAPI OBEX_SetEventCb(obex_t *self, obex_event_cb_t eventcb,
+                                                               void *data)
+{
+       obex_return_if_fail(self != NULL);
+       /* The callback can't be NULL */
+       if (eventcb != NULL) {
                self->eventcb = eventcb;
                /* Optionaly change the user data */
                if (data != NULL)
@@ -312,6 +310,8 @@ int CALLAPI OBEX_ServerRegister(obex_t *self, struct 
sockaddr *saddr, int addrle
 
 /**
        Accept an incoming connection.
+       \deprecated Use OBEX_Accept() in combination with OBEX_SetEventCb()
+                       instead.
        \param server OBEX handle
        \param eventcb Event callback for client (use NULL for same as server)
        \param data Userdata for client (use NULL for same as server)
@@ -332,6 +332,38 @@ LIB_SYMBOL
 obex_t *CALLAPI OBEX_ServerAccept(obex_t *server, obex_event_t eventcb,
                                                                void *data)
 {
+       obex_t * client = OBEX_Accept(server);
+
+       if (client) {
+               if (eventcb == NULL)
+                       eventcb = client->old_eventcb;
+               if (data == NULL)
+                       data = client->userdata;
+               OBEX_SetUserCallBack(client, eventcb, data);
+       }
+
+       return client;
+}
+
+/**
+       Accept an incoming connection.
+       \param server OBEX handle
+       \return the client instance or NULL on error
+
+       Create a new OBEX instance to handle the incomming connection.
+       The old OBEX instance will continue to listen for new connections.
+       The two OBEX instances become totally independant from each other.
+
+       This function should be called after the library generates
+       an #OBEX_EV_ACCEPTHINT event to the user, but before the user
+       start to pull data out of the incomming connection.
+
+       Using this function also requires that the OBEX handle was created
+       with the #OBEX_FL_KEEPSERVER flag set while calling #OBEX_New().
+ */
+LIB_SYMBOL
+obex_t *CALLAPI OBEX_Accept(obex_t *server)
+{
        obex_t *self;
 
        DEBUG(3, "\n");
@@ -348,54 +380,11 @@ obex_t *CALLAPI OBEX_ServerAccept(obex_t *server, 
obex_event_t eventcb,
        if (server->object != NULL)
                return NULL;
 
-       /* Allocate new instance */
-       self = calloc(1, sizeof(*self));
-       if (self == NULL)
-               return NULL;
-
-       /* Set callback and callback data as needed */
-       if (eventcb != NULL)
-               self->eventcb = eventcb;
-       else
-               self->eventcb = server->eventcb;
-
-       if (data != NULL)
-               self->userdata = data;
-       else
-               self->userdata = server->userdata;
-
-       self->init_flags = server->init_flags;
-
-       obex_transport_clone(self, server);
-
-       self->mtu_rx = server->mtu_rx;
-       self->mtu_tx = server->mtu_tx;
-       self->mtu_tx_max = server->mtu_tx_max;
-
-       /* Allocate message buffers */
-       self->rx_msg = buf_new(self->mtu_rx);
-       if (self->rx_msg == NULL)
-               goto out_err;
-
-       /* Note : mtu_tx not yet negociated, so let's be safe here - Jean II */
-       self->tx_msg = buf_new(self->mtu_tx_max);
-       if (self->tx_msg == NULL)
-               goto out_err;
-
-       obex_transport_split(self, server);
-       self->mode = OBEX_MODE_SERVER;
-        self->state = STATE_IDLE;
-       self->rsp_mode = server->rsp_mode;
+       self = obex_clone(server);
+       if (self)
+               obex_transport_split(self, server);
 
        return self;
-
-out_err:
-       if (self->tx_msg != NULL)
-               buf_free(self->tx_msg);
-       if (self->rx_msg != NULL)
-               buf_free(self->rx_msg);
-       free(self);
-       return NULL;
 }
 
 /**
diff --git a/lib/obex.sym b/lib/obex.sym
index 0c33b63..6483738 100644
--- a/lib/obex.sym
+++ b/lib/obex.sym
@@ -1,8 +1,10 @@
 OBEX_Init
+OBEX_New
 OBEX_Cleanup
 OBEX_SetUserData
 OBEX_GetUserData
 OBEX_SetUserCallBack
+OBEX_SetEventCb
 OBEX_SetTransportMTU
 OBEX_GetFD
 OBEX_RegisterCTransport
@@ -14,6 +16,7 @@ OBEX_CustomDataFeed
 OBEX_HandleInput
 OBEX_ServerRegister
 OBEX_ServerAccept
+OBEX_Accept
 OBEX_Request
 OBEX_CancelRequest
 OBEX_SuspendRequest
diff --git a/lib/obex_main.c b/lib/obex_main.c
index 690dd97..1233120 100644
--- a/lib/obex_main.c
+++ b/lib/obex_main.c
@@ -38,6 +38,7 @@
 #include <stdio.h>
 
 #endif /* _WIN32 */
+#include <stdlib.h>
 
 #ifdef HAVE_BLUETOOTH
 #include "bluez_compat.h"
@@ -52,12 +53,110 @@
 
 #include <openobex/obex_const.h>
 
-int obex_debug;
-int obex_dump;
+#ifndef OBEX_DEBUG
+#define OBEX_DEBUG -1
+#endif
+#ifndef OBEX_DUMP
+#define OBEX_DUMP 0
+#endif
+
+int obex_debug = OBEX_DEBUG;
+int obex_dump = OBEX_DUMP;
 
 #include "cloexec.h"
 #include "nonblock.h"
 
+obex_t * obex_new(enum obex_transport_type transport, unsigned int flags)
+{
+       obex_t *self;
+       char *env;
+
+       env = getenv("OBEX_DEBUG");
+       if (env)
+               obex_debug = atoi(env);
+
+       env = getenv("OBEX_DUMP");
+       if (env)
+               obex_dump = atoi(env);
+
+       self = calloc(1, sizeof(*self));
+       if (self == NULL)
+               return NULL;
+
+       self->init_flags = flags;
+       self->mode = OBEX_MODE_SERVER;
+       self->state = STATE_IDLE;
+       self->rsp_mode = OBEX_RSP_MODE_NORMAL;
+
+       /* Safe values.
+        * Both self->mtu_rx and self->mtu_tx_max can be increased by app
+        * self->mtu_tx will be whatever the other end sends us - Jean II */
+       self->mtu_rx = OBEX_DEFAULT_MTU;
+       self->mtu_tx = OBEX_MINIMUM_MTU;
+       self->mtu_tx_max = OBEX_DEFAULT_MTU;
+
+       if (obex_transport_init(self, transport) < 0)
+               goto out_err;
+
+       /* Allocate message buffers */
+       /* It's safe to allocate them smaller than OBEX_MAXIMUM_MTU
+        * because buf_t will realloc data as needed. - Jean II */
+       self->rx_msg = buf_new(self->mtu_rx);
+       if (self->rx_msg == NULL)
+               goto out_err;
+
+       self->tx_msg = buf_new(self->mtu_tx_max);
+       if (self->tx_msg == NULL)
+               goto out_err;
+
+       return self;
+
+out_err:
+       OBEX_Cleanup(self);
+       return NULL;
+}
+
+obex_t *obex_clone(obex_t *from)
+{
+       /* Allocate new instance */
+       obex_t *self = calloc(1, sizeof(*self));
+       if (self == NULL)
+               return NULL;
+
+       /* Set callback and callback data as needed */
+       self->eventcb = from->eventcb;
+       self->userdata = from->userdata;
+
+       self->init_flags = from->init_flags;
+
+       obex_transport_clone(self, from);
+
+       self->mtu_rx = from->mtu_rx;
+       self->mtu_tx = from->mtu_tx;
+       self->mtu_tx_max = from->mtu_tx_max;
+
+       /* Allocate message buffers */
+       self->rx_msg = buf_new(self->mtu_rx);
+       if (self->rx_msg == NULL)
+               goto out_err;
+
+       /* Note : mtu_tx not negotiated, yet, so let's be safe here */
+       self->tx_msg = buf_new(self->mtu_tx_max);
+       if (self->tx_msg == NULL)
+               goto out_err;
+
+       self->mode = OBEX_MODE_SERVER;
+        self->state = STATE_IDLE;
+       self->rsp_mode = from->rsp_mode;
+
+       return self;
+
+out_err:
+       OBEX_Cleanup(self);
+       return NULL;
+
+}
+
 /*
  * Function obex_create_socket()
  *
@@ -192,7 +291,13 @@ void obex_deliver_event(obex_t *self, int event, int cmd, 
int rsp, int del)
        if (del == TRUE)
                self->object = NULL;
 
-       self->eventcb(self, object, self->mode, event, cmd, rsp);
+       if (self->eventcb)
+               self->eventcb(self, object, self->mode, event, cmd, rsp);
+
+       else if (self->old_eventcb)
+               self->old_eventcb(self, object, (int)self->mode, (int)event,
+                                 (int)cmd, (int)rsp);
+
 
        if (del == TRUE)
                obex_object_delete(object);
diff --git a/lib/obex_main.h b/lib/obex_main.h
index 24d37c5..d880bb8 100644
--- a/lib/obex_main.h
+++ b/lib/obex_main.h
@@ -52,7 +52,9 @@ struct obex {
        struct databuffer *rx_msg;      /* Reusable receive message */
 
        struct obex_object *object;     /* Current object being transfered */
-       obex_event_t eventcb;           /* Event-callback */
+
+       obex_event_t old_eventcb;       /* Old, deprecated event-callback */
+       obex_event_cb_t eventcb;        /* Event-callback */
 
        obex_transport_t trans;         /* Transport being used */
 
@@ -62,6 +64,8 @@ struct obex {
        void * userdata;                /* For user */
 };
 
+obex_t * obex_new(enum obex_transport_type transport, unsigned int flags);
+obex_t * obex_clone(obex_t *from);
 socket_t obex_create_socket(struct obex *self, int domain);
 socket_t obex_create_packet_socket(obex_t *self, int domain);
 int obex_delete_socket(struct obex *self, socket_t fd);
-- 
1.7.5.4


------------------------------------------------------------------------------
Got Input?   Slashdot Needs You.
Take our quick survey online.  Come on, we don't ask for help often.
Plus, you'll get a chance to win $100 to spend on ThinkGeek.
http://p.sf.net/sfu/slashdot-survey
_______________________________________________
Openobex-users mailing list
Openobex-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/openobex-users

Reply via email to