/// <summary> /// Initializes a new instance of the <see cref="T:Coflnet.Server.Reference`1"/> /// </summary> /// <param name="resource">Resource.</param> /*public Reference(T resource, SourceReference referenceId) * { * this.resource = resource; * this.referenceId = referenceId; * //referenceId = ReferenceManager.Instance.AddReference(resource); * }*/ public Reference(T resource) { this.InnerReference = new InnerReference <T> () { Resource = resource }; }
public bool TryGetReference(EntityId id, out InnerReference <Entity> result) { InnerReference <Entity> reference; references.TryGetValue(id, out reference); if (reference == null) { if (!TryLoadReference(id, out reference, true)) { result = null; return(false); } } // special references // Redirects occur if offline ids were used if (reference is RedirectReference <Entity> ) { var redirectReference = reference as RedirectReference <Entity>; return(TryGetReference(redirectReference.newId, out result)); } result = reference; return(true); }
/// <summary> /// Creates a new reference. /// </summary> /// <returns>The reference identifier.</returns> /// <param name="entity">Referencable object to store.</param> public virtual EntityId CreateReference(Entity entity, bool force = false) { long nextIndex = ThreadSaveIdGenerator.NextId; EntityId newReference; // generate new Id for the current server if (this.coreInstance == null) { newReference = new EntityId(0, nextIndex); } else { newReference = new EntityId(this.coreInstance.Id.ServerId, nextIndex); } if (entity.Id != new EntityId() && !force) { throw new Exception("The entity already had an id, it may already have been registered. Call with force = true to ignore"); } entity.Id = newReference; InnerReference <Entity> referenceObject = new InnerReference <Entity> (entity); if (!AddReference(referenceObject)) { throw new Exception("adding failed"); } return(newReference); }
/// <summary> /// Tries to load the reference from disc. /// </summary> /// <returns><c>true</c>, if load resource was tryed, <c>false</c> otherwise.</returns> /// <param name="id">Identifier.</param> /// <param name="data">Data.</param> /// <typeparam name="T">The 1st type parameter.</typeparam> public bool TryLoadReference(EntityId id, out InnerReference <Entity> data, bool cache = true) { var path = $"res/{id.ToString()}"; if (!FileController.Exists(path)) { data = null; return(false); } var bytes = DataController.Instance.LoadData(path); var result = MessagePack.MessagePackSerializer.Typeless.Deserialize(bytes) as InnerReference <Entity>; if (cache) { references[id] = result; } data = result; return(true); }
/// <summary> /// Adds a reference and maybe its data to the reference dictionary. /// </summary> /// <returns><c>true</c>, if reference was added, <c>false</c> otherwise.</returns> /// <param name="reference">Reference.</param> public bool AddReference(InnerReference <Entity> reference) { return(references.TryAdd(reference.Resource.Id, reference)); }