am 971af003: Merge change I65208317 into eclair

Merge commit '971af0030568ba25a83788506a3f29bc9f1cd10d' into eclair-plus-aosp

* commit '971af0030568ba25a83788506a3f29bc9f1cd10d':
  Update OBEX to fix missing several contact entries issue.
diff --git a/obex/javax/obex/ClientOperation.java b/obex/javax/obex/ClientOperation.java
index 65663b1..05b498c 100644
--- a/obex/javax/obex/ClientOperation.java
+++ b/obex/javax/obex/ClientOperation.java
@@ -269,7 +269,7 @@
 
         if (mPrivateOutput == null) {
             // there are 3 bytes operation headers and 3 bytes body headers //
-            mPrivateOutput = new PrivateOutputStream(this, mMaxPacketSize - 6);
+            mPrivateOutput = new PrivateOutputStream(this, getMaxPacketSize());
         }
 
         mPrivateOutputOpen = true;
@@ -278,7 +278,13 @@
     }
 
     public int getMaxPacketSize() {
-        return mMaxPacketSize - 6;
+        return mMaxPacketSize - 6 - getHeaderLength();
+    }
+
+    public int getHeaderLength() {
+        // OPP may need it
+        byte[] headerArray = ObexHelper.createHeader(mRequestHeader, false);
+        return headerArray.length;
     }
 
     /**
diff --git a/obex/javax/obex/Operation.java b/obex/javax/obex/Operation.java
index 20653f2..25656ed 100644
--- a/obex/javax/obex/Operation.java
+++ b/obex/javax/obex/Operation.java
@@ -163,6 +163,8 @@
 
     long getLength();
 
+    int getHeaderLength();
+
     String getType();
 
     InputStream openInputStream() throws IOException;
diff --git a/obex/javax/obex/ServerOperation.java b/obex/javax/obex/ServerOperation.java
index 504fe35..07a3a53 100644
--- a/obex/javax/obex/ServerOperation.java
+++ b/obex/javax/obex/ServerOperation.java
@@ -124,21 +124,30 @@
              * It is a PUT request.
              */
             mGetOperation = false;
-        } else {
+
+            /*
+             * Determine if the final bit is set
+             */
+            if ((request & 0x80) == 0) {
+                finalBitSet = false;
+            } else {
+                finalBitSet = true;
+                mRequestFinished = true;
+            }
+        } else if ((request == 0x03) || (request == 0x83)) {
             /*
              * It is a GET request.
              */
             mGetOperation = true;
-        }
 
-        /*
-         * Determine if the final bit is set
-         */
-        if ((request & 0x80) == 0) {
+            // For Get request, final bit set is decided by server side logic
             finalBitSet = false;
+
+            if (request == 0x83) {
+                mRequestFinished = true;
+            }
         } else {
-            finalBitSet = true;
-            mRequestFinished = true;
+            throw new IOException("ServerOperation can not handle such request");
         }
 
         int length = in.read();
@@ -216,12 +225,9 @@
         }
 
         // wait for get request finished !!!!
-        while (mGetOperation && !finalBitSet) {
+        while (mGetOperation && !mRequestFinished) {
             sendReply(ResponseCodes.OBEX_HTTP_CONTINUE);
         }
-        if (finalBitSet && mGetOperation) {
-            mRequestFinished = true;
-        }
     }
 
     public boolean isValidBody() {
@@ -333,6 +339,12 @@
             out.write(headerArray);
         }
 
+        // For Get operation: if response code is OBEX_HTTP_OK, then this is the
+        // last packet; so set finalBitSet to true.
+        if (mGetOperation && type == ResponseCodes.OBEX_HTTP_OK) {
+            finalBitSet = true;
+        }
+
         if ((finalBitSet) || (headerArray.length < (mMaxPacketLength - 20))) {
             if (bodyLength > 0) {
                 /*
@@ -410,9 +422,10 @@
                 }
             } else {
 
-                if ((headerID == ObexHelper.OBEX_OPCODE_PUT_FINAL)
-                        || (headerID == ObexHelper.OBEX_OPCODE_GET_FINAL)) {
+                if ((headerID == ObexHelper.OBEX_OPCODE_PUT_FINAL)) {
                     finalBitSet = true;
+                } else if (headerID == ObexHelper.OBEX_OPCODE_GET_FINAL) {
+                    mRequestFinished = true;
                 }
 
                 /*
@@ -584,7 +597,20 @@
     }
 
     public int getMaxPacketSize() {
-        return mMaxPacketLength - 6;
+        return mMaxPacketLength - 6 - getHeaderLength();
+    }
+
+    public int getHeaderLength() {
+        long id = mListener.getConnectionId();
+        if (id == -1) {
+            replyHeader.mConnectionID = null;
+        } else {
+            replyHeader.mConnectionID = ObexHelper.convertToByteArray(id);
+        }
+
+        byte[] headerArray = ObexHelper.createHeader(replyHeader, false);
+
+        return headerArray.length;
     }
 
     /**
@@ -623,7 +649,7 @@
         }
 
         if (mPrivateOutput == null) {
-            mPrivateOutput = new PrivateOutputStream(this, mMaxPacketLength - 6);
+            mPrivateOutput = new PrivateOutputStream(this, getMaxPacketSize());
         }
         mPrivateOutputOpen = true;
         return mPrivateOutput;