/// <summary>
        /// Download program
        /// </summary>
        /// <param name="downloadList"></param>
        private void StartDownload(DownloadFileInfo downloadList)
        {
            DownloadProgress dp = new DownloadProgress(downloadList, AppName, newversion, newsize);

            if (dp.ShowDialog() == DialogResult.OK)
            {
                //
                if (DialogResult.Cancel == dp.ShowDialog())
                {
                    return;
                }

                if (bNeedRestart)
                {
                    MessageBox.Show(ConstFile.APPLYTHEUPDATE, ConstFile.MESSAGETITLE, MessageBoxButtons.OK, MessageBoxIcon.Information);

                    // Launch setup of application downloaded
                    string setupexe = Path.Combine(downloadList.TargetUrl, downloadList.FileName);
                    System.Diagnostics.Process.Start(setupexe);

                    // Stop this instance of the application
                    CommonUnitity.StopApplication();
                }
            }
        }
        public DownloadConfirm(DownloadFileInfo downloadfileList, string tAppName, string tversion, long tsize)
        {
            AppName    = tAppName;
            newversion = tversion;
            newsize    = tsize;

            InitializeComponent();

            downloadFileList = downloadfileList;

            this.label2.Text = "A new version of " + AppName + " is available: (" + newversion.ToString() + ")";
            this.label3.Text = "Name:  " + AppName;
        }
        public DownloadProgress(DownloadFileInfo downloadFileListTemp, string tAppName, string tversion, long tsize)
        {
            AppName    = tAppName;
            newversion = tversion;
            newsize    = tsize;

            InitializeComponent();

            this.label3.Text = "Updating " + AppName;
            this.label7.Text = "Name: " + AppName;
            this.Text        = "Updating " + AppName;

            this.downloadFileList = downloadFileListTemp;
            allFileList           = new DownloadFileInfo(downloadFileListTemp.DownloadUrl, downloadFileListTemp.TargetUrl, downloadFileListTemp.FileName, downloadFileListTemp.LastVer, downloadFileListTemp.Size);
        }
        private void ProcDownload(object o)
        {
            evtPerDonwload = new ManualResetEvent(false);

            if (downloadFileList != null)
            {
                total += downloadFileList.Size;
            }


            try
            {
                while (!evtDownload.WaitOne(0, false))
                {
                    if (downloadFileList == null)
                    {
                        break;
                    }

                    DownloadFileInfo file = downloadFileList;

                    this.ShowCurrentDownloadFileName(file.FileName);

                    //Download
                    clientDownload = new WebClient();

                    //Added the function to support proxy
                    System.Net.IWebProxy iwpxy = WebRequest.GetSystemWebProxy();
                    clientDownload.Proxy = iwpxy;

                    //clientDownload.Proxy = WebProxy.GetDefaultProxy();


                    clientDownload.Proxy.Credentials = CredentialCache.DefaultCredentials;
                    clientDownload.Credentials       = System.Net.CredentialCache.DefaultCredentials;
                    //End added


                    // Progress changed
                    clientDownload.DownloadProgressChanged += (object sender, DownloadProgressChangedEventArgs e) =>
                    {
                        try
                        {
                            this.SetProcessBar(e.ProgressPercentage, (int)((nDownloadedTotal + e.BytesReceived) * 100 / total));
                        }
                        catch
                        {
                            //log the error message,you can use the application's log code
                        }
                    };


                    // Download completed
                    clientDownload.DownloadFileCompleted += (object sender, AsyncCompletedEventArgs e) =>
                    {
                        try
                        {
                            DownloadFileInfo dfile = e.UserState as DownloadFileInfo;
                            nDownloadedTotal += dfile.Size;
                            this.SetProcessBar(0, (int)(nDownloadedTotal * 100 / total));
                            evtPerDonwload.Set();
                        }
                        catch (Exception)
                        {
                            //log the error message,you can use the application's log code
                        }
                    };

                    evtPerDonwload.Reset();

                    //Download

                    // Telecharge le fichier dans le repertoire downloads
                    clientDownload.DownloadFileAsync(new Uri(file.DownloadUrl), Path.Combine(file.TargetUrl, file.FileName), file);

                    //Wait for the download complete
                    evtPerDonwload.WaitOne();

                    clientDownload.Dispose();
                    clientDownload = null;

                    downloadFileList = null;
                }
            }
            catch (Exception)
            {
                ShowErrorAndRestartApplication();
                //throw;
            }

            //After dealed with all files, clear the data
            allFileList = null;

            if (downloadFileList == null)
            {
                Exit(true);
            }
            else
            {
                Exit(false);
            }

            evtDownload.Set();
        }
        public void Update()
        {
            if (!config.Enabled)
            {
                return;
            }

            // Retrieve list of remote files to update
            Dictionary <string, RemoteFile> listRemotFile = ParseRemoteXml(config.ServerUrl);



            // Create download list
            DownloadFileInfo downloadList = null;

            if (listRemotFile.ContainsKey(AppName))
            {
                RemoteFile rf = listRemotFile[AppName];

                // FAB
                this._serverUrl = rf.Url;
                Uri uri = new Uri(@rf.Url);
                _serverUrl = "http://" + uri.Host + "/AutoupdateService.xml";

                Version v1 = new Version(rf.LastVer);
                Version v2 = new Version(localfile.LastVer);
                if (v1 > v2)
                {
                    // Add to download list all files having a greater version
                    downloadList      = new DownloadFileInfo(rf.Url, localfile.Path, rf.Url, rf.LastVer, rf.Size);
                    localfile.LastVer = rf.LastVer;
                    localfile.Size    = rf.Size;

                    newversion = rf.LastVer;
                    newsize    = rf.Size;

                    if (rf.NeedRestart)
                    {
                        bNeedRestart = true;
                    }

                    bDownload = true;
                }
                // Remove from list
                listRemotFile.Remove(AppName);
            }



            // Display form download confirm
            if (bDownload)
            {
                DownloadConfirm dc = new DownloadConfirm(downloadList, AppName, newversion, newsize);

                if (this.OnShow != null)
                {
                    this.OnShow();
                }

                if (DialogResult.OK == dc.ShowDialog())
                {
                    StartDownload(downloadList);
                }
            }
        }