| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef DWGBUFFER_H |
| #define DWGBUFFER_H |
|
|
| #include <fstream> |
| #include <sstream> |
| #include <memory> |
| #include "../drw_base.h" |
|
|
| class DRW_Coord; |
| class DRW_TextCodec; |
|
|
| class dwgBasicStream{ |
| protected: |
| dwgBasicStream() = default; |
| public: |
| virtual ~dwgBasicStream() = default; |
| virtual bool read(duint8* s, duint64 n) = 0; |
| virtual duint64 size() const = 0; |
| virtual duint64 getPos() const = 0; |
| virtual bool setPos(duint64 p) = 0; |
| virtual bool good() const = 0; |
| virtual dwgBasicStream* clone() const = 0; |
| }; |
|
|
| class dwgFileStream: public dwgBasicStream{ |
| public: |
| explicit dwgFileStream(std::ifstream *s) |
| :stream{s} |
| { |
| stream->seekg (0, std::ios::end); |
| sz = stream->tellg(); |
| stream->seekg(0, std::ios_base::beg); |
| } |
| bool read(duint8* s, duint64 n) override; |
| duint64 size() const override{return sz;} |
| duint64 getPos() const override{return stream->tellg();} |
| bool setPos(duint64 p) override; |
| bool good() const override{return stream->good();} |
| dwgBasicStream* clone() const override{return new dwgFileStream(stream);} |
| private: |
| std::ifstream *stream{nullptr}; |
| duint64 sz{0}; |
| }; |
|
|
| class dwgCharStream: public dwgBasicStream{ |
| public: |
| dwgCharStream(duint8 *buf, duint64 s) |
| :stream{buf} |
| ,sz{s} |
| {} |
| bool read(duint8* s, duint64 n) override; |
| duint64 size() const override {return sz;} |
| duint64 getPos() const override {return pos;} |
| bool setPos(duint64 p) override; |
| bool good() const override {return isOk;} |
| dwgBasicStream* clone() const override {return new dwgCharStream(stream, sz);} |
| private: |
| duint8 *stream{nullptr}; |
| duint64 sz{0}; |
| duint64 pos{0}; |
| bool isOk{true}; |
| }; |
|
|
| class dwgBuffer { |
| public: |
| dwgBuffer(std::ifstream *stream, DRW_TextCodec *decoder = nullptr); |
| dwgBuffer(duint8 *buf, duint64 size, DRW_TextCodec *decoder= nullptr); |
| dwgBuffer( const dwgBuffer& org ); |
| dwgBuffer& operator=( const dwgBuffer& org ); |
| virtual ~dwgBuffer() = default; |
| duint64 size() const {return filestr->size();} |
| bool setPosition(duint64 pos); |
| duint64 getPosition() const; |
| void resetPosition(){setPosition(0); setBitPos(0);} |
| void setBitPos(duint8 pos); |
| duint8 getBitPos() const {return bitPos;} |
| bool moveBitPos(dint32 size); |
|
|
| duint8 getBit(); |
| bool getBoolBit(); |
| duint8 get2Bits(); |
| duint8 get3Bits(); |
| duint16 getBitShort(); |
| dint16 getSBitShort(); |
| dint32 getBitLong(); |
| duint64 getBitLongLong(); |
| double getBitDouble(); |
| |
| DRW_Coord get3BitDouble(); |
| duint8 getRawChar8(); |
| duint16 getRawShort16(); |
| double getRawDouble(); |
| duint32 getRawLong32(); |
| duint64 getRawLong64(); |
| DRW_Coord get2RawDouble(); |
| |
| duint32 getUModularChar(); |
| dint32 getModularChar(); |
| dint32 getModularShort(); |
| dwgHandle getHandle(); |
| dwgHandle getOffsetHandle(duint32 href); |
| UTF8STRING getVariableText(DRW::Version v, bool nullTerm = true); |
| UTF8STRING getCP8Text(); |
| UTF8STRING getUCSText(bool nullTerm = true); |
| UTF8STRING getUCSStr(duint16 ts); |
|
|
| duint16 getObjType(DRW::Version v); |
|
|
| |
|
|
| DRW_Coord getExtrusion(bool b_R2000_style); |
| double getDefaultDouble(double d); |
| double getThickness(bool b_R2000_style); |
| |
| duint32 getCmColor(DRW::Version v); |
| duint32 getEnColor(DRW::Version v); |
| |
|
|
| duint16 getBERawShort16(); |
|
|
| bool isGood() const {return filestr->good();} |
| bool getBytes(duint8 *buf, duint64 size); |
| int numRemainingBytes() const {return (maxSize- filestr->getPos());} |
|
|
| duint16 crc8(duint16 dx,dint32 start,dint32 end); |
| duint32 crc32(duint32 seed,dint32 start,dint32 end); |
|
|
| |
| DRW_TextCodec *decoder{nullptr}; |
|
|
| private: |
| std::unique_ptr<dwgBasicStream> filestr; |
| duint64 maxSize{0}; |
| duint8 currByte{0}; |
| duint8 bitPos{0}; |
|
|
| UTF8STRING get8bitStr(); |
| UTF8STRING get16bitStr(duint16 textSize, bool nullTerm = true); |
| }; |
|
|
| #endif |
|
|