| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| #ifndef KUDU_RPC_SERIALIZATION_H |
| #define KUDU_RPC_SERIALIZATION_H |
| |
| #include <cstdint> |
| #include <cstring> |
| |
| namespace google { |
| namespace protobuf { |
| class MessageLite; |
| } // namespace protobuf |
| } // namespace google |
| |
| namespace kudu { |
| |
| class Status; |
| class faststring; |
| class Slice; |
| |
| namespace rpc { |
| namespace serialization { |
| |
| // Serialize the request param into a buffer which is allocated by this function. |
| // Uses the message's cached size by calling MessageLite::GetCachedSize(). |
| // In : 'message' Protobuf Message to serialize |
| // 'additional_size' Optional argument which increases the recorded size |
| // within param_buf. This argument is necessary if there will be |
| // additional sidecars appended onto the message (that aren't part of |
| // the protobuf itself). |
| // 'use_cached_size' Additional optional argument whether to use the cached |
| // or explicit byte size by calling MessageLite::GetCachedSize() or |
| // MessageLite::ByteSize(), respectively. |
| // Out: The faststring 'param_buf' to be populated with the serialized bytes. |
| // The faststring's length is only determined by the amount that |
| // needs to be serialized for the protobuf (i.e., no additional space |
| // is reserved for 'additional_size', which only affects the |
| // size indicator prefix in 'param_buf'). |
| void SerializeMessage(const google::protobuf::MessageLite& message, |
| faststring* param_buf, int additional_size = 0, |
| bool use_cached_size = false); |
| |
| // Serialize the request or response header into a buffer which is allocated |
| // by this function. |
| // Includes leading 32-bit length of the buffer. |
| // In: Protobuf Header to serialize, |
| // Length of the message param following this header in the frame. |
| // Out: faststring to be populated with the serialized bytes. |
| void SerializeHeader(const google::protobuf::MessageLite& header, |
| size_t param_len, |
| faststring* header_buf); |
| |
| // Deserialize the request. |
| // In: data buffer Slice. |
| // Out: parsed_header PB initialized, |
| // parsed_main_message pointing to offset in original buffer containing |
| // the main payload. |
| Status ParseMessage(const Slice& buf, |
| google::protobuf::MessageLite* parsed_header, |
| Slice* parsed_main_message); |
| |
| // Serialize the RPC connection header (magic number + flags). |
| // buf must have 7 bytes available (kMagicNumberLength + kHeaderFlagsLength). |
| void SerializeConnHeader(uint8_t* buf); |
| |
| // Validate the entire rpc header (magic number + flags). |
| Status ValidateConnHeader(const Slice& slice); |
| |
| |
| } // namespace serialization |
| } // namespace rpc |
| } // namespace kudu |
| #endif // KUDU_RPC_SERIALIZATION_H |