summaryrefslogtreecommitdiffstats
path: root/src/io/inkscapestream.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/io/inkscapestream.h')
-rw-r--r--src/io/inkscapestream.h669
1 files changed, 669 insertions, 0 deletions
diff --git a/src/io/inkscapestream.h b/src/io/inkscapestream.h
new file mode 100644
index 000000000..ad213dad9
--- /dev/null
+++ b/src/io/inkscapestream.h
@@ -0,0 +1,669 @@
+#ifndef __INKSCAPE_IO_INKSCAPESTREAM_H__
+#define __INKSCAPE_IO_INKSCAPESTREAM_H__
+/**
+ * Our base basic stream classes.
+ *
+ * Authors:
+ * Bob Jamison <rjamison@titan.com>
+ *
+ * Copyright (C) 2004 Inkscape.org
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+
+#include <glibmm.h>
+
+namespace Inkscape
+{
+namespace IO
+{
+
+class StreamException : public std::exception
+{
+public:
+
+ StreamException(const char *theReason) throw()
+ { reason = theReason; }
+ StreamException(Glib::ustring &theReason) throw()
+ { reason = theReason; }
+ ~StreamException() throw()
+ { }
+ char const *what() const throw()
+ { return reason.c_str(); }
+
+private:
+ Glib::ustring reason;
+
+};
+
+//#########################################################################
+//# I N P U T S T R E A M
+//#########################################################################
+
+/**
+ * This interface is the base of all input stream classes. Users who wish
+ * to make an InputStream that is part of a chain should inherit from
+ * BasicInputStream. Inherit from this class to make a source endpoint,
+ * such as a URI or buffer.
+ *
+ */
+class InputStream
+{
+
+public:
+
+ /**
+ * Constructor.
+ */
+ InputStream() {}
+
+ /**
+ * Destructor
+ */
+ virtual ~InputStream() {}
+
+ /**
+ * Return the number of bytes that are currently available
+ * to be read
+ */
+ virtual int available() = 0;
+
+ /**
+ * Do whatever it takes to 'close' this input stream
+ * The most likely implementation of this method will be
+ * for endpoints that use a resource for their data.
+ */
+ virtual void close() = 0;
+
+ /**
+ * Read one byte from this input stream. This is a blocking
+ * call. If no data is currently available, this call will
+ * not return until it exists. If the user does not want
+ * their code to block, then the usual solution is:
+ * if (available() > 0)
+ * myChar = get();
+ * This call returns -1 on end-of-file.
+ */
+ virtual int get() = 0;
+
+}; // class InputStream
+
+
+
+
+/**
+ * This is the class that most users should inherit, to provide
+ * their own streams.
+ *
+ */
+class BasicInputStream : public InputStream
+{
+
+public:
+
+ BasicInputStream(InputStream &sourceStream);
+
+ virtual ~BasicInputStream() {}
+
+ virtual int available();
+
+ virtual void close();
+
+ virtual int get();
+
+protected:
+
+ bool closed;
+
+ InputStream &source;
+
+private:
+
+
+}; // class BasicInputStream
+
+
+
+/**
+ * Convenience class for reading from standard input
+ */
+class StdInputStream : public InputStream
+{
+public:
+
+ int available()
+ { return 0; }
+
+ void close()
+ { /* do nothing */ }
+
+ int get()
+ { return getchar(); }
+
+};
+
+
+
+
+
+
+//#########################################################################
+//# O U T P U T S T R E A M
+//#########################################################################
+
+/**
+ * This interface is the base of all input stream classes. Users who wish
+ * to make an OutputStream that is part of a chain should inherit from
+ * BasicOutputStream. Inherit from this class to make a destination endpoint,
+ * such as a URI or buffer.
+ */
+class OutputStream
+{
+
+public:
+
+ /**
+ * Constructor.
+ */
+ OutputStream() {}
+
+ /**
+ * Destructor
+ */
+ virtual ~OutputStream() {}
+
+ /**
+ * This call should
+ * 1. flush itself
+ * 2. close itself
+ * 3. close the destination stream
+ */
+ virtual void close() = 0;
+
+ /**
+ * This call should push any pending data it might have to
+ * the destination stream. It should NOT call flush() on
+ * the destination stream.
+ */
+ virtual void flush() = 0;
+
+ /**
+ * Send one byte to the destination stream.
+ */
+ virtual void put(int ch) = 0;
+
+
+}; // class OutputStream
+
+
+/**
+ * This is the class that most users should inherit, to provide
+ * their own output streams.
+ */
+class BasicOutputStream : public OutputStream
+{
+
+public:
+
+ BasicOutputStream(OutputStream &destinationStream);
+
+ virtual ~BasicOutputStream() {}
+
+ virtual void close();
+
+ virtual void flush();
+
+ virtual void put(int ch);
+
+protected:
+
+ bool closed;
+
+ OutputStream &destination;
+
+
+}; // class BasicOutputStream
+
+
+
+/**
+ * Convenience class for writing to standard output
+ */
+class StdOutputStream : public OutputStream
+{
+public:
+
+ void close()
+ { }
+
+ void flush()
+ { }
+
+ void put(int ch)
+ { putchar(ch); }
+
+};
+
+
+
+
+//#########################################################################
+//# R E A D E R
+//#########################################################################
+
+
+/**
+ * This interface and its descendants are for unicode character-oriented input
+ *
+ */
+class Reader
+{
+
+public:
+
+ /**
+ * Constructor.
+ */
+ Reader() {}
+
+ /**
+ * Destructor
+ */
+ virtual ~Reader() {}
+
+
+ virtual int available() = 0;
+
+ virtual void close() = 0;
+
+ virtual gunichar get() = 0;
+
+ virtual Glib::ustring readLine() = 0;
+
+ virtual Glib::ustring readWord() = 0;
+
+ /* Input formatting */
+ virtual const Reader& readBool (bool& val ) = 0;
+ virtual const Reader& operator>> (bool& val ) = 0;
+
+ virtual const Reader& readShort (short &val) = 0;
+ virtual const Reader& operator>> (short &val) = 0;
+
+ virtual const Reader& readUnsignedShort (unsigned short &val) = 0;
+ virtual const Reader& operator>> (unsigned short &val) = 0;
+
+ virtual const Reader& readInt (int &val) = 0;
+ virtual const Reader& operator>> (int &val) = 0;
+
+ virtual const Reader& readUnsignedInt (unsigned int &val) = 0;
+ virtual const Reader& operator>> (unsigned int &val) = 0;
+
+ virtual const Reader& readLong (long &val) = 0;
+ virtual const Reader& operator>> (long &val) = 0;
+
+ virtual const Reader& readUnsignedLong (unsigned long &val) = 0;
+ virtual const Reader& operator>> (unsigned long &val) = 0;
+
+ virtual const Reader& readFloat (float &val) = 0;
+ virtual const Reader& operator>> (float &val) = 0;
+
+ virtual const Reader& readDouble (double &val) = 0;
+ virtual const Reader& operator>> (double &val) = 0;
+
+}; // interface Reader
+
+
+
+/**
+ * This class and its descendants are for unicode character-oriented input
+ *
+ */
+class BasicReader : public Reader
+{
+
+public:
+
+ BasicReader(Reader &sourceStream);
+
+ virtual ~BasicReader() {}
+
+ virtual int available();
+
+ virtual void close();
+
+ virtual gunichar get();
+
+ virtual Glib::ustring readLine();
+
+ virtual Glib::ustring readWord();
+
+ /* Input formatting */
+ virtual const Reader& readBool (bool& val );
+ virtual const Reader& operator>> (bool& val )
+ { return readBool(val); }
+
+ virtual const Reader& readShort (short &val);
+ virtual const Reader& operator>> (short &val)
+ { return readShort(val); }
+
+ virtual const Reader& readUnsignedShort (unsigned short &val);
+ virtual const Reader& operator>> (unsigned short &val)
+ { return readUnsignedShort(val); }
+
+ virtual const Reader& readInt (int &val);
+ virtual const Reader& operator>> (int &val)
+ { return readInt(val); }
+
+ virtual const Reader& readUnsignedInt (unsigned int &val);
+ virtual const Reader& operator>> (unsigned int &val)
+ { return readUnsignedInt(val); }
+
+ virtual const Reader& readLong (long &val);
+ virtual const Reader& operator>> (long &val)
+ { return readLong(val); }
+
+ virtual const Reader& readUnsignedLong (unsigned long &val);
+ virtual const Reader& operator>> (unsigned long &val)
+ { return readUnsignedLong(val); }
+
+ virtual const Reader& readFloat (float &val);
+ virtual const Reader& operator>> (float &val)
+ { return readFloat(val); }
+
+ virtual const Reader& readDouble (double &val);
+ virtual const Reader& operator>> (double &val)
+ { return readDouble(val); }
+
+
+protected:
+
+ Reader *source;
+
+ BasicReader()
+ { source = NULL; }
+
+private:
+
+}; // class BasicReader
+
+
+
+/**
+ * Class for placing a Reader on an open InputStream
+ *
+ */
+class InputStreamReader : public BasicReader
+{
+public:
+
+ InputStreamReader(InputStream &inputStreamSource);
+
+ /*Overload these 3 for your implementation*/
+ virtual int available();
+
+ virtual void close();
+
+ virtual gunichar get();
+
+
+private:
+
+ InputStream &inputStream;
+
+
+};
+
+/**
+ * Convenience class for reading formatted from standard input
+ *
+ */
+class StdReader : public BasicReader
+{
+public:
+
+ StdReader();
+
+ ~StdReader();
+
+ /*Overload these 3 for your implementation*/
+ virtual int available();
+
+ virtual void close();
+
+ virtual gunichar get();
+
+
+private:
+
+ InputStream *inputStream;
+
+
+};
+
+
+
+
+
+//#########################################################################
+//# W R I T E R
+//#########################################################################
+
+/**
+ * This interface and its descendants are for unicode character-oriented output
+ *
+ */
+class Writer
+{
+
+public:
+
+ /**
+ * Constructor.
+ */
+ Writer() {}
+
+ /**
+ * Destructor
+ */
+ virtual ~Writer() {}
+
+ virtual void close() = 0;
+
+ virtual void flush() = 0;
+
+ virtual void put(gunichar ch) = 0;
+
+ /* Formatted output */
+ virtual Writer& printf(char *fmt, ...) = 0;
+
+ virtual Writer& writeChar(char val) = 0;
+
+ virtual Writer& writeUString(Glib::ustring &val) = 0;
+
+ virtual Writer& writeStdString(std::string &val) = 0;
+
+ virtual Writer& writeString(const char *str) = 0;
+
+ virtual Writer& writeBool (bool val ) = 0;
+
+ virtual Writer& writeShort (short val ) = 0;
+
+ virtual Writer& writeUnsignedShort (unsigned short val ) = 0;
+
+ virtual Writer& writeInt (int val ) = 0;
+
+ virtual Writer& writeUnsignedInt (unsigned int val ) = 0;
+
+ virtual Writer& writeLong (long val ) = 0;
+
+ virtual Writer& writeUnsignedLong (unsigned long val ) = 0;
+
+ virtual Writer& writeFloat (float val ) = 0;
+
+ virtual Writer& writeDouble (double val ) = 0;
+
+
+
+}; // interface Writer
+
+
+/**
+ * This class and its descendants are for unicode character-oriented output
+ *
+ */
+class BasicWriter : public Writer
+{
+
+public:
+
+ BasicWriter(Writer &destinationWriter);
+
+ virtual ~BasicWriter() {}
+
+ /*Overload these 3 for your implementation*/
+ virtual void close();
+
+ virtual void flush();
+
+ virtual void put(gunichar ch);
+
+
+
+ /* Formatted output */
+ virtual Writer &printf(char *fmt, ...);
+
+ virtual Writer& writeChar(char val);
+
+ virtual Writer& writeUString(Glib::ustring &val);
+
+ virtual Writer& writeStdString(std::string &val);
+
+ virtual Writer& writeString(const char *str);
+
+ virtual Writer& writeBool (bool val );
+
+ virtual Writer& writeShort (short val );
+
+ virtual Writer& writeUnsignedShort (unsigned short val );
+
+ virtual Writer& writeInt (int val );
+
+ virtual Writer& writeUnsignedInt (unsigned int val );
+
+ virtual Writer& writeLong (long val );
+
+ virtual Writer& writeUnsignedLong (unsigned long val );
+
+ virtual Writer& writeFloat (float val );
+
+ virtual Writer& writeDouble (double val );
+
+
+protected:
+
+ Writer *destination;
+
+ BasicWriter()
+ { destination = NULL; }
+
+private:
+
+}; // class BasicWriter
+
+
+
+Writer& operator<< (Writer &writer, char val);
+
+Writer& operator<< (Writer &writer, Glib::ustring &val);
+
+Writer& operator<< (Writer &writer, std::string &val);
+
+Writer& operator<< (Writer &writer, char *val);
+
+Writer& operator<< (Writer &writer, bool val);
+
+Writer& operator<< (Writer &writer, short val);
+
+Writer& operator<< (Writer &writer, unsigned short val);
+
+Writer& operator<< (Writer &writer, int val);
+
+Writer& operator<< (Writer &writer, unsigned int val);
+
+Writer& operator<< (Writer &writer, long val);
+
+Writer& operator<< (Writer &writer, unsigned long val);
+
+Writer& operator<< (Writer &writer, float val);
+
+Writer& operator<< (Writer &writer, double val);
+
+
+
+
+/**
+ * Class for placing a Writer on an open OutputStream
+ *
+ */
+class OutputStreamWriter : public BasicWriter
+{
+public:
+
+ OutputStreamWriter(OutputStream &outputStreamDest);
+
+ /*Overload these 3 for your implementation*/
+ virtual void close();
+
+ virtual void flush();
+
+ virtual void put(gunichar ch);
+
+
+private:
+
+ OutputStream &outputStream;
+
+
+};
+
+
+/**
+ * Convenience class for writing to standard output
+ */
+class StdWriter : public BasicWriter
+{
+public:
+ StdWriter();
+
+ ~StdWriter();
+
+
+ virtual void close();
+
+
+ virtual void flush();
+
+
+ virtual void put(gunichar ch);
+
+
+private:
+
+ OutputStream *outputStream;
+
+};
+
+//#########################################################################
+//# U T I L I T Y
+//#########################################################################
+
+void pipeStream(InputStream &source, OutputStream &dest);
+
+
+
+} // namespace IO
+} // namespace Inkscape
+
+
+#endif /* __INKSCAPE_IO_INKSCAPESTREAM_H__ */