Example #1
0
        /// <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
            };
        }
Example #2
0
        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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
 /// <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));
 }