diff --git a/services/backup/docker-server/contents/server/src/Reactors/WriteReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/WriteReactorBase.h deleted file mode 100644 --- a/services/backup/docker-server/contents/server/src/Reactors/WriteReactorBase.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace comm { -namespace network { - -template -class WriteReactorBase : public grpc::ServerWriteReactor { - Response response; - -protected: - // this is a const ref since it's not meant to be modified - const Request &request; - -public: - WriteReactorBase(const Request *request); - - virtual void NextWrite(); - void OnDone() override; - void OnWriteDone(bool ok) override; - - virtual std::unique_ptr writeResponse(Response *response) = 0; -}; - -template -WriteReactorBase::WriteReactorBase(const Request *request) - : request(*request) { - // we cannot call this->NextWrite() here because it's going to call it on - // the base class, not derived leading to the runtime error of calling - // a pure virtual function - // NextWrite has to be exposed as a public function and called explicitly - // to initialize writing -} - -template -void WriteReactorBase::NextWrite() { - this->response = Response(); - std::unique_ptr status = this->writeResponse(&this->response); - if (status != nullptr) { - this->Finish(*status); - return; - } - this->StartWrite(&this->response); -} - -template -void WriteReactorBase::OnDone() { - delete this; -} - -template -void WriteReactorBase::OnWriteDone(bool ok) { - if (!ok) { - this->Finish(grpc::Status(grpc::StatusCode::INTERNAL, "writing error")); - return; - } - try { - this->NextWrite(); - } catch (std::runtime_error &e) { - this->Finish(grpc::Status(grpc::StatusCode::INTERNAL, e.what())); - } -} - -} // namespace network -} // namespace comm diff --git a/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerWriteReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerWriteReactorBase.h new file mode 100644 --- /dev/null +++ b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerWriteReactorBase.h @@ -0,0 +1,94 @@ +#pragma once + +#include + +#include +#include +#include + +namespace comm { +namespace network { +namespace reactor { + +template +class ServerWriteReactorBase : public grpc::ServerWriteReactor { + Response response; + bool initialized = false; + + void terminate(grpc::Status status); + +protected: + // this is a const ref since it's not meant to be modified + const Request &request; + +public: + ServerWriteReactorBase(const Request *request); + + virtual void NextWrite(); + void OnDone() override; + void OnWriteDone(bool ok) override; + + virtual std::unique_ptr writeResponse(Response *response) = 0; + virtual void initialize(){}; + virtual void doneCallback(){}; +}; + +template +void ServerWriteReactorBase::terminate(grpc::Status status) { + this->status = status; + this->Finish(status); +} + +template +ServerWriteReactorBase::ServerWriteReactorBase( + const Request *request) + : request(*request) { + // we cannot call this->NextWrite() here because it's going to call it on + // the base class, not derived leading to the runtime error of calling + // a pure virtual function + // NextWrite has to be exposed as a public function and called explicitly + // to initialize writing +} + +template +void ServerWriteReactorBase::NextWrite() { + try { + if (!this->initialized) { + this->initialize(); + this->initialized = true; + } + this->response = Response(); + std::unique_ptr status = this->writeResponse(&this->response); + if (status != nullptr) { + this->terminate(*status); + return; + } + this->StartWrite(&this->response); + } catch (std::runtime_error &e) { + std::cout << "error: " << e.what() << std::endl; + this->terminate(grpc::Status(grpc::StatusCode::INTERNAL, e.what())); + } +} + +template +void ServerWriteReactorBase::OnDone() { + this->doneCallback(); + delete this; +} + +template +void ServerWriteReactorBase::OnWriteDone(bool ok) { + if (!ok) { + this->terminate(grpc::Status(grpc::StatusCode::INTERNAL, "writing error")); + return; + } + try { + this->NextWrite(); + } catch (std::runtime_error &e) { + this->terminate(grpc::Status(grpc::StatusCode::INTERNAL, e.what())); + } +} + +} // namespace reactor +} // namespace network +} // namespace comm