void Watch(PropertyManager PM, String path) { ManagedObjectReference vm = cb.getConnection().Service.FindByInventoryPath( cb.getConnection().ServiceContent.searchIndex, path); if (vm == null) { System.Console.WriteLine("Virtual Machine located at path: " + path + " not found."); return; } // Create a FilterSpec PropertySpec pSpec = new PropertySpec(); pSpec.type = vm.type; pSpec.pathSet = new String[] { "guest", "summary.quickStats", "summary.runtime.powerState" }; ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = vm; oSpec.skip = false; oSpec.skipSpecified = true; PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.propSet = new PropertySpec[] { pSpec }; pfSpec.objectSet = new ObjectSpec[] { oSpec }; Console.WriteLine("Updates being displayed...Press Ctrl-Break to exit"); PM.Register(pfSpec, false, new PropertyFilterUpdateHandler(DisplayUpdates)); while (true) { System.Threading.Thread.Sleep(100); } }
private PropertyFilterSpec createEventFilterSpec() { // Set up a PropertySpec to use the latestPage attribute // of the EventHistoryCollector PropertySpec propSpec = new PropertySpec(); propSpec.all = false; propSpec.pathSet=new String[] { "latestPage" }; propSpec.type =_eventHistoryCollector.type; // PropertySpecs are wrapped in a PropertySpec array PropertySpec[] propSpecAry = new PropertySpec[] { propSpec }; // Set up an ObjectSpec with the above PropertySpec for the // EventHistoryCollector we just created // as the Root or Starting Object to get Attributes for. ObjectSpec objSpec = new ObjectSpec(); objSpec.obj =_eventHistoryCollector; objSpec.skip = false; // Get Event objects in "latestPage" from "EventHistoryCollector" // and no "traversl" further, so, no SelectionSpec is specified objSpec.selectSet= new SelectionSpec[] { }; // ObjectSpecs are wrapped in an ObjectSpec array ObjectSpec[] objSpecAry = new ObjectSpec[] { objSpec }; PropertyFilterSpec spec = new PropertyFilterSpec(); spec.propSet= propSpecAry; spec.objectSet= objSpecAry; return spec; }
private PropertyFilterSpec[] createPFSForRecentTasks( ManagedObjectReference taskManagerRef) { PropertySpec pSpec = new PropertySpec(); pSpec.all= false; pSpec.type="Task"; pSpec.pathSet= new String[] {"info.entity", "info.entityName", "info.name", "info.state", "info.cancelled", "info.error"}; ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = taskManagerRef; oSpec.skip= false; oSpec.skipSpecified = true; TraversalSpec tSpec = new TraversalSpec(); tSpec.type="TaskManager"; tSpec.path="recentTask"; tSpec.skip= false; oSpec.selectSet=new SelectionSpec[]{tSpec}; PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.propSet=new PropertySpec[]{pSpec}; pfSpec.objectSet=new ObjectSpec[]{oSpec}; return new PropertyFilterSpec[]{pfSpec}; }
/** * Create Property Collector Filter to get names of all * ScheduledTasks the ScheduledTaskManager has. * * @return PropertyFilterSpec to get properties */ private PropertyFilterSpec createTaskPropertyFilterSpec() { // The traversal spec traverses the "scheduledTask" property of // ScheduledTaskManager to get names of ScheduledTask ManagedEntities // A Traversal Spec allows traversal into a ManagedObjects // using a single attribute of the managedObject TraversalSpec scheduledTaskTraversal = new TraversalSpec(); scheduledTaskTraversal.type=_scheduleManager.type; scheduledTaskTraversal.path= "scheduledTask"; // We want to get values of the scheduleTask property // of the scheduledTaskManager, which are the ScheduledTasks // so we set skip = false. scheduledTaskTraversal.skip= false; scheduledTaskTraversal.skipSpecified = true; // no further traversal needed once we get to scheduled task list scheduledTaskTraversal.selectSet=new SelectionSpec[] { }; scheduledTaskTraversal.name="scheduleManagerToScheduledTasks"; // Setup a PropertySpec to return names of Scheduled Tasks so // we can find the named ScheduleTask ManagedEntity to delete // Name is an attribute of ScheduledTaskInfo so // the path set will contain "info.name" PropertySpec propSpec = new PropertySpec(); propSpec.all= false; propSpec.allSpecified= true; propSpec.pathSet= new String[] { "info.name" }; propSpec.type="ScheduledTask"; // PropertySpecs are wrapped in a PropertySpec array // since we only have a propertySpec for the ScheduledTask, // the only values we will get back are names of scheduledTasks PropertySpec[] propSpecArray = new PropertySpec[] { propSpec }; // Create an Object Spec to specify the starting or root object // and the SelectionSpec to traverse to each ScheduledTask in the // array of scheduledTasks in the ScheduleManager ObjectSpec objSpec = new ObjectSpec(); objSpec.obj=_scheduleManager; objSpec.selectSet= new SelectionSpec[] { scheduledTaskTraversal } ; // Set skip = true so properties of ScheduledTaskManager // are not returned, and only values of info.name property of // each ScheduledTask is returned objSpec.skip = true; objSpec.skipSpecified= true; // ObjectSpecs used in PropertyFilterSpec are wrapped in an array ObjectSpec[] objSpecArray = new ObjectSpec[] { objSpec }; // Create the PropertyFilter spec with // ScheduledTaskManager as "root" object PropertyFilterSpec spec = new PropertyFilterSpec(); spec.propSet = propSpecArray; spec.objectSet= objSpecArray; return spec; }
/* * getProperties -- * * Retrieves the specified set of properties for the given managed object * reference into an array of result objects (returned in the same oder * as the property list). */ public static Object[] getProperties(ManagedObjectReference moRef, String[] properties) { // PropertySpec specifies what properties to // retrieve and from type of Managed Object PropertySpec pSpec = new PropertySpec(); pSpec.type = moRef.type; pSpec.pathSet = properties; // ObjectSpec specifies the starting object and // any TraversalSpecs used to specify other objects // for consideration ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = moRef; // PropertyFilterSpec is used to hold the ObjectSpec and // PropertySpec for the call PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.propSet = new PropertySpec[] { pSpec }; pfSpec.objectSet = new ObjectSpec[] { oSpec }; // retrieveProperties() returns the properties // selected from the PropertyFilterSpec ObjectContent[] ocs = new ObjectContent[20]; ocs = ecb._svcUtil.retrievePropertiesEx(_sic.propertyCollector, new PropertyFilterSpec[] { pfSpec }); // Return value, one object for each property specified Object[] ret = new Object[properties.Length]; if (ocs != null) { for (int i = 0; i < ocs.Length; ++i) { ObjectContent oc = ocs[i]; DynamicProperty[] dps = oc.propSet; if (dps != null) { for (int j = 0; j < dps.Length; ++j) { DynamicProperty dp = dps[j]; // find property path index for (int p = 0; p < ret.Length; ++p) { if (properties[p].Equals(dp.name)) { ret[p] = dp.val; } } } } } } return ret; }
protected void AddElement(Profiles.OrderRelationElement element, PropertyBag bag) { const string category = "Provision¶©¹º"; string desc = String.Format("ID := {{{0}}}", element.GetAttribute("Code")); PropertySpec item = new PropertySpec(element.GetAttribute("Name"), 0, category, desc); item.Key = element.GetAttribute("Code"); #if false item.Attributes = new Attribute[] { ReadOnlyAttribute.Yes }; #endif bag.Add(item); }
private static PropertySpec GetProperySpecForProperty(PropertyInfo propertyInfo) { var propertySpec = new PropertySpec(propertyInfo.Name, propertyInfo.PropertyType); var attributeList = new List<Attribute>(); foreach(object attrib in propertyInfo.GetCustomAttributes(true)) if (attrib is Attribute) attributeList.Add(attrib as Attribute); if (propertyInfo.GetSetMethod()==null) { attributeList.Add(new ReadOnlyAttribute(true)); } propertySpec.Attributes = attributeList.ToArray(); return propertySpec; }
protected override bool DoDefineMembers() { var action = Module.PredefinedTypes.Action.Resolve(); if (action != null) { continuation = AddCompilerGeneratedField("$continuation", new TypeExpression(action, Location), true); continuation.ModFlags |= Modifiers.READONLY; } PredefinedType builder_type; PredefinedMember <MethodSpec> bf; PredefinedMember <MethodSpec> sr; PredefinedMember <MethodSpec> se; bool has_task_return_type = false; var pred_members = Module.PredefinedMembers; if (return_type.Kind == MemberKind.Void) { builder_type = Module.PredefinedTypes.AsyncVoidMethodBuilder; bf = pred_members.AsyncVoidMethodBuilderCreate; sr = pred_members.AsyncVoidMethodBuilderSetResult; se = pred_members.AsyncVoidMethodBuilderSetException; } else if (return_type == Module.PredefinedTypes.Task.TypeSpec) { builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilder; bf = pred_members.AsyncTaskMethodBuilderCreate; sr = pred_members.AsyncTaskMethodBuilderSetResult; se = pred_members.AsyncTaskMethodBuilderSetException; task = pred_members.AsyncTaskMethodBuilderTask.Get(); } else { builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilderGeneric; bf = pred_members.AsyncTaskMethodBuilderGenericCreate; sr = pred_members.AsyncTaskMethodBuilderGenericSetResult; se = pred_members.AsyncTaskMethodBuilderGenericSetException; task = pred_members.AsyncTaskMethodBuilderGenericTask.Get(); has_task_return_type = true; } set_result = sr.Get(); set_exception = se.Get(); var builder_factory = bf.Get(); if (!builder_type.Define() || set_result == null || builder_factory == null || set_exception == null) { Report.Error(1993, Location, "Cannot find compiler required types for asynchronous functions support. Are you targeting the wrong framework version?"); return(base.DoDefineMembers()); } var bt = builder_type.TypeSpec; // // Inflate generic Task types // if (has_task_return_type) { var task_return_type = return_type.TypeArguments; if (mutator != null) { task_return_type = mutator.Mutate(task_return_type); } bt = bt.MakeGenericType(Module, task_return_type); builder_factory = MemberCache.GetMember <MethodSpec> (bt, builder_factory); set_result = MemberCache.GetMember <MethodSpec> (bt, set_result); set_exception = MemberCache.GetMember <MethodSpec> (bt, set_exception); if (task != null) { task = MemberCache.GetMember <PropertySpec> (bt, task); } } builder = AddCompilerGeneratedField("$builder", new TypeExpression(bt, Location)); builder.ModFlags |= Modifiers.READONLY; if (!base.DoDefineMembers()) { return(false); } MethodGroupExpr mg; var block = instance_constructors[0].Block; // // Initialize continuation with state machine method // if (continuation != null) { var args = new Arguments(1); mg = MethodGroupExpr.CreatePredefined(StateMachineMethod.Spec, spec, Location); args.Add(new Argument(mg)); block.AddStatement( new StatementExpression(new SimpleAssign( new FieldExpr(continuation, Location), new NewDelegate(action, args, Location), Location ))); } mg = MethodGroupExpr.CreatePredefined(builder_factory, bt, Location); block.AddStatement( new StatementExpression(new SimpleAssign( new FieldExpr(builder, Location), new Invocation(mg, new Arguments(0)), Location))); if (has_task_return_type) { hoisted_return = LocalVariable.CreateCompilerGenerated(bt.TypeArguments[0], block, Location); } return(true); }
public override bool Resolve(BlockContext bc) { if (bc.CurrentBlock is Linq.QueryBlock) { bc.Report.Error(1995, loc, "The `await' operator may only be used in a query expression within the first collection expression of the initial `from' clause or within the collection expression of a `join' clause"); return(false); } if (!base.Resolve(bc)) { return(false); } Arguments args = new Arguments(0); type = expr.Type; // // The await expression is of dynamic type // if (type.BuiltinType == BuiltinTypeSpec.Type.Dynamic) { result_type = type; expr = new Invocation(new MemberAccess(expr, "GetAwaiter"), args).Resolve(bc); return(true); } // // Check whether the expression is awaitable // Expression ama = new AwaitableMemberAccess(expr).Resolve(bc); if (ama == null) { return(false); } var errors_printer = new SessionReportPrinter(); var old = bc.Report.SetPrinter(errors_printer); ama = new Invocation(ama, args).Resolve(bc); bc.Report.SetPrinter(old); if (errors_printer.ErrorsCount > 0 || !MemberAccess.IsValidDotExpression(ama.Type)) { bc.Report.Error(1986, expr.Location, "The `await' operand type `{0}' must have suitable GetAwaiter method", expr.Type.GetSignatureForError()); return(false); } var awaiter_type = ama.Type; expr = ama; // // Predefined: bool IsCompleted { get; } // is_completed = MemberCache.FindMember(awaiter_type, MemberFilter.Property("IsCompleted", bc.Module.Compiler.BuiltinTypes.Bool), BindingRestriction.InstanceOnly) as PropertySpec; if (is_completed == null || !is_completed.HasGet) { Error_WrongAwaiterPattern(bc, awaiter_type); return(false); } // // Predefined: GetResult () // // The method return type is also result type of await expression // get_result = MemberCache.FindMember(awaiter_type, MemberFilter.Method("GetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, null), BindingRestriction.InstanceOnly) as MethodSpec; if (get_result == null) { Error_WrongAwaiterPattern(bc, awaiter_type); return(false); } // // Predefined: INotifyCompletion.OnCompleted (System.Action) // var nc = bc.Module.PredefinedTypes.INotifyCompletion; if (nc.Define() && !awaiter_type.ImplementsInterface(nc.TypeSpec, false)) { bc.Report.Error(4027, loc, "The awaiter type `{0}' must implement interface `{1}'", awaiter_type.GetSignatureForError(), nc.GetSignatureForError()); return(false); } result_type = get_result.ReturnType; return(true); }
/// <summary> /// Make a new PropertySpec for a property named 'propertyName'. /// For convenience you can set he 'next' field to form a linked /// list of PropertySpecs. /// </summary> public PropertySpec(string propertyName, PropertySpec next = null) { Next = next; _propertyName = propertyName; }
///<summary> /// Specifications to find all Networks in a Datacenter, /// list all VMs on each Network, /// list all Hosts on each Network ///</summary> private static ObjectContent[] getNetworkInfo( ManagedObjectReference dcMoRef) { // PropertySpec specifies what properties to // retrieve from what type of Managed Object // This spec selects the Network name PropertySpec networkPropSpec = new PropertySpec(); networkPropSpec.type = "Network"; networkPropSpec.pathSet = new String[] { "name" }; // This spec selects HostSystem information PropertySpec hostPropSpec = new PropertySpec(); hostPropSpec.type = "HostSystem"; hostPropSpec.pathSet = new String[] { "network", "name", "summary.hardware", "runtime.connectionState", "summary.overallStatus", "summary.quickStats" }; // This spec selects VirtualMachine information PropertySpec vmPropSpec = new PropertySpec(); vmPropSpec.type = "VirtualMachine"; vmPropSpec.pathSet = new String[] { "network", "name", "runtime.host", "runtime.powerState", "summary.overallStatus", "summary.quickStats" }; // The following TraversalSpec and SelectionSpec // objects create the following relationship: // // a. Datacenter -> network // b. Network -> host // c. Network -> vm // b. Traverse from a Network through the 'host' property TraversalSpec network2host = new TraversalSpec(); network2host.type = "Network"; network2host.path = "host"; // c. Traverse from a Network through the 'vm' property TraversalSpec network2vm = new TraversalSpec(); network2vm.type = "Network"; network2vm.path = "vm"; // a. Traverse from a Datacenter through // the 'network' property TraversalSpec dc2network = new TraversalSpec(); dc2network.type = "Datacenter"; dc2network.path = "network"; dc2network.selectSet = new SelectionSpec[] { // Add b. traversal network2host, // Add c. traversal network2vm }; // ObjectSpec specifies the starting object and // any TraversalSpecs used to specify other objects // for consideration ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = dcMoRef; oSpec.skip = true; oSpec.selectSet = new SelectionSpec[] { dc2network }; // PropertyFilterSpec is used to hold the ObjectSpec and // PropertySpec for the call PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.propSet = new PropertySpec[] { networkPropSpec, hostPropSpec, vmPropSpec }; pfSpec.objectSet = new ObjectSpec[] { oSpec }; // RetrieveProperties() returns the properties // selected from the PropertyFilterSpec return _service.RetrieveProperties( _sic.propertyCollector, new PropertyFilterSpec[] { pfSpec }); }
/// <summary> /// This code takes an array of [typename, property, property, ...] /// and converts it into a ContainerFilterSpec array. /// handles case where multiple references to the same typename /// are specified. /// </summary> /// <param name="typeinfo">array pf [typename, property, property, ...]</param> /// <returns>array of container property specs</returns> public PropertySpec[] BuildPropertySpecArray( string[][] typeinfo ) { // Eliminate duplicates Hashtable tInfo = new Hashtable(); for (int ti = 0; ti < typeinfo.Length; ++ti) { Hashtable props = (Hashtable)tInfo[typeinfo[ti][0]]; if (props == null) { props = new Hashtable(); tInfo[typeinfo[ti][0]] = props; } bool typeSkipped = false; for (int pi = 0; pi < typeinfo[ti].Length; ++pi) { String prop = typeinfo[ti][pi]; if (typeSkipped) { if (!props.Contains(prop)) { // some value, not important props[prop] = String.Empty; } } else { typeSkipped = true; } } } // Create PropertySpecs ArrayList pSpecs = new ArrayList(); foreach (String type in tInfo.Keys) { PropertySpec pSpec = new PropertySpec(); Hashtable props = (Hashtable)tInfo[type]; pSpec.type = type; pSpec.all = props.Count == 0 ? true : false; pSpec.pathSet = new String[props.Count]; int index = 0; foreach (String prop in props.Keys) { pSpec.pathSet[index++] = prop; } pSpecs.Add(pSpec); } return (PropertySpec[])pSpecs.ToArray(typeof(PropertySpec)); }
protected override bool DoDefineMembers() { PredefinedType builder_type; PredefinedMember <MethodSpec> bf; PredefinedMember <MethodSpec> bs; PredefinedMember <MethodSpec> sr; PredefinedMember <MethodSpec> se; PredefinedMember <MethodSpec> sm; bool has_task_return_type = false; var pred_members = Module.PredefinedMembers; if (return_type.Kind == MemberKind.Void) { builder_type = Module.PredefinedTypes.AsyncVoidMethodBuilder; bf = pred_members.AsyncVoidMethodBuilderCreate; bs = pred_members.AsyncVoidMethodBuilderStart; sr = pred_members.AsyncVoidMethodBuilderSetResult; se = pred_members.AsyncVoidMethodBuilderSetException; sm = pred_members.AsyncVoidMethodBuilderSetStateMachine; } else if (return_type == Module.PredefinedTypes.Task.TypeSpec) { builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilder; bf = pred_members.AsyncTaskMethodBuilderCreate; bs = pred_members.AsyncTaskMethodBuilderStart; sr = pred_members.AsyncTaskMethodBuilderSetResult; se = pred_members.AsyncTaskMethodBuilderSetException; sm = pred_members.AsyncTaskMethodBuilderSetStateMachine; task = pred_members.AsyncTaskMethodBuilderTask.Get(); } else { builder_type = Module.PredefinedTypes.AsyncTaskMethodBuilderGeneric; bf = pred_members.AsyncTaskMethodBuilderGenericCreate; bs = pred_members.AsyncTaskMethodBuilderGenericStart; sr = pred_members.AsyncTaskMethodBuilderGenericSetResult; se = pred_members.AsyncTaskMethodBuilderGenericSetException; sm = pred_members.AsyncTaskMethodBuilderGenericSetStateMachine; task = pred_members.AsyncTaskMethodBuilderGenericTask.Get(); has_task_return_type = true; } set_result = sr.Get(); set_exception = se.Get(); builder_factory = bf.Get(); builder_start = bs.Get(); var istate_machine = Module.PredefinedTypes.IAsyncStateMachine; var set_statemachine = sm.Get(); if (!builder_type.Define() || !istate_machine.Define() || set_result == null || builder_factory == null || set_exception == null || set_statemachine == null || builder_start == null || !Module.PredefinedTypes.INotifyCompletion.Define()) { Report.Error(1993, Location, "Cannot find compiler required types for asynchronous functions support. Are you targeting the wrong framework version?"); return(base.DoDefineMembers()); } var bt = builder_type.TypeSpec; // // Inflate generic Task types // if (has_task_return_type) { var task_return_type = return_type.TypeArguments; if (mutator != null) { task_return_type = mutator.Mutate(task_return_type); } bt = bt.MakeGenericType(Module, task_return_type); set_result = MemberCache.GetMember(bt, set_result); set_exception = MemberCache.GetMember(bt, set_exception); set_statemachine = MemberCache.GetMember(bt, set_statemachine); if (task != null) { task = MemberCache.GetMember(bt, task); } } builder = AddCompilerGeneratedField("$builder", new TypeExpression(bt, Location)); var set_state_machine = new Method(this, new TypeExpression(Compiler.BuiltinTypes.Void, Location), Modifiers.COMPILER_GENERATED | Modifiers.DEBUGGER_HIDDEN | Modifiers.PUBLIC, new MemberName("SetStateMachine"), ParametersCompiled.CreateFullyResolved( new Parameter(new TypeExpression(istate_machine.TypeSpec, Location), "stateMachine", Parameter.Modifier.NONE, null, Location), istate_machine.TypeSpec), null); ToplevelBlock block = new ToplevelBlock(Compiler, set_state_machine.ParameterInfo, Location); block.IsCompilerGenerated = true; set_state_machine.Block = block; Members.Add(set_state_machine); if (!base.DoDefineMembers()) { return(false); } // // Fabricates SetStateMachine method // // public void SetStateMachine (IAsyncStateMachine stateMachine) // { // $builder.SetStateMachine (stateMachine); // } // var mg = MethodGroupExpr.CreatePredefined(set_statemachine, bt, Location); mg.InstanceExpression = new FieldExpr(builder, Location); var param_reference = block.GetParameterReference(0, Location); param_reference.Type = istate_machine.TypeSpec; param_reference.eclass = ExprClass.Variable; var args = new Arguments(1); args.Add(new Argument(param_reference)); set_state_machine.Block.AddStatement(new StatementExpression(new Invocation(mg, args))); if (has_task_return_type) { hoisted_return = LocalVariable.CreateCompilerGenerated(bt.TypeArguments[0], StateMachineMethod.Block, Location); } return(true); }
private static ObjectContent[] getVMInfo(ManagedObjectReference vmMoRef) { // This spec selects VirtualMachine information PropertySpec vmPropSpec = new PropertySpec(); vmPropSpec.type = "VirtualMachine"; vmPropSpec.pathSet = new String[] { "name", "config.guestFullName", "config.hardware.memoryMB", "config.hardware.numCPU", "guest.toolsStatus", "guestHeartbeatStatus", "guest.ipAddress", "guest.hostName", "runtime.powerState", "summary.quickStats.overallCpuUsage", "summary.quickStats.hostMemoryUsage", "summary.quickStats.guestMemoryUsage", }; PropertySpec hostPropSpec = new PropertySpec(); hostPropSpec.type = "HostSystem"; hostPropSpec.pathSet = new String[] { "name" }; PropertySpec taskPropSpec = new PropertySpec(); taskPropSpec.type = "Task"; taskPropSpec.pathSet = new String[] { "info.name", "info.completeTime" }; PropertySpec datastorePropSpec = new PropertySpec(); datastorePropSpec.type = "Datastore"; datastorePropSpec.pathSet = new String[] { "info" }; PropertySpec networkPropSpec = new PropertySpec(); networkPropSpec.type = "Network"; networkPropSpec.pathSet = new String[] { "name" }; TraversalSpec hostTraversalSpec = new TraversalSpec(); hostTraversalSpec.type = "VirtualMachine"; hostTraversalSpec.path = "runtime.host"; TraversalSpec taskTravesalSpec = new TraversalSpec(); taskTravesalSpec.type = "VirtualMachine"; taskTravesalSpec.path = "recentTask"; TraversalSpec datastoreTraversalSpec = new TraversalSpec(); datastoreTraversalSpec.type = "VirtualMachine"; datastoreTraversalSpec.path = "datastore"; TraversalSpec networkTraversalSpec = new TraversalSpec(); networkTraversalSpec.type = "VirtualMachine"; networkTraversalSpec.path = "network"; // ObjectSpec specifies the starting object and // any TraversalSpecs used to specify other objects // for consideration ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = vmMoRef; // Add the TraversalSpec objects to the ObjectSpec // This specifies what additional object we want to // consider during the process. oSpec.selectSet = new SelectionSpec[] { hostTraversalSpec, taskTravesalSpec, datastoreTraversalSpec, networkTraversalSpec }; PropertyFilterSpec pfSpec = new PropertyFilterSpec(); // Add the PropertySpec objects to the PropertyFilterSpec // This specifies what data we want to collect while // processing the found objects from the ObjectSpec pfSpec.propSet = new PropertySpec[] { vmPropSpec, hostPropSpec, taskPropSpec, datastorePropSpec, networkPropSpec }; pfSpec.objectSet = new ObjectSpec[] { oSpec }; return _service.RetrieveProperties( _sic.propertyCollector, new PropertyFilterSpec[] { pfSpec }); }
///<summary> ///Specifications to find all the Datacenters and ///retrieve their name, vmFolder and hostFolder values. ///</summary> private static ObjectContent[] getDatacenters() { // The PropertySpec object specifies what properties // to retrieve from what type of Managed Object PropertySpec pSpec = new PropertySpec(); pSpec.type = "Datacenter"; pSpec.pathSet = new String[] { "name", "vmFolder", "hostFolder" }; // The following TraversalSpec and SelectionSpec // objects create the following relationship: // // a. Folder -> childEntity // b. recurse to a. // // This specifies that starting with a Folder // managed object, traverse through its childEntity // property. For each element in the childEntity // property, process by going back to the 'parent' // TraversalSpec. // SelectionSpec to cause Folder recursion SelectionSpec recurseFolders = new SelectionSpec(); // The name of a SelectionSpec must refer to a // TraversalSpec with the same name value. recurseFolders.name = "folder2childEntity"; // Traverse from a Folder through the 'childEntity' property TraversalSpec folder2childEntity = new TraversalSpec(); // Select the Folder type managed object folder2childEntity.type = "Folder"; // Traverse through the childEntity property of the Folder folder2childEntity.path = "childEntity"; // Name this TraversalSpec so the SelectionSpec above // can refer to it folder2childEntity.name = recurseFolders.name; // Add the SelectionSpec above to this traversal so that // we will recurse through the tree via the childEntity // property folder2childEntity.selectSet = new SelectionSpec[] { recurseFolders }; // The ObjectSpec object specifies the starting object and // any TraversalSpecs used to specify other objects // for consideration ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = _sic.rootFolder; // We set skip to true because we are not interested // in retrieving properties from the root Folder oSpec.skip = true; // Specify the TraversalSpec. This is what causes // other objects besides the starting object to // be considered part of the collection process oSpec.selectSet = new SelectionSpec[] { folder2childEntity }; // The PropertyFilterSpec object is used to hold the // ObjectSpec and PropertySpec objects for the call PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.propSet = new PropertySpec[] { pSpec }; pfSpec.objectSet = new ObjectSpec[] { oSpec }; // RetrieveProperties() returns the properties // selected from the PropertyFilterSpec return _service.RetrieveProperties( _sic.propertyCollector, new PropertyFilterSpec[] { pfSpec }); }
///<summary> /// Specifications to find all the VMs in a Datacenter and /// retrieve their name and runtime.powerState values. ///</summary> private static ObjectContent[] getVMs(ManagedObjectReference dcMoRef) { // The PropertySpec object specifies what properties // retrieve from what type of Managed Object PropertySpec pSpec = new PropertySpec(); pSpec.type = "VirtualMachine"; pSpec.pathSet = new String[] { "name", "runtime.powerState" }; SelectionSpec recurseFolders = new SelectionSpec(); recurseFolders.name = "folder2childEntity"; TraversalSpec folder2childEntity = new TraversalSpec(); folder2childEntity.type = "Folder"; folder2childEntity.path = "childEntity"; folder2childEntity.name = recurseFolders.name; folder2childEntity.selectSet = new SelectionSpec[] { recurseFolders }; // Traverse from a Datacenter through the 'vmFolder' property TraversalSpec dc2vmFolder = new TraversalSpec(); dc2vmFolder.type = "Datacenter"; dc2vmFolder.path = "vmFolder"; dc2vmFolder.selectSet = new SelectionSpec[] { folder2childEntity }; ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = dcMoRef; oSpec.skip = true; oSpec.selectSet = new SelectionSpec[] { dc2vmFolder }; PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.propSet = new PropertySpec[] { pSpec }; pfSpec.objectSet = new ObjectSpec[] { oSpec }; return _service.RetrieveProperties(_sic.propertyCollector, new PropertyFilterSpec[] { pfSpec }); }
/// <summary> /// Return MOR /// </summary> /// <param name="folder">ManagedObjectReference</param> /// <param name="type">string</param> /// <param name="name">string</param> /// <returns>ManagedObjectReference</returns> public ManagedObjectReference GetMOREFsInFolderByType(ManagedObjectReference folder, string type, string name) { String propName = "name"; string[] type1 = new string[2]; type1[0] = type; ManagedObjectReference viewManager = cb._connection._sic.viewManager; ManagedObjectReference containerView = cb._connection._service.CreateContainerView(viewManager, folder, type1, true); PropertySpec propertySpec = new PropertySpec(); propertySpec.all = false; propertySpec.type = type; propertySpec.pathSet = new string[] { propName }; TraversalSpec ts = new TraversalSpec(); ts.name = "view"; ts.path = "view"; ts.skip = false; ts.type = "ContainerView"; // Now create Object Spec ObjectSpec objectSpec = new ObjectSpec(); objectSpec.obj = containerView; objectSpec.skip = true; objectSpec.selectSet = new SelectionSpec[] { ts }; // Create PropertyFilterSpec using the PropertySpec and ObjectPec // created above. PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec(); propertyFilterSpec.propSet = new PropertySpec[] { propertySpec }; propertyFilterSpec.objectSet = new ObjectSpec[] { objectSpec }; PropertyFilterSpec[] filterspec = new PropertyFilterSpec[3]; filterspec[0] = propertyFilterSpec; ObjectContent[] ocary = cb._svcUtil.retrievePropertiesEx(cb._connection._sic.propertyCollector, filterspec); if (ocary == null || ocary.Length == 0) { return null; } ObjectContent oc = null; ManagedObjectReference mor = null; DynamicProperty[] propary = null; string propval = null; bool found = false; for (int oci = 0; oci < ocary.Length && !found; oci++) { oc = ocary[oci]; mor = oc.obj; propary = oc.propSet; if ((type == null) || (type != null && cb._svcUtil.typeIsA(type, mor.type))) { if (propary.Length > 0) { propval = (string)propary[0].val; } found = propval != null && name.Equals(propval); propval = null; } } if (!found) { mor = null; } return mor; }
public override bool Resolve(BlockContext bc) { if (!base.Resolve(bc)) { return(false); } Arguments args = new Arguments(0); type = expr.Type; // // The await expression is of dynamic type // if (type.BuiltinType == BuiltinTypeSpec.Type.Dynamic) { result_type = type; awaiter = ((AsyncTaskStorey)machine_initializer.Storey).AddAwaiter(type, loc); expr = new Invocation(new MemberAccess(expr, "GetAwaiter"), args).Resolve(bc); return(true); } // // Check whether the expression is awaitable // Expression ama = new AwaitableMemberAccess(expr).Resolve(bc); if (ama == null) { return(false); } var errors_printer = new SessionReportPrinter(); var old = bc.Report.SetPrinter(errors_printer); ama = new Invocation(ama, args).Resolve(bc); bc.Report.SetPrinter(old); if (errors_printer.ErrorsCount > 0 || !MemberAccess.IsValidDotExpression(ama.Type)) { bc.Report.Error(1986, expr.Location, "The `await' operand type `{0}' must have suitable GetAwaiter method", expr.Type.GetSignatureForError()); return(false); } var awaiter_type = ama.Type; awaiter = ((AsyncTaskStorey)machine_initializer.Storey).AddAwaiter(awaiter_type, loc); expr = ama; // // Predefined: bool IsCompleted { get; } // is_completed = MemberCache.FindMember(awaiter_type, MemberFilter.Property("IsCompleted", bc.Module.Compiler.BuiltinTypes.Bool), BindingRestriction.InstanceOnly) as PropertySpec; if (is_completed == null || !is_completed.HasGet) { Error_WrongAwaiterPattern(bc, awaiter_type); return(false); } // // Predefined: OnCompleted (Action) // if (bc.Module.PredefinedTypes.Action.Define()) { on_completed = MemberCache.FindMember(awaiter_type, MemberFilter.Method("OnCompleted", 0, ParametersCompiled.CreateFullyResolved(bc.Module.PredefinedTypes.Action.TypeSpec), bc.Module.Compiler.BuiltinTypes.Void), BindingRestriction.InstanceOnly) as MethodSpec; if (on_completed == null) { Error_WrongAwaiterPattern(bc, awaiter_type); return(false); } } // // Predefined: GetResult () // // The method return type is also result type of await expression // get_result = MemberCache.FindMember(awaiter_type, MemberFilter.Method("GetResult", 0, ParametersCompiled.EmptyReadOnlyParameters, null), BindingRestriction.InstanceOnly) as MethodSpec; if (get_result == null) { Error_WrongAwaiterPattern(bc, awaiter_type); return(false); } result_type = get_result.ReturnType; return(true); }
static ObjectContent[] getVMInfo(ManagedObjectReference vmMoRef) { // This spec selects VirtualMachine information PropertySpec vmPropSpec = new PropertySpec(); vmPropSpec.type = "VirtualMachine"; vmPropSpec.pathSet = new String[]{"name","config.guestFullName","summary.quickStats.overallCpuUsage","summary.quickStats.hostMemoryUsage","summary.quickStats.guestMemoryUsage"}; PropertySpec hostPropSpec = new PropertySpec(); hostPropSpec.type = "HostSystem"; hostPropSpec.pathSet = new String[] { "name", "summary.quickStats.overallCpuUsage", "summary.quickStats.overallMemoryUsage", }; TraversalSpec hostTraversalSpec = new TraversalSpec(); hostTraversalSpec.type = "VirtualMachine"; hostTraversalSpec.path = "runtime.host"; ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = vmMoRef; oSpec.selectSet = new SelectionSpec[]{hostTraversalSpec}; PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.propSet = new PropertySpec[]{vmPropSpec,hostPropSpec}; pfSpec.objectSet = new ObjectSpec[]{oSpec}; return _service.RetrieveProperties(_sic.propertyCollector,new PropertyFilterSpec[]{pfSpec}); }
public void SetProperty(PropertySpec property, object propertyValue) { Context.SetProperty(this, property, propertyValue); }
/// <summary> /// Get Container contents for all childEntities accessible from rootFolder /// </summary> public void GetContainerContents() { // Create a Filter Spec to Retrieve Contents for... TraversalSpec rpToVm = new TraversalSpec(); rpToVm.name = "rpToVm"; rpToVm.type = "ResourcePool"; rpToVm.path = "vm"; rpToVm.skip = false; // Recurse through all ResourcePools TraversalSpec rpToRp = new TraversalSpec(); rpToRp.name = "rpToRp"; rpToRp.type = "ResourcePool"; rpToRp.path = "resourcePool"; rpToRp.skip = false; rpToRp.selectSet = new SelectionSpec[] { new SelectionSpec(), new SelectionSpec() }; rpToRp.selectSet[0].name = "rpToRp"; rpToRp.selectSet[1].name = "rpToVm"; // Traversal through ResourcePool branch TraversalSpec crToRp = new TraversalSpec(); crToRp.name = "crToRp"; crToRp.type = "ComputeResource"; crToRp.path = "resourcePool"; crToRp.skip = false; crToRp.selectSet = new SelectionSpec[] { new SelectionSpec(), new SelectionSpec() }; crToRp.selectSet[0].name = "rpToRp"; crToRp.selectSet[1].name = "rpToVm"; // Traversal through host branch TraversalSpec crToH = new TraversalSpec(); crToH.name = "crToH"; crToH.type = "ComputeResource"; crToH.path = "host"; crToH.skip = false; // Traversal through hostFolder branch TraversalSpec dcToHf = new TraversalSpec(); dcToHf.name = "dcToHf"; dcToHf.type = "Datacenter"; dcToHf.path = "hostFolder"; dcToHf.skip = false; dcToHf.selectSet = new SelectionSpec[] { new SelectionSpec() }; dcToHf.selectSet[0].name = "visitFolders"; // Traversal through vmFolder branch TraversalSpec dcToVmf = new TraversalSpec(); dcToVmf.name = "dcToVmf"; dcToVmf.type = "Datacenter"; dcToVmf.path = "vmFolder"; dcToVmf.skip = false; dcToVmf.selectSet = new SelectionSpec[] { new SelectionSpec() }; dcToVmf.selectSet[0].name = "visitFolders"; // Recurse through all Hosts TraversalSpec HToVm = new TraversalSpec(); HToVm.name = "HToVm"; HToVm.type = "HostSystem"; HToVm.path = "vm"; HToVm.skip = false; HToVm.selectSet = new SelectionSpec[] { new SelectionSpec() }; HToVm.selectSet[0].name = "visitFolders"; // Recurse thriugh the folders TraversalSpec visitFolders = new TraversalSpec(); visitFolders.name = "visitFolders"; visitFolders.type = "Folder"; visitFolders.path = "childEntity"; visitFolders.skip = false; visitFolders.selectSet = new SelectionSpec[] { new SelectionSpec(), new SelectionSpec(), new SelectionSpec(), new SelectionSpec(), new SelectionSpec(), new SelectionSpec(), new SelectionSpec() }; visitFolders.selectSet[0].name = "visitFolders"; visitFolders.selectSet[1].name = "dcToHf"; visitFolders.selectSet[2].name = "dcToVmf"; visitFolders.selectSet[3].name = "crToH"; visitFolders.selectSet[4].name = "crToRp"; visitFolders.selectSet[5].name = "HToVm"; visitFolders.selectSet[6].name = "rpToVm"; SelectionSpec[] selectionSpecs = new SelectionSpec[] { visitFolders, dcToVmf, dcToHf, crToH, crToRp, rpToRp, HToVm, rpToVm }; PropertySpec[] propspecary = new PropertySpec[] { new PropertySpec() }; propspecary[0].all = false; propspecary[0].allSpecified = true; propspecary[0].pathSet = new string[] { "name" }; propspecary[0].type = "ManagedEntity"; PropertyFilterSpec spec = new PropertyFilterSpec(); spec.propSet = propspecary; spec.objectSet = new ObjectSpec[] { new ObjectSpec() }; spec.objectSet[0].obj = _rootFolder; spec.objectSet[0].skip = false; spec.objectSet[0].selectSet = selectionSpecs; // Recursively get all ManagedEntity ManagedObjectReferences // and the "name" property for all ManagedEntities retrieved ObjectContent[] ocary = _service.RetrieveProperties( _propCol, new PropertyFilterSpec[] { spec } ); // If we get contents back. print them out. if (ocary != null) { ObjectContent oc = null; ManagedObjectReference mor = null; DynamicProperty[] pcary = null; DynamicProperty pc = null; for (int oci = 0; oci < ocary.Length; oci++) { oc = ocary[oci]; mor = oc.obj; pcary = oc.propSet; Console.WriteLine("Object Type : " + mor.type); Console.WriteLine("Reference Value : " + mor.Value); if (pcary != null) { for (int pci = 0; pci < pcary.Length; pci++) { pc = pcary[pci]; Console.WriteLine(" Property Name : " + pc.name); if (pc != null) { if (!pc.val.GetType().IsArray) { Console.WriteLine(" Property Value : " + pc.val); } else { Array ipcary = (Array)pc.val; Console.WriteLine("Val : " + pc.val); for (int ii = 0; ii < ipcary.Length; ii++) { object oval = ipcary.GetValue(ii); if (oval.GetType().Name.IndexOf("ManagedObjectReference") >= 0) { ManagedObjectReference imor = (ManagedObjectReference)oval; Console.WriteLine("Inner Object Type : " + imor.type); Console.WriteLine("Inner Reference Value : " + imor.Value); } else { Console.WriteLine("Inner Property Value : " + oval); } } } } } } } } else { Console.WriteLine("No Managed Entities retrieved!"); } }
private Object[] getProperties(VimService service, ManagedObjectReference moRef, String[] properties) { PropertySpec pSpec = new PropertySpec(); pSpec.type = moRef.type; pSpec.pathSet = properties; ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = moRef; PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.propSet = (new PropertySpec[] { pSpec }); pfSpec.objectSet = (new ObjectSpec[] { oSpec }); ObjectContent[] ocs = service.RetrieveProperties(sic.propertyCollector, new PropertyFilterSpec[] { pfSpec }); Object[] ret = new Object[properties.Length]; if (ocs != null) { for (int i = 0; i < ocs.Length; ++i) { ObjectContent oc = ocs[i]; DynamicProperty[] dps = oc.propSet; if (dps != null) { for (int j = 0; j < dps.Length; ++j) { DynamicProperty dp = dps[j]; for (int p = 0; p < ret.Length; ++p) { if (properties[p].Equals(dp.name)) { ret[p] = dp.val; } } } } } } return ret; }
private static ObjectContent[] getHosts(ManagedObjectReference dcMoRef) { // PropertySpec specifies what properties to // retrieve from what type of Managed Object PropertySpec pSpec = new PropertySpec(); pSpec.type = "HostSystem"; pSpec.pathSet = new String[] { "name", "runtime.connectionState" }; SelectionSpec recurseFolders = new SelectionSpec(); recurseFolders.name = "folder2childEntity"; TraversalSpec computeResource2host = new TraversalSpec(); computeResource2host.type = "ComputeResource"; computeResource2host.path = "host"; TraversalSpec folder2childEntity = new TraversalSpec(); folder2childEntity.type = "Folder"; folder2childEntity.path = "childEntity"; folder2childEntity.name = recurseFolders.name; // Add BOTH of the specifications to this specification folder2childEntity.selectSet = new SelectionSpec[] { recurseFolders }; // Traverse from a Datacenter through // the 'hostFolder' property TraversalSpec dc2hostFolder = new TraversalSpec(); dc2hostFolder.type = "Datacenter"; dc2hostFolder.path = "hostFolder"; dc2hostFolder.selectSet = new SelectionSpec[] { folder2childEntity }; ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = dcMoRef; oSpec.skip = true; oSpec.selectSet = new SelectionSpec[] { dc2hostFolder }; PropertyFilterSpec pfSpec = new PropertyFilterSpec(); pfSpec.propSet = new PropertySpec[] { pSpec }; pfSpec.objectSet = new ObjectSpec[] { oSpec }; return _service.RetrieveProperties( _sic.propertyCollector, new PropertyFilterSpec[] { pfSpec }); }
/// <summary> /// Get MOR of Datacenter /// </summary> /// <param name="dsMor">ManagedObjectReference</param> /// <returns>ManagedObjectReference</returns> private ManagedObjectReference getDatacenterOfDatastore(ManagedObjectReference dsMor) { ManagedObjectReference datacenter = null; // Create Property Spec PropertySpec propertySpec = new PropertySpec(); propertySpec.all = false; propertySpec.type = "Datacenter"; propertySpec.pathSet = new string[] { "name" }; // Now create Object Spec ObjectSpec objectSpec = new ObjectSpec(); objectSpec.obj = dsMor; objectSpec.skip = true; objectSpec.selectSet = buildTraversalSpecForDatastoreToDatacenter(); // Create PropertyFilterSpec using the PropertySpec and ObjectPec // created above. PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec(); propertyFilterSpec.propSet = new PropertySpec[] { propertySpec }; propertyFilterSpec.objectSet = new ObjectSpec[] { objectSpec }; PropertyFilterSpec[] propertyFilterSpecs = new PropertyFilterSpec[] { propertyFilterSpec }; ObjectContent[] oCont = cb._svcUtil.retrievePropertiesEx(cb._connection._sic.propertyCollector, propertyFilterSpecs); if (oCont != null) { foreach (ObjectContent oc in oCont) { datacenter = oc.obj; break; } } return datacenter; }
public string GetUri(PropertySpec property, object value) { return("http://todo"); }
public TaskWaiter(PropertyManager pm, ManagedObjectReference task) { _task = task; _pm = pm; ObjectSpec oSpec = new ObjectSpec(); oSpec.obj = task; oSpec.skip = false; oSpec.skipSpecified = true; PropertySpec pSpec = new PropertySpec(); pSpec.all = false; pSpec.allSpecified = true; pSpec.pathSet = new String[] { "info.error", "info.state" }; pSpec.type = task.type; _pfSpec = new PropertyFilterSpec(); _pfSpec.objectSet = new ObjectSpec[] { oSpec }; _pfSpec.propSet = new PropertySpec[] { pSpec }; }
public override void Init(ObjectData data) { var version = LevelData.Game.MappingsVersion; var art = LevelData.ReadFile("../Levels/AIZ/Nemesis Art/Swing Vine.bin", CompressionType.Nemesis); var map = LevelData.ASMToBin("../Levels/AIZ/Misc Object Data/Map - (&MHZ) Ride Vine.asm", version); frames = new Sprite[34]; for (int frame = 0; frame < frames.Length; frame++) { frames[frame] = ObjectHelper.MapToBmp(art, map, frame, 0); } spriteData = new int[16][][]; spriteData[5] = new[] { new int[] { 0, -15, -30, -46, -62, -78, -94, -109, -124, -137, -148, -159, -168, -174, -180, -187 }, new int[] { 4, 10, 16, 19, 19, 20, 17, 11, 5, -4, -15, -26, -39, -54, -69, -86 }, new int[] { 33, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15 } }; spriteData[6] = new[] { new int[] { 0, -13, -28, -43, -59, -75, -91, -107, -122, -137, -150, -163, -174, -183, -192, -202 }, new int[] { 4, 13, 19, 25, 28, 28, 29, 26, 20, 14, 5, -4, -15, -28, -41, -57 }, new int[] { 33, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 13, 13, 14 } }; spriteData[7] = new[] { new int[] { 0, -11, -22, -35, -48, -63, -78, -94, -110, -126, -142, -158, -174, -189, -204, -221 }, new int[] { 4, 15, 26, 35, 44, 50, 56, 59, 62, 62, 63, 60, 57, 51, 45, 35 }, new int[] { 33, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11 } }; spriteData[8] = new[] { new int[] { 0, -6, -12, -21, -30, -39, -48, -59, -70, -81, -92, -105, -118, -131, -144, -163 }, new int[] { 4, 19, 34, 47, 60, 73, 86, 97, 108, 119, 130, 139, 148, 157, 166, 172 }, new int[] { 33, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6 } }; spriteData[9] = new[] { new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, new int[] { 4, 20, 36, 52, 68, 84, 100, 116, 132, 148, 164, 180, 196, 212, 228, 244 }, new int[] { 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; spriteData[10] = new[] { new int[] { -1, 5, 11, 17, 26, 35, 44, 53, 64, 75, 86, 97, 110, 123, 136, 146 }, new int[] { 4, 19, 34, 49, 62, 75, 88, 101, 112, 123, 134, 145, 154, 163, 172, 181 }, new int[] { 33, 30, 30, 30, 29, 29, 29, 29, 28, 28, 28, 28, 27, 27, 27, 27 } }; spriteData[11] = new[] { new int[] { -1, 10, 21, 34, 47, 62, 77, 93, 109, 125, 141, 157, 173, 188, 203, 213 }, new int[] { 4, 15, 26, 35, 44, 50, 56, 59, 62, 62, 63, 60, 57, 51, 45, 35 }, new int[] { 33, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21 } }; spriteData[12] = new[] { new int[] { -1, 12, 27, 42, 58, 74, 90, 106, 121, 136, 149, 162, 173, 182, 191, 194 }, new int[] { 4, 13, 19, 25, 28, 28, 29, 26, 20, 14, 5, -4, -15, -28, -41, -57 }, new int[] { 33, 27, 26, 26, 25, 24, 24, 23, 22, 22, 21, 21, 20, 19, 19, 18 } }; spriteData[13] = new[] { new int[] { -1, 12, 27, 43, 59, 75, 91, 106, 121, 134, 145, 156, 165, 171, 177, 177 }, new int[] { 4, 13, 19, 22, 22, 23, 20, 14, 8, -1, -12, -23, -36, -51, -66, -83 }, new int[] { 33, 27, 26, 25, 24, 24, 23, 22, 22, 21, 20, 20, 19, 18, 18, 17 } }; spriteData[14] = spriteData[12]; spriteData[15] = spriteData[11]; spriteData[0] = spriteData[10]; spriteData[1] = spriteData[9]; spriteData[2] = spriteData[8]; spriteData[3] = spriteData[7]; spriteData[4] = spriteData[6]; properties = new PropertySpec[2]; subtypes = new ReadOnlyCollection <byte>(new byte[0]); sprite = SpriteFromSpriteData(0, 0); properties[0] = new PropertySpec("Length", typeof(int), "Extended", "The number of rope segments in the object.", null, (obj) => obj.SubType & 0x0F, (obj, value) => obj.SubType = (byte)((obj.SubType & 0xF0) | (int)value & 0x0F)); properties[1] = new PropertySpec("Offset", typeof(int), "Extended", "The starting point of the object's movement cycle.", null, (obj) => (obj.SubType & 0xF0) >> 4, (obj, value) => obj.SubType = (byte)((obj.SubType & 0x0F) | (((int)value << 4) & 0xF0))); }