OSDN Git Service

gobex: Fix put request handling with final bit value
authorJohan Hedberg <johan.hedberg@intel.com>
Mon, 11 Jul 2011 21:38:18 +0000 (00:38 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 4 Dec 2012 21:22:01 +0000 (22:22 +0100)
gobex/gobex-transfer.c
unit/test-gobex-transfer.c

index 533956e..62c57ee 100644 (file)
@@ -136,11 +136,7 @@ static void transfer_response(GObex *obex, GError *err, GObexPacket *rsp,
        }
 
        if (transfer->opcode == G_OBEX_OP_GET) {
-               GObexHeader *body;
-               body = g_obex_packet_get_header(rsp, G_OBEX_HDR_BODY);
-               if (body == NULL)
-                       body = g_obex_packet_get_header(rsp,
-                                                       G_OBEX_HDR_BODY_END);
+               GObexHeader *body = g_obex_packet_get_body(rsp);
                if (body != NULL) {
                        const guint8 *buf;
                        gsize len;
@@ -200,7 +196,7 @@ guint g_obex_put_req(GObex *obex, GObexDataProducer data_func,
        transfer->data_producer = data_func;
 
        va_start(args, first_hdr_id);
-       req = g_obex_packet_new_valist(G_OBEX_OP_PUT, TRUE,
+       req = g_obex_packet_new_valist(G_OBEX_OP_PUT, FALSE,
                                                        first_hdr_id, args);
        va_end(args);
 
@@ -233,26 +229,30 @@ static void transfer_abort_req(GObex *obex, GObexPacket *req, gpointer user_data
 
 static guint8 put_get_bytes(struct transfer *transfer, GObexPacket *req)
 {
-       guint8 rspcode = G_OBEX_RSP_CONTINUE;
        GObexHeader *body;
+       gboolean final;
+       guint8 rsp;
+       const guint8 *buf;
+       gsize len;
 
-       body = g_obex_packet_get_header(req, G_OBEX_HDR_BODY);
-       if (body == NULL) {
-               body = g_obex_packet_get_header(req, G_OBEX_HDR_BODY_END);
-               rspcode = G_OBEX_RSP_SUCCESS;
-       }
+       g_obex_packet_get_operation(req, &final);
+       if (final)
+               rsp = G_OBEX_RSP_SUCCESS;
+       else
+               rsp = G_OBEX_RSP_CONTINUE;
 
-       if (body != NULL) {
-               const guint8 *buf;
-               gsize len;
+       body = g_obex_packet_get_body(req);
+       if (body == NULL)
+               return rsp;
 
-               g_obex_header_get_bytes(body, &buf, &len);
+       g_obex_header_get_bytes(body, &buf, &len);
+       if (len == 0)
+               return rsp;
 
-               if (len > 0)
-                       transfer->data_consumer(buf, len, transfer->user_data);
-       }
+       if (transfer->data_consumer(buf, len, transfer->user_data) == FALSE)
+               rsp = G_OBEX_RSP_FORBIDDEN;
 
-       return rspcode;
+       return rsp;
 }
 
 static void transfer_put_req_first(struct transfer *transfer, GObexPacket *req,
@@ -270,7 +270,7 @@ static void transfer_put_req_first(struct transfer *transfer, GObexPacket *req,
                g_error_free(err);
        }
 
-       if (rspcode == G_OBEX_RSP_SUCCESS)
+       if (rspcode != G_OBEX_RSP_CONTINUE)
                transfer_complete(transfer, NULL);
 }
 
@@ -289,7 +289,7 @@ static void transfer_put_req(GObex *obex, GObexPacket *req, gpointer user_data)
                g_error_free(err);
        }
 
-       if (rspcode == G_OBEX_RSP_SUCCESS)
+       if (rspcode != G_OBEX_RSP_CONTINUE)
                transfer_complete(transfer, NULL);
 }
 
index 40ce85d..914a185 100644 (file)
@@ -33,7 +33,7 @@
 
 #define FINAL_BIT 0x80
 
-static guint8 put_req_first[] = { G_OBEX_OP_PUT | FINAL_BIT, 0x00, 0x30,
+static guint8 put_req_first[] = { G_OBEX_OP_PUT, 0x00, 0x30,
        G_OBEX_HDR_TYPE, 0x00, 0x0b,
        'f', 'o', 'o', '/', 'b', 'a', 'r', '\0',
        G_OBEX_HDR_NAME, 0x00, 0x15,