/// <summary> /// Initializes a new instance of the <see cref="LocalAssetProxy{T}"/> class. /// </summary> /// <param name="manager"> /// The manager. /// </param> /// <param name="networkAsset"> /// The network asset. /// </param> /// <param name="name"> /// The name. /// </param> /// <param name="instance"> /// The instance. /// </param> public LocalAssetProxy(LocalAssetManager manager, LocalAsset networkAsset, string name, IAsset instance) : base(instance.GetType()) { this.m_Instance = instance; this.m_Manager = manager; this.m_LocalAsset = networkAsset; this.m_AssetName = name; this.m_Dirty = false; this.m_LocalAsset.Dirtied += this.MarkDirty; }
[Test, Ignore] // ignore as long as Shadow Object info is not support by data binary serialization public void TestCreateChildAsset() { // ------------------------- // Init // ------------------------- var localComponentDescriptor = TypeDescriptorFactory.Default.Find(typeof(LocalComponent)); var baseAsset = new LocalAsset { Name = "base", Value = 1 }; baseAsset.Parameters.Set(LocalAsset.StringKey, "string"); var component = new LocalComponent() { Name = "comp1", Position = Vector4.UnitX }; component.SetOverride(localComponentDescriptor["Name"], OverrideType.Sealed); baseAsset.Parameters.Set(LocalAsset.ComponentKey, component); var baseAssetItem = new AssetItem("base1", baseAsset); // Create a child asset var newAsset = (LocalAsset)baseAssetItem.CreateChildAsset(); // ------------------------- // Check base asset // ------------------------- Assert.NotNull(newAsset.Base); Assert.IsFalse(newAsset.Base.IsRootImport); Assert.AreEqual(baseAsset.Id, newAsset.Base.Id); // Check override on member "Name" var newComponent = newAsset.Parameters[LocalAsset.ComponentKey]; var overrideType = newComponent.GetOverride(localComponentDescriptor["Name"]); Assert.AreEqual(OverrideType.Sealed, overrideType); }
public void TestAccessor() { // ------------------------- // Init // ------------------------- var localAssetDescriptor = TypeDescriptorFactory.Default.Find(typeof(LocalAsset)); var localComponentDescriptor = TypeDescriptorFactory.Default.Find(typeof(LocalComponent)); var collectionDescriptor = (DictionaryDescriptor)TypeDescriptorFactory.Default.Find(typeof(CustomParameterCollection)); var baseAsset = new LocalAsset { Name = "base", Value = 1 }; baseAsset.Parameters.Set(LocalAsset.StringKey, "string"); var component = new LocalComponent() { Name = "comp1", Position = Vector4.UnitX }; component.SetOverride(localComponentDescriptor["Name"], OverrideType.Sealed); baseAsset.Parameters.Set(LocalAsset.ComponentKey, component); var baseAssetItem = new AssetItem("base1", baseAsset); // Create a child asset var newAsset = (LocalAsset)baseAssetItem.CreateChildAsset(); var newAssetItem = new AssetItem("new1", newAsset); // ------------------------- // Setup project + assets // ------------------------- var project = new Package(); project.Assets.Add(baseAssetItem); project.Assets.Add(newAssetItem); var session = new PackageSession(project); // Create accessor on new item var accessor = new AssetItemAccessor(newAssetItem); var memberPath = new MemberPath(); memberPath.Push(localAssetDescriptor["Parameters"]); memberPath.Push(collectionDescriptor, LocalAsset.ComponentKey); memberPath.Push(localComponentDescriptor["Name"]); // Get value for member path var memberValue = accessor.TryGetMemberValue(memberPath); Assert.IsTrue(memberValue.IsValid); Assert.AreEqual(OverrideType.Sealed, memberValue.Override); Assert.NotNull(memberValue.OverriderItem); Assert.AreEqual(baseAsset.Id, memberValue.OverriderItem.Id); memberPath.Pop(); memberPath.Push(localComponentDescriptor["Position"]); // Get value for member path memberValue = accessor.TryGetMemberValue(memberPath); Assert.IsTrue(memberValue.IsValid); Assert.AreEqual(OverrideType.Base, memberValue.Override); Assert.NotNull(memberValue.OverriderItem); Assert.AreEqual(baseAsset.Id, memberValue.OverriderItem.Id); // Set Position as a new value newAsset.Parameters[LocalAsset.ComponentKey].SetOverride(localComponentDescriptor["Position"], OverrideType.New); memberValue = accessor.TryGetMemberValue(memberPath); Assert.IsTrue(memberValue.IsValid); Assert.AreEqual(OverrideType.New, memberValue.Override); Assert.IsNull(memberValue.OverriderItem); }
/// <summary> /// The invoke. /// </summary> /// <param name="msg"> /// The msg. /// </param> /// <returns> /// The <see cref="IMessage"/>. /// </returns> /// <exception cref="InvalidOperationException"> /// </exception> public override IMessage Invoke(IMessage msg) { if (this.m_Dirty) { this.m_LocalAsset.Dirtied -= this.MarkDirty; this.m_LocalAsset = this.m_Manager.GetUnresolved(this.m_AssetName) as LocalAsset; var proxy = this.m_LocalAsset.Resolve<IAsset>(); if (!RemotingServices.IsTransparentProxy(proxy)) { throw new InvalidOperationException("Object retrieved was not transparent proxy."); } var realProxy = RemotingServices.GetRealProxy(proxy); var newNetworkAssetProxy = realProxy as LocalAssetProxy; if (newNetworkAssetProxy == null) { throw new InvalidOperationException("Unable to cast real proxy back to NetworkAssetProxy<>."); } this.m_Instance = newNetworkAssetProxy.m_Instance; this.m_Dirty = false; this.m_LocalAsset.Dirtied += this.MarkDirty; } var methodCall = (IMethodCallMessage)msg; var method = (MethodInfo)methodCall.MethodBase; try { var result = method.Invoke(this.m_Instance, methodCall.InArgs); return new ReturnMessage(result, null, 0, methodCall.LogicalCallContext, methodCall); } catch (Exception e) { if (e is TargetInvocationException && e.InnerException != null) { return new ReturnMessage(e.InnerException, msg as IMethodCallMessage); } return new ReturnMessage(e, msg as IMethodCallMessage); } }