| 
					
				 | 
			
			
				@@ -49,22 +49,25 @@ namespace protobuf { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace util { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace internal { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ZeroCopyStreamByteSink::~ZeroCopyStreamByteSink() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  stream_->BackUp(buffer_size_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  while (len > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    void* buffer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    int length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!stream_->Next(&buffer, &length)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // There isn't a way for ByteSink to report errors. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  while (true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (len <= buffer_size_) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      memcpy(buffer_, bytes, len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      buffer_ = static_cast<char*>(buffer_) + len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      buffer_size_ -= len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (len < length) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      memcpy(buffer, bytes, len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      stream_->BackUp(length - len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      memcpy(buffer, bytes, length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      bytes += length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      len -= length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    memcpy(buffer_, bytes, buffer_size_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    bytes += buffer_size_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    len -= buffer_size_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!stream_->Next(&buffer_, &buffer_size_)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // There isn't a way for ByteSink to report errors. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      buffer_size_ = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |