1// Request.h 2 3#ifndef NET_FS_REQUEST_H 4#define NET_FS_REQUEST_H 5 6#include <string.h> 7 8#include <HashString.h> 9 10#include "SLList.h" 11 12class RequestFlattener; 13class RequestMemberVisitor; 14class RequestUnflattener; 15class RequestVisitor; 16 17// Data 18struct Data { 19 const void* address; 20 int32 size; 21 22 Data() : address(NULL), size(0) {} 23 24 void SetTo(const void* address, int32 size) 25 { 26 this->address = (size > 0 ? address : NULL); 27 this->size = size; 28 } 29 30 const void* GetData() const 31 { 32 return address; 33 } 34 35 int32 GetSize() const 36 { 37 return size; 38 } 39}; 40 41// StringData 42struct StringData : Data { 43 void SetTo(const char* string) 44 { 45 Data::SetTo(string, (string ? strlen(string) + 1 : 0)); 46 } 47 48 void SetTo(const HashString& string) 49 { 50 SetTo(string.GetString()); 51 } 52 53 const char* GetString() const 54 { 55 return (const char*)address; 56 } 57}; 58 59// RequestMember 60class RequestMember { 61public: 62 RequestMember(); 63 virtual ~RequestMember(); 64 65 virtual void ShowAround(RequestMemberVisitor* visitor) = 0; 66}; 67 68// FlattenableRequestMember 69class FlattenableRequestMember : public RequestMember { 70public: 71 FlattenableRequestMember(); 72 virtual ~FlattenableRequestMember(); 73 74 virtual status_t Flatten(RequestFlattener* flattener) = 0; 75 virtual status_t Unflatten(RequestUnflattener* unflattener) = 0; 76}; 77 78// RequestBuffer 79class RequestBuffer : public SLListLinkImpl<RequestBuffer> { 80private: 81 RequestBuffer() {} 82 ~RequestBuffer() {} 83 84public: 85 static RequestBuffer* Create(uint32 dataSize); 86 static void Delete(RequestBuffer* buffer); 87 88 void* GetData(); 89 const void* GetData() const; 90}; 91 92// Request 93class Request : public FlattenableRequestMember { 94public: 95 Request(uint32 type); 96 virtual ~Request(); 97 98 uint32 GetType() const; 99 100 void AttachBuffer(RequestBuffer* buffer); 101 102 virtual status_t Accept(RequestVisitor* visitor) = 0; 103 104 virtual status_t Flatten(RequestFlattener* flattener); 105 virtual status_t Unflatten(RequestUnflattener* unflattener); 106 107private: 108 uint32 fType; 109 SLList<RequestBuffer> fBuffers; 110}; 111 112// RequestMemberVisitor 113class RequestMemberVisitor { 114public: 115 RequestMemberVisitor(); 116 virtual ~RequestMemberVisitor(); 117 118 virtual void Visit(RequestMember* member, bool& data) = 0; 119 virtual void Visit(RequestMember* member, int8& data) = 0; 120 virtual void Visit(RequestMember* member, uint8& data) = 0; 121 virtual void Visit(RequestMember* member, int16& data) = 0; 122 virtual void Visit(RequestMember* member, uint16& data) = 0; 123 virtual void Visit(RequestMember* member, int32& data) = 0; 124 virtual void Visit(RequestMember* member, uint32& data) = 0; 125 virtual void Visit(RequestMember* member, int64& data) = 0; 126 virtual void Visit(RequestMember* member, uint64& data) = 0; 127 virtual void Visit(RequestMember* member, Data& data) = 0; 128 virtual void Visit(RequestMember* member, 129 StringData& data) = 0; 130 virtual void Visit(RequestMember* member, 131 RequestMember& subMember) = 0; 132 virtual void Visit(RequestMember* member, 133 FlattenableRequestMember& subMember) = 0; 134}; 135 136#endif // NET_FS_REQUEST_H 137