Inheritance: IControlToken
Esempio n. 1
0
        public virtual IControlToken TakeControl(int priority = 1, [System.Runtime.CompilerServices.CallerMemberName] string name = "")
        {
            lock (this)
            {
                var ownerCandidate = new ControlledDevice(
                    name,
                    priority,
                    populate => BuildDefaultData(populate),
                    cToken =>
                    {
                        IData restoreData;
                        IControlToken nextOwner;

                        lock (this)
                        {
                            this.owners.Remove(cToken);

                            nextOwner = this.owners.LastOrDefault();

                            if (nextOwner != null)
                                restoreData = nextOwner.GetDataForDevice(this);
                            else
                                restoreData = GetOwnerlessData();

                            restoreData = restoreData.Copy();

                            this.currentOwner = nextOwner;

                            Executor.Current.SetControlToken(this, nextOwner);
                        }

                        SetData(nextOwner, restoreData.Select(x => Tuple.Create(x.Key, x.Value)).ToArray());
                    });

                // Insert new owner
                lock (this)
                {
                    int pos = -1;
                    for (int i = 0; i < this.owners.Count; i++)
                    {
                        if (this.owners[i].Priority < priority)
                            continue;

                        pos = i;
                        break;
                    }
                    if (pos == -1)
                        this.owners.Add(ownerCandidate);
                    else
                        this.owners.Insert(pos, ownerCandidate);
                }

                // Grab the owner with the highest priority (doesn't have to be the candidate)
                var newOwner = this.owners.Last();

                this.currentOwner = newOwner;

                Executor.Current.SetControlToken(this, newOwner);

                return ownerCandidate;
            }
        }
        public virtual IControlToken TakeControl(int priority = 1, [System.Runtime.CompilerServices.CallerMemberName] string name = "")
        {
            lock (this.lockObject)
            {
                var ownerCandidate = new ControlledDevice(
                    name,
                    priority,
                    populate => BuildDefaultData(populate),
                    cToken =>
                {
                    IData restoreData;
                    IControlToken nextOwner;

                    lock (this.lockObject)
                    {
                        this.owners.Remove(cToken);

                        nextOwner = this.owners.LastOrDefault();

                        if (nextOwner != null)
                        {
                            restoreData = nextOwner.GetDataForDevice(this);
                        }
                        else
                        {
                            restoreData = GetOwnerlessData();
                        }

                        restoreData = restoreData.Copy();

                        this.currentOwner = nextOwner;

                        Executor.Current.SetControlToken(this, nextOwner);
                    }

                    SetData(nextOwner, restoreData);
                });

                // Insert new owner
                lock (this.lockObject)
                {
                    int pos = -1;
                    for (int i = 0; i < this.owners.Count; i++)
                    {
                        if (this.owners[i].Priority < priority)
                        {
                            continue;
                        }

                        pos = i;
                        break;
                    }
                    if (pos == -1)
                    {
                        this.owners.Add(ownerCandidate);
                    }
                    else
                    {
                        this.owners.Insert(pos, ownerCandidate);
                    }
                }

                // Grab the owner with the highest priority (doesn't have to be the candidate)
                var newOwner = this.owners.Last();

                this.currentOwner = newOwner;

                Executor.Current.SetControlToken(this, newOwner);

                return(ownerCandidate);
            }
        }