Ejemplo n.º 1
0
        private void AddWriters(Node node, NodeReader reader, BufferTree tree, QueueIndex queue)
        {
            if (node.Index.Count > 0)
            {
                FieldWriter writer = new FieldWriter(node)
                {
                    BufferIndex = node.Index.ToArray(),
                    NamePart    = this.GetNamePart(node, queue, tree),
                    Queue       = queue,
                };

                reader.Writers.Add(writer);
                tree.Fields.Add(writer);

                if (queue != null && queue.Type == RelationQueueType.Cached)
                {
                    CacheWriter cacheWriter = new CacheWriter(node)
                    {
                        BufferIndex = writer.BufferIndex.First(),
                        CacheIndex  = queue.Cache.Count,
                        Queue       = queue,
                    };

                    queue.Cache.Add(cacheWriter);
                }
            }

            if (node.Item != null || node.Metadata.HasFlag(RelationMetadataFlags.List | RelationMetadataFlags.Recursive))
            {
                QueueIndex prevQueue = tree.Queues.LastOrDefault()?.Index;
                QueueIndex nextQueue = this.CreateIndex(node, tree);

                QueueWriter writer = new QueueWriter(node)
                {
                    NamePart = this.GetNamePart(node.Item ?? node, queue, tree),
                    Queue    = queue,
                    Next     = nextQueue,
                };

                if ((node.Item ?? node).Metadata.HasFlag(RelationMetadataFlags.Recursive))
                {
                    nextQueue.Type = RelationQueueType.Recursive;
                }
                else if (prevQueue != null && !prevQueue.List.Identity.Equals(nextQueue.List.Owner.Parent?.Identity))
                {
                    nextQueue.Type = RelationQueueType.Cached;
                }
                else if (prevQueue != null && prevQueue.Type == RelationQueueType.Cached)
                {
                    nextQueue.Type = RelationQueueType.Cached;
                }

                reader.Writers.Add(writer);

                if (node.Item != null)
                {
                    this.CreateQueue(node.Item, tree, nextQueue);
                }
            }
        }
Ejemplo n.º 2
0
        private Expression GetAssignNewQueueExpression(QueueIndex index, int metadataOffset)
        {
            Expression arrayIndex = Expression.ArrayAccess(Arguments.Queues, Expression.Constant(index.Buffer));
            Expression newQueue   = this.GetNewQueueExpression(index, metadataOffset);

            return(Expression.Assign(arrayIndex, newQueue));
        }
Ejemplo n.º 3
0
        private PropertyReader CreateProperty(Node node, BufferTree tree, QueueIndex queue)
        {
            PropertyReader reader = new PropertyReader(node);

            this.AddWritersAndProperties(node, reader, tree, queue);

            return(reader);
        }
Ejemplo n.º 4
0
        private Expression GetNewQueueExpression(QueueIndex index, int metadataOffset)
        {
            Type            type = this.GetQueueGenericType(index);
            ConstructorInfo ctor = type.GetConstructors()[0];

            Expression metadata  = Expression.ArrayAccess(Arguments.Metadata, Expression.Constant(metadataOffset + index.Buffer));
            Expression queueType = Expression.Constant(index.Type);

            return(Expression.New(ctor, metadata, queueType));
        }
Ejemplo n.º 5
0
        private QueueReader CreateQueue(Node node, BufferTree tree, QueueIndex queue)
        {
            QueueReader reader = new QueueReader(node)
            {
                Index = queue,
            };

            tree.Queues.Add(reader);

            this.AddWritersAndProperties(node, reader, tree, queue);

            return(reader);
        }
Ejemplo n.º 6
0
        public async Task <bool> Play()
        {
            DACPRequest request = new DACPRequest("/ctrl-int/1/playqueue-edit");

            request.QueryParameters["command"] = "playnow";
            request.QueryParameters["index"]   = QueueIndex.ToString();

            try
            {
                await Server.SubmitRequestAsync(request).ConfigureAwait(false);
            }
            catch { return(false); }
            return(true);
        }
Ejemplo n.º 7
0
        private string GetNamePart(Node node, QueueIndex queue, BufferTree tree)
        {
            if (node.Metadata.HasFlag(RelationMetadataFlags.Recursive | RelationMetadataFlags.List))
            {
                string itemName = tree.Notation.Combine(node.Metadata.Identity.Name, tree.Notation.Member(queue.Item.Identity.Name));

                return(tree.Notation.Path(queue.Item.Identity.Name, itemName));
            }
            else if (queue != null)
            {
                return(tree.Notation.Path(queue.Item.Identity.Name, node.Metadata.Identity.Name));
            }
            else
            {
                return(tree.Notation.Path(tree.Source.Metadata.Identity.Name, node.Metadata.Identity.Name));
            }
        }
Ejemplo n.º 8
0
        private Expression GetCacheExpression(QueueIndex queue, Expression nonCachedWrite)
        {
            Expression isCached = this.GetQueuePropertyExpression(queue, "IsCached");

            List <Expression> writeBody = new List <Expression>()
            {
                nonCachedWrite
            };
            List <Expression> readBody = new List <Expression>();

            foreach (CacheWriter writer in queue.Cache)
            {
                writeBody.Add(this.GetCacheWriteExpression(writer));
                readBody.Add(this.GetCacheReadExpression(writer));
            }

            return(Expression.IfThenElse(isCached, this.GetBlockOrExpression(readBody), this.GetBlockOrExpression(writeBody)));
        }
Ejemplo n.º 9
0
 private Expression GetQueuePropertyExpression(QueueIndex queue, string propertyName)
 => Expression.Property(queue.Variable, propertyName);
Ejemplo n.º 10
0
        private Expression GetQueueIndexExpression(QueueIndex index)
        {
            Expression arrayIndex = Expression.ArrayAccess(Arguments.Queues, Expression.Constant(index.Buffer));

            return(Expression.Convert(arrayIndex, index.Variable.Type));
        }
Ejemplo n.º 11
0
 private Type GetQueueItemGenericType(QueueIndex queue) => typeof(RelationQueueItem <>).MakeGenericType(queue.List.Type);
Ejemplo n.º 12
0
 private void AddProperties(Node node, NodeReader reader, BufferTree tree, QueueIndex queue)
 {
     reader.Properties = node.Properties.Select(n => this.CreateProperty(n, tree, queue)).ToList();
 }
Ejemplo n.º 13
0
 private void AddWritersAndProperties(Node node, NodeReader reader, BufferTree tree, QueueIndex queue)
 {
     this.AddWriters(node, reader, tree, queue);
     this.AddProperties(node, reader, tree, queue);
 }