diff options
Diffstat (limited to 'netfs/msgtypes.h')
-rw-r--r-- | netfs/msgtypes.h | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/netfs/msgtypes.h b/netfs/msgtypes.h new file mode 100644 index 0000000..c29dc93 --- /dev/null +++ b/netfs/msgtypes.h @@ -0,0 +1,212 @@ +#ifndef MSGTYPES_H +#define MSGTYPES_H + +#include "smartpointer.h" +#include "comms.h" +#include <map> +#include <string> +#include <sys/stat.h> +#include <stdint.h> + +typedef DataPayloadPtr (*MessageFactory)(); +typedef std::map<uint16_t, MessageFactory> MessageFactories; +MessageFactories & MsgFacs(); + +template <class Cls> +class Factory { + public: + Factory() { MsgFacs()[Cls::TypeID] = &create; } + static DataPayloadPtr create() { + return new TypedPayload<Cls>(); + } +}; + +class ContentBase : public IsRefCounted { + public: + ~ContentBase() = 0; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class RequestBase : public ContentBase { + public: + uid_t uid; + gid_t gid; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class SimpleInt : public ContentBase { + public: + int value; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class AccessRequest : public RequestBase { + public: + std::string path; + int access; + const static uint16_t TypeID; + typedef SimpleInt Reply; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class GetAttrReply : public ContentBase { + public: + int res; + struct stat val; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class GetAttrRequest : public RequestBase { + public: + std::string path; + const static uint16_t TypeID; + typedef GetAttrReply Reply; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class OpenDirReply : public ContentBase { + public: + int handle; + int error; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class OpenDirRequest : public RequestBase { + public: + std::string path; + const static uint16_t TypeID; + typedef OpenDirReply Reply; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class CloseDirReply : public ContentBase { + public: + int error; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class CloseDirRequest : public RequestBase { + public: + int handle; + const static uint16_t TypeID; + typedef CloseDirReply Reply; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class ReadDirReply : public ContentBase { + public: + int error; + size_t count; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class ReadDirRequest : public RequestBase { + public: + int handle; + const static uint16_t TypeID; + typedef ReadDirReply Reply; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class ReadDirContent : public ContentBase { + public: + std::string path; + struct stat val; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +class OpenReply : public ContentBase { + public: + int error; + int handle; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; +class OpenRequest : public RequestBase { + public: + std::string path; + const static uint16_t TypeID; + typedef OpenReply Reply; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; +class CloseReply : public ContentBase { + public: + int error; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; +class CloseRequest : public RequestBase { + public: + int handle; + const static uint16_t TypeID; + typedef CloseReply Reply; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; +class ReadReply : public ContentBase { + public: + ~ReadReply(); + int error; + char * data; + size_t size; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; +class ReadRequest : public RequestBase { + public: + int handle; + size_t size; + off_t offset; + const static uint16_t TypeID; + typedef ReadReply Reply; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; +class WriteReply : public ContentBase { + public: + int error; + const static uint16_t TypeID; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; +class WriteRequest : public RequestBase { + public: + ~WriteRequest(); + int handle; + size_t size; + char * data; + off_t offset; + const static uint16_t TypeID; + typedef WriteReply Reply; + virtual void Send(FILE*) const; + virtual void Read(FILE*); +}; + +#define MSGTYPE(id, cls) \ + const uint16_t cls::TypeID = id; \ + namespace FactoryFor##cls { Factory<cls> fac; } +#endif + |