static pwr_tStatus CreateObject ( ldh_sMenuCall *ip ) { pwr_tStatus sts; pwr_tClassId Class = cdh_ClassObjidToId(ip->Selected[0].Objid); pwr_tObjid Object; pwr_sMenuButton mb; ldh_eDest Dest; 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__; } sts = ldh_CreateObject(ip->PointedSession, &Object, NULL, Class, ip->Pointed.Objid, Dest); return sts; }
static int IsOkCreateObject ( ldh_sMenuCall *ip, pwr_sMenuButton *mbp ) { pwr_tStatus sts; pwr_tClassId Class = cdh_ClassObjidToId(ip->Selected[0].Objid); ldh_eDest Dest; 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__; } sts = ldh_IsOkCreateObject(ip->PointedSession, Class, ip->Pointed.Objid, Dest); return ODD(sts); }
/*----------------------------------------------------------------------------*\ Find classes belonging to an specific IO-type. \*----------------------------------------------------------------------------*/ pwr_tStatus io_GetIoTypeClasses( io_eType type, pwr_tClassId **classes, int *size ) { pwr_tStatus sts; pwr_sClassDef cdef; pwr_tOid oid; int add_class; pwr_sAttrRef aref; *size = 0; *classes = calloc( IO_CLASSES_SIZE, sizeof(pwr_tCid)); for ( sts = gdh_GetClassList( pwr_eClass_ClassDef, &oid); ODD(sts); sts = gdh_GetNextObject( oid, &oid)) { aref = cdh_ObjidToAref( oid); sts = gdh_GetObjectInfoAttrref( &aref, &cdef, sizeof(cdef)); if ( EVEN(sts)) return sts; add_class = 0; switch ( type) { case io_eType_Agent: if ( cdef.Flags.b.IOAgent) add_class = 1; break; case io_eType_Rack: if ( cdef.Flags.b.IORack) add_class = 1; break; case io_eType_Card: if ( cdef.Flags.b.IOCard) add_class = 1; break; default: return IO__NOMETHOD; } if ( add_class) { if ( *size >= IO_CLASSES_SIZE) return IO__CLASSEXCEED; (*classes)[ *size] = cdh_ClassObjidToId( oid); (*size)++; } } return IO__SUCCESS; }
// // Help for class i palette // static pwr_tStatus ClassHelp( ldh_sMenuCall *ip) { pwr_tStatus sts; int size; char cname[32]; char cmd[200]; pwr_tCid cid; cid = cdh_ClassObjidToId( ip->Pointed.Objid); sts = ldh_ClassIdToName( ip->PointedSession, cid, cname, sizeof(cname), &size); if ( EVEN(sts)) return sts; if ( cname[0] == '$') snprintf( cmd, sizeof(cmd), "help %s /strict", &cname[1]); else snprintf( cmd, sizeof(cmd), "help %s /strict", cname); ip->wnav->command( cmd); return 1; }
int main( int argc, char *argv[]) { pwr_tObjName volume; for ( int i = 1; i < argc; i++) { if ( argv[i][0] == '-') { switch ( argv[i][1]) { case 'h': usage(); exit(0); case 'v': if ( i+1 >= argc) { usage(); exit(0); } strncpy( volume, argv[i+1], sizeof(volume)); i++; break; default: printf("Unknown argument: %s\n", argv[i]); usage(); exit(0); } } } wb_env env; env.load( volume); wb_volume vol; for ( vol = env.volume(); vol.oddSts(); vol.next()) { if ( vol.cid() == pwr_eClass_RootVolume || vol.cid() == pwr_eClass_SubVolume || vol.cid() == pwr_eClass_SharedVolume) { break; } } if ( vol.evenSts()) exit( vol.sts()); wb_session session(vol); if ( ! session.access( ldh_eAccess_ReadWrite)) { cout << "** No write access" << endl; exit(0); } #if 0 wb_object o; for ( o = session.object(); o.oddSts(); o = o.after()) { process( session, o); } #endif // Replace Pb modules $IoConnect references with Io modules references pwr_tAttrRef aref; pwr_tCid cid; pwr_tAttrRef value_aref; for ( unsigned int i = 0; i < sizeof(upg_sigchancon)/sizeof(upg_sigchancon[0]); i++) { wb_object co = session.object( upg_sigchancon[i].cname); if ( !co) { printf( "** Class not loaded: %s\n", upg_sigchancon[i].cname); continue; } cid = cdh_ClassObjidToId( co.oid()); for ( session.aref( cid, &aref); session.oddSts(); session.nextAref( cid, &aref, &aref)) { wb_attribute a = session.attribute(&aref); if (!a) continue; wb_attribute a_ioconnect( a, 0, "IoConnect"); if ( a_ioconnect.evenSts()) continue; a_ioconnect.value( &value_aref); if ( a_ioconnect.evenSts()) continue; wb_attribute a_pbmodule = session.attribute( &value_aref); if ( a_pbmodule.oddSts()) { wb_attribute a_iomodule( a_pbmodule, 0, "Io"); if ( a_iomodule.oddSts()) { value_aref = a_iomodule.aref(); session.writeAttribute( a_ioconnect, &value_aref, sizeof( value_aref)); printf( "Set %s -> %s\n", a_iomodule.longName().c_str(), a_ioconnect.longName().c_str()); } } for ( unsigned int j = 0; j < sizeof(upg_sigchancon[0].attr)/sizeof(upg_sigchancon[0].attr[0]); j++) { if ( strcmp( upg_sigchancon[i].attr[j], "") == 0) break; try { wb_attribute a_attr2( a, 0, upg_sigchancon[i].attr[j]); if ( a_attr2.evenSts()) continue; wb_attribute a_attr( a_attr2, 0, "SigChanCon"); if ( a_attr.evenSts()) continue; a_attr.value( &value_aref); if ( a_attr.evenSts()) continue; if ( value_aref.Objid.vid == cdh_cIoConnectVolume) { wb_attribute a_value = session.attribute( upg_sigchancon[i].value[j]); value_aref = a_value.aref(); if ( a_value.evenSts()) continue; session.writeAttribute( a_attr, &value_aref, sizeof( value_aref)); // printf( "Updating SigChanCon \"%s\" %s\n", a_attr.longName().c_str(), upg_sigchancon[i].value[j]); } } catch ( wb_error& e) { continue; } } } } session.commit(); }
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; }
wb_cdef wb_volume::cdef(pwr_tOid coid) { return cdef(cdh_ClassObjidToId(coid)); }
void wb_dbs::checkObject(sOentry *oep) { int nChild = 0; pwr_tStatus sts; dbs_sQlink *sib_lh; dbs_sQlink *sib_ll; sOentry *sep; dbs_sName n; sNentry *nep; // Check object if (!oep->flags.b.exist) { printf("** Object does not exist!\n"); } m_nTreeObjects++; oep->ref = dbs_dMakeRef(dbs_eSect_object, m_sect[dbs_eSect_object].size); m_sect[dbs_eSect_object].size += dbs_dAlign(sizeof(dbs_sObject)); dbs_Qinit(&sts, &oep->o.sib_lh, oep->ref + offsetof(dbs_sObject, sib_lh)); dbs_Qinit(&sts, &oep->o.sib_ll, oep->ref + offsetof(dbs_sObject, sib_ll)); dbs_Qinit(&sts, &oep->o.o_ll, oep->ref + offsetof(dbs_sObject, o_ll)); classInsert(oep); switch (oep->o.cid) { case pwr_eClass_ClassDef: // Version is dependent of attribute objects m_v->merep()->classVersion(&sts, cdh_ClassObjidToId(oep->o.oid), &oep->o.time); break; case pwr_eClass_LibHier: if ( !cdh_isClassVolumeClass( m_volume.cid)) oep->o.flags.b.devOnly = 1; break; case pwr_eClass_Alias: if ( !cdh_isClassVolumeClass( m_volume.cid)) oep->o.flags.b.isAliasClient = 1; break; case pwr_eClass_MountVolume: case pwr_eClass_CreateVolume: case pwr_eClass_MountObject: if (m_volume.cid == pwr_eClass_RootVolume || m_volume.cid == pwr_eClass_VolatileVolume) { // Root volume or cloned volume oep->o.flags.b.isMountClient = 1; } break; default: break; } oep->o.flags.b.isMountClean = 1; // Check all children sib_lh = sib_ll = &oep->o.sib_lh; for (sep = oep->foep; sep != 0; sep = sep->aoep) { if (sep->poep != oep) { printf("** Object not linked to right parent!\n"); } checkObject(sep); sep->o.pref = oep->ref; dbs_Qinsert(&sts, sib_ll, &sep->o.sib_ll, sib_lh); sib_ll = &sep->o.sib_ll; oep->o.flags.b.isMountClean |= sep->o.flags.b.isMountClean && !sep->o.flags.b.isMountClient; nChild++; } /* Check name table, get reference to first and last child in name order. */ memset(&n, 0, sizeof(n)); n.poix = oep->o.oid.oix; nep = (sNentry*)tree_FindSuccessor(&sts, m_name_th, &n); if (nep != NULL && nep->n.poix == oep->o.oid.oix) { oep->o.name_bt.start = nep->ref; } n.poix += 1; nep = (sNentry*)tree_FindPredecessor(&sts, m_name_th, &n); if (nep != NULL && nep->n.poix == oep->o.oid.oix) { oep->o.name_bt.end = nep->ref; } oep->o.name_bt.rsize = dbs_dAlign(sizeof(dbs_sName)); }