bool wb_vrepext::moveObject(pwr_tStatus *sts, wb_orep *orep, wb_destination &d) { if ( d.oid().vid != m_vid || orep->oid().vid != m_vid) { *sts = LDH__BADOBJID; return 0; } vext_sQMsg qmsg; vext_sAMsg amsg; qmsg.MoveObject.Oix = orep->oix(); qmsg.MoveObject.Type = vext_eMsgType_MoveObject; qmsg.MoveObject.DestOix = d.oid().oix; qmsg.MoveObject.DestType = d.code(); put( &qmsg, sizeof(qmsg), sts); if ( EVEN(*sts)) return 0; receive( &amsg, sizeof(amsg), sts); if ( EVEN(*sts)) return 0; if ( ODD( amsg.Any.Status)) { *sts = LDH__SUCCESS; } else { *sts = amsg.Any.Status; return false; } return true; }
bool wb_session::moveObject(wb_object o, wb_destination d) { if (isReadonly()) throw wb_error_str("ReadOnlySession"); validateDestination(d, o.cid()); if (evenSts()) return false; // Check that object is not ancestor to destination wb_object dest = object(d.oid()); while (dest) { if (cdh_ObjidIsEqual(dest.oid(), o.oid())) throw wb_error(LDH__BADDEST); dest = dest.parent(); } wb_object parent; switch (d.code()) { case ldh_eDest_IntoFirst: case ldh_eDest_IntoLast: parent = object(d.oid()); break; case ldh_eDest_After: case ldh_eDest_Before: parent = object(d.oid()).parent(); break; default: throw wb_error(LDH__NODEST); } wb_object old_parent = o.parent(); m_sts = triggAnteMove(o, parent, old_parent); if (evenSts()) return false; m_sts = triggAnteUnadopt(old_parent, o); if (evenSts()) return false; m_sts = triggAnteAdopt(parent, o.cid()); if (evenSts()) return false; ldh_sEvent* ep = m_srep->eventStart(o.oid(), ldh_eEvent_ObjectMoved); m_srep->eventOldFamily(ep, o); bool rsts = m_vrep->moveObject(&m_sts, (wb_orep*)o, d); m_srep->update(); triggPostMove(o); triggPostUnadopt(old_parent, o); triggPostAdopt(parent, o); m_srep->eventNewFamily(ep, o); m_srep->eventSend(ep); return rsts; }
bool wb_session::validateDestination(wb_destination d, pwr_tCid cid) { wb_object parent; wb_object o = object(d.oid()); // Get parent if (o) { switch (d.code()) { case ldh_eDest_After: case ldh_eDest_Before: parent = o.parent(); break; default: parent = o; } } if (!parent) { // No parent, check if valid top object (for vrepmem all objects are valid // topobjects) wb_cdef c = cdef(cid); if (!c.flags().b.TopObject && type() != ldh_eVolRep_Mem) { m_sts = LDH__NOTOP; return false; } } else { // Check if adoption is legal if (parent.flags().b.NoAdopt) { m_sts = LDH__NOADOPT; return false; } } m_sts = LDH__SUCCESS; return true; }
wb_object wb_session::createObject(wb_cdef cdef, wb_destination d, wb_name name) { wb_orep* orep = 0; if (isReadonly()) throw wb_error_str("ReadOnlySession"); validateDestination(d, cdef.cid()); if (evenSts()) throw wb_error(sts()); wb_object parent; switch (d.code()) { case ldh_eDest_IntoFirst: case ldh_eDest_IntoLast: parent = object(d.oid()); break; case ldh_eDest_After: case ldh_eDest_Before: parent = object(d.oid()).parent(); break; default: throw wb_error(LDH__NODEST); } m_sts = triggAnteCreate(parent, cdef.cid()); if (evenSts()) throw wb_error(sts()); m_sts = triggAnteAdopt(parent, cdef.cid()); if (evenSts()) throw wb_error(sts()); orep = m_vrep->createObject(&m_sts, cdef, d, name); if (evenSts()) throw wb_error(sts()); m_srep->update(); wb_object o = wb_object(m_sts, orep); ldh_sEvent* ep = m_srep->eventStart(o.oid(), ldh_eEvent_ObjectCreated); m_srep->eventNewFamily(ep, o); triggPostCreate(o); triggPostAdopt(parent, o); m_srep->eventSend(ep); return o; }
wb_object wb_session::copyObject(wb_object o, wb_destination d, wb_name name) { wb_orep* orep = 0; if (isReadonly()) throw wb_error_str("ReadOnlySession"); validateDestination(d, o.cid()); if (evenSts()) throw wb_error(sts()); wb_object parent; switch (d.code()) { case ldh_eDest_IntoFirst: case ldh_eDest_IntoLast: parent = object(d.oid()); break; case ldh_eDest_After: case ldh_eDest_Before: parent = object(d.oid()).parent(); break; default: throw wb_error(LDH__NODEST); } m_sts = triggAnteCreate(parent, o.cid()); if (evenSts()) throw wb_error(sts()); m_sts = triggAnteAdopt(parent, o.cid()); if (evenSts()) throw wb_error(sts()); if (m_vrep->vid() == o.vid()) { orep = m_vrep->copyObject(&m_sts, (wb_orep*)o, d, name); if (evenSts()) throw wb_error(sts()); orep->ref(); } else { wb_cdef c = cdef(o.cid()); orep = m_vrep->createObject(&m_sts, c, d, name); orep->ref(); wb_attribute rba(o.sts(), (wb_orep*)o, "RtBody"); if (rba) { void* p = rba.value(); wb_attribute rban(m_sts, orep, "RtBody"); writeAttribute(rban, p); } wb_attribute dba(o.sts(), (wb_orep*)o, "DevBody"); if (dba) { void* p = dba.value(); wb_attribute dban(m_sts, orep, "DevBody"); writeAttribute(dban, p); } wb_attribute sba(o.sts(), (wb_orep*)o, "SysBody"); if (sba) { void* p = sba.value(); wb_attribute sban(m_sts, orep, "SysBody"); writeAttribute(sban, p); } } m_srep->update(); wb_object onew = wb_object(m_sts, orep); orep->unref(); ldh_sEvent* ep = m_srep->eventStart(onew.oid(), ldh_eEvent_ObjectCreated); m_srep->eventNewFamily(ep, onew); triggPostCreate(onew); triggPostAdopt(parent, onew); m_srep->eventSend(ep); return onew; }