wb_cdef wb_volume::cdef(wb_name n) { pwr_tStatus sts; // Look in this volume's meta environment only return wb_cdef(m_vrep->merep()->cdrep(&sts, n)); }
bool wb_vrepext::createVolumeObject( const char *name) { pwr_tStatus sts; wb_cdrep *cdrep = m_merep->cdrep( &sts, m_cid); wb_cdef cdef = wb_cdef( cdrep); ext_object exto; strcpy( exto.m_name, name); exto.m_oid.vid = m_vid; exto.m_oid.oix = 0; exto.m_cid = m_cid; exto.m_flags = cdef.flags(); exto.rbody_size = cdef.size( pwr_eBix_rt); if ( exto.rbody_size) { exto.rbody = malloc( exto.rbody_size); cdef.templateBody( &sts, pwr_eBix_rt, exto.rbody, exto.m_oid); if ( EVEN(sts)) return false; } exto.dbody_size = cdef.size( pwr_eBix_dev); if ( exto.dbody_size) { exto.dbody = malloc( exto.dbody_size); cdef.templateBody( &sts, pwr_eBix_dev, exto.dbody, exto.m_oid); if ( EVEN(sts)) return false; } volume_object = exto; strcpy( volume_name, name); return true; }
wb_orep *wb_vrepext::object(pwr_tStatus *sts) { vext_sQMsg qmsg; vext_sAMsg amsg; qmsg.Any.Type = vext_eMsgType_Object; put( &qmsg, sizeof(qmsg), sts); if ( EVEN(*sts)) return 0; receive( &amsg, sizeof(amsg), sts); if ( EVEN(*sts)) return 0; if ( ODD( amsg.Object.Status)) { *sts = LDH__SUCCESS; wb_cdrep *cdrep = m_merep->cdrep( sts, amsg.Object.cid); wb_cdef cdef = wb_cdef( cdrep); ext_object exto( &amsg.Object, m_vid, cdef); wb_orepext *orep = new wb_orepext( this, exto); return orep; } else { *sts = amsg.Object.Status; return 0; } }
wb_orep *wb_vrepext::object(pwr_tStatus *sts, wb_name &name) { if ( name.hasVolume() && !name.hasObject()) { // Volume object *sts = LDH__SUCCESS; return new wb_orepext( this, volume_object); } vext_sQMsg qmsg; vext_sAMsg amsg; qmsg.ObjectName.Type = vext_eMsgType_ObjectName; strcpy( qmsg.ObjectName.Name, name.name(cdh_mName_path | cdh_mName_object)); put( &qmsg, sizeof(qmsg), sts); if ( EVEN(*sts)) return 0; receive( &amsg, sizeof(amsg), sts); if ( EVEN(*sts)) return 0; if ( ODD( amsg.Object.Status)) { *sts = LDH__SUCCESS; wb_cdrep *cdrep = m_merep->cdrep( sts, amsg.Object.cid); wb_cdef cdef = wb_cdef( cdrep); ext_object exto( &amsg.Object, m_vid, cdef); wb_orepext *orep = new wb_orepext( this, exto); return orep; } else { *sts = amsg.Object.Status; return 0; } }
wb_cdef wb_volume::cdef(wb_object o) { pwr_tStatus sts; wb_orep *orep = o; wb_cdrep *cdrep; try { if (orep->vrep() == m_vrep) // Object in this volume cdrep = m_vrep->merep()->cdrep(&sts, *orep); else // Object in other volume, get class info from this volume's meta environment cdrep = m_vrep->erep()->cdrep(&sts, *orep); } catch ( wb_error &e) { return wb_cdef(); } return wb_cdef(cdrep); }
size_t wb_object::dbSize() { wb_cdef c = wb_cdef(*m_orep); wb_bdef b = c.bdef(pwr_eBix_dev); if (!b) return 0; return b.size(); }
size_t wb_object::rbSize() { check(); wb_cdef c = wb_cdef(*m_orep); wb_bdef b = c.bdef(pwr_eBix_rt); if (!b) return 0; return b.size(); }
wb_adef wb_volume::adef(pwr_tCid cid, const char *bname, const char *aname) { pwr_tStatus sts; wb_cdrep *cdrep = m_vrep->merep()->cdrep(&sts, cid); if (EVEN(sts)) return wb_adef(); wb_cdef cdef = wb_cdef(cdrep); wb_bdef bdef = cdef.bdef(bname); if (!bdef) return wb_adef(); return bdef.adef(aname); }
wb_orep *wb_vrepext::object(pwr_tStatus *sts, pwr_tOid oid) { if ( oid.vid != m_vid) { *sts = LDH__BADOBJID; return 0; } if ( oid.oix == 0) { // Volume object *sts = LDH__SUCCESS; return new wb_orepext( this, volume_object); } // Look in cache if ( m_cashe.m_oid.oix == oid.oix) { wb_orepext *orep = new wb_orepext( this, m_cashe); *sts = LDH__SUCCESS; return orep; } vext_sQMsg qmsg; vext_sAMsg amsg; qmsg.Oid.Type = vext_eMsgType_ObjectOid; qmsg.Oid.Oix = oid.oix; put( &qmsg, sizeof(qmsg), sts); if ( EVEN(*sts)) return 0; receive( &amsg, sizeof(amsg), sts); if ( EVEN(*sts)) return 0; if ( ODD( amsg.Object.Status)) { *sts = LDH__SUCCESS; wb_cdrep *cdrep = m_merep->cdrep( sts, amsg.Object.cid); wb_cdef cdef = wb_cdef( cdrep); ext_object exto( &amsg.Object, m_vid, cdef); cashe_insert( exto); wb_orepext *orep = new wb_orepext( this, exto); return orep; } else { *sts = amsg.Object.Status; return 0; } }
wb_orep *wb_vrepext::copyObject(pwr_tStatus *sts, const wb_orep *orep, wb_destination &d, wb_name &name, pwr_tOix oix) { if ( d.oid().vid != m_vid || orep->oid().vid != m_vid) { *sts = LDH__BADOBJID; return 0; } vext_sQMsg qmsg; vext_sAMsg amsg; qmsg.CopyObject.Oix = orep->oix(); qmsg.CopyObject.Type = vext_eMsgType_CopyObject; qmsg.CopyObject.DestOix = d.oid().oix; qmsg.CopyObject.DestType = d.code(); if ( name) strcpy( qmsg.CopyObject.Name, name.object()); else strcpy( qmsg.CopyObject.Name, ""); put( &qmsg, sizeof(qmsg), sts); if ( EVEN(*sts)) return 0; receive( &amsg, sizeof(amsg), sts); if ( EVEN(*sts)) return 0; if ( ODD( amsg.Object.Status)) { *sts = LDH__SUCCESS; wb_cdrep *cdrep = m_merep->cdrep( sts, amsg.Object.cid); wb_cdef cdef = wb_cdef( cdrep); ext_object exto( &amsg.Object, m_vid, cdef); cashe_insert( exto); wb_orepext *orep = new wb_orepext( this, exto); return orep; } else { *sts = amsg.Object.Status; return 0; } return 0; }