aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/serialise.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil/serialise.hh')
-rw-r--r--src/libutil/serialise.hh71
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 */