summaryrefslogtreecommitdiff
path: root/netfs/msgtypes.h
diff options
context:
space:
mode:
Diffstat (limited to 'netfs/msgtypes.h')
-rw-r--r--netfs/msgtypes.h212
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
+