Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
/*----------------------------------------------------------------------------*\
  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;
}
Example #4
0
//
//  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;
}
Example #5
0
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();
}
Example #6
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;
}
Example #7
0
wb_cdef wb_volume::cdef(pwr_tOid coid)
{
  return cdef(cdh_ClassObjidToId(coid));
}
Example #8
0
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));
}