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