bool wb_treeimport::importUpdateSubClass( wb_adrep *subattr, char *body, wb_vrep *vrep, bool *modified) { pwr_tStatus sts; pwr_tOix oix; pwr_tCid cid = subattr->subClass(); wb_cdrep *cdrep = vrep->merep()->cdrep( &sts, cid); if ( EVEN(sts)) throw wb_error(sts); wb_bdrep *bdrep = cdrep->bdrep( &sts, pwr_eBix_rt); if ( EVEN(sts)) throw wb_error(sts); int subattr_elements = subattr->isArray() ? subattr->nElement() : 1; for ( int i = 0; i < subattr_elements; i++) { wb_adrep *adrep = bdrep->adrep( &sts); while ( ODD(sts)) { int elements = adrep->isArray() ? adrep->nElement() : 1; if ( adrep->isClass()) { importUpdateSubClass( adrep, body + i * subattr->size() / subattr_elements + adrep->offset(), vrep, modified); } else { switch ( adrep->type()) { case pwr_eType_Objid: { pwr_tOid *oidp = (pwr_tOid *)(body + i * subattr->size() / subattr_elements + adrep->offset()); for ( int j = 0; j < elements; j++) { if ( oidp->vid == m_import_source_vid && (oix = importTranslate( oidp->oix))) { oidp->vid = vrep->vid(); oidp->oix = oix; *modified = true; } else if ( ldh_isSymbolicVid( oidp->vid) && (oix = importTranslateCid(oidp->oix))) { oidp->oix = oix; *modified = true; } oidp++; } break; } case pwr_eType_AttrRef: { pwr_sAttrRef *arp = (pwr_sAttrRef *)(body + i * subattr->size() / subattr_elements + adrep->offset()); for ( int j = 0; j < elements; j++) { if ( arp->Objid.vid == m_import_source_vid && (oix = importTranslate( arp->Objid.oix))) { arp->Objid.vid = vrep->vid(); arp->Objid.oix = oix; *modified = true; } else if ( ldh_isSymbolicVid( arp->Objid.vid) && (oix = importTranslateCid(arp->Objid.oix))) { arp->Objid.oix = oix; *modified = true; } arp++; } break; } case pwr_eType_DataRef: { pwr_tDataRef *drp = (pwr_tDataRef *)(body + i * subattr->size() / subattr_elements + adrep->offset()); for ( int j = 0; j < elements; j++) { if ( drp->Aref.Objid.vid == m_import_source_vid && (oix = importTranslate( drp->Aref.Objid.oix))) { drp->Aref.Objid.vid = vrep->vid(); drp->Aref.Objid.oix = oix; *modified = true; } drp++; } break; } default: ; } } wb_adrep *prev = adrep; adrep = adrep->next( &sts); delete prev; } } delete bdrep; delete cdrep; return true; }
bool wb_treeimport::importUpdateObject( wb_orep *o, wb_vrep *vrep) { pwr_tOix oix; pwr_tStatus sts; wb_cdrep *cdrep = vrep->merep()->cdrep( &sts, o->cid()); if ( EVEN(sts)) throw wb_error(sts); pwr_mClassDef flags = cdrep->flags(); for ( int i = 0; i < 2; i++) { pwr_eBix bix = i ? pwr_eBix_rt : pwr_eBix_dev; wb_bdrep *bdrep = cdrep->bdrep( &sts, bix); if ( EVEN(sts)) continue; int size = bdrep->size(); char *body = (char *)malloc( bdrep->size()); vrep->readBody( &sts, o, bix, body); if ( EVEN(sts)) throw wb_error(sts); bool modified = false; wb_adrep *adrep = bdrep->adrep( &sts); while ( ODD(sts)) { int elements = adrep->isArray() ? adrep->nElement() : 1; if (adrep->offset() < 0 || ((int)(adrep->offset() + adrep->size()) > size)) printf("(adrep->offset() < 0 || (adrep->offset() + adrep->size() > size))\n"); if ( adrep->isClass()) { importUpdateSubClass( adrep, body + adrep->offset(), vrep, &modified); } else { switch ( adrep->type()) { case pwr_eType_Objid: { pwr_tOid *oidp = (pwr_tOid *)(body + adrep->offset()); for ( int j = 0; j < elements; j++) { if ( oidp->vid == m_import_source_vid && (oix = importTranslate( oidp->oix))) { oidp->vid = vrep->vid(); oidp->oix = oix; modified = true; } else if ( ldh_isSymbolicVid( oidp->vid) && (oix = importTranslateCid(oidp->oix))) { oidp->oix = oix; modified = true; } oidp++; } break; } case pwr_eType_AttrRef: { pwr_sAttrRef *arp = (pwr_sAttrRef *)(body + adrep->offset()); for ( int j = 0; j < elements; j++) { if ( arp->Objid.vid == m_import_source_vid && (oix = importTranslate( arp->Objid.oix))) { arp->Objid.vid = vrep->vid(); arp->Objid.oix = oix; modified = true; } else if ( ldh_isSymbolicVid( arp->Objid.vid) && (oix = importTranslateCid(arp->Objid.oix))) { arp->Objid.oix = oix; modified = true; } arp++; } break; } case pwr_eType_DataRef: { pwr_tDataRef *drp = (pwr_tDataRef *)(body + adrep->offset()); for ( int j = 0; j < elements; j++) { if ( drp->Aref.Objid.vid == m_import_source_vid && (oix = importTranslate( drp->Aref.Objid.oix))) { drp->Aref.Objid.vid = vrep->vid(); drp->Aref.Objid.oix = oix; modified = true; } drp++; } break; } default: ; } } wb_adrep *prev = adrep; adrep = adrep->next( &sts); delete prev; } if ( modified) { vrep->writeBody( &sts, o, bix, body); if ( EVEN(sts)) throw wb_error(sts); } free( body); delete bdrep; } delete cdrep; return true; }
// // printValue // bool wb_print_wbl::printValue (wb_volume& v, wb_adef& adef, void *val, int varSize, char **svalp) { unsigned long sts; char timbuf[24]; static char sval[512]; bool retval = true; pwr_tOid oid; wb_object o; sval[0] = '\0'; if (adef.flags() & PWR_MASK_POINTER) { sprintf(sval, "%u", *(unsigned int *) val); *svalp = sval; return TRUE; } switch (adef.type()) { case pwr_eType_Boolean: sprintf(sval, "%d", *(pwr_tBoolean *) val); break; case pwr_eType_Float32: if ( *(pwr_tFloat32 *)val == FLT_MIN) strcpy( sval, "FLT_MIN"); else if ( *(pwr_tFloat32 *)val == FLT_MAX) strcpy( sval, "FLT_MAX"); else sprintf(sval, "%.*e", FLT_DIG, *(pwr_tFloat32 *) val); break; case pwr_eType_Float64: sprintf(sval, "%.*e", DBL_DIG, *(pwr_tFloat64 *) val); break; case pwr_eType_Char: if (*(pwr_tChar *) val == 0) sprintf(sval, "\"\""); else sprintf(sval, "\"%c\"", *(pwr_tChar *) val); break; case pwr_eType_Int8: sprintf(sval, "%d", *(pwr_tInt8 *) val); break; case pwr_eType_Int16: sprintf(sval, "%d", *(pwr_tInt16 *) val); break; case pwr_eType_Int32: if ( *(pwr_tInt32 *)val == INT_MIN) strcpy( sval, "INT_MIN"); else if ( *(pwr_tInt32 *)val == INT_MAX) strcpy( sval, "INT_MAX"); else sprintf(sval, "%d", *(pwr_tInt32 *) val); break; case pwr_eType_Int64: sprintf(sval, pwr_dFormatInt64, *(pwr_tInt64 *) val); break; case pwr_eType_UInt8: sprintf(sval, "%u", *(pwr_tUInt8 *) val); break; case pwr_eType_UInt16: sprintf(sval, "%u", *(pwr_tUInt16 *) val); break; case pwr_eType_UInt32: case pwr_eType_DisableAttr: sprintf(sval, "%u", *(pwr_tUInt32 *) val); break; case pwr_eType_UInt64: sprintf(sval, pwr_dFormatUInt64, *(pwr_tUInt64 *) val); break; case pwr_eType_Mask: sprintf(sval, "%u", *(pwr_tUInt32 *) val); break; case pwr_eType_Enum: sprintf(sval, "%u", *(pwr_tUInt32 *) val); break; case pwr_eType_RefId: sprintf(sval, "0"); break; case pwr_eType_Objid: if (cdh_ObjidIsNull(*(pwr_tOid *) val)) sprintf(sval, "\"_O0.0.0.0:0\""); else { o = v.object(*(pwr_tOid *)val); if (o) { if ( o.oid().vid >= cdh_cUserVolMin && o.oid().vid != v.vid() && !m_keepName) // Other user volume. Loadfile might not be created yet at load time. sprintf(sval, "\"%s\"", cdh_ObjidToString(NULL, *(pwr_tObjid *)val, 1)); else sprintf(sval, "\"%s\"", o.longName().c_str()); } else sprintf(sval, "\"%s\"", cdh_ObjidToString(NULL, *(pwr_tObjid *)val, 1)); } break; case pwr_eType_ObjectIx: if ( *(pwr_tObjectIx *) val == 0) sprintf(sval, "0"); else sprintf(sval, "\"%s\"", cdh_ObjectIxToString(NULL, *(pwr_tObjectIx *) val,1)); break; case pwr_eType_VolumeId: if ( *(pwr_tVolumeId *) val == 0) sprintf(sval, "0"); else sprintf(sval, "\"%s\"", cdh_VolumeIdToString(NULL, *(pwr_tVolumeId *) val,1,0)); break; case pwr_eType_ClassId: if (*(pwr_tClassId *) val == 0) sprintf(sval, "0"); else { wb_cdef cdef = v.cdef(*(pwr_tCid *)val); if (cdef) sprintf(sval, "\"%s\"", cdef.longName().c_str()); else { sprintf(sval, "Unknown class, identity: %d", (*(pwr_tClassId *) val)); m_errCnt++; retval = false; } } break; case pwr_eType_TypeId: /** @todo Modify when wb_tdef is OK q*/ case pwr_eType_CastId: if (*(pwr_tTypeId *) val == 0) sprintf(sval, "0"); else { oid = cdh_TypeIdToObjid(*(pwr_tTid *)val); o = v.object(oid); if (o) sprintf(sval, "\"%s\"", o.longName().c_str()); else { sprintf(sval, "Unknown type, identity: %d", (*(pwr_tTypeId *) val)); m_errCnt++; retval = false; } } break; case pwr_eType_AttrRef: /** @todo */ if (cdh_ObjidIsNull(((pwr_sAttrRef*)val)->Objid)) sprintf(sval, "\"_O0.0.0.0:0\""); else { try { wb_attribute a = v.attribute((pwr_sAttrRef*)val); if (a) sprintf(sval, "\"%s\"", a.longName().c_str()); else { sprintf(sval, "\"%s\"", cdh_ArefToString(NULL, (pwr_sAttrRef*)val, 1)); } } catch ( wb_error &e) { if ( ldh_isSymbolicVid( ((pwr_sAttrRef *)val)->Objid.vid)) sprintf(sval, "\"%s\"", cdh_ArefToString(NULL, (pwr_sAttrRef*)val, 1)); else { sprintf(sval, "Unknown attribute reference"); m_errCnt++; retval = FALSE; } } } #if 0 } else {