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; } }
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)); }
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."); }
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; } } }
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); } } }