--- lib/obex_client.c | 101 +++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 72 insertions(+), 29 deletions(-)
diff --git a/lib/obex_client.c b/lib/obex_client.c index e17528a..fd9962b 100644 --- a/lib/obex_client.c +++ b/lib/obex_client.c @@ -49,12 +49,63 @@ static __inline uint16_t msg_get_len(const buf_t *msg) return 0; } -static int obex_client_recv(obex_t *self, buf_t *msg, int rsp) +static int obex_client_recv_transmit_tx(obex_t *self) +{ + int ret = 0; + int rsp = OBEX_RSP_CONTINUE; + + DEBUG(4, "STATE: RECV/TRANSMIT_TX\n"); + + ret = obex_object_send_transmit(self, self->object); + if (ret == -1) { + obex_deliver_event(self, OBEX_EV_LINKERR, + self->object->opcode, rsp, TRUE); + self->state = STATE_IDLE; + + } else if (ret == 1) { + obex_deliver_event(self, OBEX_EV_PROGRESS, + self->object->opcode, rsp, FALSE); + self->substate = SUBSTATE_RECEIVE_RX; + } + + return ret; +} + +static int obex_client_recv_prepare_tx(obex_t *self) +{ + DEBUG(4, "STATE: RECV/PREPARE_TX\n"); + + if (self->object->rsp_mode == OBEX_RSP_MODE_NORMAL || + (self->object->rsp_mode == OBEX_RSP_MODE_SINGLE && + self->srm_flags & OBEX_SRM_FLAG_WAIT_REMOTE)) + { + int ret = obex_object_prepare_send(self, self->object, TRUE, + FALSE); + if (ret == 1) { + self->substate = SUBSTATE_TRANSMIT_TX; + return obex_client_recv_transmit_tx(self); + + } else + return ret; + + } else { + self->substate = SUBSTATE_RECEIVE_RX; + } + + return 0; +} + +static int obex_client_recv(obex_t *self) { int ret; + buf_t *msg = obex_data_receive(self); + int rsp; - /* Receiving answer of request */ - DEBUG(4, "STATE_REC\n"); + DEBUG(4, "STATE: RECV/RECEIVE_RX\n"); + + if (msg == NULL) + return 0; + rsp = msg_get_rsp(msg); switch (self->object->opcode) { case OBEX_CMD_CONNECT: @@ -88,50 +139,33 @@ static int obex_client_recv(obex_t *self, buf_t *msg, int rsp) self->state = STATE_IDLE; return -1; } + obex_data_receive_finished(self); /* Are we done yet? */ if (rsp == OBEX_RSP_CONTINUE) { DEBUG(3, "Continue...\n"); - - self->object->continue_received = 1; - if (self->object->abort) { DEBUG(3, "Ignoring CONTINUE because request was aborted\n"); return 0; } - - if (self->object->suspend) { - DEBUG(3, "Not sending new request because transfer is suspended\n"); - return 0; - } - - if (self->object->rsp_mode == OBEX_RSP_MODE_NORMAL || - (self->srm_flags & OBEX_SRM_FLAG_WAIT_REMOTE)) { - ret = obex_object_send(self, self->object, TRUE, FALSE); - if (ret < 0) - obex_deliver_event(self, OBEX_EV_LINKERR, - self->object->opcode, rsp, - TRUE); - } - if (ret >= 0) - obex_deliver_event(self, OBEX_EV_PROGRESS, - self->object->opcode, rsp, FALSE); - - if (self->object) - self->object->continue_received = 0; + self->substate = SUBSTATE_PREPARE_TX; + return obex_client_recv_prepare_tx(self); } else { /* Notify app that client-operation is done! */ + ret = 0; DEBUG(3, "Done! Rsp=%02x!\n", rsp); if (self->object->abort) { if (rsp == OBEX_RSP_SUCCESS) obex_deliver_event(self, OBEX_EV_ABORT, self->object->opcode, rsp, TRUE); - else + else { obex_deliver_event(self, OBEX_EV_LINKERR, self->object->opcode, rsp, TRUE); + ret = -1; + } } else obex_deliver_event(self, OBEX_EV_REQDONE, @@ -139,9 +173,9 @@ static int obex_client_recv(obex_t *self, buf_t *msg, int rsp) rsp, TRUE); self->mode = MODE_SRV; self->state = STATE_IDLE; + return ret; } - return 0; } int obex_client_send(obex_t *self, buf_t *msg, int rsp) @@ -252,7 +286,16 @@ int obex_client(obex_t *self) break; case STATE_REC: - ret = obex_client_recv(self, msg, rsp); + switch (self->substate) { + case SUBSTATE_RECEIVE_RX: + return obex_client_recv(self); + + case SUBSTATE_PREPARE_TX: + return obex_client_recv_prepare_tx(self); + + case SUBSTATE_TRANSMIT_TX: + return obex_client_recv_transmit_tx(self); + } break; default: -- 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