diff --git a/services/backup/docker-server/contents/server/src/Reactors/WriteReactorBase.h b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerWriteReactorBase.h rename from services/backup/docker-server/contents/server/src/Reactors/WriteReactorBase.h rename to services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerWriteReactorBase.h --- a/services/backup/docker-server/contents/server/src/Reactors/WriteReactorBase.h +++ b/services/backup/docker-server/contents/server/src/Reactors/server/base-reactors/ServerWriteReactorBase.h @@ -1,33 +1,39 @@ #pragma once #include + #include #include #include namespace comm { namespace network { +namespace reactor { template -class WriteReactorBase : public grpc::ServerWriteReactor { +class ServerWriteReactorBase : public grpc::ServerWriteReactor { Response response; + bool initialized = false; protected: // this is a const ref since it's not meant to be modified const Request &request; public: - WriteReactorBase(const Request *request); + 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 -WriteReactorBase::WriteReactorBase(const Request *request) +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 @@ -37,23 +43,33 @@ } template -void WriteReactorBase::NextWrite() { - this->response = Response(); - std::unique_ptr status = this->writeResponse(&this->response); - if (status != nullptr) { - this->Finish(*status); - return; +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->Finish(*status); + return; + } + this->StartWrite(&this->response); + } catch (std::runtime_error &e) { + std::cout << "error: " << e.what() << std::endl; + this->Finish(grpc::Status(grpc::StatusCode::INTERNAL, e.what())); } - this->StartWrite(&this->response); } template -void WriteReactorBase::OnDone() { +void ServerWriteReactorBase::OnDone() { + this->doneCallback(); delete this; } template -void WriteReactorBase::OnWriteDone(bool ok) { +void ServerWriteReactorBase::OnWriteDone(bool ok) { if (!ok) { this->Finish(grpc::Status(grpc::StatusCode::INTERNAL, "writing error")); return; @@ -65,5 +81,6 @@ } } +} // namespace reactor } // namespace network } // namespace comm