2006-11-30 20:19:59 +01:00
|
|
|
#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;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2011-12-15 00:30:06 +01:00
|
|
|
/* A sink that writes data to a file descriptor (using a buffer). */
|
2006-11-30 20:19:59 +01:00
|
|
|
struct FdSink : Sink
|
|
|
|
{
|
|
|
|
int fd;
|
2011-12-15 00:30:06 +01:00
|
|
|
unsigned int bufSize, bufPos;
|
|
|
|
unsigned char * buffer;
|
2006-11-30 20:19:59 +01:00
|
|
|
|
2011-12-15 00:30:06 +01:00
|
|
|
FdSink() : fd(-1), bufSize(32 * 1024), bufPos(0), buffer(0) { }
|
|
|
|
|
|
|
|
FdSink(int fd, unsigned int bufSize = 32 * 1024)
|
2011-12-15 13:32:08 +01:00
|
|
|
: fd(fd), bufSize(bufSize), bufPos(0), buffer(0) { }
|
2011-12-15 00:30:06 +01:00
|
|
|
|
|
|
|
~FdSink()
|
2006-11-30 20:19:59 +01:00
|
|
|
{
|
2011-12-15 00:30:06 +01:00
|
|
|
flush();
|
|
|
|
if (buffer) delete[] buffer;
|
2006-11-30 20:19:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void operator () (const unsigned char * data, unsigned int len);
|
2011-12-15 00:30:06 +01:00
|
|
|
|
|
|
|
void flush();
|
2006-11-30 20:19:59 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* A source that reads data from a file descriptor. */
|
|
|
|
struct FdSource : Source
|
|
|
|
{
|
|
|
|
int fd;
|
2011-12-15 13:32:08 +01:00
|
|
|
unsigned int bufSize, bufPosIn, bufPosOut;
|
|
|
|
unsigned char * buffer;
|
2006-11-30 20:19:59 +01:00
|
|
|
|
2011-12-15 13:32:08 +01:00
|
|
|
FdSource() : fd(-1), bufSize(32 * 1024), bufPosIn(0), bufPosOut(0), buffer(0) { }
|
|
|
|
|
|
|
|
FdSource(int fd, unsigned int bufSize = 32 * 1024)
|
|
|
|
: fd(fd), bufSize(bufSize), bufPosIn(0), bufPosOut(0), buffer(0) { }
|
2006-11-30 20:54:43 +01:00
|
|
|
|
2011-12-15 13:32:08 +01:00
|
|
|
~FdSource()
|
2006-11-30 20:19:59 +01:00
|
|
|
{
|
2011-12-15 13:32:08 +01:00
|
|
|
if (buffer) delete[] buffer;
|
2006-11-30 20:19:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void operator () (unsigned char * data, unsigned int len);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2006-12-13 00:05:01 +01:00
|
|
|
/* A sink that writes data to a string. */
|
|
|
|
struct StringSink : Sink
|
|
|
|
{
|
|
|
|
string s;
|
|
|
|
virtual void operator () (const unsigned char * data, unsigned int len)
|
|
|
|
{
|
|
|
|
s.append((const char *) data, len);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* A source that reads data from a string. */
|
|
|
|
struct StringSource : Source
|
|
|
|
{
|
2008-12-03 18:30:32 +01:00
|
|
|
const string & s;
|
2006-12-13 00:05:01 +01:00
|
|
|
unsigned int pos;
|
2008-12-03 18:30:32 +01:00
|
|
|
StringSource(const string & _s) : s(_s), pos(0) { }
|
2006-12-13 00:05:01 +01:00
|
|
|
virtual void operator () (unsigned char * data, unsigned int len)
|
|
|
|
{
|
|
|
|
s.copy((char *) data, len, pos);
|
|
|
|
pos += len;
|
|
|
|
if (pos > s.size())
|
|
|
|
throw Error("end of string reached");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2006-11-30 20:19:59 +01:00
|
|
|
void writePadding(unsigned int len, Sink & sink);
|
|
|
|
void writeInt(unsigned int n, Sink & sink);
|
2008-06-18 11:34:17 +02:00
|
|
|
void writeLongLong(unsigned long long n, Sink & sink);
|
2006-11-30 20:19:59 +01:00
|
|
|
void writeString(const string & s, Sink & sink);
|
2006-11-30 23:43:55 +01:00
|
|
|
void writeStringSet(const StringSet & ss, Sink & sink);
|
2006-11-30 20:19:59 +01:00
|
|
|
|
|
|
|
void readPadding(unsigned int len, Source & source);
|
|
|
|
unsigned int readInt(Source & source);
|
2008-06-18 11:34:17 +02:00
|
|
|
unsigned long long readLongLong(Source & source);
|
2006-11-30 20:19:59 +01:00
|
|
|
string readString(Source & source);
|
2006-11-30 23:43:55 +01:00
|
|
|
StringSet readStringSet(Source & source);
|
|
|
|
|
2006-11-30 20:19:59 +01:00
|
|
|
|
2009-03-22 18:36:43 +01:00
|
|
|
MakeError(SerialisationError, Error)
|
|
|
|
|
|
|
|
|
2006-11-30 20:19:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* !__SERIALISE_H */
|