| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <cstdlib> |
| | #include <iostream> |
| | #include <fstream> |
| | #include <string> |
| | #include <sstream> |
| | #include <vector> |
| | #include "drw_dbg.h" |
| | #include "dwgreader21.h" |
| | #include "drw_textcodec.h" |
| | #include "../libdwgr.h" |
| |
|
| | bool dwgReader21::readMetaData() { |
| | version = parent->getVersion(); |
| | decoder.setVersion(version, false); |
| | DRW_DBG("dwgReader21::readFileHeader()\n"); |
| | DRW_DBG("dwgReader21::parsing metadata\n"); |
| | if (! fileBuf->setPosition(11)) |
| | return false; |
| | maintenanceVersion = fileBuf->getRawChar8(); |
| | DRW_DBG("maintenance version= "); DRW_DBGH(maintenanceVersion); |
| | DRW_DBG("\nbyte at 0x0C= "); DRW_DBG(fileBuf->getRawChar8()); |
| | previewImagePos = fileBuf->getRawLong32(); |
| | DRW_DBG("previewImagePos (seekerImageData) = "); DRW_DBG(previewImagePos); |
| | DRW_DBG("\n\napp writer version= "); DRW_DBGH(fileBuf->getRawChar8()); |
| | DRW_DBG("\napp writer maintenance version= "); DRW_DBGH(fileBuf->getRawChar8()); |
| | duint16 cp = fileBuf->getRawShort16(); |
| | DRW_DBG("\ncodepage= "); DRW_DBG(cp); |
| | if (cp == 30) |
| | decoder.setCodePage("ANSI_1252", false); |
| | |
| | DRW_DBG("\nUNKNOWN SECTION= "); DRW_DBG(fileBuf->getRawShort16()); |
| | DRW_DBG("\nUNKNOUWN SECTION 3b= "); DRW_DBG(fileBuf->getRawChar8()); |
| | duint32 secType = fileBuf->getRawLong32(); |
| | DRW_DBG("\nsecurity type flag= "); DRW_DBGH(secType); |
| | |
| | DRW_DBG("\nUNKNOWN SECTION 4bytes= "); DRW_DBG(fileBuf->getRawLong32()); |
| |
|
| | DRW_DBG("\nSummary info address= "); DRW_DBGH(fileBuf->getRawLong32()); |
| | DRW_DBG("\nVBA project address= "); DRW_DBGH(fileBuf->getRawLong32()); |
| | DRW_DBG("\n0x00000080 32b= "); DRW_DBGH(fileBuf->getRawLong32()); |
| | DRW_DBG("\nApp info address= "); DRW_DBGH(fileBuf->getRawLong32()); |
| | |
| | DRW_DBG("\nAnother address? = "); DRW_DBGH(fileBuf->getRawLong32()); |
| | return true; |
| | } |
| |
|
| | bool dwgReader21::parseSysPage(duint64 sizeCompressed, duint64 sizeUncompressed, duint64 correctionFactor, duint64 offset, duint8 *decompData){ |
| | |
| | duint64 alsize = (sizeCompressed + 7) &(-8); |
| | |
| | duint32 chunks = (((alsize * correctionFactor)+238)/239); |
| | duint64 fpsize = chunks * 255; |
| |
|
| | if (! fileBuf->setPosition(offset)) |
| | return false; |
| | std::vector<duint8> tmpDataRaw(fpsize); |
| | fileBuf->getBytes(&tmpDataRaw.front(), fpsize); |
| | std::vector<duint8> tmpDataRS(fpsize); |
| | dwgRSCodec::decode239I(&tmpDataRaw.front(), &tmpDataRS.front(), fpsize/255); |
| |
|
| | return dwgCompressor::decompress21(&tmpDataRS.front(), decompData, sizeCompressed, sizeUncompressed); |
| | } |
| |
|
| | bool dwgReader21::parseDataPage(const dwgSectionInfo &si, duint8 *dData){ |
| | DRW_DBG("parseDataPage, section size: "); DRW_DBG(si.size); |
| | for (auto it=si.pages.begin(); it!=si.pages.end(); ++it){ |
| | dwgPageInfo pi = it->second; |
| | if (!fileBuf->setPosition(pi.address)) |
| | return false; |
| |
|
| | std::vector<duint8> tmpPageRaw(pi.size); |
| | fileBuf->getBytes(&tmpPageRaw.front(), pi.size); |
| | #ifdef DRW_DBG_DUMP |
| | DRW_DBG("\nSection OBJECTS raw data=\n"); |
| | for (unsigned int i=0, j=0; i< pi.size;i++) { |
| | DRW_DBGH( (unsigned char)tmpPageRaw[i]); |
| | if (j == 7) { DRW_DBG("\n"); j = 0; |
| | } else { DRW_DBG(", "); j++; } |
| | } DRW_DBG("\n"); |
| | #endif |
| |
|
| | std::vector<duint8> tmpPageRS(pi.size); |
| |
|
| | duint8 chunks =pi.size / 255; |
| | dwgRSCodec::decode251I(&tmpPageRaw.front(), &tmpPageRS.front(), chunks); |
| | #ifdef DRW_DBG_DUMP |
| | DRW_DBG("\nSection OBJECTS RS data=\n"); |
| | for (unsigned int i=0, j=0; i< pi.size;i++) { |
| | DRW_DBGH( (unsigned char)tmpPageRS[i]); |
| | if (j == 7) { DRW_DBG("\n"); j = 0; |
| | } else { DRW_DBG(", "); j++; } |
| | } DRW_DBG("\n"); |
| | #endif |
| |
|
| | DRW_DBG("\npage uncomp size: "); DRW_DBG(pi.uSize); DRW_DBG(" comp size: "); DRW_DBG(pi.cSize); |
| | DRW_DBG("\noffset: "); DRW_DBG(pi.startOffset); |
| | duint8 *pageData = dData + pi.startOffset; |
| | if (!dwgCompressor::decompress21(&tmpPageRS.front(), pageData, pi.cSize, pi.uSize)) { |
| | return false; |
| | } |
| |
|
| | #ifdef DRW_DBG_DUMP |
| | DRW_DBG("\n\nSection OBJECTS decompressed data=\n"); |
| | for (unsigned int i=0, j=0; i< pi.uSize;i++) { |
| | DRW_DBGH( (unsigned char)pageData[i]); |
| | if (j == 7) { DRW_DBG("\n"); j = 0; |
| | } else { DRW_DBG(", "); j++; } |
| | } DRW_DBG("\n"); |
| | #endif |
| |
|
| | } |
| | DRW_DBG("\n"); |
| | return true; |
| | } |
| |
|
| | bool dwgReader21::readFileHeader() { |
| |
|
| | DRW_DBG("\n\ndwgReader21::parsing file header\n"); |
| | if (! fileBuf->setPosition(0x80)) |
| | return false; |
| | duint8 fileHdrRaw[0x2FD]; |
| | fileBuf->getBytes(fileHdrRaw, 0x2FD); |
| | duint8 fileHdrdRS[0x2CD]; |
| | dwgRSCodec::decode239I(fileHdrRaw, fileHdrdRS, 3); |
| |
|
| | #ifdef DRW_DBG_DUMP |
| | DRW_DBG("\ndwgReader21::parsed Reed Solomon decode:\n"); |
| | int j = 0; |
| | for (int i=0, j=0; i<0x2CD; i++){ |
| | DRW_DBGH( (unsigned char)fileHdrdRS[i]); |
| | if (j== 15){ j=0; DRW_DBG("\n"); |
| | } else{ j++; DRW_DBG(", "); } |
| | } DRW_DBG("\n"); |
| | #endif |
| |
|
| | dwgBuffer fileHdrBuf(fileHdrdRS, 0x2CD, &decoder); |
| | DRW_DBG("\nCRC 64b= "); DRW_DBGH(fileHdrBuf.getRawLong64()); |
| | DRW_DBG("\nunknown key 64b= "); DRW_DBGH(fileHdrBuf.getRawLong64()); |
| | DRW_DBG("\ncomp data CRC 64b= "); DRW_DBGH(fileHdrBuf.getRawLong64()); |
| | dint32 fileHdrCompLength = fileHdrBuf.getRawLong32(); |
| | DRW_DBG("\ncompr len 4bytes= "); DRW_DBG(fileHdrCompLength); |
| | dint32 fileHdrCompLength2 = fileHdrBuf.getRawLong32(); |
| | DRW_DBG("\nlength2 4bytes= "); DRW_DBG(fileHdrCompLength2); |
| |
|
| | int fileHdrDataLength = 0x110; |
| | std::vector<duint8> fileHdrData; |
| | if (fileHdrCompLength < 0) { |
| | fileHdrDataLength = fileHdrCompLength * -1; |
| | fileHdrData.resize(fileHdrDataLength); |
| | fileHdrBuf.getBytes(&fileHdrData.front(), fileHdrDataLength); |
| | } |
| | else { |
| | DRW_DBG("\ndwgReader21:: file header are compressed:\n"); |
| | std::vector<duint8> compByteStr(fileHdrCompLength); |
| | fileHdrBuf.getBytes(compByteStr.data(), fileHdrCompLength); |
| | fileHdrData.resize(fileHdrDataLength); |
| | if (!dwgCompressor::decompress21(compByteStr.data(), &fileHdrData.front(), |
| | fileHdrCompLength, fileHdrDataLength)) { |
| | return false; |
| | } |
| | } |
| |
|
| | #ifdef DRW_DBG_DUMP |
| | DRW_DBG("\ndwgReader21::parsed file header:\n"); |
| | for (int i=0, j=0; i<fileHdrDataLength; i++){ |
| | DRW_DBGH( (unsigned char)fileHdrData[i]); |
| | if (j== 15){ j=0; DRW_DBG("\n"); |
| | } else{ j++; DRW_DBG(", "); } |
| | } DRW_DBG("\n"); |
| | #endif |
| |
|
| | dwgBuffer fileHdrDataBuf(&fileHdrData.front(), fileHdrDataLength, &decoder); |
| | DRW_DBG("\nHeader size = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nFile size = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nPagesMapCrcCompressed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | duint64 PagesMapCorrectionFactor = fileHdrDataBuf.getRawLong64(); |
| | DRW_DBG("\nPagesMapCorrectionFactor = "); DRW_DBG(PagesMapCorrectionFactor); |
| | DRW_DBG("\nPagesMapCrcSeed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nPages map2offset = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nPages map2Id = "); DRW_DBG(fileHdrDataBuf.getRawLong64()); |
| | duint64 PagesMapOffset = fileHdrDataBuf.getRawLong64(); |
| | DRW_DBG("\nPagesMapOffset = "); DRW_DBGH(PagesMapOffset); |
| | DRW_DBG("\nPagesMapId = "); DRW_DBG(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nHeader2offset = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | duint64 PagesMapSizeCompressed = fileHdrDataBuf.getRawLong64(); |
| | DRW_DBG("\nPagesMapSizeCompressed = "); DRW_DBG(PagesMapSizeCompressed); |
| | duint64 PagesMapSizeUncompressed = fileHdrDataBuf.getRawLong64(); |
| | DRW_DBG("\nPagesMapSizeUncompressed = "); DRW_DBG(PagesMapSizeUncompressed); |
| | DRW_DBG("\nPagesAmount = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | duint64 PagesMaxId = fileHdrDataBuf.getRawLong64(); |
| | DRW_DBG("\nPagesMaxId = "); DRW_DBG(PagesMaxId); |
| | DRW_DBG("\nUnknown (normally 0x20) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nUnknown (normally 0x40) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nPagesMapCrcUncompressed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nUnknown (normally 0xf800) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nUnknown (normally 4) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nUnknown (normally 1) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nSectionsAmount (number of sections + 1) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nSectionsMapCrcUncompressed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | duint64 SectionsMapSizeCompressed = fileHdrDataBuf.getRawLong64(); |
| | DRW_DBG("\nSectionsMapSizeCompressed = "); DRW_DBGH(SectionsMapSizeCompressed); |
| | DRW_DBG("\nSectionsMap2Id = "); DRW_DBG(fileHdrDataBuf.getRawLong64()); |
| | duint64 SectionsMapId = fileHdrDataBuf.getRawLong64(); |
| | DRW_DBG("\nSectionsMapId = "); DRW_DBG(SectionsMapId); |
| | duint64 SectionsMapSizeUncompressed = fileHdrDataBuf.getRawLong64(); |
| | DRW_DBG("\nSectionsMapSizeUncompressed = "); DRW_DBGH(SectionsMapSizeUncompressed); |
| | DRW_DBG("\nSectionsMapCrcCompressed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | duint64 SectionsMapCorrectionFactor = fileHdrDataBuf.getRawLong64(); |
| | DRW_DBG("\nSectionsMapCorrectionFactor = "); DRW_DBG(SectionsMapCorrectionFactor); |
| | DRW_DBG("\nSectionsMapCrcSeed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nStreamVersion (normally 0x60100) = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nCrcSeed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nCrcSeedEncoded = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nRandomSeed = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); |
| | DRW_DBG("\nHeader CRC64 = "); DRW_DBGH(fileHdrDataBuf.getRawLong64()); DRW_DBG("\n"); |
| |
|
| | DRW_DBG("\ndwgReader21::parse page map:\n"); |
| | std::vector<duint8> PagesMapData(PagesMapSizeUncompressed); |
| |
|
| | if (!parseSysPage(PagesMapSizeCompressed, PagesMapSizeUncompressed, |
| | PagesMapCorrectionFactor, 0x480+PagesMapOffset, |
| | &PagesMapData.front())) { |
| | return false; |
| | } |
| |
|
| | duint64 address = 0x480; |
| | duint64 i = 0; |
| | dwgBuffer PagesMapBuf(&PagesMapData.front(), PagesMapSizeUncompressed, &decoder); |
| | |
| | std::unordered_map<duint64, dwgPageInfo >sectionPageMapTmp; |
| |
|
| | |
| | while (PagesMapSizeUncompressed > i ) { |
| | duint64 size = PagesMapBuf.getRawLong64(); |
| | dint64 id = PagesMapBuf.getRawLong64(); |
| | duint64 ind = id > 0 ? id : -id; |
| | i += 16; |
| |
|
| | DRW_DBG("Page gap= "); DRW_DBG(id); DRW_DBG(" Page num= "); DRW_DBG(ind); DRW_DBG(" size= "); DRW_DBGH(size); |
| | DRW_DBG(" address= "); DRW_DBGH(address); DRW_DBG("\n"); |
| | sectionPageMapTmp[ind] = dwgPageInfo(ind, address,size); |
| | address += size; |
| | |
| | |
| | } |
| |
|
| | DRW_DBG("\n*** dwgReader21: Processing Section Map ***\n"); |
| | std::vector<duint8> SectionsMapData( SectionsMapSizeUncompressed); |
| | dwgPageInfo sectionMap = sectionPageMapTmp[SectionsMapId]; |
| | if (!parseSysPage( SectionsMapSizeCompressed, SectionsMapSizeUncompressed, |
| | SectionsMapCorrectionFactor, sectionMap.address, &SectionsMapData.front()) ) { |
| | return false; |
| | } |
| |
|
| | |
| | |
| | |
| | dwgBuffer SectionsMapBuf( &SectionsMapData.front(), SectionsMapSizeUncompressed, &decoder); |
| | duint8 nextId = 1; |
| | while(SectionsMapBuf.getPosition() < SectionsMapBuf.size()){ |
| | dwgSectionInfo secInfo; |
| | secInfo.size = SectionsMapBuf.getRawLong64(); |
| | DRW_DBG("\nSize of section (data size)= "); DRW_DBGH(secInfo.size); |
| | secInfo.maxSize = SectionsMapBuf.getRawLong64(); |
| | DRW_DBG("\nMax Decompressed Size= "); DRW_DBGH(secInfo.maxSize); |
| | secInfo.encrypted = SectionsMapBuf.getRawLong64(); |
| | |
| | DRW_DBG("\nencription= "); DRW_DBGH(secInfo.encrypted); |
| | DRW_DBG("\nHashCode = "); DRW_DBGH(SectionsMapBuf.getRawLong64()); |
| | duint64 SectionNameLength = SectionsMapBuf.getRawLong64(); |
| | DRW_DBG("\nSectionNameLength = "); DRW_DBG(SectionNameLength); |
| | DRW_DBG("\nUnknown = "); DRW_DBGH(SectionsMapBuf.getRawLong64()); |
| | secInfo.compressed = SectionsMapBuf.getRawLong64(); |
| | DRW_DBG("\nEncoding (compressed) = "); DRW_DBGH(secInfo.compressed); |
| | secInfo.pageCount = SectionsMapBuf.getRawLong64(); |
| | DRW_DBG("\nPage count= "); DRW_DBGH(secInfo.pageCount); |
| | secInfo.name = SectionsMapBuf.getUCSStr(SectionNameLength); |
| | DRW_DBG("\nSection name = "); DRW_DBG(secInfo.name); DRW_DBG("\n"); |
| |
|
| | for (unsigned int i=0; i< secInfo.pageCount; i++){ |
| | duint64 po = SectionsMapBuf.getRawLong64(); |
| | duint32 ds = SectionsMapBuf.getRawLong64(); |
| | duint32 pn = SectionsMapBuf.getRawLong64(); |
| | DRW_DBG(" pag Id = "); DRW_DBGH(pn); DRW_DBG(" data size = "); DRW_DBGH(ds); |
| | dwgPageInfo pi = sectionPageMapTmp[pn]; |
| | pi.dataSize = ds; |
| | pi.startOffset = po; |
| | pi.uSize = SectionsMapBuf.getRawLong64(); |
| | pi.cSize = SectionsMapBuf.getRawLong64(); |
| | secInfo.pages[pn]= pi; |
| | DRW_DBG("\n Page number= "); DRW_DBGH(secInfo.pages[pn].Id); |
| | DRW_DBG("\n address in file= "); DRW_DBGH(secInfo.pages[pn].address); |
| | DRW_DBG("\n size in file= "); DRW_DBGH(secInfo.pages[pn].size); |
| | DRW_DBG("\n Data size= "); DRW_DBGH(secInfo.pages[pn].dataSize); |
| | DRW_DBG("\n Start offset= "); DRW_DBGH(secInfo.pages[pn].startOffset); |
| | DRW_DBG("\n Page uncompressed size = "); DRW_DBGH(secInfo.pages[pn].uSize); |
| | DRW_DBG("\n Page compressed size = "); DRW_DBGH(secInfo.pages[pn].cSize); |
| |
|
| | DRW_DBG("\n Page checksum = "); DRW_DBGH(SectionsMapBuf.getRawLong64()); |
| | DRW_DBG("\n Page CRC = "); DRW_DBGH(SectionsMapBuf.getRawLong64()); DRW_DBG("\n"); |
| | } |
| |
|
| | if (!secInfo.name.empty()) { |
| | secInfo.Id = nextId++; |
| | DRW_DBG("Saved section Name= "); DRW_DBG( secInfo.name.c_str() ); DRW_DBG("\n"); |
| | sections[secEnum::getEnum(secInfo.name)] = secInfo; |
| | } |
| | } |
| |
|
| | if (! fileBuf->isGood()) |
| | return false; |
| |
|
| | DRW_DBG("\ndwgReader21::readFileHeader END\n"); |
| | return true; |
| | } |
| |
|
| | bool dwgReader21::readDwgHeader(DRW_Header& hdr){ |
| | DRW_DBG("\ndwgReader21::readDwgHeader\n"); |
| | dwgSectionInfo si = sections[secEnum::HEADER]; |
| | if (si.Id < 0) { |
| | return false; |
| | } |
| |
|
| | DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n"); |
| | std::vector<duint8> tmpHeaderData( si.size); |
| |
|
| | if (!dwgReader21::parseDataPage( si, &tmpHeaderData.front())) { |
| | return false; |
| | } |
| |
|
| | dwgBuffer dataBuf(&tmpHeaderData.front(), si.size, &decoder); |
| | dwgBuffer handleBuf(&tmpHeaderData.front(), si.size, &decoder); |
| | DRW_DBG("Header section sentinel= "); |
| | checkSentinel(&dataBuf, secEnum::HEADER, true); |
| |
|
| | return dwgReader::readDwgHeader(hdr, &dataBuf, &handleBuf); |
| | } |
| |
|
| | bool dwgReader21::readDwgClasses(){ |
| | DRW_DBG("\ndwgReader21::readDwgClasses"); |
| | dwgSectionInfo si = sections[secEnum::CLASSES]; |
| | if (si.Id<0) |
| | return false; |
| |
|
| | DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n"); |
| | std::vector<duint8> tmpClassesData( si.size); |
| | bool ret = dwgReader21::parseDataPage(si, tmpClassesData.data()); |
| | if (!ret) { |
| | return ret; |
| | } |
| |
|
| | dwgBuffer buff(tmpClassesData.data(), si.size, &decoder); |
| | DRW_DBG("classes section sentinel= "); |
| | checkSentinel(&buff, secEnum::CLASSES, true); |
| |
|
| | duint32 size = buff.getRawLong32(); |
| | DRW_DBG("\ndata size in bytes "); DRW_DBG(size); |
| |
|
| | duint32 bitSize = buff.getRawLong32(); |
| | DRW_DBG("\ntotal size in bits "); DRW_DBG(bitSize); |
| |
|
| | duint32 maxClassNum = buff.getBitShort(); |
| | DRW_DBG("\nMaximum class number "); DRW_DBG(maxClassNum); |
| | DRW_DBG("\nRc 1 "); DRW_DBG(buff.getRawChar8()); |
| | DRW_DBG("\nRc 2 "); DRW_DBG(buff.getRawChar8()); |
| | DRW_DBG("\nBit "); DRW_DBG(buff.getBit()); |
| |
|
| | |
| | |
| | dwgBuffer strBuff(tmpClassesData.data(), si.size, &decoder); |
| | duint32 strStartPos = bitSize + 159; |
| | DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos); |
| | strBuff.setPosition(strStartPos >> 3); |
| | strBuff.setBitPos(strStartPos & 7); |
| | DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition()); |
| | DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos()); |
| | DRW_DBG("\nendBit "); DRW_DBG(strBuff.getBit()); |
| | strStartPos -= 16; |
| | DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos); |
| | strBuff.setPosition(strStartPos >> 3); |
| | strBuff.setBitPos(strStartPos & 7); |
| | DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition()); |
| | DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos()); |
| | duint32 strDataSize = strBuff.getRawShort16(); |
| | DRW_DBG("\nstrDataSize: "); DRW_DBG(strDataSize); |
| | if (strDataSize & 0x8000) { |
| | strStartPos -= 16; |
| | strDataSize &= 0x7FFF; |
| | strBuff.setPosition(strStartPos >> 3); |
| | strBuff.setBitPos(strStartPos & 7); |
| | duint32 hiSize = strBuff.getRawShort16(); |
| | strDataSize |= (hiSize << 15); |
| | } |
| | strStartPos -= strDataSize; |
| | DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos); |
| | strBuff.setPosition(strStartPos >> 3); |
| | strBuff.setBitPos(strStartPos & 7); |
| | DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition()); |
| | DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos()); |
| |
|
| |
|
| | |
| |
|
| | duint32 endDataPos = maxClassNum-499; |
| | DRW_DBG("\nbuff.getPosition: "); DRW_DBG(buff.getPosition()); |
| | for (duint32 i= 0; i<endDataPos;i++) { |
| | DRW_Class *cl = new DRW_Class(); |
| | cl->parseDwg(version, &buff, &strBuff); |
| | classesmap[cl->classNum] = cl; |
| | DRW_DBG("\nbuff.getPosition: "); DRW_DBG(buff.getPosition()); |
| | } |
| | DRW_DBG("\nend classes data buff.getPosition: "); DRW_DBG(buff.getPosition()); |
| | DRW_DBG("\nend classes data buff.getBitPos: "); DRW_DBG(buff.getBitPos()); |
| |
|
| | buff.setPosition(size+20); |
| | DRW_DBG("\nCRC: "); DRW_DBGH(buff.getRawShort16()); |
| | DRW_DBG("\nclasses section end sentinel= "); |
| | checkSentinel(&buff, secEnum::CLASSES, true); |
| | return buff.isGood(); |
| | } |
| |
|
| |
|
| | bool dwgReader21::readDwgHandles(){ |
| | DRW_DBG("\ndwgReader21::readDwgHandles"); |
| | dwgSectionInfo si = sections[secEnum::HANDLES]; |
| | if (si.Id<0) |
| | return false; |
| |
|
| | DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n"); |
| | std::vector<duint8> tmpHandlesData(si.size); |
| | bool ret = dwgReader21::parseDataPage(si, tmpHandlesData.data()); |
| | if (!ret) |
| | return ret; |
| |
|
| | dwgBuffer dataBuf(tmpHandlesData.data(), si.size, &decoder); |
| |
|
| | ret = dwgReader::readDwgHandles(&dataBuf, 0, si.size); |
| | return ret; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | bool dwgReader21::readDwgTables(DRW_Header& hdr) { |
| | DRW_DBG("\ndwgReader21::readDwgTables\n"); |
| | dwgSectionInfo si = sections[secEnum::OBJECTS]; |
| | if (si.Id<0) |
| | return false; |
| |
|
| | DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n"); |
| | dataSize = si.size; |
| | objData.reset( new duint8 [dataSize] ); |
| | bool ret = dwgReader21::parseDataPage(si, objData.get()); |
| | if (!ret) |
| | return ret; |
| |
|
| | DRW_DBG("readDwgTables total data size= "); DRW_DBG(dataSize); DRW_DBG("\n"); |
| | dwgBuffer dataBuf(objData.get(), dataSize, &decoder); |
| | ret = dwgReader::readDwgTables(hdr, &dataBuf); |
| |
|
| | return ret; |
| | } |
| |
|
| |
|
| | bool dwgReader21::readDwgBlocks(DRW_Interface& intfa){ |
| | bool ret = true; |
| | dwgBuffer dataBuf(objData.get(), dataSize, &decoder); |
| | ret = dwgReader::readDwgBlocks(intfa, &dataBuf); |
| | return ret; |
| | } |
| |
|
| |
|