Ejemplo n.º 1
0
        void HandleUpdates(EntityChangeData change)
        {
            switch (change.ChangeType)
            {
            case EntityChangeData.EntityChangeType.EntityAdded:
                var entityItem = change.Entity;
                EntitiesAdded.Add(change.Entity.Guid);
                var entityState = new EntityState(entityItem);        // { Name = "Unknown" };
                if (entityItem.HasDataBlob <NameDB>())
                {
                    entityState.Name = entityItem.GetDataBlob <NameDB>().GetName(_faction.Guid);
                    EntityStatesWithNames.Add(entityItem.Guid, entityState);
                }
                if (entityItem.HasDataBlob <PositionDB>())
                {
                    EntityStatesWithPosition.Add(entityItem.Guid, entityState);
                }
                else if (entityItem.HasDataBlob <ColonyInfoDB>())
                {
                    EntityStatesColonies.Add(entityItem.Guid, entityState);
                }
                break;

            //if an entity moves from one system to another, then this should be triggered,
            //currently Entity.ChangeEvent probibly does too, but we might have to tweak this. maybe add another enum?
            case EntityChangeData.EntityChangeType.EntityRemoved:
                EntitysToBin.Add(change.Entity.Guid);
                break;
            }
        }
Ejemplo n.º 2
0
        internal void HandleChange(EntityChangeData changeData)
        {
            if (changeData.ChangeType == EntityChangeData.EntityChangeType.DBAdded)
            {
                if (changeData.Datablob is OrbitDB && changeData.Entity.GetDataBlob <OrbitDB>().Parent != null)
                {
                    if (!((OrbitDB)changeData.Datablob).IsStationary)
                    {
                        OrbitList[changeData.Entity.Guid] = new OrbitRing(changeData.Entity, _camera);
                    }
                }
                if (changeData.Datablob is NameDB)
                {
                    TextIconList[changeData.Entity.Guid] = new TextIcon(changeData.Entity, _camera);
                }

                IconDict[changeData.Entity.Guid] = new EntityIcon(changeData.Entity, _camera);
            }
            if (changeData.ChangeType == EntityChangeData.EntityChangeType.DBRemoved)
            {
                if (changeData.Datablob is OrbitDB)
                {
                    OrbitList.Remove(changeData.Entity.Guid);
                }
                if (changeData.Datablob is NameDB)
                {
                    TextIconList.Remove(changeData.Entity.Guid);
                }
            }
        }
            /// <summary>
            /// Creates EntityChangeData which captures the state of the specified entity descriptor data.
            /// </summary>
            /// <param name="entityDescriptorData">The entity descriptor data.</param>
            /// <param name="propertiesValues">The properties values before SaveChanges.</param>
            /// <returns>Entity change data.</returns>
            public static ChangeData Create(EntityDescriptorData entityDescriptorData, IEnumerable <NamedValue> propertiesValues)
            {
                EntityChangeData changeData = new EntityChangeData(entityDescriptorData);

                foreach (NamedValue nv in propertiesValues)
                {
                    changeData.CachedPropertiesValues.Add(nv.Name, nv.Value);
                }

                changeData.ClrTypeForRequery = entityDescriptorData.EntityClrType;

                return(changeData);
            }
        private ChangeData CreateChangeData(DescriptorData descriptorData, IDictionary <object, IEnumerable <NamedValue> > propertyValuesBeforeSave)
        {
            var entityDescriptorData = descriptorData as EntityDescriptorData;

            if (entityDescriptorData != null)
            {
                IEnumerable <NamedValue> propertyValues;
                ExceptionUtilities.Assert(propertyValuesBeforeSave.TryGetValue(entityDescriptorData.Entity, out propertyValues), "Could not find property values for descriptor: {0}", entityDescriptorData);

                return(EntityChangeData.Create(entityDescriptorData, propertyValues));
            }

            var linkDescriptorData = descriptorData as LinkDescriptorData;

            ExceptionUtilities.CheckObjectNotNull(linkDescriptorData, "Descriptor was neither an entity nor a link");

            return(LinkChangeData.Create(linkDescriptorData));
        }
Ejemplo n.º 5
0
        void SendEntityChangeData(List <NetConnection> recipients, EntityChangeData changeData)
        {
            NetOutgoingMessage message = NetPeerObject.CreateMessage();

            message.Write((byte)ToClientMsgType.SendEntityChangeData);
            message.Write((byte)changeData.ChangeType);
            switch (changeData.ChangeType)
            {
            case EntityChangeData.EntityChangeType.EntityAdded:
            {
                EntityDataMessage(message, changeData.Entity);
            }
            break;

            case EntityChangeData.EntityChangeType.EntityRemoved:
            {
                message.Write(changeData.Entity.Guid.ToByteArray());
            }
            break;

            case EntityChangeData.EntityChangeType.DBAdded:
            {
                DatablobDataMessage(message, changeData.Entity, changeData.Datablob);
            }
            break;

            case EntityChangeData.EntityChangeType.DBRemoved:
            {
                message.Write(changeData.Entity.Guid.ToByteArray());                                //entity guid.
                message.Write(changeData.Datablob.GetType().Name);                                  //datablob name
                message.Write(EntityManager.DataBlobTypes[changeData.Datablob.GetType()]);          //datablob typeIndex
            }
            break;

            default:
                throw new Exception("Network classes need to handle EntityChangeType");
            }
            foreach (var recipient in recipients)
            {
                NetServerObject.SendMessage(message, recipient, NetDeliveryMethod.ReliableOrdered);
            }
            Messages.Add("Sent " + changeData.ChangeType + " changeData to " + recipients.Count + " netclient.");
        }
Ejemplo n.º 6
0
        void HandleChangeData(EntityChangeData changeData)
        {
            if (changeData.Entity.IsValid)
            {
                switch (changeData.ChangeType)
                {
                case EntityChangeData.EntityChangeType.EntityAdded:

                    string name = changeData.Entity.GetDataBlob <NameDB>().GetName(_state.Faction);
                    _systemEntityNames.Add(changeData.Entity.Guid, name);
                    _sensorContacts[changeData.Entity.Guid] = _sysState.SystemContacts.GetSensorContact(changeData.Entity.Guid);
                    break;

                case EntityChangeData.EntityChangeType.EntityRemoved:
                    _systemEntityNames.Remove(changeData.Entity.Guid);
                    _sensorContacts.Remove(changeData.Entity.Guid);
                    break;
                }
            }
        }
Ejemplo n.º 7
0
        void HandleUpdates(EntityChangeData change)
        {
            switch (change.ChangeType)
            {
            case EntityChangeData.EntityChangeType.EntityAdded:
                if (change.Entity.IsValid && change.Entity.HasDataBlob <PositionDB>())
                {
                    var entityState = new EntityState(change.Entity)
                    {
                        Name = "Unknown"
                    };
                    EntityStatesWithPosition.Add(change.Entity.Guid, entityState);
                    EntitiesAdded.Add(change.Entity.Guid);
                }
                break;

            //if an entity moves from one system to another, then this should be triggered,
            //currently Entity.ChangeEvent probibly does too, but we might have to tweak this. maybe add another enum?
            case EntityChangeData.EntityChangeType.EntityRemoved:
                EntitysToBin.Add(change.Entity.Guid);
                break;
            }
        }
            /// <summary>
            /// Creates EntityChangeData which captures the state of the specified entity descriptor data.
            /// </summary>
            /// <param name="entityDescriptorData">The entity descriptor data.</param>
            /// <param name="propertiesValues">The properties values before SaveChanges.</param>
            /// <returns>Entity change data.</returns>
            public static ChangeData Create(EntityDescriptorData entityDescriptorData, IEnumerable<NamedValue> propertiesValues)
            {
                EntityChangeData changeData = new EntityChangeData(entityDescriptorData);

                foreach (NamedValue nv in propertiesValues)
                {
                    changeData.CachedPropertiesValues.Add(nv.Name, nv.Value);
                }

                changeData.ClrTypeForRequery = entityDescriptorData.EntityClrType;

                return changeData;
            }
        private void VerifyPropertiesValues(EntityChangeData entityChange, object entity)
        {
            var entityType = this.GetEntityType(entity.GetType());
            var serverNamedValues = this.ObjectServices.GetPropertiesValues(entity, entityType);

            foreach (NamedValue serverNamedValue in serverNamedValues)
            {
                object cachedClientValue = entityChange.CachedPropertiesValues[serverNamedValue.Name];

                // check if it's store-generated property
                MemberProperty property = this.GetPropertyWithPath(serverNamedValue.Name, entityType);
                StoreGeneratedPatternAnnotation storeGenAnnotation = property.Annotations.OfType<StoreGeneratedPatternAnnotation>().SingleOrDefault();

                // The client does not perform fix-up on dependent properties, so we skip those properties here. The verification in the protocol tests
                // is sufficient for ensuring the server behavior is correct
                if (entityType.GetDependentProperties().Contains(property))
                {
                    continue;
                }

                bool isMediaLinkEntryInsert = entityType.HasStream() && entityChange.State == EntityStates.Added;
                if (storeGenAnnotation != null)
                {
                    bool clientShouldBeUpdated = !isMediaLinkEntryInsert;
                    if (isMediaLinkEntryInsert || (entityChange.State == EntityStates.Modified && storeGenAnnotation.ServerGeneratedOnUpdate))
                    {
                        // if the product ever supports materializing the property values generated by the server
                        // during an MLE insert, then this can be changed to expect the server values on DSRP.None as well
                        clientShouldBeUpdated = this.currentContextData.AddAndUpdateResponsePreference == DataServiceResponsePreference.IncludeContent;
                    }
                    else if (!isMediaLinkEntryInsert && entityChange.State == EntityStates.Added && storeGenAnnotation.ServerGeneratedOnInsert)
                    {
                        clientShouldBeUpdated = this.currentContextData.AddAndUpdateResponsePreference != DataServiceResponsePreference.NoContent;
                    }

                    var clientValue = this.ObjectServices.GetObjectAdapter(entityType.FullName).GetMemberValue<object>(entityChange.DescriptorData.Entity, serverNamedValue.Name);
                    if (clientShouldBeUpdated)
                    {
                        this.Assert.AreEqual(
                            serverNamedValue.Value,
                            clientValue,
                            ValueComparer.Instance,
                            "Server-generated value should have been propagated back to the client. {0}.{1}",
                            entityChange.DescriptorData.Identity,
                            serverNamedValue.Name);
                    }
                    else
                    {
                           this.Assert.AreEqual(
                            cachedClientValue,
                            clientValue,
                            ValueComparer.Instance,
                            "Server-generated value should NOT have been propagated back to the client. {0}.{1}",
                            entityChange.DescriptorData.Identity,
                            serverNamedValue.Name);
                    }
                }
                else
                {
                    // The value provided on the client should have been saved to the store.
                    this.VerifyPropertyValue(
                        cachedClientValue,
                        serverNamedValue.Value,
                        serverNamedValue.Name,
                        entityChange.DescriptorData.Identity.OriginalString);
                }
            }
        }
        private void VerifyPropertiesValues(EntityChangeData entityChange, object entity)
        {
            var entityType        = this.GetEntityType(entity.GetType());
            var serverNamedValues = this.ObjectServices.GetPropertiesValues(entity, entityType);

            foreach (NamedValue serverNamedValue in serverNamedValues)
            {
                object cachedClientValue = entityChange.CachedPropertiesValues[serverNamedValue.Name];

                // check if it's store-generated property
                MemberProperty property = this.GetPropertyWithPath(serverNamedValue.Name, entityType);
                StoreGeneratedPatternAnnotation storeGenAnnotation = property.Annotations.OfType <StoreGeneratedPatternAnnotation>().SingleOrDefault();

                // The client does not perform fix-up on dependent properties, so we skip those properties here. The verification in the protocol tests
                // is sufficient for ensuring the server behavior is correct
                if (entityType.GetDependentProperties().Contains(property))
                {
                    continue;
                }

                bool isMediaLinkEntryInsert = entityType.HasStream() && entityChange.State == EntityStates.Added;
                if (storeGenAnnotation != null)
                {
                    bool clientShouldBeUpdated = !isMediaLinkEntryInsert;
                    if (isMediaLinkEntryInsert || (entityChange.State == EntityStates.Modified && storeGenAnnotation.ServerGeneratedOnUpdate))
                    {
                        // if the product ever supports materializing the property values generated by the server
                        // during an MLE insert, then this can be changed to expect the server values on DSRP.None as well
                        clientShouldBeUpdated = this.currentContextData.AddAndUpdateResponsePreference == DataServiceResponsePreference.IncludeContent;
                    }
                    else if (!isMediaLinkEntryInsert && entityChange.State == EntityStates.Added && storeGenAnnotation.ServerGeneratedOnInsert)
                    {
                        clientShouldBeUpdated = this.currentContextData.AddAndUpdateResponsePreference != DataServiceResponsePreference.NoContent;
                    }

                    var clientValue = this.ObjectServices.GetObjectAdapter(entityType.FullName).GetMemberValue <object>(entityChange.DescriptorData.Entity, serverNamedValue.Name);
                    if (clientShouldBeUpdated)
                    {
                        this.Assert.AreEqual(
                            serverNamedValue.Value,
                            clientValue,
                            ValueComparer.Instance,
                            "Server-generated value should have been propagated back to the client. {0}.{1}",
                            entityChange.DescriptorData.Identity,
                            serverNamedValue.Name);
                    }
                    else
                    {
                        this.Assert.AreEqual(
                            cachedClientValue,
                            clientValue,
                            ValueComparer.Instance,
                            "Server-generated value should NOT have been propagated back to the client. {0}.{1}",
                            entityChange.DescriptorData.Identity,
                            serverNamedValue.Name);
                    }
                }
                else
                {
                    // The value provided on the client should have been saved to the store.
                    this.VerifyPropertyValue(
                        cachedClientValue,
                        serverNamedValue.Value,
                        serverNamedValue.Name,
                        entityChange.DescriptorData.Identity.OriginalString);
                }
            }
        }