diff options
Diffstat (limited to 'src/libutil/serialise.hh')
-rw-r--r-- | src/libutil/serialise.hh | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh new file mode 100644 index 000000000..459a693ee --- /dev/null +++ b/src/libutil/serialise.hh @@ -0,0 +1,71 @@ +#ifndef __SERIALISE_H +#define __SERIALISE_H + +#include "types.hh" + + +namespace nix { + + +/* Abstract destination of binary data. */ +struct Sink +{ + virtual ~Sink() { } + virtual void operator () (const unsigned char * data, unsigned int len) = 0; +}; + + +/* Abstract source of binary data. */ +struct Source +{ + virtual ~Source() { } + + /* The callee should store exactly *len bytes in the buffer + pointed to by data. It should block if that much data is not + yet available, or throw an error if it is not going to be + available. */ + virtual void operator () (unsigned char * data, unsigned int len) = 0; +}; + + +/* A sink that writes data to a file descriptor. */ +struct FdSink : Sink +{ + int fd; + + FdSink(int fd) + { + this->fd = fd; + } + + void operator () (const unsigned char * data, unsigned int len); +}; + + +/* A source that reads data from a file descriptor. */ +struct FdSource : Source +{ + int fd; + + FdSource(int fd) + { + this->fd = fd; + } + + void operator () (unsigned char * data, unsigned int len); +}; + + +void writePadding(unsigned int len, Sink & sink); +void writeInt(unsigned int n, Sink & sink); +void writeString(const string & s, Sink & sink); + +void readPadding(unsigned int len, Source & source); +unsigned int readInt(Source & source); +string readString(Source & source); + + +} + + +#endif /* !__SERIALISE_H */ |