1/* 2 * Copyright 2012 Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Pawe�� Dziepak, pdziepak@quarnos.org 7 */ 8#ifndef XDR_H 9#define XDR_H 10 11 12#include <SupportDefs.h> 13 14 15namespace XDR { 16 17class Stream { 18public: 19 typedef uint32 Position; 20 21 virtual ~Stream(); 22 23 inline const void* Buffer() const; 24 inline Position Current() const; 25 26protected: 27 Stream(void* buffer, uint32 size); 28 29 inline uint32 _PositionToSize() const; 30 inline uint32 _RealSize(uint32 size) const; 31 32 uint32* fBuffer; 33 uint32 fSize; 34 Position fPosition; 35}; 36 37class ReadStream : public Stream { 38public: 39 ReadStream(void* buffer, uint32 size); 40 virtual ~ReadStream(); 41 42 inline void SetPosition(Position position); 43 44 inline int Size() const; 45 46 int32 GetInt(); 47 uint32 GetUInt(); 48 int64 GetHyper(); 49 uint64 GetUHyper(); 50 51 inline bool GetBoolean(); 52 53 char* GetString(); 54 55 const void* GetOpaque(uint32* size); 56 57 inline bool IsEOF() const; 58 59private: 60 bool fEOF; 61}; 62 63class WriteStream : public Stream { 64public: 65 WriteStream(); 66 WriteStream(const WriteStream& x); 67 virtual ~WriteStream(); 68 69 inline int Size() const; 70 void Clear(); 71 72 status_t InsertUInt(Stream::Position pos, uint32 x); 73 74 status_t AddInt(int32 x); 75 status_t AddUInt(uint32 x); 76 status_t AddHyper(int64 x); 77 status_t AddUHyper(uint64 x); 78 79 inline status_t AddBoolean(bool x); 80 81 status_t AddString(const char* str, uint32 maxlen = 0); 82 83 status_t AddOpaque(const void* ptr, uint32 size); 84 status_t AddOpaque(const WriteStream& stream); 85 86 status_t Append(const WriteStream& stream); 87 88 inline status_t Error() const; 89 90private: 91 status_t _CheckResize(uint32 size); 92 93 status_t fError; 94 95 static const uint32 kInitialSize = 64; 96}; 97 98 99inline const void* 100Stream::Buffer() const 101{ 102 return fBuffer; 103} 104 105 106inline Stream::Position 107Stream::Current() const 108{ 109 return fPosition; 110} 111 112 113inline void 114ReadStream::SetPosition(Position position) 115{ 116 fPosition = position; 117} 118 119 120inline int 121ReadStream::Size() const 122{ 123 return fSize; 124} 125 126 127inline bool 128ReadStream::IsEOF() const 129{ 130 return fEOF; 131} 132 133 134inline bool 135ReadStream::GetBoolean() 136{ 137 return GetInt() != 0; 138} 139 140 141inline int 142WriteStream::Size() const 143{ 144 return fPosition * sizeof(uint32); 145} 146 147 148inline status_t 149WriteStream::AddBoolean(bool x) 150{ 151 return AddInt(static_cast<int32>(x)); 152} 153 154 155inline status_t 156WriteStream::Error() const 157{ 158 return fError; 159} 160 161 162} // namespace XDR 163 164 165#endif // XDR_H 166 167