| 
					
				 | 
			
			
				@@ -39,7 +39,8 @@ class GrpcBufferWriterPeer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const int kGrpcBufferWriterMaxBufferLength = 1024 * 1024; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class GrpcBufferWriter : public ::grpc::protobuf::io::ZeroCopyOutputStream { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class GrpcBufferWriter final 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    : public ::grpc::protobuf::io::ZeroCopyOutputStream { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   explicit GrpcBufferWriter(grpc_byte_buffer** bp, int block_size) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       : block_size_(block_size), byte_count_(0), have_backup_(false) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -87,8 +88,6 @@ class GrpcBufferWriter : public ::grpc::protobuf::io::ZeroCopyOutputStream { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc::protobuf::int64 ByteCount() const override { return byte_count_; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_slice_buffer* SliceBuffer() { return slice_buffer_; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  private: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   friend class GrpcBufferWriterPeer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const int block_size_; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -99,7 +98,8 @@ class GrpcBufferWriter : public ::grpc::protobuf::io::ZeroCopyOutputStream { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_slice slice_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class GrpcBufferReader : public ::grpc::protobuf::io::ZeroCopyInputStream { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class GrpcBufferReader final 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    : public ::grpc::protobuf::io::ZeroCopyInputStream { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   explicit GrpcBufferReader(grpc_byte_buffer* buffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       : byte_count_(0), backup_count_(0), status_() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -160,7 +160,7 @@ class GrpcBufferReader : public ::grpc::protobuf::io::ZeroCopyInputStream { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return byte_count_ - backup_count_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- protected: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ private: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int64_t byte_count_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int64_t backup_count_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_byte_buffer_reader reader_; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -168,83 +168,57 @@ class GrpcBufferReader : public ::grpc::protobuf::io::ZeroCopyInputStream { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Status status_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-template <class BufferWriter, class T> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Status GenericSerialize(const grpc::protobuf::Message& msg, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        grpc_byte_buffer** bp, bool* own_buffer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  static_assert( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      std::is_base_of<protobuf::io::ZeroCopyOutputStream, BufferWriter>::value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "BufferWriter must be a subclass of io::ZeroCopyOutputStream"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  *own_buffer = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  int byte_size = msg.ByteSize(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (byte_size <= internal::kGrpcBufferWriterMaxBufferLength) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_slice slice = g_core_codegen_interface->grpc_slice_malloc(byte_size); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_CODEGEN_ASSERT( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        GRPC_SLICE_END_PTR(slice) == 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        msg.SerializeWithCachedSizesToArray(GRPC_SLICE_START_PTR(slice))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    *bp = g_core_codegen_interface->grpc_raw_byte_buffer_create(&slice, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    g_core_codegen_interface->grpc_slice_unref(slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return g_core_codegen_interface->ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    BufferWriter writer(bp, internal::kGrpcBufferWriterMaxBufferLength); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return msg.SerializeToZeroCopyStream(&writer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               ? g_core_codegen_interface->ok() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               : Status(StatusCode::INTERNAL, "Failed to serialize message"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-template <class BufferReader, class T> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Status GenericDeserialize(grpc_byte_buffer* buffer, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                          grpc::protobuf::Message* msg) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  static_assert( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      std::is_base_of<protobuf::io::ZeroCopyInputStream, BufferReader>::value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      "BufferReader must be a subclass of io::ZeroCopyInputStream"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (buffer == nullptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return Status(StatusCode::INTERNAL, "No payload"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  Status result = g_core_codegen_interface->ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    BufferReader reader(buffer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!reader.status().ok()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return reader.status(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ::grpc::protobuf::io::CodedInputStream decoder(&reader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    decoder.SetTotalBytesLimit(INT_MAX, INT_MAX); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!msg->ParseFromCodedStream(&decoder)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      result = Status(StatusCode::INTERNAL, msg->InitializationErrorString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (!decoder.ConsumedEntireMessage()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      result = Status(StatusCode::INTERNAL, "Did not read entire message"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  g_core_codegen_interface->grpc_byte_buffer_destroy(buffer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }  // namespace internal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// this is needed so the following class does not conflict with protobuf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// serializers that utilize internal-only tools. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#ifdef GRPC_OPEN_SOURCE_PROTO 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// This class provides a protobuf serializer. It translates between protobuf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// objects and grpc_byte_buffers. More information about SerializationTraits can 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// be found in include/grpc++/impl/codegen/serialization_traits.h. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 template <class T> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class SerializationTraits<T, typename std::enable_if<std::is_base_of< 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                  grpc::protobuf::Message, T>::value>::type> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   static Status Serialize(const grpc::protobuf::Message& msg, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                           grpc_byte_buffer** bp, bool* own_buffer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return internal::GenericSerialize<internal::GrpcBufferWriter, T>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        msg, bp, own_buffer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *own_buffer = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int byte_size = msg.ByteSize(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (byte_size <= internal::kGrpcBufferWriterMaxBufferLength) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      grpc_slice slice = g_core_codegen_interface->grpc_slice_malloc(byte_size); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      GPR_CODEGEN_ASSERT( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          GRPC_SLICE_END_PTR(slice) == 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          msg.SerializeWithCachedSizesToArray(GRPC_SLICE_START_PTR(slice))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      *bp = g_core_codegen_interface->grpc_raw_byte_buffer_create(&slice, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      g_core_codegen_interface->grpc_slice_unref(slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return g_core_codegen_interface->ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      internal::GrpcBufferWriter writer( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          bp, internal::kGrpcBufferWriterMaxBufferLength); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return msg.SerializeToZeroCopyStream(&writer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 ? g_core_codegen_interface->ok() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 : Status(StatusCode::INTERNAL, "Failed to serialize message"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   static Status Deserialize(grpc_byte_buffer* buffer, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             grpc::protobuf::Message* msg) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return internal::GenericDeserialize<internal::GrpcBufferReader, T>(buffer, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                                       msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (buffer == nullptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return Status(StatusCode::INTERNAL, "No payload"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Status result = g_core_codegen_interface->ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      internal::GrpcBufferReader reader(buffer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (!reader.status().ok()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return reader.status(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ::grpc::protobuf::io::CodedInputStream decoder(&reader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      decoder.SetTotalBytesLimit(INT_MAX, INT_MAX); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (!msg->ParseFromCodedStream(&decoder)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = Status(StatusCode::INTERNAL, msg->InitializationErrorString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (!decoder.ConsumedEntireMessage()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = Status(StatusCode::INTERNAL, "Did not read entire message"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    g_core_codegen_interface->grpc_byte_buffer_destroy(buffer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }  // namespace grpc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |