One step is triggered the transport handle_input function: this one fills the
rx_msg buffer. It also used to read from that rx_msg buffer right again and
trigger the state machine. This patch decouples the second part and is needed
for further splitting into substates.
---
 lib/obex.c           |    2 +-
 lib/obex_client.c    |   13 +++++++--
 lib/obex_client.h    |    2 +-
 lib/obex_main.c      |   73 ++++++++++++++++++++++++++++++++-----------------
 lib/obex_main.h      |    2 +
 lib/obex_server.c    |   18 +++++++++---
 lib/obex_server.h    |    2 +-
 lib/obex_transport.c |    2 +-
 8 files changed, 78 insertions(+), 36 deletions(-)

diff --git a/lib/obex.c b/lib/obex.c
index bf2b71b..e56ef74 100644
--- a/lib/obex.c
+++ b/lib/obex.c
@@ -535,7 +535,7 @@ int CALLAPI OBEX_Request(obex_t *self, obex_object_t 
*object)
        self->mode = MODE_CLI;
         self->state = STATE_SEND;
 
-       return obex_client(self, NULL, 0);
+       return obex_client_send(self, NULL, 0);
 }
 
 /**
diff --git a/lib/obex_client.c b/lib/obex_client.c
index 0199fbf..e17528a 100644
--- a/lib/obex_client.c
+++ b/lib/obex_client.c
@@ -238,22 +238,29 @@ int obex_client_send(obex_t *self, buf_t *msg, int rsp)
  *    Handle client operations
  *
  */
-int obex_client(obex_t *self, buf_t *msg, int final)
+int obex_client(obex_t *self)
 {
+       int ret = -1;
+       buf_t *msg = obex_data_receive(self);
        int rsp = msg_get_rsp(msg);
 
        DEBUG(4, "\n");
 
        switch (self->state) {
        case STATE_SEND:
-               return obex_client_send(self, msg, rsp);
+               ret = obex_client_send(self, msg, rsp);
+               break;
 
        case STATE_REC:
-               return obex_client_recv(self, msg, rsp);
+               ret = obex_client_recv(self, msg, rsp);
+               break;
 
        default:
                DEBUG(0, "Unknown state\n");
                obex_deliver_event(self, OBEX_EV_PARSEERR, rsp, 0, TRUE);
                return -1;
        }
+
+       obex_data_receive_finished(self);
+       return ret;
 }
diff --git a/lib/obex_client.h b/lib/obex_client.h
index bed3593..d1ae8fd 100644
--- a/lib/obex_client.h
+++ b/lib/obex_client.h
@@ -25,7 +25,7 @@
 struct obex;
 struct databuffer;
 
-int obex_client(struct obex *self, struct databuffer *msg, int final);
+int obex_client(struct obex *self);
 int obex_client_send(obex_t *self, buf_t *msg, int rsp);
 
 #endif
diff --git a/lib/obex_main.c b/lib/obex_main.c
index 884c9e3..5337208 100644
--- a/lib/obex_main.c
+++ b/lib/obex_main.c
@@ -257,6 +257,20 @@ int obex_data_request(obex_t *self, buf_t *msg)
        return status;
 }
 
+static int obex_mode(obex_t *self)
+{
+       switch (self->mode) {
+       case MODE_SRV:
+               return obex_server(self);
+
+       case MODE_CLI:
+               return obex_client(self);
+
+       default:
+               return -1;
+       }
+}
+
 /*
  * Function obex_work (self, timeout)
  *
@@ -265,6 +279,8 @@ int obex_data_request(obex_t *self, buf_t *msg)
  */
 int obex_work(obex_t *self, int timeout)
 {
+       int ret;
+
        /* Waiting for an incoming packet will not work for single response mode
         * as the client is not supposed to send any when we (as server) are
         * sending the response.
@@ -273,8 +289,6 @@ int obex_work(obex_t *self, int timeout)
                        self->object->rsp_mode != OBEX_RSP_MODE_NORMAL &&
                        self->state == STATE_SEND &&
                        !(self->srm_flags & OBEX_SRM_FLAG_WAIT_LOCAL)) {
-               int ret;
-
                /* Still, we need to do a zero-wait check for an ABORT
                 * and for connection errors. */
                ret = obex_transport_handle_input(self, 0);
@@ -298,7 +312,10 @@ int obex_work(obex_t *self, int timeout)
                        return sizeof(obex_common_hdr_t);
        }
 
-       return obex_transport_handle_input(self, timeout);
+       ret = obex_transport_handle_input(self, timeout);
+       if (ret == 1)
+               ret = obex_mode(self);
+       return ret;
 }
 
 /*
@@ -314,15 +331,14 @@ int obex_get_buffer_status(buf_t *msg) {
 /*
  * Function obex_data_indication (self)
  *
- *    Read/Feed some input from device and find out which packet it is
+ *    Read some input from device and find out which packet it is
  *
  */
 int obex_data_indication(obex_t *self)
 {
        obex_common_hdr_t *hdr;
        buf_t *msg;
-       uint8_t opcode;
-       int final, ret, actual = 0;
+       int actual;
        unsigned int size;
 
        DEBUG(4, "\n");
@@ -342,7 +358,7 @@ int obex_data_indication(obex_t *self)
                 * partial buffer (custom transport) */
                if (actual < 0) {
                        obex_deliver_event(self, OBEX_EV_LINKERR, 0, 0, TRUE);
-                       return actual;
+                       return -1;
                }
        }
 
@@ -366,14 +382,14 @@ int obex_data_indication(obex_t *self)
                        if (actual < 0) {
                                obex_deliver_event(self, OBEX_EV_LINKERR,
                                                                0, 0, TRUE);
-                               return actual;
+                               return -1;
                        }
                }
        } else {
                /* Wait until we have at least 3 bytes data */
                DEBUG(3, "Need at least 3 bytes got only %lu!\n",
                                        (unsigned long) msg->data_size);
-               return actual;
+               return 0;
         }
 
        /* New data has been inserted at the end of message */
@@ -392,16 +408,20 @@ int obex_data_indication(obex_t *self)
                                size, (unsigned long)msg->data_size);
 
                /* I'll be back! */
-               return msg->data_size;
+               return 0;
        }
 
        DUMPBUFFER(2, "Rx", msg);
 
-       actual = msg->data_size;
-       opcode = hdr->opcode & ~OBEX_FINAL;
-       final = hdr->opcode & OBEX_FINAL; /* Extract final bit */
+       return 1;
+}
+
+buf_t* obex_data_receive(obex_t *self)
+{
+       buf_t *msg = self->rx_msg;
+       obex_common_hdr_t *hdr = (obex_common_hdr_t *)msg->data;
+       uint8_t opcode = hdr->opcode & ~OBEX_FINAL;
 
-       /* Dispatch to the mode we are in */
        if (self->mode == MODE_SRV) {
                /* Single response mode makes it possible for the client to send
                 * the next request (e.g. PUT) while still receiving the last
@@ -411,23 +431,26 @@ int obex_data_indication(obex_t *self)
                                self->object->rsp_mode != OBEX_RSP_MODE_NORMAL 
&&
                                self->state == STATE_SEND &&
                                !(opcode == OBEX_CMD_ABORT || opcode == 
self->object->cmd))
-                       return 0;
+                       return NULL;
+       }
 
-               self->srm_flags &= ~OBEX_SRM_FLAG_WAIT_LOCAL;
-               ret = obex_server(self, msg, final);
-       } else
-               ret = obex_client(self, msg, final);
+       if (!obex_get_buffer_status(msg))
+               return NULL;
+
+       self->srm_flags &= ~OBEX_SRM_FLAG_WAIT_LOCAL;
+       return msg;
+}
+
+void obex_data_receive_finished(obex_t *self)
+{
+       buf_t *msg = self->rx_msg;
+       obex_common_hdr_t *hdr = (obex_common_hdr_t *)msg->data;
+       unsigned int size = ntohs(hdr->len);
 
        DEBUG(4, "Pulling %u bytes\n", size);
        buf_remove_begin(msg, size);
        if (msg->data_size == 0)
                buf_reuse(msg);
-
-       /* Check parse errors */
-       if (ret < 0)
-               actual = ret;
-
-       return actual;
 }
 
 /*
diff --git a/lib/obex_main.h b/lib/obex_main.h
index 53d2768..8a3e975 100644
--- a/lib/obex_main.h
+++ b/lib/obex_main.h
@@ -69,6 +69,8 @@ void obex_deliver_event(struct obex *self, int event, int 
cmd, int rsp, int del)
 int obex_work(struct obex *self, int timeout);
 int obex_get_buffer_status(buf_t *msg);
 int obex_data_indication(struct obex *self);
+buf_t* obex_data_receive(obex_t *self);
+void obex_data_receive_finished(obex_t *self);
 
 void obex_response_request(struct obex *self, uint8_t opcode);
 void obex_data_request_prepare(struct obex *self, struct databuffer *msg,
diff --git a/lib/obex_server.c b/lib/obex_server.c
index 52f490e..1902e4f 100644
--- a/lib/obex_server.c
+++ b/lib/obex_server.c
@@ -324,22 +324,29 @@ static int obex_server_idle(obex_t *self, buf_t *msg, int 
final,
  *    Handle server-operations
  *
  */
-int obex_server(obex_t *self, buf_t *msg, int final)
+int obex_server(obex_t *self)
 {
+       int ret = -1;
+       buf_t *msg = obex_data_receive(self);
+       obex_common_hdr_t *hdr = (obex_common_hdr_t *)msg->data;
        int cmd = msg_get_cmd(msg);
        uint16_t len = msg_get_len(msg);
+       int final = hdr->opcode & OBEX_FINAL; /* Extract final bit */
 
        DEBUG(4, "\n");
 
        switch (self->state) {
        case STATE_IDLE:
-               return obex_server_idle(self, msg, final, cmd, len);
+               ret = obex_server_idle(self, msg, final, cmd, len);
+               break;
 
        case STATE_REC:
-               return obex_server_recv(self, msg, final, cmd, len);
+               ret = obex_server_recv(self, msg, final, cmd, len);
+               break;
 
        case STATE_SEND:
-               return obex_server_send(self, msg, cmd, len);
+               ret = obex_server_send(self, msg, cmd, len);
+               break;
 
        default:
                DEBUG(0, "Unknown state\n");
@@ -347,4 +354,7 @@ int obex_server(obex_t *self, buf_t *msg, int final)
                obex_deliver_event(self, OBEX_EV_PARSEERR, cmd, 0, TRUE);
                return -1;
        }
+
+       obex_data_receive_finished(self);
+       return ret;
 }
diff --git a/lib/obex_server.h b/lib/obex_server.h
index 3906e6f..2d4bc18 100644
--- a/lib/obex_server.h
+++ b/lib/obex_server.h
@@ -25,7 +25,7 @@
 struct obex;
 struct databuffer;
 
-int obex_server(struct obex *self, struct databuffer *msg, int final);
+int obex_server(struct obex *self);
 int obex_server_send(obex_t *self, buf_t *msg, int cmd, uint16_t len);
 
 #endif
diff --git a/lib/obex_transport.c b/lib/obex_transport.c
index aa113ed..6207279 100644
--- a/lib/obex_transport.c
+++ b/lib/obex_transport.c
@@ -251,7 +251,7 @@ int obex_transport_handle_input(obex_t *self, int timeout)
        self->trans.timeout = timeout;
        if (obex_get_buffer_status(self->rx_msg)) {
                DEBUG(4, "full message already in buffer\n");
-               return obex_data_indication(self);
+               return 1;
        }
 
        if (self->trans.ops.handle_input)
-- 
1.7.5.4


------------------------------------------------------------------------------
AppSumo Presents a FREE Video for the SourceForge Community by Eric 
Ries, the creator of the Lean Startup Methodology on "Lean Startup 
Secrets Revealed." This video shows you how to validate your ideas, 
optimize your ideas and identify your business strategy.
http://p.sf.net/sfu/appsumosfdev2dev
_______________________________________________
Openobex-users mailing list
Openobex-users@lists.sourceforge.net
http://lists.sourceforge.net/lists/listinfo/openobex-users

Reply via email to