Пример #1
0
        /// <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;
        }
Пример #2
0
        [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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        /// <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);
            }
        }