1 /*
2  * Copyright 2019 Google LLC.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     https://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "private_join_and_compute/private_join_and_compute_rpc_impl.h"
17 
18 #include "private_join_and_compute/util/status.inc"
19 
20 namespace private_join_and_compute {
21 
22 namespace {
23 // Translates Status to grpc::Status
ConvertStatus(const Status & status)24 ::grpc::Status ConvertStatus(const Status& status) {
25   if (status.ok()) {
26     return ::grpc::Status::OK;
27   }
28   if (IsInvalidArgument(status)) {
29     return ::grpc::Status(::grpc::StatusCode::INVALID_ARGUMENT,
30                           std::string(status.message()));
31   }
32   if (IsInternal(status)) {
33     return ::grpc::Status(::grpc::StatusCode::INTERNAL,
34                           std::string(status.message()));
35   }
36   return ::grpc::Status(::grpc::StatusCode::UNKNOWN,
37                         std::string(status.message()));
38 }
39 
40 class SingleMessageSink : public MessageSink<ServerMessage> {
41  public:
SingleMessageSink(ServerMessage * server_message)42   explicit SingleMessageSink(ServerMessage* server_message)
43       : server_message_(server_message) {}
44 
45   ~SingleMessageSink() override = default;
46 
Send(const ServerMessage & server_message)47   Status Send(const ServerMessage& server_message) override {
48     if (!message_sent_) {
49       *server_message_ = server_message;
50       message_sent_ = true;
51       return OkStatus();
52     } else {
53       return InvalidArgumentError(
54           "SingleMessageSink can only accept a single message.");
55     }
56   }
57 
58  private:
59   ServerMessage* server_message_ = nullptr;
60   bool message_sent_ = false;
61 };
62 
63 }  // namespace
64 
Handle(::grpc::ServerContext * context,const ClientMessage * request,ServerMessage * response)65 ::grpc::Status PrivateJoinAndComputeRpcImpl::Handle(
66     ::grpc::ServerContext* context, const ClientMessage* request,
67     ServerMessage* response) {
68   SingleMessageSink message_sink(response);
69   auto status = protocol_server_impl_->Handle(*request, &message_sink);
70   return ConvertStatus(status);
71 }
72 
73 }  // namespace private_join_and_compute
74