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