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


------------------------------------------------------------------------------
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