فهرست منبع

漏了三个文件……

tanghai 14 سال پیش
والد
کامیت
2ab9c10fc3
3فایلهای تغییر یافته به همراه103 افزوده شده و 0 حذف شده
  1. 25 0
      Src/Egametang/Rpc/MethodInfo.h
  2. 46 0
      Src/Egametang/Rpc/ResponseHandler.cc
  3. 32 0
      Src/Egametang/Rpc/ResponseHandler.h

+ 25 - 0
Src/Egametang/Rpc/MethodInfo.h

@@ -0,0 +1,25 @@
+#ifndef RPC_METHODINFO_H
+#define RPC_METHODINFO_H
+
+#include <google/protobuf/service.h>
+#include <google/protobuf/message.h>
+
+namespace Egametang {
+
+struct MethodInfo
+{
+	RpcServicePtr service;
+	const google::protobuf::MethodDescriptor* method_descriptor;
+	google::protobuf::Message* request_prototype;
+	google::protobuf::Message* response_prototype;
+	MethodInfo(RpcServicePtr service, const google::protobuf::MethodDescriptor* method_descriptor):
+		service(service), method_descriptor(method_descriptor)
+	{
+		request_prototype = &service->GetRequestPrototype(method_descriptor);
+		response_prototype = &service->GetResponsePrototype(method_descriptor);
+	}
+};
+
+} // namespace Egametang
+
+#endif // RPC_METHODINFO_H

+ 46 - 0
Src/Egametang/Rpc/ResponseHandler.cc

@@ -0,0 +1,46 @@
+#include "Rpc/MethodInfo.h"
+#include "Rpc/ResponseHandler.h"
+
+namespace Egametang {
+
+ResponseHandler::ResponseHandler(
+		MethodInfoPtr& method_info, std::size_t id, MessageHandler& send_message):
+		id(id), message_handler(message_handler)
+{
+	method = method_info->method_descriptor;
+	request = method_info->request_prototype->New();
+	response = method_info->response_prototype->New();
+}
+
+ResponseHandler::~ResponseHandler()
+{
+	delete request;
+	delete response;
+}
+
+google::protobuf::MethodDescriptor* ResponseHandler::Method()
+{
+	return method;
+}
+
+google::protobuf::Message* ResponseHandler::Request()
+{
+	return request;
+}
+
+google::protobuf::Message* ResponseHandler::Response()
+{
+	return response;
+}
+
+void ResponseHandler::Run()
+{
+	RpcMetaPtr meta(new RpcMeta());
+	StringPtr message(new std::string);
+	response->SerializeToString(message.get());
+	meta->id = id;
+	meta->size = message->size();
+	message_handler(meta, message);
+}
+
+} // namespace Egametang

+ 32 - 0
Src/Egametang/Rpc/ResponseHandler.h

@@ -0,0 +1,32 @@
+#ifndef RPC_RESPONSEHANDLER_H
+#define RPC_RESPONSEHANDLER_H
+
+#include <google/protobuf/service.h>
+#include <google/protobuf/message.h>
+
+namespace Egametang {
+
+class ResponseHandler
+{
+	google::protobuf::MethodDescriptor* method;
+	google::protobuf::Message* request;
+	google::protobuf::Message* response;
+	std::size_t id;
+	MessageHandler message_handler;
+
+	ResponseHandler(MethodInfoPtr& method_info, std::size_t id, MessageHandler& send_message);
+
+	~ResponseHandler();
+
+	google::protobuf::MethodDescriptor* Method();
+
+	google::protobuf::Message* Request();
+
+	google::protobuf::Message* Response();
+
+	void Run();
+};
+
+} // namespace Egametang
+
+#endif // RPC_RESPONSEHANDLER_H