/// <summary>
 /// Fires the <see cref="BuildQueueRequestRemoved"/> event.
 /// </summary>
 /// <param name="request">The request that was removed.</param>
 protected void FireBuildQueueRequestRemoved(BuildQueueRequest request)
 {
     if (BuildQueueRequestRemoved != null)
     {
         var args = new BuildQueueRequestChangedArgs(request);
         BuildQueueRequestRemoved(this, args);
     }
 }
 /// <summary>
 /// Initialise a new <see cref="BuildQueueRequestChangedArgs"/>.
 /// </summary>
 /// <param name="buildQueue">The build queue request that changed.</param>
 public BuildQueueRequestChangedArgs(BuildQueueRequest buildQueue)
 {
     BuildQueueRequest = buildQueue;
 }
        /// <summary>
        /// Updates the details on a build queue.
        /// </summary>
        /// <param name="value">The new build queue details.</param>
        public void Update(QueueSnapshot value)
        {
            // Validate the arguments
            if (value == null) throw new ArgumentNullException("value");

            // Find all the changed properties
            var changes = new List<string>();
            var newRequests = new List<BuildQueueRequest>();
            var oldRequests = new List<BuildQueueRequest>();

            lock (syncLock)
            {
                // Check for any request differences
                var requestValues = new Dictionary<BuildQueueRequest, QueuedRequestSnapshot>();
                var oldRequestNames = new List<string>(requests.Keys);
                foreach (var request in value.Requests)
                {
                    // Check if this request has already been loaded
                    var requestName = request.ProjectName;
                    if (oldRequestNames.Contains(requestName))
                    {
                        requestValues.Add(requests[requestName], request);
                        oldRequestNames.Remove(requestName);
                    }
                    else
                    {
                        // Otherwise this is a new request
                        var newRequest = new BuildQueueRequest(client, this, request);
                        newRequests.Add(newRequest);
                    }
                }

                // Store the old request
                foreach (var request in oldRequestNames)
                {
                    oldRequests.Add(requests[request]);
                }

                // Perform the actual update
                foreach (var request in oldRequestNames)
                {
                    requests.Remove(request);
                }
                foreach (var request in newRequests)
                {
                    if (!requests.ContainsKey(request.Name))
                    {
                        requests.Add(request.Name, request);
                    }
                }
                buildQueue = value;

                // Update all the requests
                foreach (var requestValue in requestValues)
                {
                    requestValue.Key.Update(requestValue.Value);
                }
            }

            // Tell any listeners about any changes
            foreach (var request in newRequests)
            {
                FireBuildQueueRequestAdded(request);
            }
            foreach (var request in oldRequests)
            {
                FireBuildQueueRequestRemoved(request);
            }
            foreach (var change in changes)
            {
                FirePropertyChanged(change);
            }
        }