std::string desitemplate::get_svn_devstr(const std::string& product) { std::string cbuff(""); std::string unversioned("0"); FILE *in; char buff[512]; std::string product_dir = product; std::transform(product_dir.begin(), product_dir.end(), product_dir.begin(), ::toupper); product_dir += "_DIR"; std::string command("svnversion -n "); command += getenv(product_dir.c_str()); if (!(in = popen(command.c_str(),"r"))) return cbuff; if (fgets(buff, sizeof(buff), in) != NULL) { cbuff = buff; if (cbuff == "Unversioned directory") return unversioned; std::size_t colon = cbuff.find(":"); if (colon != std::string::npos) { cbuff = cbuff.substr(colon+1); } while (cbuff[cbuff.length()-1] == 'M' || cbuff[cbuff.length()-1] == 'C' || cbuff[cbuff.length()-1] == 'P') cbuff = cbuff.substr(0,cbuff.length()-1); } pclose(in); return cbuff; }
/** * Reads all the object referenced in the object map section of the DWG file * (using their object file offsets) */ bool dwgReader::readDwgTables(DRW_Header& hdr, dwgBuffer *dbuf) { DRW_DBG("\ndwgReader::readDwgTables start\n"); bool ret = true; bool ret2 = true; objHandle oc; std::map<duint32, objHandle>::iterator mit; dint16 oType; duint32 bs = 0; //bit size of handle stream 2010+ duint8 *tmpByteStr; //parse linetypes, start with linetype Control mit = ObjectMap.find(hdr.linetypeCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: LineType control not found\n"); ret = false; } else { DRW_DBG("\n**********Parsing LineType control*******\n"); oc = mit->second; ObjectMap.erase(mit); DRW_ObjControl ltControl; dbuf->setPosition(oc.loc); int csize = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[csize]; dbuf->getBytes(tmpByteStr, csize); dwgBuffer cbuff(tmpByteStr, csize, &decoder); //verify if object are correct oType = cbuff.getObjType(version); if (oType != 0x38) { DRW_DBG("\nWARNING: Not LineType control object, found oType "); DRW_DBG(oType); DRW_DBG(" instead 0x38\n"); ret = false; } else { //reset position cbuff.resetPosition(); ret2 = ltControl.parseDwg(version, &cbuff, bs); if(ret) ret = ret2; } delete[]tmpByteStr; for (std::list<duint32>::iterator it=ltControl.hadlesList.begin(); it != ltControl.hadlesList.end(); ++it){ mit = ObjectMap.find(*it); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: LineType not found\n"); ret = false; } else { oc = mit->second; ObjectMap.erase(mit); DRW_DBG("\nLineType Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" loc.: "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_LType *lt = new DRW_LType(); dbuf->setPosition(oc.loc); int lsize = dbuf->getModularShort(); DRW_DBG("LineType size in bytes= "); DRW_DBG(lsize); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[lsize]; dbuf->getBytes(tmpByteStr, lsize); dwgBuffer lbuff(tmpByteStr, lsize, &decoder); ret2 = lt->parseDwg(version, &lbuff, bs); ltypemap[lt->handle] = lt; if(ret) ret = ret2; delete[]tmpByteStr; } } } //parse layers, start with layer Control mit = ObjectMap.find(hdr.layerCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: Layer control not found\n"); ret = false; } else { DRW_DBG("\n**********Parsing Layer control*******\n"); oc = mit->second; ObjectMap.erase(mit); DRW_ObjControl layControl; dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); //verify if object are correct oType = buff.getObjType(version); if (oType != 0x32) { DRW_DBG("\nWARNING: Not Layer control object, found oType "); DRW_DBG(oType); DRW_DBG(" instead 0x32\n"); ret = false; } else { //reset position buff.resetPosition(); ret2 = layControl.parseDwg(version, &buff, bs); if(ret) ret = ret2; } delete[]tmpByteStr; for (std::list<duint32>::iterator it=layControl.hadlesList.begin(); it != layControl.hadlesList.end(); ++it){ mit = ObjectMap.find(*it); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: Layer not found\n"); ret = false; } else { oc = mit->second; ObjectMap.erase(mit); DRW_DBG("Layer Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_Layer *la = new DRW_Layer(); dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); ret2 = la->parseDwg(version, &buff, bs); layermap[la->handle] = la; if(ret) ret = ret2; delete[]tmpByteStr; } } } //set linetype in layer for (std::map<duint32, DRW_Layer*>::iterator it=layermap.begin(); it!=layermap.end(); ++it) { DRW_Layer *ly = it->second; duint32 ref =ly->lTypeH.ref; std::map<duint32, DRW_LType*>::iterator lt_it = ltypemap.find(ref); if (lt_it != ltypemap.end()){ ly->lineType = (lt_it->second)->name; } } //parse text styles, start with style Control mit = ObjectMap.find(hdr.styleCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: Style control not found\n"); ret = false; } else { DRW_DBG("\n**********Parsing Style control*******\n"); oc = mit->second; ObjectMap.erase(mit); DRW_ObjControl styControl; dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); //verify if object are correct oType = buff.getObjType(version); if (oType != 0x34) { DRW_DBG("\nWARNING: Not Text Style control object, found oType "); DRW_DBG(oType); DRW_DBG(" instead 0x34\n"); ret = false; } else { //reset position buff.resetPosition(); ret2 = styControl.parseDwg(version, &buff, bs); if(ret) ret = ret2; } delete[]tmpByteStr; for (std::list<duint32>::iterator it=styControl.hadlesList.begin(); it != styControl.hadlesList.end(); ++it){ mit = ObjectMap.find(*it); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: Style not found\n"); ret = false; } else { oc = mit->second; ObjectMap.erase(mit); DRW_DBG("Style Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_Textstyle *sty = new DRW_Textstyle(); dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); ret2 = sty->parseDwg(version, &buff, bs); stylemap[sty->handle] = sty; if(ret) ret = ret2; delete[]tmpByteStr; } } } //parse dim styles, start with dimstyle Control mit = ObjectMap.find(hdr.dimstyleCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: Dimension Style control not found\n"); ret = false; } else { DRW_DBG("\n**********Parsing Dimension Style control*******\n"); oc = mit->second; ObjectMap.erase(mit); DRW_ObjControl dimstyControl; dbuf->setPosition(oc.loc); duint32 size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); //verify if object are correct oType = buff.getObjType(version); if (oType != 0x44) { DRW_DBG("\nWARNING: Not Dim Style control object, found oType "); DRW_DBG(oType); DRW_DBG(" instead 0x44\n"); ret = false; } else { //reset position buff.resetPosition(); ret2 = dimstyControl.parseDwg(version, &buff, bs); if(ret) ret = ret2; } delete[]tmpByteStr; for (std::list<duint32>::iterator it=dimstyControl.hadlesList.begin(); it != dimstyControl.hadlesList.end(); ++it){ mit = ObjectMap.find(*it); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: Dimension Style not found\n"); ret = false; } else { oc = mit->second; ObjectMap.erase(mit); DRW_DBG("Dimstyle Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_Dimstyle *sty = new DRW_Dimstyle(); dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); ret2 = sty->parseDwg(version, &buff, bs); dimstylemap[sty->handle] = sty; if(ret) ret = ret2; delete[]tmpByteStr; } } } //parse vports, start with vports Control mit = ObjectMap.find(hdr.vportCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: vports control not found\n"); ret = false; } else { DRW_DBG("\n**********Parsing vports control*******\n"); oc = mit->second; ObjectMap.erase(mit); DRW_ObjControl vportControl; dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); //verify if object are correct oType = buff.getObjType(version); if (oType != 0x40) { DRW_DBG("\nWARNING: Not VPorts control object, found oType: "); DRW_DBG(oType); DRW_DBG(" instead 0x40\n"); ret = false; } else { //reset position buff.resetPosition(); ret2 = vportControl.parseDwg(version, &buff, bs); if(ret) ret = ret2; } delete[]tmpByteStr; for (std::list<duint32>::iterator it=vportControl.hadlesList.begin(); it != vportControl.hadlesList.end(); ++it){ mit = ObjectMap.find(*it); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: vport not found\n"); ret = false; } else { oc = mit->second; ObjectMap.erase(mit); DRW_DBG("Vport Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_Vport *vp = new DRW_Vport(); dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); ret2 = vp->parseDwg(version, &buff, bs); vportmap[vp->handle] = vp; if(ret) ret = ret2; delete[]tmpByteStr; } } } //parse Block_records , start with Block_record Control mit = ObjectMap.find(hdr.blockCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: Block_record control not found\n"); ret = false; } else { DRW_DBG("\n**********Parsing Block_record control*******\n"); oc = mit->second; ObjectMap.erase(mit); DRW_ObjControl blockControl; dbuf->setPosition(oc.loc); int csize = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[csize]; dbuf->getBytes(tmpByteStr, csize); dwgBuffer buff(tmpByteStr, csize, &decoder); //verify if object are correct oType = buff.getObjType(version); if (oType != 0x30) { DRW_DBG("\nWARNING: Not Block Record control object, found oType "); DRW_DBG(oType); DRW_DBG(" instead 0x30\n"); ret = false; } else { //reset position buff.resetPosition(); ret2 = blockControl.parseDwg(version, &buff, bs); if(ret) ret = ret2; } delete[]tmpByteStr; for (std::list<duint32>::iterator it=blockControl.hadlesList.begin(); it != blockControl.hadlesList.end(); ++it){ mit = ObjectMap.find(*it); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: block record not found\n"); ret = false; } else { oc = mit->second; ObjectMap.erase(mit); DRW_DBG("block record Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_Block_Record *br = new DRW_Block_Record(); dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); ret2 = br->parseDwg(version, &buff, bs); blockRecordmap[br->handle] = br; if(ret) ret = ret2; delete[]tmpByteStr; } } } //parse appId , start with appId Control mit = ObjectMap.find(hdr.appidCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: AppId control not found\n"); ret = false; } else { DRW_DBG("\n**********Parsing AppId control*******\n"); oc = mit->second; ObjectMap.erase(mit); DRW_DBG("AppId Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_ObjControl appIdControl; dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); //verify if object are correct oType = buff.getObjType(version); if (oType != 0x42) { DRW_DBG("\nWARNING: Not AppId control object, found oType "); DRW_DBG(oType); DRW_DBG(" instead 0x42\n"); ret = false; } else { //reset position buff.resetPosition(); ret2 = appIdControl.parseDwg(version, &buff, bs); if(ret) ret = ret2; } delete[]tmpByteStr; for (std::list<duint32>::iterator it=appIdControl.hadlesList.begin(); it != appIdControl.hadlesList.end(); ++it){ mit = ObjectMap.find(*it); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: AppId not found\n"); ret = false; } else { oc = mit->second; ObjectMap.erase(mit); DRW_DBG("AppId Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_AppId *ai = new DRW_AppId(); dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); ret2 = ai->parseDwg(version, &buff, bs); appIdmap[ai->handle] = ai; if(ret) ret = ret2; delete[]tmpByteStr; } } } //RLZ: parse remaining object controls, TODO: implement all if (DRW_DBGGL == DRW_dbg::DEBUG){ mit = ObjectMap.find(hdr.viewCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: View control not found\n"); ret = false; } else { DRW_DBG("\n**********Parsing View control*******\n"); oc = mit->second; ObjectMap.erase(mit); DRW_DBG("View Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_ObjControl viewControl; dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); //verify if object are correct oType = buff.getObjType(version); if (oType != 0x3C) { DRW_DBG("\nWARNING: Not View control object, found oType "); DRW_DBG(oType); DRW_DBG(" instead 0x3C\n"); ret = false; } else { //reset position buff.resetPosition(); ret2 = viewControl.parseDwg(version, &buff, bs); if(ret) ret = ret2; } delete[]tmpByteStr; } mit = ObjectMap.find(hdr.ucsCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: Ucs control not found\n"); ret = false; } else { oc = mit->second; ObjectMap.erase(mit); DRW_DBG("\n**********Parsing Ucs control*******\n"); DRW_DBG("Ucs Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_ObjControl ucsControl; dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); //verify if object are correct oType = buff.getObjType(version); if (oType != 0x3E) { DRW_DBG("\nWARNING: Not Ucs control object, found oType "); DRW_DBG(oType); DRW_DBG(" instead 0x3E\n"); ret = false; } else { //reset position buff.resetPosition(); ret2 = ucsControl.parseDwg(version, &buff, bs); if(ret) ret = ret2; } delete[]tmpByteStr; } if (version < DRW::AC1018) {//r2000- mit = ObjectMap.find(hdr.vpEntHeaderCtrl); if (mit==ObjectMap.end()) { DRW_DBG("\nWARNING: vpEntHeader control not found\n"); ret = false; } else { DRW_DBG("\n**********Parsing vpEntHeader control*******\n"); oc = mit->second; ObjectMap.erase(mit); DRW_DBG("vpEntHeader Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); DRW_ObjControl vpEntHeaderCtrl; dbuf->setPosition(oc.loc); int size = dbuf->getModularShort(); if (version > DRW::AC1021) //2010+ bs = dbuf->getUModularChar(); else bs = 0; tmpByteStr = new duint8[size]; dbuf->getBytes(tmpByteStr, size); dwgBuffer buff(tmpByteStr, size, &decoder); //verify if object are correct oType = buff.getObjType(version); if (oType != 0x46) { DRW_DBG("\nWARNING: Not vpEntHeader control object, found oType "); DRW_DBG(oType); DRW_DBG(" instead 0x46\n"); ret = false; } else { //reset position buff.resetPosition(); /* RLZ: writeme ret2 = vpEntHeader.parseDwg(version, &buff, bs); if(ret) ret = ret2;*/ } delete[]tmpByteStr; } } } return ret; }