THRIFT-533.  Fix write:offset:length: to ensure all requested data is written.

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@796351 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/cocoa/src/transport/TNSStreamTransport.m b/lib/cocoa/src/transport/TNSStreamTransport.m
index 52a02e2..1d4cfee 100644
--- a/lib/cocoa/src/transport/TNSStreamTransport.m
+++ b/lib/cocoa/src/transport/TNSStreamTransport.m
@@ -65,17 +65,19 @@
 }
 
 
-// FIXME:geech:20071019 - make this write all
 - (void) write: (uint8_t *) data offset: (unsigned int) offset length: (unsigned int) length
 {
-  int result = [mOutput write: data+offset maxLength: length];
-  if (result == -1) {
-    @throw [TTransportException exceptionWithReason: @"Error writing to transport output stream."
-                                              error: [mOutput streamError]];
-  } else if (result == 0) {
-    @throw [TTransportException exceptionWithReason: @"End of output stream."];
-  } else if (result != length) {
-    @throw [TTransportException exceptionWithReason: @"Output stream did not write all of our data."];
+  int got = 0;
+  int result = 0;
+  while (got < length) {
+    result = [mOutput write: data+offset+got maxLength: length-got];
+    if (result == -1) {
+      @throw [TTransportException exceptionWithReason: @"Error writing to transport output stream."
+                                                error: [mOutput streamError]];
+    } else if (result == 0) {
+      @throw [TTransportException exceptionWithReason: @"End of output stream."];
+    }
+    got += result;
   }
 }