Page MenuHomePhorge

D3519.1769047619.diff
No OneTemporary

Size
2 KB
Referenced Files
None
Subscribers
None

D3519.1769047619.diff

diff --git a/services/blob/src/Reactors/server/base-reactors/ServerReadReactorBase.h b/services/blob/src/Reactors/server/base-reactors/ServerReadReactorBase.h
new file mode 100644
--- /dev/null
+++ b/services/blob/src/Reactors/server/base-reactors/ServerReadReactorBase.h
@@ -0,0 +1,75 @@
+#pragma once
+
+#include <grpcpp/grpcpp.h>
+
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace comm {
+namespace network {
+namespace reactor {
+
+template <class Request, class Response>
+class ServerReadReactorBase : public grpc::ServerReadReactor<Request> {
+ Request request;
+
+ void terminate(grpc::Status status);
+
+protected:
+ Response *response;
+ grpc::Status status;
+
+public:
+ ServerReadReactorBase(Response *response);
+
+ void OnDone() override;
+ void OnReadDone(bool ok) override;
+
+ virtual std::unique_ptr<grpc::Status> readRequest(Request request) = 0;
+ virtual void initialize(){};
+ virtual void doneCallback(){};
+};
+
+template <class Request, class Response>
+void ServerReadReactorBase<Request, Response>::terminate(grpc::Status status) {
+ this->status = status;
+ this->Finish(status);
+}
+
+template <class Request, class Response>
+ServerReadReactorBase<Request, Response>::ServerReadReactorBase(
+ Response *response)
+ : response(response) {
+ this->initialize();
+ this->StartRead(&this->request);
+}
+
+template <class Request, class Response>
+void ServerReadReactorBase<Request, Response>::OnDone() {
+ this->doneCallback();
+ delete this;
+}
+
+template <class Request, class Response>
+void ServerReadReactorBase<Request, Response>::OnReadDone(bool ok) {
+ if (!ok) {
+ this->terminate(grpc::Status(grpc::StatusCode::INTERNAL, "reading error"));
+ return;
+ }
+ try {
+ std::unique_ptr<grpc::Status> status = this->readRequest(this->request);
+ if (status != nullptr) {
+ this->terminate(*status);
+ return;
+ }
+ } catch (std::runtime_error &e) {
+ this->terminate(grpc::Status(grpc::StatusCode::INTERNAL, e.what()));
+ return;
+ }
+ this->StartRead(&this->request);
+}
+
+} // namespace reactor
+} // namespace network
+} // namespace comm

File Metadata

Mime Type
text/plain
Expires
Thu, Jan 22, 2:06 AM (1 m, 26 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5973324
Default Alt Text
D3519.1769047619.diff (2 KB)

Event Timeline