/****************************************************************************** ** libDXFrw - Library to read/write DXF files (ascii & binary) ** ** ** ** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** ** ** ** This library is free software, licensed under the terms of the GNU ** ** General Public License as published by the Free Software Foundation, ** ** either version 2 of the License, or (at your option) any later version. ** ** You should have received a copy of the GNU General Public License ** ** along with this program. If not, see . ** ******************************************************************************/ #include #include #include #include #include #include "drw_dbg.h" #include "dwgreader15.h" #include "drw_textcodec.h" #include "../libdwgr.h" bool dwgReader15::readMetaData() { version = parent->getVersion(); decoder.setVersion(version, false); DRW_DBG("dwgReader15::readMetaData\n"); if (! fileBuf->setPosition(13)) return false; previewImagePos = fileBuf->getRawLong32(); DRW_DBG("previewImagePos (seekerImageData) = "); DRW_DBG(previewImagePos); /* MEASUREMENT system variable 2 bytes*/ duint16 meas = fileBuf->getRawShort16(); DRW_DBG("\nMEASUREMENT (0 = English, 1 = Metric)= "); DRW_DBG(meas); duint16 cp = fileBuf->getRawShort16(); DRW_DBG("\ncodepage= "); DRW_DBG(cp); DRW_DBG("\n"); if (cp == 29) //TODO RLZ: locate wath code page and correct this decoder.setCodePage("ANSI_1252", false); if (cp == 30) decoder.setCodePage("ANSI_1252", false); return true; } bool dwgReader15::readFileHeader() { bool ret = true; DRW_DBG("dwgReader15::readFileHeader\n"); if (! fileBuf->setPosition(21)) return false; duint32 count = fileBuf->getRawLong32(); DRW_DBG("count records= "); DRW_DBG(count); DRW_DBG("\n"); for (unsigned int i = 0; i < count; i++) { duint8 rec = fileBuf->getRawChar8(); duint32 address = fileBuf->getRawLong32(); duint32 size = fileBuf->getRawLong32(); dwgSectionInfo si; si.Id = rec; si.size = size; si.address = address; if (rec == 0) { DRW_DBG("\nSection HEADERS address= "); DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); sections[secEnum::HEADER] = si; } else if (rec == 1) { DRW_DBG("\nSection CLASSES address= "); DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); sections[secEnum::CLASSES] = si; } else if (rec == 2) { DRW_DBG("\nSection OBJECTS (handles) address= "); DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); sections[secEnum::HANDLES] = si; } else if (rec == 3) { DRW_DBG("\nSection UNKNOWN address= "); DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); sections[secEnum::UNKNOWNS] = si; } else if (rec == 4) { DRW_DBG("\nSection R14DATA (AcDb:Template) address= "); DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); sections[secEnum::TEMPLATE] = si; } else if (rec == 5) { DRW_DBG("\nSection R14REC5 (AcDb:AuxHeader) address= "); DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); sections[secEnum::AUXHEADER] = si; } else { std::cerr << "\nUnsupported section number\n"; } } if (! fileBuf->isGood()) return false; DRW_DBG("\nposition after read section locator records= "); DRW_DBG(fileBuf->getPosition()); DRW_DBG(", bit are= "); DRW_DBG(fileBuf->getBitPos()); duint32 ckcrc = fileBuf->crc8(0,0,fileBuf->getPosition()); DRW_DBG("\nfile header crc8 0 result= "); DRW_DBG(ckcrc); switch (count){ case 3: ckcrc = ckcrc ^ 0xA598; break; case 4: ckcrc = ckcrc ^ 0x8101; break; case 5: ckcrc = ckcrc ^ 0x3CC4; break; case 6: ckcrc = ckcrc ^ 0x8461; } DRW_DBG("\nfile header crc8 xor result= "); DRW_DBG(ckcrc); DRW_DBG("\nfile header CRC= "); DRW_DBG(fileBuf->getRawShort16()); DRW_DBG("\nfile header sentinel= "); checkSentinel(fileBuf.get(), secEnum::FILEHEADER, false); DRW_DBG("\nposition after read file header sentinel= "); DRW_DBG(fileBuf->getPosition()); DRW_DBG(", bit are= "); DRW_DBG(fileBuf->getBitPos()); DRW_DBG("\ndwgReader15::readFileHeader END\n"); return ret; } bool dwgReader15::readDwgHeader(DRW_Header& hdr){ DRW_DBG("dwgReader15::readDwgHeader\n"); dwgSectionInfo si = sections[secEnum::HEADER]; if (si.Id<0)//not found, ends return false; if (!fileBuf->setPosition(si.address)) return false; duint8 *tmpByteStr = new duint8[si.size]; fileBuf->getBytes(tmpByteStr, si.size); dwgBuffer buff(tmpByteStr, si.size, &decoder); DRW_DBG("Header section sentinel= "); checkSentinel(&buff, secEnum::HEADER, true); bool ret = dwgReader::readDwgHeader(hdr, &buff, &buff); delete[]tmpByteStr; return ret; } bool dwgReader15::readDwgClasses(){ DRW_DBG("\ndwgReader15::readDwgClasses\n"); dwgSectionInfo si = sections[secEnum::CLASSES]; if (si.Id<0)//not found, ends return false; if (!fileBuf->setPosition(si.address)) return false; DRW_DBG("classes section sentinel= "); checkSentinel(fileBuf.get(), secEnum::CLASSES, true); duint32 size = fileBuf->getRawLong32(); if (size != (si.size - 38)) { DRW_DBG("\nWARNING dwgReader15::readDwgClasses size are "); DRW_DBG(size); DRW_DBG(" and secSize - 38 are "); DRW_DBG(si.size - 38); DRW_DBG("\n"); } duint8 *tmpByteStr = new duint8[size]; fileBuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); size--; //reduce 1 byte instead of check pos + bitPos while (size > buff.getPosition()) { DRW_Class *cl = new DRW_Class(); cl->parseDwg(version, &buff, &buff); classesmap[cl->classNum] = cl; } DRW_DBG("\nCRC: "); DRW_DBGH(fileBuf->getRawShort16()); DRW_DBG("\nclasses section end sentinel= "); checkSentinel(fileBuf.get(), secEnum::CLASSES, false); bool ret = buff.isGood(); delete[]tmpByteStr; return ret; } bool dwgReader15::readDwgHandles() { DRW_DBG("\ndwgReader15::readDwgHandles\n"); dwgSectionInfo si = sections[secEnum::HANDLES]; if (si.Id<0)//not found, ends return false; bool ret = dwgReader::readDwgHandles(fileBuf.get(), si.address, si.size); return ret; } /*********** objects ************************/ /** * Reads all the object referenced in the object map section of the DWG file * (using their object file offsets) */ bool dwgReader15::readDwgTables(DRW_Header& hdr) { bool ret = dwgReader::readDwgTables(hdr, fileBuf.get()); return ret; } /** * Reads all the object referenced in the object map section of the DWG file * (using their object file offsets) */ bool dwgReader15::readDwgBlocks(DRW_Interface& intfa) { bool ret = true; ret = dwgReader::readDwgBlocks(intfa, fileBuf.get()); return ret; }