/// <summary>
 /// Download updates async
 /// </summary>
 /// <param name="uCollection"></param>
 public void DownloadUpdates(UpdateCollection uCollection)
 {
     updateDownloader = new UpdateDownloader();
     progressWindow   = new ProgressWindow();
     progressWindow.Show();
     progressWindow.Title     = "Downloading...";
     downloadJob              = null;
     updateDownloader.Updates = uCollection;
     downloadJob              = updateDownloader.BeginDownload(new DownloadProgressChangedFunc(this), new DownloadCompletedFunc(this), null);
     InstallButton.IsEnabled  = false;
 }
        public static DownloadSession BeginDownload(this PSCmdlet cmdlet, ISearchResult searchResult)
        {
            UpdateSession    session    = new UpdateSession();
            UpdateDownloader downloader = session.CreateDownloader();

            downloader.Updates  = searchResult.Updates;
            downloader.Priority = DownloadPriority.dpExtraHigh;

            ProgressAdapter adapter = new ProgressAdapter(cmdlet, downloader);

            DownloadProgressChangedCallback progressCallback = new DownloadProgressChangedCallback(adapter);

            DownloadCompletedCallback completedCallback = new DownloadCompletedCallback(downloader);

            object state = new object();

            downloader.BeginDownload(progressCallback, completedCallback, state);

            return(DownloadSession.From(completedCallback));
        }
        private OperationResultCode DownloadUpdatesUtil(CancellationToken cancellationToken)
        {
            try
            {
                UpdateDownloader uDownloader       = this._uSession.CreateUpdateDownloader();
                UpdateCollection updatesToDownload = new UpdateCollection();

                foreach (WUUpdateWrapper item in this._wuCollectionWrapper.Collection.Values)
                {
                    if (!item.IsDownloaded)
                    {
                        if (item.Update.EulaAccepted == false)
                        {
                            if (this._serviceSettings.AcceptWindowsUpdateEula)
                            {
                                try
                                {
                                    item.Update.AcceptEula();
                                }
                                catch (Exception e)
                                {
                                    _eventSource.WarningMessage(string.Format("Error occurred while accepting Eula for {0} . Exception : {1}",
                                                                              item, e));
                                }
                                updatesToDownload.Add(item.Update);
                            }
                        }
                        else
                        {
                            updatesToDownload.Add(item.Update);
                        }
                    }
                }

                uDownloader.Updates = updatesToDownload;

                DownloadCompletedCallback downloadCompletedCallback = new DownloadCompletedCallback();
                IDownloadJob downloadJob = uDownloader.BeginDownload(new DownloadProgressChangedCallback(),
                                                                     downloadCompletedCallback, null);

                TimeSpan operationTimeOut = TimeSpan.FromMinutes(this._serviceSettings.WUOperationTimeOutInMinutes);
                if (
                    !this._helper.WaitOnTask(downloadCompletedCallback.Task, (int)operationTimeOut.TotalMilliseconds,
                                             cancellationToken))
                {
                    _eventSource.Message("downloadJob : Requested Abort");
                    downloadJob.RequestAbort();
                }

                IDownloadResult uResult = uDownloader.EndDownload(downloadJob);
                for (int i = 0; i < updatesToDownload.Count; i++)
                {
                    var hResult  = uResult.GetUpdateResult(i).HResult;
                    var updateID = updatesToDownload[i].Identity.UpdateID;
                    this._wuCollectionWrapper.Collection[updateID].IsDownloaded = (hResult == 0);
                    if (hResult != 0)
                    {
                        _eventSource.WarningMessage(string.Format("Download for update ID {0} returned hResult {1}", updateID, hResult));
                    }
                }

                return(uResult.ResultCode);
            }
            catch (Exception e)
            {
                if ((uint)e.HResult == WUErrorCodes.WU_E_NO_UPDATE)
                {
                    return(OperationResultCode.orcSucceeded); // no updates found.
                }
                _eventSource.InfoMessage("Exception while downloading Windows-Updates: {0}", e);
                return(OperationResultCode.orcFailed);
            }
        }