00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef COIN_SOOUTPUT_H
00021 #define COIN_SOOUTPUT_H
00022
00023 #include <Inventor/system/inttypes.h>
00024 #include <Inventor/SbBasic.h>
00025 #include <Inventor/SbString.h>
00026 #include <stdio.h>
00027
00028 class SbDict;
00029 class SbName;
00030 class SoBase;
00031
00032 typedef void * SoOutputReallocCB(void * ptr, size_t newSize);
00033
00034 class COIN_DLL_API SoOutput {
00035 public:
00036 enum Stage { COUNT_REFS, WRITE };
00037
00038 enum Annotations { ADDRESSES = 0x01, REF_COUNTS = 0x02 };
00039
00040 SoOutput(void);
00041 SoOutput(SoOutput * dictOut);
00042 virtual ~SoOutput();
00043
00044 virtual void setFilePointer(FILE * newFP);
00045 virtual FILE * getFilePointer(void) const;
00046 virtual SbBool openFile(const char * const fileName);
00047 virtual void closeFile(void);
00048
00049 virtual void setBuffer(void * bufPointer, size_t initSize,
00050 SoOutputReallocCB * reallocFunc, int32_t offset = 0);
00051 virtual SbBool getBuffer(void * & bufPointer, size_t & nBytes) const;
00052 virtual size_t getBufferSize(void) const;
00053 virtual void resetBuffer(void);
00054 virtual void setBinary(const SbBool flag);
00055 virtual SbBool isBinary(void) const;
00056 virtual void setHeaderString(const SbString & str);
00057 virtual void resetHeaderString(void);
00058 virtual void setFloatPrecision(const int precision);
00059
00060 void setStage(Stage stage);
00061 Stage getStage(void) const;
00062
00063 void incrementIndent(const int levels = 1);
00064 void decrementIndent(const int levels = 1);
00065
00066 virtual void write(const char c);
00067 virtual void write(const char * s);
00068 virtual void write(const SbString & s);
00069 virtual void write(const SbName & n);
00070 virtual void write(const int i);
00071 virtual void write(const unsigned int i);
00072 virtual void write(const short s);
00073 virtual void write(const unsigned short s);
00074 virtual void write(const float f);
00075 virtual void write(const double d);
00076 virtual void writeBinaryArray(const unsigned char * c, const int length);
00077 virtual void writeBinaryArray(const int32_t * const l, const int length);
00078 virtual void writeBinaryArray(const float * const f, const int length);
00079 virtual void writeBinaryArray(const double * const d, const int length);
00080
00081 virtual void indent(void);
00082 virtual void reset(void);
00083 void setCompact(SbBool flag);
00084 SbBool isCompact(void) const;
00085 void setAnnotation(uint32_t bits);
00086 uint32_t getAnnotation(void);
00087
00088 static SbString getDefaultASCIIHeader(void);
00089 static SbString getDefaultBinaryHeader(void);
00090
00091 int addReference(const SoBase * base);
00092 int findReference(const SoBase * base) const;
00093
00094 protected:
00095 SbBool isToBuffer(void) const;
00096 size_t bytesInBuf(void) const;
00097 SbBool makeRoomInBuf(size_t nBytes);
00098 void convertShort(short s, char * to);
00099 void convertInt32(int32_t l, char * to);
00100 void convertFloat(float f, char * to);
00101 void convertDouble(double d, char * to);
00102 void convertShortArray(short * from, char * to, int len);
00103 void convertInt32Array(int32_t * from, char * to, int len);
00104 void convertFloatArray(float * from, char * to, int len);
00105 void convertDoubleArray(double * from, char * to, int len);
00106
00107 static SbString padHeader(const SbString & inString);
00108
00109 SbBool wroteHeader;
00110
00111 private:
00112 int precision;
00113 int indentlevel;
00114 SbBool usersetfp, binarystream, writecompact;
00115 SbBool disabledwriting, memorybuffer;
00116 FILE * filep;
00117 SbString * headerstring;
00118 void * buffer;
00119 size_t buffersize;
00120 SoOutputReallocCB * reallocfunc;
00121 int32_t bufferoffset;
00122 Stage stage;
00123 SbDict * sobase2id;
00124 int nextreferenceid;
00125 uint32_t annotationbits;
00126
00127 void constructorCommon(void);
00128
00129 void checkHeader(void);
00130 void writeBytesWithPadding(const char * const p, const size_t nr);
00131
00132 friend class SoBase;
00133 };
00134
00135 #endif // !COIN_SOOUTPUT_H