1 // Copyright 2021 gRPC authors.
2 //
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 //     http://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 #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_TRANSACTION_H
16 #define GRPC_SRC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_TRANSACTION_H
17 
18 #include <grpc/support/port_platform.h>
19 
20 #include <string>
21 #include <vector>
22 
23 #include "absl/strings/string_view.h"
24 
25 #include <grpc/support/log.h>
26 
27 #include "src/core/lib/gprpp/crash.h"
28 
29 namespace grpc_binder {
30 
31 ABSL_CONST_INIT extern const int kFlagPrefix;
32 ABSL_CONST_INIT extern const int kFlagMessageData;
33 ABSL_CONST_INIT extern const int kFlagSuffix;
34 ABSL_CONST_INIT extern const int kFlagOutOfBandClose;
35 ABSL_CONST_INIT extern const int kFlagExpectSingleMessage;
36 ABSL_CONST_INIT extern const int kFlagStatusDescription;
37 ABSL_CONST_INIT extern const int kFlagMessageDataIsParcelable;
38 ABSL_CONST_INIT extern const int kFlagMessageDataIsPartial;
39 
40 using Metadata = std::vector<std::pair<std::string, std::string>>;
41 
42 class Transaction {
43  public:
Transaction(int tx_code,bool is_client)44   Transaction(int tx_code, bool is_client)
45       : tx_code_(tx_code), is_client_(is_client) {}
46   // TODO(mingcl): Consider using string_view
SetPrefix(Metadata prefix_metadata)47   void SetPrefix(Metadata prefix_metadata) {
48     prefix_metadata_ = prefix_metadata;
49     GPR_ASSERT((flags_ & kFlagPrefix) == 0);
50     flags_ |= kFlagPrefix;
51   }
SetMethodRef(std::string method_ref)52   void SetMethodRef(std::string method_ref) {
53     GPR_ASSERT(is_client_);
54     method_ref_ = method_ref;
55   }
SetData(std::string message_data)56   void SetData(std::string message_data) {
57     message_data_ = message_data;
58     GPR_ASSERT((flags_ & kFlagMessageData) == 0);
59     flags_ |= kFlagMessageData;
60   }
SetSuffix(Metadata suffix_metadata)61   void SetSuffix(Metadata suffix_metadata) {
62     if (is_client_) GPR_ASSERT(suffix_metadata.empty());
63     suffix_metadata_ = suffix_metadata;
64     GPR_ASSERT((flags_ & kFlagSuffix) == 0);
65     flags_ |= kFlagSuffix;
66   }
SetStatusDescription(std::string status_desc)67   void SetStatusDescription(std::string status_desc) {
68     GPR_ASSERT(!is_client_);
69     GPR_ASSERT((flags_ & kFlagStatusDescription) == 0);
70     status_desc_ = status_desc;
71   }
SetStatus(int status)72   void SetStatus(int status) {
73     GPR_ASSERT(!is_client_);
74     GPR_ASSERT((flags_ >> 16) == 0);
75     GPR_ASSERT(status < (1 << 16));
76     flags_ |= (status << 16);
77   }
78 
IsClient()79   bool IsClient() const { return is_client_; }
IsServer()80   bool IsServer() const { return !is_client_; }
GetTxCode()81   int GetTxCode() const { return tx_code_; }
GetFlags()82   int GetFlags() const { return flags_; }
83 
GetMethodRef()84   absl::string_view GetMethodRef() const { return method_ref_; }
GetPrefixMetadata()85   const Metadata& GetPrefixMetadata() const { return prefix_metadata_; }
GetSuffixMetadata()86   const Metadata& GetSuffixMetadata() const { return suffix_metadata_; }
GetMessageData()87   absl::string_view GetMessageData() const { return message_data_; }
GetStatusDesc()88   absl::string_view GetStatusDesc() const { return status_desc_; }
89 
90   Transaction(const Transaction&) = delete;
91   void operator=(const Transaction&) = delete;
92 
93  private:
94   int tx_code_;
95   bool is_client_;
96   Metadata prefix_metadata_;
97   Metadata suffix_metadata_;
98   std::string method_ref_;
99   std::string message_data_;
100   std::string status_desc_;
101 
102   int flags_ = 0;
103 };
104 
105 }  // namespace grpc_binder
106 
107 #endif  // GRPC_SRC_CORE_EXT_TRANSPORT_BINDER_WIRE_FORMAT_TRANSACTION_H
108