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