| // Copyright 2018 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef SRC_DEVELOPER_DEBUG_IPC_MESSAGE_READER_H_ | |
| #define SRC_DEVELOPER_DEBUG_IPC_MESSAGE_READER_H_ | |
| #include <stdint.h> | |
| #include <string> | |
| #include <vector> | |
| namespace debug_ipc { | |
| struct MsgHeader; | |
| class MessageReader { | |
| public: | |
| explicit MessageReader(std::vector<char> message); | |
| ~MessageReader(); | |
| bool has_error() const { return has_error_; } | |
| // Returns the number of bytes available still to read. | |
| uint32_t remaining() const { return message_.size() - offset_; } | |
| size_t message_size() const { return message_.size(); } | |
| // These functions return true on success. | |
| bool ReadBytes(uint32_t len, void* output); | |
| bool ReadInt32(int32_t* output); | |
| bool ReadUint32(uint32_t* output); | |
| bool ReadInt64(int64_t* output); | |
| bool ReadUint64(uint64_t* output); | |
| bool ReadString(std::string* output); | |
| bool ReadBool(bool* output); | |
| bool ReadHeader(MsgHeader* output); | |
| private: | |
| // Sets the error flag and returns false. This is designed so that error | |
| // handling code | |
| // need only call "return SetError();". | |
| bool SetError(); | |
| const std::vector<char> message_; | |
| uint32_t offset_ = 0; // Current read offset. | |
| bool has_error_ = false; | |
| }; | |
| } // namespace debug_ipc | |
| #endif // SRC_DEVELOPER_DEBUG_IPC_MESSAGE_READER_H_ |