wb_attribute::wb_attribute(pwr_tStatus sts, wb_orep* orep, const char *bname, const char *aname) : wb_status(sts), m_orep(orep), m_adrep(0), m_size(0), m_offset(0), m_idx(0), m_tid(0), m_elements(1), m_is_elem(0), m_type(pwr_eType_), m_flags(0), m_bix(pwr_eBix__), m_body(0), m_shadowed(false) { if ( orep == 0) m_sts = LDH__NOSUCHATTR; else { m_orep->ref(); wb_attrname n = wb_attrname(aname); wb_bdrep *bd = 0; wb_cdrep *cd = m_orep->vrep()->merep()->cdrep( &m_sts, m_orep->cid()); if ( oddSts()) { if ( bname) { bd = cd->bdrep( &m_sts, bname); if ( oddSts()) { m_adrep = bd->adrep( &m_sts, n.attributesAllTrue()); m_bix = bd->bix(); } } else { m_adrep = cd->adrep( &m_sts, n.attributesAllTrue()); m_bix = pwr_eBix_rt; } if ( oddSts()) { m_adrep->ref(); m_size = m_adrep->size(); m_offset = m_adrep->offset(); m_tid = m_original_tid = m_adrep->tid(); m_elements = m_adrep->nElement(); m_flags = m_adrep->flags(); m_type = m_adrep->type(); if ( m_flags & PWR_MASK_CASTATTR) { pwr_tCastId castid; castId( &castid); if ( castid != pwr_cNCastId) m_tid = castid; } } else m_adrep = 0; delete cd; if ( bd) delete bd; } } }
bool wb_session::commit() { if (!m_vrep->erep()->check_lock((char*)m_vrep->name(), m_vrep->dbtype())) { m_sts = LDH__LOCKSTOLEN; return false; } // Store time in volume object pwr_tOid oid = pwr_cNOid; pwr_tTime time; time_GetTime(&time); oid.vid = m_vrep->vid(); wb_orep* orep = m_vrep->object(&m_sts, oid); if (oddSts()) { orep->ref(); wb_attribute modtime(m_sts, orep, "SysBody", "Modified"); if (modtime.oddSts()) writeAttribute(modtime, &time); orep->unref(); } return m_srep->commit(&m_sts); }
void wb_volume::nextObjectAref(pwr_tCid cid, pwr_sAttrRef *arp, pwr_sAttrRef *oarp) { tree_sTable *catt_tt = m_vrep->merep()->catt_tt(); int bd_size; wb_orep *op = m_vrep->object(&m_sts, arp->Objid); if (evenSts()) return; // Get body size wb_cdrep *cd = m_vrep->merep()->cdrep(&m_sts, cid); if (evenSts()) return; wb_bdrep *bd = cd->bdrep(&m_sts, pwr_eBix_rt); if (oddSts()) { bd_size = bd->size(); delete bd; } else bd_size = 0; delete cd; op->ref(); // Find next attribute object in current object merep_sClassAttrKey key; merep_sClassAttr *item; key.subCid = cid; key.hostCid = op->cid(); key.idx = 0; for (item = (merep_sClassAttr*)tree_Find(&m_sts, catt_tt, &key); item && item->key.subCid == cid && item->key.hostCid == op->cid(); item = (merep_sClassAttr*)tree_FindSuccessor(&m_sts, catt_tt, &item->key)) { // Find next offset for (int i = 0; i < item->numOffset; i++) { if (item->offset[i] > arp->Offset) { *oarp = pwr_cNAttrRef; oarp->Objid = op->oid(); oarp->Flags.b.ObjectAttr = 1; oarp->Offset = item->offset[i]; oarp->Size = bd_size; oarp->Body = cdh_cidToBid( cid, pwr_eBix_rt); if (item->flags[i] & PWR_MASK_DISABLEATTR) { wb_attribute a = attribute(oarp); if (a.disabled()) continue; } op->unref(); return; } } } m_sts = LDH__NONEXT; op->unref(); }
wb_attribute::wb_attribute(pwr_tStatus sts, wb_orep* orep, const char *bname) : wb_status(sts), m_orep(orep), m_adrep(0), m_size(0), m_offset(0), m_idx(0), m_tid(0), m_elements(1), m_is_elem(0), m_type(pwr_eType_), m_flags(0), m_bix(pwr_eBix__), m_body(0), m_shadowed(false) { if ( orep == 0) m_sts = LDH__NOSUCHATTR; else { m_orep->ref(); wb_cdrep *cd = m_orep->vrep()->merep()->cdrep( &m_sts, m_orep->cid()); if ( oddSts()) { wb_bdrep *bd = cd->bdrep( &m_sts, bname); if ( oddSts()) { m_size = bd->size(); m_bix = bd->bix(); delete bd; } delete cd; } } }
void wb_build::plcpgm( pwr_tOid oid) { int check_hierarchy = cdh_ObjidIsNotNull( m_hierarchy); int hierarchy_found = 0; wb_object o = m_session.object(oid); if ( !o) { m_sts = o.sts(); return; } // Check that no ancestor is a LibHier for ( wb_object p = o.parent(); p.oddSts(); p = p.parent()) { if ( p.cid() == pwr_eClass_LibHier) { m_sts = PWRB__INLIBHIER; return; } if ( check_hierarchy && cdh_ObjidIsEqual( m_hierarchy, p.oid())) hierarchy_found = 1; } if ( check_hierarchy && !hierarchy_found) { m_sts = PWRB__NOBUILT; return; } m_sts = utl_compile( (ldh_tSession *)&m_session, ldh_SessionToWB( (ldh_tSession *)&m_session), o.longName().name(cdh_mName_volumeStrict), 0, 0, 0, !opt.force, opt.debug, 0, 0); if ( oddSts() && m_sts != GSX__NOMODIF) { char msg[200]; sprintf( msg, "Build: PlcPgm %s", o.longName().name(cdh_mName_path | cdh_mName_object)); MsgWindow::message('I', msg, msgw_ePop_No, oid); } else if ( m_sts == GSX__NOMODIF) { m_sts = PWRB__NOBUILT; } else { char msg[500]; char msg2[256]; msg_GetMsg( m_sts, msg, sizeof(msg)); sprintf( msg2, ", PlcPgm %s", o.longName().name(cdh_mName_path | cdh_mName_object)); strcat( msg, msg2); MsgWindow::message('E', msg, msgw_ePop_Yes, oid, true); } }
void wb_volume::aref(pwr_tCid cid, wb_object o, pwr_sAttrRef *arp) { tree_sTable *catt_tt = m_vrep->merep()->buildCatt(&m_sts); merep_sClassAttrKey key; merep_sClassAttr *item; key.subCid = cid; key.hostCid = o.cid(); key.idx = 0; item = (merep_sClassAttr *) tree_Find(&m_sts, catt_tt, &key); if (item == NULL) { m_sts = LDH__CLASSLIST; return; } wb_cdrep *cd = m_vrep->merep()->cdrep(&m_sts, cid); if (evenSts()) return; int bd_size; wb_bdrep *bd = cd->bdrep(&m_sts, pwr_eBix_rt); if (oddSts()) { bd_size = bd->size(); delete bd; } else bd_size = 0; delete cd; *arp = pwr_cNAttrRef; arp->Objid = o.oid(); arp->Flags.b.ObjectAttr = 1; arp->Offset = item->offset[0]; arp->Size = bd_size; arp->Body = cdh_cidToBid( cid, pwr_eBix_rt); if (item->flags[0] & PWR_MASK_DISABLEATTR) { wb_attribute a = attribute(arp); if (a.disabled()) { pwr_sAttrRef aref = *arp; nextObjectAref(cid, &aref, arp); } } }
void wb_build::node( char *nodename, void *volumelist, int volumecnt) { lfu_t_volumelist *vlist = (lfu_t_volumelist *)volumelist; pwr_tTime vtime; pwr_tTime btime; pwr_tFileName fname; pwr_tObjName vname; int bussid = -1; int rebuild = 1; pwr_tStatus status; char currentnode[80]; char node[80]; pwr_tStatus sumsts; printf( "-- Build node %s\n", nodename); wb_log::push(); if ( !opt.manual) { // Check if there is any new dbsfile rebuild = 0; for ( int i = 0; i < volumecnt; i++) { if ( cdh_NoCaseStrcmp( nodename, vlist[i].p1) == 0) { if ( bussid == -1) { char systemname[80], systemgroup[80]; pwr_tVid *vl; pwr_tString40 *vnl; int vcnt; // Get time for current bootfile status = sscanf( vlist[i].p3, "%d", &bussid); if ( status != 1) { // Bussid error } sprintf( fname, load_cNameBoot, load_cDirectory, vlist[i].p2, bussid); cdh_ToLower( fname, fname); dcli_translate_filename( fname, fname); status = lfu_ReadBootFile( fname, &btime, systemname, systemgroup, &vl, &vnl, &vcnt, 0, 0); if ( EVEN(status)) { rebuild = 1; } strcpy( node, vlist[i].p2); } if ( vlist[i].volume_id == m_session.vid()) { // Build current volume volume(); if ( evenSts()) return; } cdh_ToLower( vname, vlist[i].volume_name); if ( vlist[i].volume_id >= cdh_cUserVolMin && vlist[i].volume_id <= cdh_cUserVolMax) { sprintf( fname, "$pwrp_load/%s.dbs", vname); dcli_translate_filename( fname, fname); m_sts = dcli_file_time( fname, &vtime); if ( evenSts()) { // Dbs file is missing char msg[200]; sprintf( msg, "Loadfile for volume %s not created", vname); MsgWindow::message('E', msg, msgw_ePop_Yes); return; } if ( vtime.tv_sec > btime.tv_sec) rebuild = 1; } } } } wb_log::pull(); if ( m_wnav && m_wnav->ldhses) { wb_erep *erep = *(wb_env *)ldh_SessionToWB( m_wnav->ldhses); erep->checkVolumes( &m_sts, nodename); if ( evenSts()) return; } if ( opt.force || opt.manual || rebuild) { m_sts = lfu_create_bootfile( nodename, (lfu_t_volumelist *)volumelist, volumecnt, opt.debug); if ( ODD(m_sts)) wb_log::log( wlog_eCategory_NodeBuild, nodename, 0); } else m_sts = PWRB__NOBUILT; sumsts = m_sts; syi_NodeName( &m_sts, currentnode, sizeof(currentnode)); // if ( cdh_NoCaseStrcmp( node, currentnode) == 0) { pwr_tFileName src_fname, dest_fname; pwr_tCmd cmd; pwr_tTime dest_time, src_time; // Copy xtt_help.dat from $pwrp_cnf to $pwrp_exe sprintf( src_fname, "$pwrp_cnf/%s/xtt_help.dat", node); dcli_translate_filename( src_fname, src_fname); m_sts = dcli_file_time( src_fname, &src_time); if ( evenSts()) { strcpy( src_fname, "$pwrp_cnf/xtt_help.dat"); dcli_translate_filename( src_fname, src_fname); m_sts = dcli_file_time( src_fname, &src_time); if ( evenSts()) { char msg[200]; sprintf( msg, "File is missing $pwrp_cnf/xtt_help.dat"); MsgWindow::message('E', msg, msgw_ePop_Yes); } } if ( oddSts()) { strcpy( dest_fname, "$pwrp_exe/xtt_help.dat"); dcli_translate_filename( dest_fname, dest_fname); m_sts = dcli_file_time( dest_fname, &dest_time); if ( opt.force || evenSts() || src_time.tv_sec > dest_time.tv_sec) { sprintf( cmd, "cp %s %s", src_fname, dest_fname); system( cmd); sprintf( cmd, "Build: Copy %s -> $pwrp_exe", src_fname); MsgWindow::message( 'I', cmd, msgw_ePop_No); m_sts = PWRB__SUCCESS; } else m_sts = PWRB__NOBUILT; } if ( sumsts == PWRB__NOBUILT && m_sts != PWRB__NOBUILT) sumsts = m_sts; // Copy pwrp_alias.dat from $pwrp_cnf to $pwrp_load sprintf( src_fname, "$pwrp_cnf/%s/pwrp_alias.dat", node); dcli_translate_filename( src_fname, src_fname); m_sts = dcli_file_time( src_fname, &src_time); if ( evenSts()) { strcpy( src_fname, "$pwrp_cnf/pwrp_alias.dat"); dcli_translate_filename( src_fname, src_fname); m_sts = dcli_file_time( src_fname, &src_time); } if ( oddSts()) { strcpy( dest_fname, "$pwrp_load/pwrp_alias.dat"); dcli_translate_filename( dest_fname, dest_fname); m_sts = dcli_file_time( dest_fname, &dest_time); if ( opt.force || evenSts() || src_time.tv_sec > dest_time.tv_sec) { sprintf( cmd, "cp %s %s", src_fname, dest_fname); system( cmd); sprintf( cmd, "Build: Copy %s -> $pwrp_load", src_fname); MsgWindow::message( 'I', cmd, msgw_ePop_No); m_sts = PWRB__SUCCESS; } else m_sts = PWRB__NOBUILT; } else m_sts = PWRB__NOBUILT; if ( sumsts == PWRB__NOBUILT && m_sts != PWRB__NOBUILT) sumsts = m_sts; // Copy ld_appl_...txt from $pwrp_cnf to $pwrp_load sprintf( src_fname, load_cNameAppl, "$pwrp_cnf", cdh_Low(node), bussid); dcli_translate_filename( src_fname, src_fname); m_sts = dcli_file_time( src_fname, &src_time); if ( evenSts()) { char dir[80]; strcpy( dir, "$pwrp_cnf/"); sprintf( src_fname, load_cNameAppl, dir, cdh_Low(node), bussid); dcli_translate_filename( src_fname, src_fname); m_sts = dcli_file_time( src_fname, &src_time); } if ( oddSts()) { sprintf( dest_fname, load_cNameAppl, "$pwrp_load/", cdh_Low(node), bussid); dcli_translate_filename( dest_fname, dest_fname); m_sts = dcli_file_time( dest_fname, &dest_time); if ( opt.force || evenSts() || src_time.tv_sec > dest_time.tv_sec) { sprintf( cmd, "cp %s %s", src_fname, dest_fname); system( cmd); sprintf( cmd, "Build: %s -> $pwrp_load", src_fname); MsgWindow::message( 'I', cmd, msgw_ePop_No); m_sts = PWRB__SUCCESS; } else m_sts = PWRB__NOBUILT; } else m_sts = PWRB__NOBUILT; if ( sumsts == PWRB__NOBUILT && m_sts != PWRB__NOBUILT) sumsts = m_sts; } if ( sumsts != PWRB__NOBUILT) { char msg[200]; sprintf( msg, "Build: Node %s", nodename); MsgWindow::message('I', msg, msgw_ePop_No); } m_sts = sumsts; }
wb_name::operator bool() const { return oddSts(); }
wb_name::~wb_name() { if (oddSts()) m_nrep->unref(); }
wb_name::wb_name(const wb_name& n) : wb_status(n.sts()), m_nrep(n.m_nrep) { if (oddSts()) m_nrep->ref(); }
void wb_volume::nextTemplateAref(pwr_tCid cid, pwr_sAttrRef *arp, pwr_sAttrRef *oarp) { tree_sTable *catt_tt = m_vrep->merep()->buildCatt(&m_sts); int bd_size; wb_object o = object(arp->Objid); if (!o) { m_sts = o.sts(); return; } wb_orep *op = o; // Get body size wb_cdrep *cd = m_vrep->merep()->cdrep(&m_sts, cid); if (evenSts()) return; wb_bdrep *bd = cd->bdrep(&m_sts, pwr_eBix_rt); if (oddSts()) { bd_size = bd->size(); delete bd; } else bd_size = 0; delete cd; if ( cid == op->cid()) { // Find attribute object pwr_tCid hostCid = 0; merep_sClassAttrKey key; merep_sClassAttr *item; key.subCid = cid; key.hostCid = 0; key.idx = 0; for (item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &key); item; item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &item->key)) { if ( item->key.subCid != cid) { m_sts = LDH__CLASSLIST; break; } if (hostCid && item->key.hostCid == hostCid) // Same class with other index continue; hostCid = item->key.hostCid; wb_object to = templateObject( item->key.hostCid); if ( to) { wb_orep *o = to; wb_cdrep *cd = m_vrep->merep()->cdrep(&m_sts, cid); if (evenSts()) return; int bd_size; wb_bdrep *bd = cd->bdrep(&m_sts, pwr_eBix_rt); if (oddSts()) { bd_size = bd->size(); delete bd; } else bd_size = 0; delete cd; *oarp = pwr_cNAttrRef; oarp->Objid = o->oid(); oarp->Flags.b.ObjectAttr = 1; oarp->Offset = item->offset[0]; oarp->Size = bd_size; oarp->Body = cdh_cidToBid( cid, pwr_eBix_rt); return; } } } // Find next attribute object in current object merep_sClassAttrKey key; merep_sClassAttr *item; int first_offset = 0; key.subCid = cid; key.hostCid = op->cid(); key.idx = 0; for (item = (merep_sClassAttr*)tree_Find(&m_sts, catt_tt, &key); item && item->key.subCid == cid && item->key.hostCid == op->cid(); item = (merep_sClassAttr*)tree_FindSuccessor(&m_sts, catt_tt, &item->key)) { // Find next offset for (int i = 0; i < item->numOffset; i++) { if (i == 0 && item->key.idx == 0) first_offset = item->offset[0]; if (item->offset[i] > arp->Offset) { *oarp = pwr_cNAttrRef; oarp->Objid = op->oid(); oarp->Flags.b.ObjectAttr = 1; oarp->Offset = item->offset[i]; oarp->Size = bd_size; oarp->Body = cdh_cidToBid( cid, pwr_eBix_rt); return; } } } // Find first offset in first object of next class key.subCid = cid; key.hostCid = op->cid(); key.idx = 0; for (item = (merep_sClassAttr*) tree_Find(&m_sts, catt_tt, &key); item && item->key.subCid == cid; item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &item->key)) { if (item->key.hostCid == key.hostCid) continue; wb_object ol = templateObject( item->key.hostCid); if (oddSts()) { *oarp = pwr_cNAttrRef; oarp->Objid = ol.oid(); oarp->Flags.b.ObjectAttr = 1; oarp->Offset = item->offset[0]; oarp->Size = bd_size; oarp->Body = cdh_cidToBid( cid, pwr_eBix_rt); return; } } m_sts = LDH__NONEXT; }
void wb_volume::nextAref(pwr_tCid cid, pwr_sAttrRef *arp, pwr_sAttrRef *oarp) { tree_sTable *catt_tt = m_vrep->merep()->catt_tt(); int bd_size; if (!catt_tt) throw wb_error(LDH__CATT); wb_orep *op = m_vrep->object(&m_sts, arp->Objid); if (evenSts()) return; // Get body size wb_cdrep *cd = m_vrep->merep()->cdrep(&m_sts, cid); if (evenSts()) return; wb_bdrep *bd = cd->bdrep(&m_sts, pwr_eBix_rt); if (oddSts()) { bd_size = bd->size(); delete bd; } else bd_size = 0; delete cd; op->ref(); if (op->cid() == cid) { // Find next object in class list wb_orep *ol = m_vrep->next(&m_sts, op); if (oddSts()) { *oarp = pwr_cNAttrRef; oarp->Objid = ol->oid(); oarp->Flags.b.Object = 1; oarp->Size = bd_size; oarp->Body = cdh_cidToBid( cid, pwr_eBix_rt); ol->unref(); op->unref(); return; } else { // Find first attribute object merep_sClassAttrKey key; merep_sClassAttr *item; pwr_tCid hostCid = 0; key.subCid = cid; key.hostCid = 0; key.idx = 0; for (item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &key); item && item->key.subCid == cid; item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &item->key)) { if (cd && item->key.hostCid == hostCid) // Same class with other index continue; hostCid = item->key.hostCid; wb_orep *ol = m_vrep->object(&m_sts, item->key.hostCid); if (oddSts()) { ol->ref(); *oarp = pwr_cNAttrRef; oarp->Objid = ol->oid(); oarp->Flags.b.ObjectAttr = 1; oarp->Size = bd_size; oarp->Offset = item->offset[0]; oarp->Body = cdh_cidToBid( cid, pwr_eBix_rt); ol->unref(); op->unref(); if (item->flags[0] & PWR_MASK_DISABLEATTR) { wb_attribute a = attribute(oarp); if (a.disabled()) { pwr_sAttrRef aref = *oarp; nextAref(cid, &aref, oarp); } } return; } } op->unref(); m_sts = LDH__NONEXT; return; } } // Find next attribute object in current object merep_sClassAttrKey key; merep_sClassAttr *item; int first_offset = 0; key.subCid = cid; key.hostCid = op->cid(); key.idx = 0; for (item = (merep_sClassAttr*)tree_Find(&m_sts, catt_tt, &key); item && item->key.subCid == cid && item->key.hostCid == op->cid(); item = (merep_sClassAttr*)tree_FindSuccessor(&m_sts, catt_tt, &item->key)) { // Find next offset for (int i = 0; i < item->numOffset; i++) { if (i == 0 && item->key.idx == 0) first_offset = item->offset[0]; if (item->offset[i] > arp->Offset) { *oarp = pwr_cNAttrRef; oarp->Objid = op->oid(); oarp->Flags.b.ObjectAttr = 1; oarp->Offset = item->offset[i]; oarp->Size = bd_size; oarp->Body = cdh_cidToBid( cid, pwr_eBix_rt); op->unref(); if (item->flags[0] & PWR_MASK_DISABLEATTR) { wb_attribute a = attribute(oarp); if (a.disabled()) { pwr_sAttrRef aref = *oarp; nextAref(cid, &aref, oarp); } } return; } } } // Find first attribute in next object wb_orep *ol = m_vrep->next(&m_sts, op); if (oddSts()) { ol->ref(); *oarp = pwr_cNAttrRef; oarp->Objid = ol->oid(); oarp->Flags.b.ObjectAttr = 1; oarp->Offset = first_offset; oarp->Size = bd_size; oarp->Body = cdh_cidToBid( cid, pwr_eBix_rt); ol->unref(); op->unref(); if (item->flags[0] & PWR_MASK_DISABLEATTR) { wb_attribute a = attribute(oarp); if (a.disabled()) { pwr_sAttrRef aref = *oarp; nextAref(cid, &aref, oarp); } } return; } // Find first offset in first object of next class key.subCid = cid; key.hostCid = op->cid(); key.idx = 0; for (item = (merep_sClassAttr*) tree_Find(&m_sts, catt_tt, &key); item && item->key.subCid == cid; item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &item->key)) { if (item->key.hostCid == key.hostCid) continue; wb_orep *ol = m_vrep->object(&m_sts, item->key.hostCid); if (oddSts()) { ol->ref(); *oarp = pwr_cNAttrRef; oarp->Objid = ol->oid(); oarp->Flags.b.ObjectAttr = 1; oarp->Offset = item->offset[0]; oarp->Size = bd_size; oarp->Body = cdh_cidToBid( cid, pwr_eBix_rt); ol->unref(); op->unref(); if (item->flags[0] & PWR_MASK_DISABLEATTR) { wb_attribute a = attribute(oarp); if (a.disabled()) { pwr_sAttrRef aref = *oarp; nextAref(cid, &aref, oarp); } } return; } } m_sts = LDH__NONEXT; op->unref(); }
void wb_volume::aref(pwr_tCid cid, pwr_sAttrRef *arp) { tree_sTable *catt_tt = m_vrep->merep()->buildCatt(&m_sts); // Look in classlist wb_orep *o = m_vrep->object(&m_sts, cid); if (oddSts()) { o->ref(); *arp = cdh_ObjidToAref(o->oid()); o->unref(); return; } else { // Find attribute object pwr_tCid hostCid = 0; merep_sClassAttrKey key; merep_sClassAttr *item; key.subCid = cid; key.hostCid = 0; key.idx = 0; for (item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &key); item; item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &item->key)) { if ( item->key.subCid != cid) { m_sts = LDH__CLASSLIST; break; } if (hostCid && item->key.hostCid == hostCid) // Same class with other index continue; hostCid = item->key.hostCid; wb_orep *o = m_vrep->object(&m_sts, item->key.hostCid); if (oddSts()) { o->ref(); wb_cdrep *cd = m_vrep->merep()->cdrep(&m_sts, cid); if (evenSts()) return; int bd_size; wb_bdrep *bd = cd->bdrep(&m_sts, pwr_eBix_rt); if (oddSts()) { bd_size = bd->size(); delete bd; } else bd_size = 0; delete cd; *arp = pwr_cNAttrRef; arp->Objid = o->oid(); arp->Flags.b.ObjectAttr = 1; arp->Offset = item->offset[0]; arp->Size = bd_size; arp->Body = cdh_cidToBid( cid, pwr_eBix_rt); o->unref(); return; } } } }