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; }
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); }
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); }
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; } }
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; }
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; }
/*_* @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; }
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; } }
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; }
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); }
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 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; }
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; }
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; }
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; } } } }
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; }
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; }
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 }
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; } }
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; } } } }
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; }
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; }
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; }
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; }
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); }
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; }
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); }