⛏️ index : haiku.git

// RequestUnflattener.h

#ifndef NET_FS_REQUEST_UNFLATTENER_H
#define NET_FS_REQUEST_UNFLATTENER_H

#include <SupportDefs.h>

#include "Request.h"
#include "HashString.h"

// Reader
class Reader {
public:
								Reader();
	virtual						~Reader();

	virtual	status_t			Read(void* buffer, int32 size) = 0;
	virtual	status_t			Read(int32 size, void** buffer,
									bool* mustFree);
	virtual	status_t			Skip(int32 size);
};

// RequestUnflattener
class RequestUnflattener : public RequestMemberVisitor {
public:
								RequestUnflattener(Reader* reader);

			status_t			GetStatus() const;
			int32				GetBytesRead() const;

	virtual	void				Visit(RequestMember* member, bool& data);
	virtual	void				Visit(RequestMember* member, int8& data);
	virtual	void				Visit(RequestMember* member, uint8& data);
	virtual	void				Visit(RequestMember* member, int16& data);
	virtual	void				Visit(RequestMember* member, uint16& data);
	virtual	void				Visit(RequestMember* member, int32& data);
	virtual	void				Visit(RequestMember* member, uint32& data);
	virtual	void				Visit(RequestMember* member, int64& data);
	virtual	void				Visit(RequestMember* member, uint64& data);
	virtual	void				Visit(RequestMember* member, Data& data);
	virtual	void				Visit(RequestMember* member, StringData& data);
	virtual	void				Visit(RequestMember* member,
									RequestMember& subMember);
	virtual	void				Visit(RequestMember* member,
									FlattenableRequestMember& subMember);

			status_t			Read(void* buffer, int32 size);
			status_t			Read(int32 size, void*& buffer, bool& mustFree);
			status_t			Align(int32 align);

			status_t			ReadBool(bool& data);
			status_t			ReadInt32(int32& data);
			status_t			ReadData(void*& buffer, int32& size,
									bool& mustFree);
			status_t			ReadString(HashString& string);

private:
			Reader*				fReader;
			status_t			fStatus;
			int32				fBytesRead;
};

#endif	// NET_FS_REQUEST_UNFLATTENER_H