Esempio n. 1
0
static pwr_tStatus CopyObject (
  ldh_sMenuCall *ip
) {
  pwr_tStatus	    retsts  = LDH__SUCCESS;
  pwr_tStatus	    sts	    = LDH__SUCCESS;
  pwr_sMenuButton   mb;
  int		    i;
  int		    j;
  ldh_eDest	    Dest;
  pwr_tObjid	    DestObject;
  pwr_tObjid	    NewObject;
  pwr_tBoolean	    Self = 0;
  
  sts = ldh_ReadObjectBody(ip->PointedSession,
    ip->ItemList[ip->ChosenItem].MenuObject,
    "SysBody", &mb, sizeof(pwr_sMenuButton));

  if (mb.MethodArguments[0][0] != '\0') {
    if (strcmp(mb.MethodArguments[0], "Before") == 0)
      Dest = ldh_eDest_Before;
    else if (strcmp(mb.MethodArguments[0], "After") == 0)
      Dest = ldh_eDest_After;
    else if (strcmp(mb.MethodArguments[0], "First") == 0)
      Dest = ldh_eDest_IntoFirst;
    else if (strcmp(mb.MethodArguments[0], "Last") == 0)
      Dest = ldh_eDest_IntoLast;
    else
      Dest = ldh_eDest__;
  }

  for (i = 0; i < (int)ip->SelectCount; i++) {
    if (cdh_ObjidIsEqual(ip->Selected[i].Objid, ip->Pointed.Objid))
      Self = 1;
    if (cdh_ObjidIsEqual(ip->Selected[i].Objid, pwr_cNObjid))
      break;
  }

  if (!Self)
    DestObject = ip->Pointed.Objid;

  if (Dest == ldh_eDest_After || Dest == ldh_eDest_IntoFirst) {
    for (j = i - 1; j >= 0; j--) {
      if (Self)
	DestObject = ip->Selected[j].Objid;
      sts = ldh_CopyObject(ip->PointedSession, &NewObject, NULL, ip->Selected[j].Objid, DestObject, Dest); 
      if (EVEN(sts)) retsts = sts;
    }
  } else {
    for (j = 0; j < i; j++) {
      if (Self)
	DestObject = ip->Selected[j].Objid;
      sts = ldh_CopyObject(ip->PointedSession, &NewObject, NULL, ip->Selected[j].Objid, DestObject, Dest); 
      if (EVEN(sts)) retsts = sts;
    }
  }
  return retsts;
}
Esempio n. 2
0
void
subs_UnlinkObject (
  gdb_sObject		*op
)
{
  sub_sServer		*sp;
  pool_sQlink		*sl;
  
  gdb_AssumeLocked;

  for (
    sl = pool_Qsucc(NULL, gdbroot->pool, &gdbroot->db->subs_lh);
    sl != &gdbroot->db->subs_lh;
  ) {
    sp = pool_Qitem(sl, sub_sServer, subs_ll);
    if (cdh_ObjidIsEqual(sp->aref.Objid, op->g.oid)) {
      sp->data	= pool_cNRef;
      sp->sts	= GDH__NOSUCHOBJ;

      if ( op->u.n.subcount > 0) /* Subscriptions on invalid offset will allocate buffer without increasing count */
	op->u.n.subcount--;
    }
  }

  pwr_Assert(op->u.n.subcount == 0);

}
Esempio n. 3
0
void
subs_UnlinkObject (
    gdb_sObject		*op
)
{
    sub_sServer		*sp;
    pool_sQlink		*sl;

    gdb_AssumeLocked;

    for (
        sl = pool_Qsucc(NULL, gdbroot->pool, &gdbroot->db->subs_lh);
        sl != &gdbroot->db->subs_lh;
    ) {
        sp = pool_Qitem(sl, sub_sServer, subs_ll);
        if (cdh_ObjidIsEqual(sp->aref.Objid, op->g.oid)) {
            sp->data	= pool_cNRef;
            sp->sts	= GDH__NOSUCHOBJ;

            op->u.n.subcount--;
        }
    }

    pwr_Assert(op->u.n.subcount == 0);

}
Esempio n. 4
0
void wb_build::application( pwr_tOid oid)
{
  pwr_tString80 buildcmd;
  pwr_tCmd	cmd;
  int 		check_hierarchy = cdh_ObjidIsNotNull( m_hierarchy);
  int 		hierarchy_found = 0;
  int		sts;

  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;
  }

  wb_attribute a = m_session.attribute( oid, "DevBody", "BuildCmd");
  if ( !a) {
    m_sts = a.sts();
    return;
  }
  a.value( &buildcmd);
  if ( !a) {
    m_sts = a.sts();
    return;
  }

  if ( strcmp( buildcmd, "") == 0) {
    m_sts = PWRB__NOBUILT;
    return;
  }

  // Exectute the build command
  dcli_translate_filename( cmd, buildcmd);
  sts = system( cmd);
  if ( sts != 0) {
    char msg[300];

    sprintf( msg, "Build Application error %s", o.longName().name(cdh_mName_path | cdh_mName_object));
    MsgWindow::message( 'E', msg, msgw_ePop_Yes, oid);
    m_sts = PWRB__SUCCESS;
  }
  else {
    m_sts = PWRB__NOBUILT;
  }
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
bck_sItem *wb_bck_list::find( pwr_tAttrRef *arp)
{
  for ( bck_sItem *ip = m_first; ip; ip = ip->next) {
    if ( cdh_ObjidIsEqual( arp->Objid, ip->aref.Objid) && arp->Offset == ip->aref.Offset &&
	 arp->Size == ip->aref.Size) {
      return ip;
    }
  }
  return 0;
}
Esempio n. 7
0
/*_*
  @aref cyclesup CycleSup
  */
lst_sEntry *
csup_Init (
    pwr_tStatus	*status,
    pwr_tObjid	tid,
    float		scanTime
)
{
    lst_sEntry	*lh;
    pwr_tObjid	cid;
    pwr_tObjid	pid;
    csup_sObject	*cp;
    int		tv_sec;
    pwr_tFloat32	max_delay;

    pwr_dStatus(sts, status, CSUP__SUCCESS);

    lh = calloc(1, sizeof(*lh));
    if (lh == NULL)
        pwr_Return(NULL, sts, CSUP__INSVIRMEM);

    lst_Init(NULL, lh, NULL);

    for (
        *sts = gdh_GetClassList(pwr_cClass_CycleSup, &cid);
        ODD(*sts);
        *sts = gdh_GetNextObject(cid, &cid)
    ) {
        cp = calloc(1, sizeof(*cp));
        cp->aref.Objid = cid;
        *sts = gdh_DLRefObjectInfoAttrref(&cp->aref, (void**)&cp->o, &cp->dlid);
        if (EVEN(*sts))
            goto error;

        if ( ODD(gdh_GetParent( cid, &pid)) && cdh_ObjidIsEqual( pid, tid))
            cp->is_owner = 1;

        lst_InsertSucc(NULL, lh, &cp->le, cp);
        max_delay = cp->o->MaxDelay;
        cp->o->DelayLimit.tv_sec = tv_sec = (int)max_delay;
        cp->o->DelayLimit.tv_nsec = (int)((max_delay - (float)tv_sec + FLT_EPSILON) * 1.0e9);
        // printf("maxdelay: %f, tv_sec: %d, tv_nsec: %d\n", cp->o->MaxDelay, cp->o->DelayLimit.tv_sec, cp->o->DelayLimit.tv_nsec);
        errh_Info("maxdelay: %f, tv_sec: %d, tv_nsec: %d", cp->o->MaxDelay,
                  cp->o->DelayLimit.tv_sec, cp->o->DelayLimit.tv_nsec);
    }

    if (lst_IsEmpty(NULL, lh))
        goto error;

    return lh;

error:
    csup_Exit(NULL, lh);
    return NULL;
}
Esempio n. 8
0
void TblNav::delete_item( TblNav_sevhistobject *hi)
{
  brow_tNode	*node_list;
  int		node_count;
  ItemBase 	*baseitem;
      
  brow_GetObjectList( brow->ctx, &node_list, &node_count);
  // Delete in tree
  for ( int i = 1; i < (int)tree.size(); i++) {
    if ( tree[i].deleted)
      continue;
    if ( tree[i].item &&
	 cdh_ObjidIsEqual( tree[i].item->oid, hi->oid) &&
	 strcmp( tree[i].item->objectattrlist[0].aname, hi->objectattrlist[0].aname) == 0) {
      tree[i].deleted = 1;
    }
  }

  // Delete node if visible
  brow_GetObjectList( brow->ctx, &node_list, &node_count);

  int found = 0;
  for ( int i = 0; i < node_count; i++) {
    brow_GetUserData( node_list[i], (void **)&baseitem);
    switch ( baseitem->type) {
    case tblnav_eItemType_Local:
    case tblnav_eItemType_TreeLocal: {
      ItemLocal *item = (ItemLocal *)baseitem;
      if ( cdh_ObjidIsEqual( hi->oid, item->item.oid) &&
	   strcmp( hi->objectattrlist[0].aname, item->item.objectattrlist[0].aname) == 0) {
	brow_DeleteNode( brow->ctx, item->node);
	found = 1;
      }
      break;
    }
    default: ;
    }
    if ( found)
      break;
  }
}
Esempio n. 9
0
static sNode *
get_nodes (
  pwr_tObjid oid
)
{
  LstLink(sNode) *nl;

  for (nl = LstFir(&node_l); nl != LstEnd(&node_l); nl = LstNex(nl)) {
    if (cdh_ObjidIsEqual(LstObj(nl)->oid, oid)) 
      return LstObj(nl);
  }

  return NULL;
}
Esempio n. 10
0
static int IsOkCopyObjectTree (
  ldh_sMenuCall *ip,
  pwr_sMenuButton *mbp
) {
  pwr_tStatus	    sts	    = LDH__SUCCESS;
  pwr_tStatus	    retsts  = LDH__SUCCESS;
  ldh_eDest	    Dest;
  int		    i;
  pwr_tBoolean	    Self    = 0;
  pwr_tObjid	    DestObject;
  
  if (mbp->MethodArguments[0][0] != '\0') {
    if (strcmp(mbp->MethodArguments[0], "Before") == 0)
      Dest = ldh_eDest_Before;
    else if (strcmp(mbp->MethodArguments[0], "After") == 0)
      Dest = ldh_eDest_After;
    else if (strcmp(mbp->MethodArguments[0], "First") == 0)
      Dest = ldh_eDest_IntoFirst;
    else if (strcmp(mbp->MethodArguments[0], "Last") == 0)
      Dest = ldh_eDest_IntoLast;
    else
      Dest = ldh_eDest__;
  }

  for (i = 0; i < (int)ip->SelectCount; i++) {
    if (cdh_ObjidIsEqual(ip->Selected[i].Objid, ip->Pointed.Objid))
      Self = 1;
    if (cdh_ObjidIsNull(ip->Selected[i].Objid))
      break;
  }

  if (!Self)
    DestObject = ip->Pointed.Objid;

  for (i = 0; i < (int)ip->SelectCount; i++) {
    if (cdh_ObjidIsNull(ip->Selected[i].Objid))
      break;
    if (Self)
      DestObject = ip->Selected[i].Objid;
    sts = ldh_IsOkCopyObject(ip->PointedSession, ip->Selected[i].Objid,
      DestObject, Dest); 
    if (EVEN(sts))
      retsts = sts;
  }

  return ODD(retsts);
}
Esempio n. 11
0
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);
  }
}
Esempio n. 12
0
void
cvolcm_DeleteObject (
  qcom_sGet		*get
)
{
  pwr_tStatus		sts;
  gdb_sObject		*op;
  gdb_sObject		*pop;
  gdb_sObject		*sop;
  pwr_tObjid		soid;
  gdb_sVolume		*vp;
  net_sDeleteObject	*dop = (net_sDeleteObject *) get->data;

  gdb_AssumeUnlocked;

  gdb_ScopeLock {
    pop = hash_Search(&sts, gdbroot->oid_ht, &dop->par.oid);
    op = hash_Search(&sts, gdbroot->oid_ht, &dop->notify.oid);
    if (op != NULL) {
      pwr_Assert(cdh_ObjidIsEqual(op->g.f.poid, dop->par.oid)); 
      vp = pool_Address(NULL, gdbroot->pool, op->l.vr);
      cvol_FreeObject(&sts, vp, op, vol_mLink_cacheDelete);
    }

    if (pop == NULL) break;

    pop->g.soid = dop->par.soid;
    if (cdh_ObjidIsNull(pop->g.soid)) {
      pop->g.flags.b.isParent = 0;
    }

    soid = dop->par.oid;
    soid.oix = dop->sib.blink;
    sop = hash_Search(&sts, gdbroot->oid_ht, &soid);
    if (sop != NULL)
      sop->g.sib.flink = dop->sib.newflink;

    soid.oix = dop->sib.flink;
    sop = hash_Search(&sts, gdbroot->oid_ht, &soid);
    if (sop != NULL)
      sop->g.sib.blink = dop->sib.newblink;
  } gdb_ScopeUnlock;
}
Esempio n. 13
0
static pwr_tStatus PostCreate(
    ldh_tSesContext Session, pwr_tOid Object, pwr_tOid Father, pwr_tCid Class)
{
  wb_session* sp = (wb_session*)Session;
  wb_object o = sp->object(Object);

  // Find a unique name for FileName
  int idx = 0;
  for (wb_object co = sp->object(pwr_cClass_OpPlaceWeb); co; co = co.next()) {
    pwr_tString80 filename;
    int i;

    if (cdh_ObjidIsEqual(co.oid(), o.oid()))
      continue;

    wb_attribute ca = sp->attribute(co.oid(), "RtBody", "FileName");
    if (!ca)
      return ca.sts();

    ca.value(filename);
    if ((streq(filename, "index.html")) && idx < 1)
      idx = 2;
    else if (sscanf(filename, "index%d.html", &i) != 0) {
      if (idx <= i)
        idx = i + 1;
    }
    if (idx > 0) {
      wb_attribute a = sp->attribute(o.oid(), "RtBody", "FileName");
      if (!a)
        return a.sts();

      sprintf(filename, "index%d.html", idx);
      try {
        sp->writeAttribute(a, filename, sizeof(filename));
      } catch (wb_error& e) {
        return e.sts();
      }
    }
  }

  return PWRB__SUCCESS;
}
Esempio n. 14
0
static void
update_node (
  sNode *np
)
{
  pwr_tBoolean new_sub;

  /* Check that the same Node object is supervised   */
  if (cdh_ObjidIsEqual(np->node.Node, np->o->Node) &&
      np->node.SubscriptionInterval == np->o->SubscriptionInterval
  ) {   
    new_sub = FALSE;
  } else {
    gdh_SubUnrefObjectInfo (np->o->SubId);
    np->o->SubId = pwr_cNSubid;
    new_sub = TRUE;
  }

  np = init_node(np->oid, np, new_sub);
  np->found = TRUE;
}
Esempio n. 15
0
void EvEve::view_shift() 
{
  pwr_sClass_OpPlace *opp;
  pwr_tStatus sts;

  sts = gdh_ObjidToPointer( user, (pwr_tAddress *) &opp);
  if ( EVEN(sts)) return;

  if ( cdh_ObjidIsNull(ala->current_view)) {
    set_view( opp->AlarmViews[0]);
  }
  else {
    for ( unsigned int i = 0; i < sizeof(opp->AlarmViews)/sizeof(opp->AlarmViews[0]); i++) {
      if ( cdh_ObjidIsEqual( ala->current_view, opp->AlarmViews[i])) {
	if ( i == sizeof(opp->AlarmViews)/sizeof(opp->AlarmViews[0]) - 1)
	  set_view( pwr_cNObjid);
	else
	  set_view( opp->AlarmViews[i+1]);
	break;
      }	   
    }
  }
}
Esempio n. 16
0
static pwr_tStatus CopyObjectTree (
  ldh_sMenuCall	    *ip
) {
  pwr_tStatus	    sts	  = LDH__SUCCESS;
  pwr_sMenuButton   mb;
  ldh_eDest	    Dest;
  pwr_tBoolean	    Self  = 0;
  int		    i;
  
  sts = ldh_ReadObjectBody(ip->PointedSession, ip->ItemList[ip->ChosenItem].MenuObject,
    "SysBody", &mb, sizeof(pwr_sMenuButton));

  if (mb.MethodArguments[0][0] != '\0') {
    if (strcmp(mb.MethodArguments[0], "Before") == 0)
      Dest = ldh_eDest_Before;
    else if (strcmp(mb.MethodArguments[0], "After") == 0)
      Dest = ldh_eDest_After;
    else if (strcmp(mb.MethodArguments[0], "First") == 0)
      Dest = ldh_eDest_IntoFirst;
    else if (strcmp(mb.MethodArguments[0], "Last") == 0)
      Dest = ldh_eDest_IntoLast;
    else
      Dest = ldh_eDest__;
  }

  for (i = 0; i < (int)ip->SelectCount; i++) {
    if (cdh_ObjidIsEqual(ip->Selected[i].Objid, ip->Pointed.Objid))
      Self = 1;
    if (cdh_ObjidIsNull(ip->Selected[i].Objid))
      break;
  }

  sts = ldh_CopyObjectTrees(ip->PointedSession, ip->Selected,
			    ip->Pointed.Objid, Dest, Self, 0, 0, 0); 
  return sts;
}
Esempio n. 17
0
static gdb_sVolume *
mountVolume (
  pwr_tStatus           *sts,
  gdb_sObject		*op
)
{
  gdb_sVolume		*vp;
  gdb_sMountServer	*msp;
  void			*p;
  pwr_tObjid		soid = pwr_cNObjid;
  gdb_sObject		*vop;
  co_mFormat            fm;
  pwr_tTime		time;
  

  if (op->g.oid.vid != gdbroot->db->vid)
    errh_Bugcheck(GDH__WEIRD, "only root volumes can mount");

  p = pool_Address(sts, gdbroot->rtdb, op->u.n.body);
  if (p == NULL) return NULL;

  switch (op->g.cid) {
  case pwr_eClass_MountObject:
    soid = ((pwr_sMountObject *)p)->Object;
    if ( cdh_ObjidIsNull(soid)) {
      *sts = GDH__NOMOUNTOBJECT;
      return NULL;
    }
    vp = vol_MountVolume(sts, soid.vid);
    break;
  case pwr_eClass_MountVolume:
    soid.vid = ((pwr_sMountVolume *)p)->Volume;
    if ( soid.vid == 0) {
      *sts = GDH__NOMOUNTOBJECT;
      return NULL;
    }
    vp = vol_MountVolume(sts, soid.vid);
    break;
  case pwr_eClass_CreateVolume:
    soid.vid = ((pwr_sCreateVolume *)p)->Volume;
    time_GetTime(&time);
    vp = gdb_LoadVolume(sts, soid.vid, op->g.f.name.orig,
                        pwr_eClass_DynamicVolume, gdbroot->db->nid, 
                        time, gdb_mLoad_build, co_GetOwnFormat(&fm));

    /* Create the volume object.  */

    vop = loadObject(sts, vp, vp->g.name.orig, soid, pwr_eClass_DynamicVolume,
      sizeof(pwr_sDynamicVolume), pwr_cNObjid, net_mGo__, pwr_cNObjid); 
    if (vop == NULL) errh_Bugcheck(*sts, "");
    break;
  }

  if (vp == NULL) return NULL;

  pwr_Assert(cdh_ObjidIsEqual(op->g.soid, soid));

  if (!op->u.n.flags.b.inMountClientList) {
    msp = vol_AddMountClient(sts, op);
    if (msp == NULL) return NULL;
  }

  return vp;
}
Esempio n. 18
0
void
subc_ActivateList (
    pool_sQlink		*lh,
    pwr_tObjid		oid
)
{
    pwr_tStatus		sts;
    tree_sTable		*add;
#if 0
    tree_sTable		*remove;
    sRemove		*rep;
#endif
    net_sSubSpec		*specp;
    qcom_sQid		tgt;
    pool_sQlink		*my_lh;
    pwr_tUInt32		my_subc_lc;
    gdb_sNode		*np;
    gdb_sNode		*old_np;
    sub_sClient		*cp;
    pool_sQlink		*cl;
    sAdd			*aep;


    /* Test each client. If existing object, fill in nid field
       and move the client to the appropriate nodes's subc_lh list. Turn
       on timeouts. Put request in subadd message buffer.

       We must do it all in one pass, since a user can come in during
       a cache query for a later subcli and cancel the subscription
       for an earlier subcli.  */

    add = tree_CreateTable(&sts, sizeof(pwr_tNodeId), offsetof(sAdd, nid),
                           sizeof(sAdd), 10, tree_Comp_nid);
#if 0
    remove = tree_CreateTable(&sts, sizeof(pwr_tNodeId), offsetof(sRemove, nid),
                              sizeof(sRemove), 10, tree_eComp_nid);
#endif

    /* Move all objects to a new, temporary root */

    my_lh = pool_Qalloc(NULL, gdbroot->pool);
    my_subc_lc = 0;

    for (cl = pool_Qsucc(NULL, gdbroot->pool, lh); cl != lh;) {
        cp = pool_Qitem(cl, sub_sClient, subc_ll);
        cl = pool_Qsucc(NULL, gdbroot->pool, cl);

        if (cdh_ObjidIsNull(oid) || cdh_ObjidIsEqual(oid, cp->aref.Objid)) {
            pool_Qremove(NULL, gdbroot->pool, &cp->subc_ll);
            pool_QinsertPred(NULL, gdbroot->pool, &cp->subc_ll, my_lh);
            my_subc_lc++;
        }
    }

    /* Now start testing clients from 'my_lh', and move them to other lists
       Make sure the clients are still there after the test.  */

    for (cl = pool_Qsucc(NULL, gdbroot->pool, my_lh); cl != my_lh; ) {
        cp = pool_Qitem(cl, sub_sClient, subc_ll);
        cl = pool_Qsucc(NULL, gdbroot->pool, cl);

        np = testClient(&sts, cp);

        /* If an error is returned the client doesn't exist anymore. Some
           other user removed it while TestSubcli had the database unlocked.
           Just go on with the next client...  */

        if (np == NULL) continue;

        /* Move the client to the list for the node where the object resides.
           nid = pwr_cNNodeId is used for all objects we don't know.  */

        old_np = hash_Search(&sts, gdbroot->nid_ht, &cp->nid);
        if (old_np == NULL) errh_Bugcheck(GDH__WEIRD, "");

        pool_Qremove(NULL, gdbroot->pool, &cp->subc_ll);
        old_np->subc_lc--;
        pool_QinsertPred(NULL, gdbroot->pool, &cp->subc_ll, &np->subc_lh);
        np->subc_lc++;
        cp->nid = np->nid;

        /* If the object's nid changed, then take the appropriate actions.  */

        if (np != old_np) {
            if (np->nid != pwr_cNNodeId) {  /* Object is known.  */

                activateTimeoutWatch(cp);

                aep = tree_Insert(&sts, add, &np->nid);
                if (aep == NULL) errh_Bugcheck(GDH__WEIRD, "");

                if (aep->msg == NULL) {
                    aep->cnt = MIN(my_subc_lc, net_cSubMaxAdd);
                    aep->msg = malloc(sizeof(net_sSubAdd) + sizeof(net_sSubSpec) * aep->cnt);
                    aep->msg->count = 0;
                } /* If there was no message allocated */

                specp		    = &aep->msg->spec[aep->msg->count];
                specp->sid	    = cp->sid;
                specp->dt	    = cp->dt;
                specp->sub_by_name  = cp->sub_by_name;
                specp->aref	    = cp->cclass != pool_cNRef ? cp->raref : cp->aref;

                if (++aep->msg->count >= aep->cnt) {

                    /* The message buffer is full and must be sent.  */

                    tgt = np->handler;
                    pwr_Assert(tgt.nid != pwr_cNNodeId);

                    gdb_Unlock;

                    net_Put(NULL, &tgt, aep->msg, net_eMsg_subAdd, 0, pwr_Offset(aep->msg, spec[aep->msg->count]), 0);

                    gdb_Lock;

                    aep->msg->count = 0;

                }

            } else {	/* The object became unknown... */

                cancelTimeoutWatch(cp);
                subc_SetOld(cp);	/* Data gets old immediately */

#if 0
                /** @todo Maybe we should unlock the cached class? */
                if (cp->cclass != pwr_cNRefId) {
                    ccp = pool_Address(NULL, gdbroot->pool, cp->cclass);
                    if (ccp == NULL) errh_Bugcheck(GDH__WEIRD, "Cached class address");
                    cmvolc_UnlockClass(NULL, ccp);
                    cp->cclass = pwr_cNRefId;
                }
#endif

#if 0
                if (old_np->nid != pwr_cNNodeId) {
                    rep = tree_Insert(&sts, remove, &old_np->nid);
                    if (rep == NULL) errh_Bugcheck(GDH__WEIRD, "");

                    if (rep->msg == NULL) {
                        rep->nid = old_np->nid;
                        rep->cnt = MIN(my_subc_lc, net_cSubMaxRemove);
                        rep->msg = malloc(sizeof(net_sSubRemove) + sizeof(rep->msg->sid[0]) * rep->cnt);
                        rep->msg->count = 0;
                    }

                    rep->msg->sid[rep->msg->count++] = cp->sid;

                    if (rep->msg->count >= net_cSubMaxRemove) {
                        np = hash_Search(&sts, gdbroot->nid_ht, &old_np->nid);
                        if (np == NULL) errh_Bugcheck(sts, "");
                        tgt.nid = rep->nid;
                        pwr_Assert(tgt.nid != pwr_cNNodeId);

                        gdb_Unlock;

                        net_Put(NULL, &tgt, rep->msg, net_eMsg_subRemove, 0, pwr_Offset(rep->msg, sid[rep->msg->count]), 0);

                        gdb_Lock;

                        rep->msg->count = 0;

                    }
                }
#endif
            }
        }
    }

    pool_Free(NULL, gdbroot->pool, my_lh);

    /* Now walk through the addmsg & remmsg and send all unsent messages.  */

    gdb_Unlock;

#if 0
    for (rep = tree_Minimum(remove); rep != NULL; rep = tree_Successor(remove, rep)) {
        if (rep->msg != NULL) {
            if (rep->msg->count > 0) {
                tgt.nid = rep->nid;
                pwr_Assert(tgt.nid != pwr_cNNodeId);
                net_Put(NULL, &tgt, rep->msg, net_eMsg_subRemove, 0, pwr_Offset(rep->msg, sid[rep->msg->count]), 0);
            }
            free(rep->msg);
        }
    }
#endif
    for (aep = tree_Minimum(&sts, add); aep != NULL; aep = tree_Successor(&sts, add, aep)) {
        if (aep->msg != NULL) {
            if (aep->msg->count > 0) {

                np = hash_Search(&sts, gdbroot->nid_ht, &aep->nid);
                if (np == NULL) errh_Bugcheck(GDH__WEIRD, "");

                tgt = np->handler;
                pwr_Assert(tgt.nid != pwr_cNNodeId);
                net_Put(NULL, &tgt, aep->msg, net_eMsg_subAdd, 0, pwr_Offset(aep->msg, spec[aep->msg->count]), 0);
            }
            free(aep->msg);
        }
    }

    gdb_Lock;

    tree_DeleteTable(&sts, add);
#if 0
    tree_DeleteTable(remove);
#endif
}
Esempio n. 19
0
void wb_build::webgraph( pwr_tOid oid)
{
  pwr_tFileName dest_fname;
  pwr_tFileName src_fname;
  pwr_tCmd	cmd;
  pwr_tString80	java_name;
  pwr_tString80	name;
  pwr_tTime	dest_time, src_time;
  int 		check_hierarchy = cdh_ObjidIsNotNull( m_hierarchy);
  int 		hierarchy_found = 0;
  int 		is_frame, is_applet;
  char		jname[80];
  pwr_tStatus  	fsts;
  int		jexport;
  int 		found;
  pwr_tFileName found_file, file_spec;
  pwr_tFileName graph_name, dir;
  char		dev[80], type[80];
  int		version;
  pwr_tString80	appletsignature = "";
  char 		*s;

  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;
  }

  wb_attribute a = m_session.attribute( oid, "RtBody", "Name");
  if ( !a) {
    m_sts = a.sts();
    return;
  }

  a.value( java_name);
  if ( !a) {
    m_sts = a.sts();
    return;
  }

  if ( isupper(java_name[0])) {
    cdh_ToLower( java_name, java_name);
    java_name[0] = toupper(java_name[0]);

    // Get the .pwg file for this javaname
    strcpy( graph_name, cdh_Low(java_name));
    sprintf( name, "$pwrp_pop/%s.pwg", graph_name);

    dcli_translate_filename( name, name);
    m_sts = dcli_file_time( name, &src_time);
    if ( evenSts()) {
      // Search in all pwg files
      found = 0;
      strcpy( file_spec, "$pwrp_pop/*.pwg");
      for ( fsts = dcli_search_file( file_spec, found_file, DCLI_DIR_SEARCH_INIT);
	    ODD(fsts);
	    fsts = dcli_search_file( file_spec, found_file, DCLI_DIR_SEARCH_NEXT)) {
	
	fsts = grow_IsJava( found_file, &is_frame, &is_applet, jname);
	if ( EVEN(fsts)) continue;
	
	if ( is_frame && strcmp( jname, java_name) == 0) {
	  dcli_parse_filename( found_file, dev, dir, graph_name, type, &version);
	  strcpy( name, found_file);
	  found = 1;
	  break;
	}      
      }
      dcli_search_file( file_spec, found_file, DCLI_DIR_SEARCH_END);

      if ( !found) {
	char msg[200];
	sprintf( msg, "Graph for %s not found", java_name);
	MsgWindow::message('E', msg, msgw_ePop_Yes, oid);
	m_sts = PWRB__NOBUILT;
	return;
      }
    }

    m_sts = dcli_file_time( name, &src_time);
    if ( evenSts()) return;

    // Check exported java frame
    jexport = 0;
    sprintf( dest_fname, "$pwrp_pop/%s.java", java_name);
    dcli_translate_filename( dest_fname, dest_fname);
    fsts = dcli_file_time( dest_fname, &dest_time);
    if ( opt.force || EVEN(fsts) || time_Acomp( &src_time, &dest_time) == 1)
      jexport = 1;


    if ( jexport) {
      if ( !m_wnav) {
	sprintf( cmd, "Build:    WebGraph  Unable to export java in this environment %s", java_name);
	MsgWindow::message('W', cmd, msgw_ePop_No, oid);
      }
      else {
	// Get signature from WebHandler
	for ( wb_object p = o.parent(); p.oddSts(); p = p.parent()) {
	  if ( p.cid() == pwr_cClass_WebHandler) {
	    wb_attribute a = m_session.attribute( p.oid(), "RtBody", "AppletSignature");
	    if ( !a) {
	      m_sts = a.sts();
	      return;
	    }

	    a.value( appletsignature);
	    if ( !a) {
	      m_sts = a.sts();
	      return;
	    }
	    dcli_trim( appletsignature, appletsignature);
	    break;
	  }
	}
	

	Ge *gectx = m_wnav->ge_new( graph_name, 1);
	if ( strcmp( appletsignature, "") == 0)
	  strcpy( cmd, "export java");
	else
	  sprintf( cmd, "export java /signature=\"%s\"", appletsignature);
	m_sts = gectx->command( cmd);
	if ( evenSts()) {
	  msg_GetMsg( m_sts, cmd, sizeof(cmd));
	  MsgWindow::message('E', cmd, msgw_ePop_Yes, oid);
	  m_sts = PWRB__NOBUILT;
	  delete gectx;
	  return;
	}
	delete gectx;

	sprintf( cmd, "Build:    WebGraph  Export java %s", java_name);
	MsgWindow::message('I', cmd, msgw_ePop_No, oid);
	
	m_sts = PWRB__SUCCESS;
      }
    }
  }
  else {
    // Copy from $pwrp_pop to $pwrp_web

    strcpy( graph_name, cdh_Low(java_name));

    cdh_ToLower( graph_name, graph_name);

    strcpy( src_fname, "$pwrp_pop/");
    strcat( src_fname, graph_name);

    if ( strstr( src_fname, ".pwg") == 0)
      strcat( src_fname, ".pwg");

    dcli_translate_filename( src_fname, src_fname);
    m_sts = dcli_file_time( src_fname, &src_time);
    if ( evenSts()) {
      m_sts = PWRB__NOBUILT;
      return;
    }

    strcpy( dest_fname, "$pwrp_web/");
    strcat( dest_fname, graph_name);

    if ( strstr( dest_fname, ".pwg") == 0)
      strcat( dest_fname, ".pwg");

    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:    WebGraph copy $pwrp_pop/%s -> $pwrp_web", graph_name);
      MsgWindow::message( 'I', cmd, msgw_ePop_No, oid);
      
      strcpy( name, graph_name);
      if (( s = strrchr( name, '.')))
	*s = 0;
      wb_log::log( wlog_eCategory_GeBuild, name, 0);
      m_sts = PWRB__SUCCESS;
    }
    else
      m_sts = PWRB__NOBUILT;

  }
}
Esempio n. 20
0
void wb_build::xttgraph( pwr_tOid oid)
{
  pwr_tFileName src_fname, dest_fname;
  pwr_tCmd	cmd;
  pwr_tString80	action;
  pwr_tString80	name;
  pwr_tTime	dest_time, src_time;
  int 		check_hierarchy = cdh_ObjidIsNotNull( m_hierarchy);
  int 		hierarchy_found = 0;
  int 		is_frame, is_applet;
  char 		java_name[80];
  pwr_tStatus  	fsts;
  int		jexport;
  char		*s;

  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;
  }

  wb_attribute a = m_session.attribute( oid, "RtBody", "Action");
  if ( !a) {
    m_sts = a.sts();
    return;
  }

  a.value( &action);
  if ( !a) {
    m_sts = a.sts();
    return;
  }

  if ( strstr( action, ".pwg")) {
    strcpy( src_fname, "$pwrp_pop/");
    strcat( src_fname, action);
    dcli_translate_filename( src_fname, src_fname);
    m_sts = dcli_file_time( src_fname, &src_time);
    if ( evenSts()) {
      m_sts = PWRB__NOBUILT;
      return;
    }

    strcpy( dest_fname, "$pwrp_exe/");
    strcat( dest_fname, action);
    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:    XttGraph copy $pwrp_pop/%s -> $pwrp_exe", action);
      MsgWindow::message( 'I', cmd, msgw_ePop_No, oid);

      strcpy( name, action);
      if (( s = strrchr( name, '.')))
	*s = 0;
      wb_log::log( wlog_eCategory_GeBuild, name, 0);
      m_sts = PWRB__SUCCESS;
    }
    else
      m_sts = PWRB__NOBUILT;

    jexport = 0;
    fsts = grow_IsJava( src_fname, &is_frame, &is_applet, java_name);
    if ( EVEN(fsts)) {
      m_sts = fsts;
      return;
    }
    if ( (is_frame || is_applet)  && 
	 strcmp( java_name, "") == 0) {
      // Java name is not yet set, use the default java name
      strcpy( java_name, action);
      if ( (s = strchr( java_name, '.')) != 0)
	*s = 0;
      java_name[0] = _toupper( java_name[0]);
    }
    if ( is_frame) {
      // Check exported java frame
      sprintf( dest_fname, "$pwrp_pop/%s.java", java_name);
      dcli_translate_filename( dest_fname, dest_fname);
      fsts = dcli_file_time( dest_fname, &dest_time);
      if ( opt.force || EVEN(fsts) || time_Acomp( &src_time, &dest_time) == 1)
	jexport = 1;
    }
    if ( is_applet) {
      // Check exported java applet
      sprintf( dest_fname, "$pwrp_pop/%s_A.java", java_name);
      dcli_translate_filename( dest_fname, dest_fname);
      fsts = dcli_file_time( dest_fname, &dest_time);
      if ( opt.force || EVEN(fsts) || time_Acomp( &src_time, &dest_time) == 1)
	jexport = 1;
    }
    if ( jexport) {
      if ( !m_wnav) {
	sprintf( cmd, "Build:    XttGraph  Unable to export java in this environment %s", action);
	MsgWindow::message('W', cmd, msgw_ePop_No, oid);
      }
      else {
	Ge *gectx = m_wnav->ge_new( action, 1);
	strcpy( cmd, "export java");
	m_sts = gectx->command( cmd);
	if ( evenSts()) {
	  msg_GetMsg( m_sts, cmd, sizeof(cmd));
	  MsgWindow::message('E', cmd, msgw_ePop_Yes, oid);
	  m_sts = PWRB__NOBUILT;
	  delete gectx;
	  return;
	}

	sprintf( cmd, "Build:    XttGraph  Export java %s", action);
	MsgWindow::message('I', cmd, msgw_ePop_No, oid);

	delete gectx;

	m_sts = PWRB__SUCCESS;
      }
    }
  }
}
Esempio n. 21
0
void wb_build::classdef( pwr_tOid oid)
{
  pwr_tFileName src_fname, dest_fname;
  pwr_tCmd	cmd;
  pwr_tString80	action;
  pwr_tString80	name;
  pwr_tTime	dest_time, src_time;
  int 		check_hierarchy = cdh_ObjidIsNotNull( m_hierarchy);
  int 		hierarchy_found = 0;
  char  	*s;

  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;
  }

  strcpy( action, cdh_Low( o.name()));
  strcat( action, ".pwg");

  strcpy( src_fname, "$pwrp_pop/");
  strcat( src_fname, action);
  dcli_translate_filename( src_fname, src_fname);
  m_sts = dcli_file_time( src_fname, &src_time);
  if ( evenSts()) {
    m_sts = PWRB__NOBUILT;
    return;
  }

  strcpy( dest_fname, "$pwrp_exe/");
  strcat( dest_fname, action);
  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:    ClassDef copy $pwrp_pop/%s -> $pwrp_exe", action);
    MsgWindow::message( 'I', cmd, msgw_ePop_No, oid);
    
    strcpy( name, action);
    if (( s = strrchr( name, '.')))
      *s = 0;
    wb_log::log( wlog_eCategory_GeBuild, name, 0);
    m_sts = PWRB__SUCCESS;
  }
  else
    m_sts = PWRB__NOBUILT;
}
Esempio n. 22
0
int pndevice_save_cb(void* sctx)
{
  device_sCtx* ctx = (device_sCtx*)sctx;
  pwr_tStatus sts;
  pwr_tOName name;
  int size;
  pwr_tOid oid;
  pwr_tStatus rsts = PB__SUCCESS;

  // Syntax check
  if (ctx->attr->attrnav->device_num == 0) {
    MsgWindow::message('E', "Device type not selected");
    return PB__SYNTAX;
  }

  for (unsigned int i = 1; i < ctx->attr->attrnav->dev_data.slot_data.size();
       i++) {
    if (ctx->attr->attrnav->dev_data.slot_data[i]->module_enum_number == 0
        && ctx->attr->attrnav->dev_data.slot_data[i]->module_class != 0) {
      // Module class selected but not module type
      char msg[20];

      sprintf(msg, "Slot %d", i);
      MsgWindow::message('E', "Module type not selected, ", msg);
      rsts = PB__MODULETYPE;
    }
    if (ctx->attr->attrnav->dev_data.slot_data[i]->module_class == 0
        && ctx->attr->attrnav->dev_data.slot_data[i]->module_enum_number != 0) {
      // Module type selected but not module class
      char msg[20];

      sprintf(msg, "Slot %d", i);
      MsgWindow::message('E', "Module class not selected, ", msg);
      rsts = PB__MODULECLASS;
    }
  }

  // Save configuration
  ((WNav*)ctx->editor_ctx)->set_nodraw();

  sts = ldh_ObjidToName(ctx->ldhses, ctx->aref.Objid, ldh_eName_Hierarchy, name,
      sizeof(name), &size);
  if (EVEN(sts))
    goto return_now;

  // Check that Slot attribute corresponds to the and module_oid
  for (unsigned int i = 1; i < ctx->attr->attrnav->dev_data.slot_data.size();
       i++)
    ctx->attr->attrnav->dev_data.slot_data[i]->module_oid = pwr_cNOid;

  for (sts = ldh_GetChild(ctx->ldhses, ctx->aref.Objid, &oid); ODD(sts);
       sts = ldh_GetNextSibling(ctx->ldhses, oid, &oid)) {
    unsigned int *slotnumberp, slotnumber;

    sts = ldh_GetObjectPar(
        ctx->ldhses, oid, "RtBody", "Slot", (char**)&slotnumberp, &size);
    if (EVEN(sts)) {
      MsgWindow::message(
          'E', "Not a Profinet module object", msgw_ePop_Yes, oid);
      continue;
    }
    slotnumber = *slotnumberp;
    free(slotnumberp);

    if (slotnumber >= ctx->attr->attrnav->dev_data.slot_data.size()) {
      MsgWindow::message('E', "Slot too large", msgw_ePop_Yes, oid);
      continue;
    }

    if (cdh_ObjidIsNotNull(
            ctx->attr->attrnav->dev_data.slot_data[slotnumber]->module_oid)) {
      MsgWindow::message('E', "Slot already used", msgw_ePop_Yes, oid);
      continue;
    }

    if (ctx->attr->attrnav->dev_data.slot_data[slotnumber]->module_class
        == pwr_cNCid)
      // Should be removed
      continue;

    ctx->attr->attrnav->dev_data.slot_data[slotnumber]->module_oid = oid;
  }

  // Remove modules that wasn't configured any more
  pwr_tOid moid[100];
  int mcnt;
  int found;
  mcnt = 0;
  for (sts = ldh_GetChild(ctx->ldhses, ctx->aref.Objid, &oid); ODD(sts);
       sts = ldh_GetNextSibling(ctx->ldhses, oid, &oid)) {
    found = 0;
    for (unsigned int i = 0; i < ctx->attr->attrnav->dev_data.slot_data.size();
         i++) {
      if (cdh_ObjidIsEqual(
              ctx->attr->attrnav->dev_data.slot_data[i]->module_oid, oid)) {
        found = 1;
        break;
      }
    }
    if (!found) {
      moid[mcnt++] = oid;
      if (mcnt > (int)(sizeof(moid) / sizeof(moid[0])))
        break;
    }
  }

  for (int i = 0; i < mcnt; i++)
    sts = ldh_DeleteObjectTree(ctx->ldhses, moid[i], 0);

  // Create new module objects
  for (unsigned int i = 0; i < ctx->attr->attrnav->dev_data.slot_data.size();
       i++) {
    GsdmlSlotData* slot = ctx->attr->attrnav->dev_data.slot_data[i];

    if (cdh_ObjidIsNull(slot->module_oid) && slot->module_class != pwr_cNCid) {
      char mname[20];
      sprintf(mname, "M%d", i);

      if (i == 1)
        sts = ldh_CreateObject(ctx->ldhses, &slot->module_oid, mname,
            slot->module_class, ctx->aref.Objid, ldh_eDest_IntoFirst);
      else {
        // Find sibling
        pwr_tOid dest_oid = pwr_cNOid;
        int dest_found = 0;
        for (int j = i - 1; j > 0; j--) {
          if (cdh_ObjidIsNotNull(
                  ctx->attr->attrnav->dev_data.slot_data[j]->module_oid)) {
            dest_oid = ctx->attr->attrnav->dev_data.slot_data[j]->module_oid;
            dest_found = 1;
            break;
          }
        }
        if (!dest_found)
          sts = ldh_CreateObject(ctx->ldhses, &slot->module_oid, mname,
              slot->module_class, ctx->aref.Objid, ldh_eDest_IntoFirst);
        else
          sts = ldh_CreateObject(ctx->ldhses, &slot->module_oid, mname,
              slot->module_class, dest_oid, ldh_eDest_After);
      }
      if (EVEN(sts)) {
        MsgWindow::message('E', "Error creating module object", mname);
        sts = 0;
        goto return_now;
      }

      pwr_tAttrRef aaref;
      pwr_tAttrRef modulearef = cdh_ObjidToAref(slot->module_oid);

      // Set Slot
      pwr_tUInt32 slotnumber = i;
      sts = ldh_ArefANameToAref(ctx->ldhses, &modulearef, "Slot", &aaref);
      if (EVEN(sts))
        goto return_now;

      sts = ldh_WriteAttribute(
          ctx->ldhses, &aaref, &slotnumber, sizeof(slotnumber));
      if (EVEN(sts))
        goto return_now;
    }
  }

  for (unsigned int i = 0; i < ctx->attr->attrnav->dev_data.slot_data.size();
       i++) {
    GsdmlSlotData* slot = ctx->attr->attrnav->dev_data.slot_data[i];

    if (i == 0) {
      std::vector<ChanItem> input_vect;
      std::vector<ChanItem> output_vect;

      sts = pndevice_check_io(ctx,
          ctx->attr->attrnav->device_item->VirtualSubmoduleList, input_vect,
          output_vect);
      if (sts == PB__CREATECHAN) {
        char msg[20];
        sprintf(msg, "Slot %d", i);
        MsgWindow::message(
            'W', "Unexpected datatype, channel not created, ", msg);
      }
    } else {
      if (slot->module_class == pwr_cClass_PnModule) {
        std::vector<ChanItem> input_vect;
        std::vector<ChanItem> output_vect;
        gsdml_UseableModules* um
            = ctx->gsdml->ApplicationProcess->DeviceAccessPointList
                  ->DeviceAccessPointItem[ctx->attr->attrnav->device_num - 1]
                  ->UseableModules;

        if (!um)
          continue;
        gsdml_ModuleItem* mi
            = (gsdml_ModuleItem*)um->ModuleItemRef[slot->module_enum_number - 1]
                  ->Body.ModuleItemTarget.p;

        sts = pndevice_check_io(
            ctx, mi->VirtualSubmoduleList, input_vect, output_vect);
        if (sts == PB__CREATECHAN) {
          char msg[20];
          sprintf(msg, "Slot %d", i);
          MsgWindow::message(
              'W', "Unexpected datatype, channel not created, ", msg);
        }

        // Create the channels
        if (EVEN(ldh_GetChild(ctx->ldhses, slot->module_oid, &oid))) {
          unsigned int chan_cnt = 0;
          for (unsigned int j = 0; j < input_vect.size(); j++) {
            char name[80];
            sprintf(name, "Ch%02u", chan_cnt++);
            sts = ldh_CreateObject(ctx->ldhses, &oid, name, input_vect[j].cid,
                slot->module_oid, ldh_eDest_IntoLast);
            if (EVEN(sts))
              goto return_now;

            pwr_tAttrRef aaref;
            pwr_tAttrRef chanaref = cdh_ObjidToAref(oid);

            // Set Representation
            pwr_tEnum representation = input_vect[j].representation;
            sts = ldh_ArefANameToAref(
                ctx->ldhses, &chanaref, "Representation", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, &representation, sizeof(representation));
            if (EVEN(sts))
              goto return_now;

            // Set Number
            pwr_tUInt16 number = input_vect[j].number;
            sts = ldh_ArefANameToAref(ctx->ldhses, &chanaref, "Number", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, &number, sizeof(number));
            if (EVEN(sts))
              goto return_now;

            // Set Description
            pwr_tString80 description;
            strncpy(
                description, input_vect[j].description, sizeof(description));
            sts = ldh_ArefANameToAref(
                ctx->ldhses, &chanaref, "Description", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, description, sizeof(description));
            if (EVEN(sts))
              goto return_now;
          }
          for (unsigned int j = 0; j < output_vect.size(); j++) {
            char name[80];
            sprintf(name, "Ch%02u", chan_cnt++);
            sts = ldh_CreateObject(ctx->ldhses, &oid, name, output_vect[j].cid,
                slot->module_oid, ldh_eDest_IntoLast);
            if (EVEN(sts))
              goto return_now;

            pwr_tAttrRef aaref;
            pwr_tAttrRef chanaref = cdh_ObjidToAref(oid);

            // Set Representation
            pwr_tEnum representation = output_vect[j].representation;
            sts = ldh_ArefANameToAref(
                ctx->ldhses, &chanaref, "Representation", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, &representation, sizeof(representation));
            if (EVEN(sts))
              goto return_now;

            // Set Number
            pwr_tUInt16 number = output_vect[j].number;
            sts = ldh_ArefANameToAref(ctx->ldhses, &chanaref, "Number", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, &number, sizeof(number));
            if (EVEN(sts))
              goto return_now;

            // Set Description
            pwr_tString80 description;
            strncpy(
                description, output_vect[j].description, sizeof(description));
            sts = ldh_ArefANameToAref(
                ctx->ldhses, &chanaref, "Description", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, description, sizeof(description));
            if (EVEN(sts))
              goto return_now;
          }
        }
      } else {
        // Remove existing channels
        std::vector<pwr_tOid> chanvect;
        pwr_tCid cid;

        for (sts = ldh_GetChild(ctx->ldhses, slot->module_oid, &oid); ODD(sts);
             sts = ldh_GetNextSibling(ctx->ldhses, oid, &oid)) {
          sts = ldh_GetObjectClass(ctx->ldhses, oid, &cid);
          if (EVEN(sts))
            goto return_now;

          switch (cid) {
          case pwr_cClass_ChanDi:
          case pwr_cClass_ChanDo:
          case pwr_cClass_ChanAi:
          case pwr_cClass_ChanAo:
          case pwr_cClass_ChanIi:
          case pwr_cClass_ChanIo:
            chanvect.push_back(oid);
            break;
          default:;
          }
        }
        for (unsigned int i = 0; i < chanvect.size(); i++) {
          sts = ldh_DeleteObject(ctx->ldhses, chanvect[i]);
          if (EVEN(sts))
            goto return_now;
        }
      }
    }
  }

  // Write data of all devices for profinet viewer
  // Data is device name, IP and MAC address
  sts = generate_viewer_data(ctx);

  sts = rsts;

return_now:
  ((WNav*)ctx->editor_ctx)->reset_nodraw();
  return sts;
}
Esempio n. 23
0
pwr_tStatus wsx_CheckXAttrRef( ldh_tSesContext	sesctx,
			      pwr_tAttrRef	aref,
			      const pwr_tObjName attribute,
			      const pwr_tObjName back_attribute,
			      pwr_tCid		*cid_vect,
			      int		null_is_ok,
			      int		*errorcount,
			      int		*warningcount)
{
  pwr_tAttrRef value;
  pwr_tAttrRef back_aref;
  wb_session *sp = (wb_session *)sesctx;

  wb_attribute a = sp->attribute( &aref);
  if ( !a) return a.sts();

  wb_attribute a_attr( a, 0, attribute);
  if ( !a_attr) return a_attr.sts();
    
  a_attr.value( &value);
  if ( !a_attr) return a_attr.sts();

  if ( !null_is_ok && cdh_ObjidIsNull( value.Objid)) {
    char msg[80];
    sprintf ( msg, "Attribute reference is null in \"%s\"", attribute);
    wsx_error_msg_str( sesctx, msg, aref, 'E', errorcount, warningcount);
  }
  if ( cdh_ObjidIsNotNull( value.Objid)) {
    wb_attribute a_value = sp->attribute( &value);
    if ( !a_value) {
      char msg[80];
      sprintf ( msg, "Undefined attribute reference in \"%s\"", attribute);
      wsx_error_msg_str( sesctx, msg, aref, 'E', errorcount, warningcount);
      return WSX__SUCCESS;
    }
    if ( cid_vect) {
      // Check attribute reference class
      bool found = false;
      for ( int i = 0; cid_vect[i]; i++) {
	if ( cid_vect[i] == a_value.tid()) {
	  found = true;
	  break;
	}
      }
      if ( !found) {
	char msg[80];
	sprintf ( msg, "Invalid class of attribute reference in \"%s\"", attribute);
	wsx_error_msg_str( sesctx, msg, aref, 'E', errorcount, warningcount);
	return WSX__SUCCESS;
      }
    }

    // Check back attrref
    wb_attribute a_back( a_value, 0, back_attribute);
    if ( !a_back) return a_back.sts();

    a_back.value( &back_aref);
    if ( !a_back) return a_back.sts();

    if ( !(cdh_ObjidIsEqual( back_aref.Objid, aref.Objid) &&
	   back_aref.Offset == aref.Offset)) {
      char msg[80];
      sprintf ( msg, "Reference is not mutual \"%s\"", attribute);
      wsx_error_msg_str( sesctx, msg, aref, 'E', errorcount, warningcount);
      return WSX__SUCCESS;
    }
  }
  return WSX__SUCCESS;
}
Esempio n. 24
0
static pwr_tStatus Connect (
  ldh_sMenuCall *ip
) {
  pwr_tStatus sts;
  pwr_sMenuButton mb;
  pwr_sAttrRef PattrRef;
  pwr_sAttrRef PattrXref;
  pwr_sAttrRef SattrRef;
  pwr_sAttrRef SattrXref;
  pwr_sAttrRef TattrRef;
  pwr_tUInt32 Pdim;
  pwr_tUInt32 Sdim;
  pwr_sAttrXRef PattrDef;
  pwr_sAttrXRef SattrDef;
  int i;

  sts = ldh_ReadObjectBody(ip->PointedSession,
    ip->ItemList[ip->ChosenItem].MenuObject,
    "SysBody", &mb, sizeof(pwr_sMenuButton));
  if (EVEN(sts)) return sts;

  sts = ldh_GetAttrRef(ip->PointedSession, ip->Pointed.Objid,
    mb.MethodArguments[0], &PattrRef);
  if (EVEN(sts)) return sts;
  sts = ldh_GetAttrRef(ip->PointedSession, ip->Selected[0].Objid,
    mb.MethodArguments[1], &SattrRef);
  if (EVEN(sts)) return sts;

  sts = ldh_GetAttrXRefDef(ip->PointedSession, &PattrRef, &PattrDef);
  if (EVEN(sts)) return sts;
  sts = ldh_GetAttrXRefDef(ip->PointedSession, &SattrRef, &SattrDef);
  if (EVEN(sts)) return sts;

  if (strncmp(PattrDef.Identity, SattrDef.Identity, sizeof(SattrDef.Identity)) != 0)
    return PWRS__IDXREF;

  if (strncmp(PattrDef.Source, SattrDef.Target, sizeof(PattrDef.Source)) != 0)
    return PWRS__STXREF;

  if (strncmp(PattrDef.Target, SattrDef.Source, sizeof(SattrDef.Source)) != 0)
    return PWRS__STXREF;

  Pdim = PattrRef.Size / sizeof(pwr_sAttrRef);
  Sdim = SattrRef.Size / sizeof(pwr_sAttrRef);

  TattrRef = PattrRef;
  TattrRef.Size = sizeof(pwr_sAttrRef);
  for (i = 0; i < (int)Pdim; i++, TattrRef.Offset += sizeof(pwr_sAttrRef)) {
    /* find Sobject */
    sts = ldh_ReadAttribute(ip->PointedSession, &TattrRef, &PattrXref,
      sizeof(pwr_sAttrRef));
    if (EVEN(sts)) return sts;
    if (!cdh_ObjidIsEqual(PattrXref.Objid, ip->Selected[0].Objid))
      continue;
    sts = ldh_ReadAttribute(ip->PointedSession, &PattrXref, &SattrXref,
      sizeof(pwr_sAttrRef));
    if (EVEN(sts)) return sts;
    if (memcmp(&SattrXref, &TattrRef, sizeof(pwr_sAttrRef)) == 0)
      return PWRS__ALRCONN;
  }

  TattrRef = PattrRef;
  TattrRef.Size = sizeof(pwr_sAttrRef);
  for (i = 0; i < (int)Pdim; i++, TattrRef.Offset += sizeof(pwr_sAttrRef)) {
    /* find free slot */
    sts = ldh_ReadAttribute(ip->PointedSession, &TattrRef, &PattrXref,
      sizeof(pwr_sAttrRef));
    if (EVEN(sts)) return sts;
    if (cdh_ObjidIsNull(PattrXref.Objid))
      break;
  }
  if (i >= (int)Pdim) {
    return PWRS__PALRCONN;
  } else {
    PattrRef = TattrRef;
  }

  TattrRef = SattrRef;
  TattrRef.Size = sizeof(pwr_sAttrRef);
  for (i = 0; i < (int)Sdim; i++, TattrRef.Offset += sizeof(pwr_sAttrRef)) {
    /* find free slot */
    sts = ldh_ReadAttribute(ip->PointedSession, &TattrRef, &SattrXref,
      sizeof(pwr_sAttrRef));
    if (EVEN(sts)) return sts;
    if (cdh_ObjidIsNull(SattrXref.Objid))
      break;
  }
  if (i >= (int)Sdim) {
    return PWRS__SALRCONN;
  } else {
    SattrRef = TattrRef;
  }

  sts = ldh_WriteAttribute(ip->PointedSession, &SattrRef, &PattrRef,
    sizeof(pwr_sAttrRef));
  sts = ldh_WriteAttribute(ip->PointedSession, &PattrRef, &SattrRef,
    sizeof(pwr_sAttrRef));
  return PWRS__SUCCESS;
}
Esempio n. 25
0
gdb_sObject *
dvol_MoveObject (
  pwr_tStatus		*sts,
  pwr_tObjid		oid,
  pwr_tObjid		poid
)
{
  static cvol_sNotify	mm;		/* Cannot be on the stack for VAXELN */

  gdb_sObject		*op;
  gdb_sObject		*new_pop;
  gdb_sObject		*old_pop;
  gdb_sObject		*tmp_op;
  
  if (oid.oix == pwr_cNObjectIx)	/* This volume object cannot be moved.  */
    pwr_Return(NULL, sts, GDH__NOTMOVABLE);

  if (cdh_ObjidIsNull(poid))
    poid.vid = oid.vid;

  if (oid.vid != poid.vid)
    pwr_Return(NULL, sts, GDH__BADPARENT);

  if (cdh_ObjidIsEqual(oid, poid))	/* An object can not be parent to itself.  */
    pwr_Return(NULL, sts, GDH__CHILDSELF);

  gdb_AssumeLocked;

  op = hash_Search(sts, gdbroot->oid_ht, &oid);
  if (op == NULL) pwr_Return(NULL, sts, GDH__NOSUCHOBJ);

  new_pop = hash_Search(sts, gdbroot->oid_ht, &poid);
  if (new_pop == NULL) pwr_Return(NULL, sts, GDH__NOSUCHOBJ);

  old_pop = pool_Address(sts, gdbroot->pool, op->l.por);
  if (old_pop == NULL) pwr_Return(NULL, sts, GDH__WEIRD);

  if (new_pop == old_pop)	/* The same parent, consider it done!  */
    pwr_Return(op, sts, GDH__SUCCESS);


  for (		/* Detect potential hierarchy loops.  */
    tmp_op = old_pop;
    tmp_op != NULL && tmp_op->g.oid.oix != pwr_cNObjectIx;
    tmp_op = pool_Address(sts, gdbroot->pool, tmp_op->l.por)
  ) {
    if (tmp_op == op)		/* Loop detected! */
      pwr_Return(NULL, sts, GDH__CHILDSELF);
  }

  if (tmp_op == NULL)
    pwr_Return(NULL, sts, GDH__WEIRD);

  /* Check potential name conflicts.  */

  tmp_op = vol_FamilyToObject(sts, op->g.f.name.orig, poid);
  if (tmp_op != NULL)
    pwr_Return(NULL, sts, GDH__DUPLNAME);

  cvols_InitNotify(op, &mm, net_eMsg_deleteObject);

  unadoptObject(NULL, op, old_pop, &mm);  

  op->g.f.poid = poid;

  adoptObject(NULL, op, new_pop, &mm);

  cvols_Notify(&mm);

  pwr_Return(op, sts, GDH__SUCCESS);
}
Esempio n. 26
0
pwr_tStatus wb_session::getMenu(ldh_sMenuCall* ip)
{
  pwr_tStatus sts = 0;
  ldh_sMenuItem* Item = (ldh_sMenuItem*)&ldh_lMenuItem;
  pwr_tUInt32 i;
  pwr_tObjName MenuFolder;
  pwr_tString80 Menu;
  pwr_tBoolean isSame = FALSE;
  pwr_tClassId Class;
  pwr_tObjid Object;
  int nItems = 0;
  wb_name cn;

  for (i = 0; i < ip->SelectCount; i++) {
    if (cdh_ObjidIsEqual(ip->Pointed.Objid, ip->Selected[i].Objid)
        && ip->Pointed.Offset == ip->Selected[i].Offset
        && ip->Pointed.Flags.m == ip->Selected[i].Flags.m) {
      isSame = TRUE;
      break;
    }
  }

  sprintf(MenuFolder, "%sP%cs%c%c",
      ldh_lUtility[((wb_session*)ip->PointedSession)->utility()].Name,
      ldh_lMenuSet[ip->PointedSet].Char, ldh_lMenuSet[ip->SelectedSet].Char,
      (isSame ? 's' : 'n'));
  /* Find generic menues of pointed object */
  switch (ip->PointedSet) {
  case ldh_eMenuSet_Object: {
    sprintf(Menu, "pwrs:Class-$Object-%s-Pointed", MenuFolder);

    wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Object);
    if (EVEN(sts))
      return sts;

    wb_orep* o = m_vrep->erep()->object(&sts, Menu);
    if (EVEN(sts))
      break;
    o->ref();

    Object = o->oid();
    void* o_menu_body;

    wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body);
    while (ODD(sts)) {
      o_menu->ref();
      getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0);
      wb_orep* prev = o_menu;
      o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body);
      prev->unref();
    }
    delete cdrep;
    o->unref();
    break;
  }
  case ldh_eMenuSet_ObjectAttr: {
    pwr_tObjName OMenuFolder;

    sprintf(OMenuFolder, "%sP%cs%c%c",
        ldh_lUtility[((wb_session*)ip->PointedSession)->utility()].Name, 'x',
        'x', 'x');
    sprintf(Menu, "pwrs:Class-$Object-%s-Pointed", OMenuFolder);

    wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Object);
    if (EVEN(sts))
      return sts;

    wb_orep* o = m_vrep->erep()->object(&sts, Menu);
    if (EVEN(sts))
      return sts;
    o->ref();

    Object = o->oid();
    void* o_menu_body;

    wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body);
    while (ODD(sts)) {
      o_menu->ref();
      getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0);
      wb_orep* prev = o_menu;
      o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body);
      prev->unref();
    }
    delete cdrep;
    o->unref();
    break;
  }
  case ldh_eMenuSet_Attribute:
  case ldh_eMenuSet_Array: {
    sprintf(Menu, "pwrs:Class-$Attribute-%s-Pointed", MenuFolder);

    wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Param);
    if (EVEN(sts))
      return sts;

    wb_orep* o = m_vrep->erep()->object(&sts, Menu);
    if (EVEN(sts))
      return sts;
    o->ref();

    Object = o->oid();
    void* o_menu_body;

    wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body);
    while (ODD(sts)) {
      o_menu->ref();
      getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0);
      wb_orep* prev = o_menu;
      o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body);
      prev->unref();
    }
    delete cdrep;
    o->unref();
    break;
  }
  case ldh_eMenuSet_Class: {
    sprintf(Menu, "pwrs:Class-$Object-%s-Pointed", MenuFolder);

    wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Object);
    if (EVEN(sts))
      return sts;

    wb_orep* o = m_vrep->erep()->object(&sts, Menu);
    if (EVEN(sts))
      return sts;
    o->ref();

    Object = o->oid();
    void* o_menu_body;

    wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body);
    while (ODD(sts)) {
      o_menu->ref();
      getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0);
      wb_orep* prev = o_menu;
      o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body);
      prev->unref();
    }
    delete cdrep;
    o->unref();
    break;
  }
  default:;
  }
  /* Find specific menues of pointed object */

  switch (ip->PointedSet) {
  case ldh_eMenuSet_Object:
  case ldh_eMenuSet_ObjectAttr: {
    if (ip->PointedSet == ldh_eMenuSet_Class) {
      Class = cdh_ClassObjidToId(ip->Pointed.Objid);
    } else {
      wb_attribute a = attribute(&ip->Pointed);
      if (!a)
        return sts;
      Class = a.tid();
    }

    wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, Class);
    while (ODD(sts)) {
      cn = cdrep->longName();
      sprintf(Menu, "%s-%s-Pointed", cn.name(), MenuFolder);

      wb_orep* o = m_vrep->erep()->object(&sts, Menu);
      if (ODD(sts)) {
        o->ref();

        Object = o->oid();

        void* o_menu_body;
        wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body);
        while (ODD(sts)) {
          o_menu->ref();
          getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0);
          wb_orep* prev = o_menu;
          o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body);
          prev->unref();
        }
        o->unref();
      }
      // Get menuitems for superclass
      wb_cdrep* super_cdrep = cdrep->super(&sts);
      if (super_cdrep) {
        delete cdrep;
        cdrep = super_cdrep;
      }
    }
    delete cdrep;
    break;
  }
  default:;
  }

  switch (ip->SelectedSet) {
  case ldh_eMenuSet_Attribute:
  case ldh_eMenuSet_Array:
  case ldh_eMenuSet_ObjectAttr:
    break;
  case ldh_eMenuSet_Class:
  case ldh_eMenuSet_Many:
  case ldh_eMenuSet_Object: {
    if (ip->PointedSet != ldh_eMenuSet_Object)
      break;

    /* Find generic menues for selected object(s) */
    sprintf(Menu, "pwrs:Class-$Object-%s-Selected", MenuFolder);
    wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Object);
    if (EVEN(sts))
      return sts;

    wb_orep* o = m_vrep->erep()->object(&sts, Menu);
    if (ODD(sts)) {
      o->ref();

      Object = o->oid();

      void* o_menu_body;
      wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body);
      while (ODD(sts)) {
        o_menu->ref();
        getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0);
        wb_orep* prev = o_menu;
        o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body);
        prev->unref();
      }
      o->unref();
    }
    delete cdrep;

    /* Find specific menues for selected object(s) */
    if (ip->PointedSet == ldh_eMenuSet_Class) {
      Class = cdh_ClassObjidToId(ip->Pointed.Objid);
    } else {
      if (m_vrep->vid() == ip->Pointed.Objid.vid)
        o = m_vrep->object(&sts, ip->Pointed.Objid);
      else
        // Other volume
        o = m_vrep->erep()->object(&sts, ip->Pointed.Objid);
      if (EVEN(sts))
        return sts;
      o->ref();
      Class = o->cid();
      o->unref();
    }

    cdrep = m_vrep->merep()->cdrep(&sts, Class);
    while (ODD(sts)) {
      cn = cdrep->longName();
      sprintf(Menu, "%s-%s-Selected", cn.name(), MenuFolder);

      o = m_vrep->erep()->object(&sts, Menu);
      if (ODD(sts)) {
        o->ref();

        Object = o->oid();

        void* o_menu_body;
        wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body);
        while (ODD(sts)) {
          o_menu->ref();
          getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0);
          wb_orep* prev = o_menu;
          o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body);
          prev->unref();
        }
        o->unref();
      }

      // Get menuitems for superclass
      wb_cdrep* super_cdrep = cdrep->super(&sts);
      if (super_cdrep) {
        delete cdrep;
        cdrep = super_cdrep;
      }
    }
    delete cdrep;

    break;
  }
  default:
    break;
  }

  Item->Level = 0;
  ip->ItemList = ldh_lMenuItem;
  ip->ItemCount = nItems - 1;
  return LDH__SUCCESS;
}
Esempio n. 27
0
bool wb_session::copyOset(pwr_sAttrRef* arp, bool keepref, bool keepsym,
    bool ignore_errors, pwr_tVid vvid, const char* vname, wb_vrepmem** vmem)
{
  char name[32];
  pwr_tStatus sts;
  pwr_tVid vid;
  m_sts = LDH__SUCCESS;

  if (!m_vrep->exportTreeIsImplemented()) {
    m_sts = LDH__NYI;
    return false;
  }

  // Avoid copying objects in plcprograms
  pwr_sAttrRef* ap = arp;
  while (cdh_ObjidIsNotNull(ap->Objid)) {
    wb_object o = object(ap->Objid);
    if (!o)
      return o.sts();
    o = o.parent();
    while (o) {
      pwr_sAttrRef* ap2 = arp;
      while (cdh_ObjidIsNotNull(ap2->Objid)) {
        if (o.cid() == pwr_cClass_plc) {
          m_sts = LDH__COPYPLCOBJECT;
          return false;
        }
        ap2++;
      }
      o = o.parent();
    }
    ap++;
  }

  if (vvid)
    vid = vvid;
  else {
    vid = m_vrep->erep()->nextVolatileVid(&m_sts, name);
    if (EVEN(m_sts))
      return false;
  }

  wb_vrepmem* mem = new wb_vrepmem(m_vrep->erep(), vid);
  if (vvid)
    mem->name(vname);
  else
    mem->name(name);

  m_vrep->erep()->addBuffer(&sts, mem);
  if (ignore_errors)
    mem->importIgnoreErrors();

  ap = arp;
  while (cdh_ObjidIsNotNull(ap->Objid)) {
    // Check selected object is not child to another selected object
    bool found = false;
    wb_object o = object(ap->Objid);
    if (!o)
      return o.sts();
    o = o.parent();
    while (o) {
      pwr_sAttrRef* ap2 = arp;
      while (cdh_ObjidIsNotNull(ap2->Objid)) {
        if (cdh_ObjidIsEqual(ap2->Objid, o.oid())) {
          found = true;
          break;
        }
        ap2++;
      }
      if (found)
        break;
      o = o.parent();
    }
    if (found) {
      ap++;
      continue;
    }

    if (m_vrep->vid() == ap->Objid.vid)
      m_vrep->exportTree(*mem, ap->Objid);
    else {
      // Other volume
      wb_vrep* vrep = m_vrep->erep()->volume(&sts, ap->Objid.vid);
      vrep->exportTree(*mem, ap->Objid);
    }
    ap++;
  }

  if (vmem)
    *vmem = mem;

  return mem->importTree(keepref, keepsym);
}