1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright 2019 Google 3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 4*61046927SAndroid Build Coastguard Worker */ 5*61046927SAndroid Build Coastguard Worker 6*61046927SAndroid Build Coastguard Worker #pragma once 7*61046927SAndroid Build Coastguard Worker 8*61046927SAndroid Build Coastguard Worker #include <inttypes.h> 9*61046927SAndroid Build Coastguard Worker #include <sys/types.h> 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard Worker #include <string> 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Worker namespace gfxstream { 14*61046927SAndroid Build Coastguard Worker namespace aemu { 15*61046927SAndroid Build Coastguard Worker 16*61046927SAndroid Build Coastguard Worker // Abstract interface to byte streams of all kind. 17*61046927SAndroid Build Coastguard Worker // This is mainly used to implement disk serialization. 18*61046927SAndroid Build Coastguard Worker class Stream { 19*61046927SAndroid Build Coastguard Worker public: 20*61046927SAndroid Build Coastguard Worker // Default constructor. 21*61046927SAndroid Build Coastguard Worker Stream() = default; 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Worker // Destructor. 24*61046927SAndroid Build Coastguard Worker virtual ~Stream() = default; 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker // Read up to |size| bytes and copy them to |buffer|. Return the number 27*61046927SAndroid Build Coastguard Worker // of bytes that were actually transferred, or -errno value on error. 28*61046927SAndroid Build Coastguard Worker virtual ssize_t read(void* buffer, size_t size) = 0; 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker // Write up to |size| bytes from |buffer| into the stream. Return the 31*61046927SAndroid Build Coastguard Worker // number of bytes that were actually transferred, or -errno value on 32*61046927SAndroid Build Coastguard Worker // error. 33*61046927SAndroid Build Coastguard Worker virtual ssize_t write(const void* buffer, size_t size) = 0; 34*61046927SAndroid Build Coastguard Worker getProtobuf()35*61046927SAndroid Build Coastguard Worker virtual void* getProtobuf() { return nullptr; } 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Worker // Write a single byte |value| into the stream. Ignore errors. 38*61046927SAndroid Build Coastguard Worker void putByte(uint8_t value); 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker // Write a 16-bit |value| as big-endian into the stream. Ignore errors. 41*61046927SAndroid Build Coastguard Worker void putBe16(uint16_t value); 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker // Write a 32-bit |value| as big-endian into the stream. Ignore errors. 44*61046927SAndroid Build Coastguard Worker void putBe32(uint32_t value); 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker // Write a 64-bit |value| as big-endian into the stream. Ignore errors. 47*61046927SAndroid Build Coastguard Worker void putBe64(uint64_t value); 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Worker // Read a single byte from the stream. Return 0 on error. 50*61046927SAndroid Build Coastguard Worker uint8_t getByte(); 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker // Read a single big-endian 16-bit value from the stream. 53*61046927SAndroid Build Coastguard Worker // Return 0 on error. 54*61046927SAndroid Build Coastguard Worker uint16_t getBe16(); 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard Worker // Read a single big-endian 32-bit value from the stream. 57*61046927SAndroid Build Coastguard Worker // Return 0 on error. 58*61046927SAndroid Build Coastguard Worker uint32_t getBe32(); 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker // Read a single big-endian 64-bit value from the stream. 61*61046927SAndroid Build Coastguard Worker // Return 0 on error. 62*61046927SAndroid Build Coastguard Worker uint64_t getBe64(); 63*61046927SAndroid Build Coastguard Worker 64*61046927SAndroid Build Coastguard Worker // Write a 32-bit float |value| to the stream. 65*61046927SAndroid Build Coastguard Worker void putFloat(float value); 66*61046927SAndroid Build Coastguard Worker 67*61046927SAndroid Build Coastguard Worker // Read a single 32-bit float value from the stream. 68*61046927SAndroid Build Coastguard Worker float getFloat(); 69*61046927SAndroid Build Coastguard Worker 70*61046927SAndroid Build Coastguard Worker // Write a 0-terminated C string |str| into the stream. Ignore error. 71*61046927SAndroid Build Coastguard Worker void putString(const char* str); 72*61046927SAndroid Build Coastguard Worker void putString(const std::string& str); 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker // Write a string |str| of |strlen| bytes into the stream. 75*61046927SAndroid Build Coastguard Worker // Ignore errors. 76*61046927SAndroid Build Coastguard Worker void putString(const char* str, size_t strlen); 77*61046927SAndroid Build Coastguard Worker 78*61046927SAndroid Build Coastguard Worker // Read a string from the stream. Return a new string instance, 79*61046927SAndroid Build Coastguard Worker // which will be empty on error. Note that this can only be used 80*61046927SAndroid Build Coastguard Worker // to read strings that were written with putString(). 81*61046927SAndroid Build Coastguard Worker std::string getString(); 82*61046927SAndroid Build Coastguard Worker 83*61046927SAndroid Build Coastguard Worker // Put/gen an integer number into the stream, making it use as little space 84*61046927SAndroid Build Coastguard Worker // there as possible. 85*61046927SAndroid Build Coastguard Worker // It uses a simple byte-by-byte encoding scheme, putting 7 bits of the 86*61046927SAndroid Build Coastguard Worker // number with the 8th bit set when there's more data to read, until the 87*61046927SAndroid Build Coastguard Worker // whole number is read. 88*61046927SAndroid Build Coastguard Worker // The compression is efficient if the number range is small, but it starts 89*61046927SAndroid Build Coastguard Worker // wasting space when values approach 14 bits for int16 (16K), 28 bits for 90*61046927SAndroid Build Coastguard Worker // int32 (268M) or 56 bits for int64 (still a lot). 91*61046927SAndroid Build Coastguard Worker void putPackedNum(uint64_t num); 92*61046927SAndroid Build Coastguard Worker uint64_t getPackedNum(); 93*61046927SAndroid Build Coastguard Worker 94*61046927SAndroid Build Coastguard Worker // Same thing, but encode negative numbers efficiently as well (single sign 95*61046927SAndroid Build Coastguard Worker // bit + packed unsigned representation) 96*61046927SAndroid Build Coastguard Worker void putPackedSignedNum(int64_t num); 97*61046927SAndroid Build Coastguard Worker int64_t getPackedSignedNum(); 98*61046927SAndroid Build Coastguard Worker 99*61046927SAndroid Build Coastguard Worker // Static big-endian conversions 100*61046927SAndroid Build Coastguard Worker static void toByte(uint8_t*); 101*61046927SAndroid Build Coastguard Worker static void toBe16(uint8_t*); 102*61046927SAndroid Build Coastguard Worker static void toBe32(uint8_t*); 103*61046927SAndroid Build Coastguard Worker static void toBe64(uint8_t*); 104*61046927SAndroid Build Coastguard Worker static void fromByte(uint8_t*); 105*61046927SAndroid Build Coastguard Worker static void fromBe16(uint8_t*); 106*61046927SAndroid Build Coastguard Worker static void fromBe32(uint8_t*); 107*61046927SAndroid Build Coastguard Worker static void fromBe64(uint8_t*); 108*61046927SAndroid Build Coastguard Worker }; 109*61046927SAndroid Build Coastguard Worker 110*61046927SAndroid Build Coastguard Worker void saveStringArray(Stream* stream, const char* const* strings, uint32_t count); 111*61046927SAndroid Build Coastguard Worker 112*61046927SAndroid Build Coastguard Worker } // namespace aemu 113*61046927SAndroid Build Coastguard Worker } // namespace gfxstream 114