xref: /haiku/src/add-ons/kernel/file_systems/nfs4/XDR.h (revision e5d65858f2361fe0552495b61620c84dcee6bc00)
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  
15  namespace XDR {
16  
17  class Stream {
18  public:
19  	typedef	uint32			Position;
20  
21  	virtual					~Stream();
22  
23  	inline	const void*		Buffer() const;
24  	inline	Position		Current() const;
25  
26  protected:
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  
37  class ReadStream : public Stream {
38  public:
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  
59  private:
60  			bool			fEOF;
61  };
62  
63  class WriteStream : public Stream {
64  public:
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  
90  private:
91  			status_t		_CheckResize(uint32 size);
92  
93  			status_t		fError;
94  
95  	static 	const uint32	kInitialSize	= 64;
96  };
97  
98  
99  inline const void*
100  Stream::Buffer() const
101  {
102  	return fBuffer;
103  }
104  
105  
106  inline Stream::Position
107  Stream::Current() const
108  {
109  	return fPosition;
110  }
111  
112  
113  inline void
114  ReadStream::SetPosition(Position position)
115  {
116  	fPosition = position;
117  }
118  
119  
120  inline int
121  ReadStream::Size() const
122  {
123  	return fSize;
124  }
125  
126  
127  inline bool
128  ReadStream::IsEOF() const
129  {
130  	return fEOF;
131  }
132  
133  
134  inline bool
135  ReadStream::GetBoolean()
136  {
137  	return GetInt() != 0;
138  }
139  
140  
141  inline int
142  WriteStream::Size() const
143  {
144  	return fPosition * sizeof(uint32);
145  }
146  
147  
148  inline status_t
149  WriteStream::AddBoolean(bool x)
150  {
151  	return AddInt(static_cast<int32>(x));
152  }
153  
154  
155  inline status_t
156  WriteStream::Error() const
157  {
158  	return fError;
159  }
160  
161  
162  }		// namespace XDR
163  
164  
165  #endif	// XDR_H
166  
167