private List <DownloadCenterForm.DownloadableFileInfo> removeAlreadyInstalledPackagesFromList(List <DownloadCenterForm.DownloadableFileInfo> packageListToFilter)
        {
            // get all the folders in the parts folder to know what is already installed
            DirectoryInfo partsFolder = new DirectoryInfo(PartLibraryPanel.sFullPathForLibrary);

            DirectoryInfo[] directoriesInPartsFolder = new DirectoryInfo[] { };
            if (partsFolder.Exists)
            {
                directoriesInPartsFolder = partsFolder.GetDirectories();
            }
            else
            {
                // if the part folder doesn't exist, try to create it
                partsFolder.Create();
                // if the part folder doesn't exist we need to get all the package found
                return(packageListToFilter);
            }


            // create a list with only the name of the directory
            List <DownloadCenterForm.DownloadableFileInfo> installedPackages = new List <DownloadCenterForm.DownloadableFileInfo>();

            foreach (DirectoryInfo directory in directoriesInPartsFolder)
            {
                // save the package name in the package info
                DownloadCenterForm.DownloadableFileInfo package = new DownloadCenterForm.DownloadableFileInfo();
                package.FileName = directory.Name + ".zip";                 // add the zip extension to facilitate the string comparison

                // check the about file on the local drive to get the version number
                string aboutFileName = Application.StartupPath + @"/parts/" + directory.Name + @"/config/About.txt";
                if (File.Exists(aboutFileName))
                {
                    package.Version = getPackageVersionInAboutFile(aboutFileName);
                }

                // add the package to the list
                installedPackages.Add(package);
            }

            // then iterate on the list to filter and remove the items already installed that has the good version
            for (int i = 0; i < packageListToFilter.Count; ++i)
            {
                foreach (DownloadCenterForm.DownloadableFileInfo package in installedPackages)
                {
                    if (package.FileName.Equals(packageListToFilter[i].FileName, StringComparison.OrdinalIgnoreCase) && string.Compare(package.Version, packageListToFilter[i].Version) >= 0)
                    {
                        packageListToFilter.RemoveAt(i);
                        i--;
                        break;
                    }
                }
            }

            return(packageListToFilter);
        }
        private void backgroundWorkerSearchOnline_DoWork(object sender, DoWorkEventArgs e)
        {
            const string partsFolder = @"/parts/";

            // Get the BackgroundWorker that raised this event.
            BackgroundWorker worker = sender as BackgroundWorker;
            // and get the parameters
            SearchParameter parameters = e.Argument as SearchParameter;
            ResultParameter result     = new ResultParameter();

            // declare a variable to report the progress on the search
            int currentUrlIndex = 0;

            // iterate on all the url in the search parameters
            foreach (string url in parameters.searchURLs)
            {
                // increase the current url and init the serach step
                currentUrlIndex++;
                int searchStep = 0;

                try
                {
                    // report the begining of the search
                    worker.ReportProgress(searchStep, new ProgressParameter(currentUrlIndex, parameters.searchURLs.Count));

                    // create a web request to browse the url
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        // report that we got an answer
                        worker.ReportProgress(++searchStep, new ProgressParameter(currentUrlIndex, parameters.searchURLs.Count));

                        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                        {
                            string html = reader.ReadToEnd();
                            // use a regexp to parse all the listed files from the html page
                            Regex           regex   = new Regex("<a href=\".+\\.zip\">(?<name>.+\\.zip)</a>");
                            MatchCollection matches = regex.Matches(html);
                            foreach (Match match in matches)
                            {
                                if (match.Success)
                                {
                                    // create an array to store the destination file name, and url source file name
                                    DownloadCenterForm.DownloadableFileInfo downloadInfo = new DownloadCenterForm.DownloadableFileInfo();
                                    // get the file name found
                                    string fileName = match.Groups["name"].Value;
                                    string fileNameWithoutExtension = fileName.Remove(fileName.Length - 4);
                                    // check if the file name contains a version number
                                    int dotIndex = fileNameWithoutExtension.IndexOf('.');
                                    if (dotIndex > 0)
                                    {
                                        downloadInfo.FileName = fileNameWithoutExtension.Remove(dotIndex) + ".zip";
                                        downloadInfo.Version  = fileNameWithoutExtension.Substring(dotIndex + 1);
                                    }
                                    else
                                    {
                                        downloadInfo.FileName = fileName;
                                        downloadInfo.Version  = string.Empty;
                                    }
                                    downloadInfo.SourceURL         = url + fileName;
                                    downloadInfo.DestinationFolder = partsFolder + fileName;
                                    // add the array in the result list
                                    result.allPackageListFound.Add(downloadInfo);
                                }
                            }

                            // report that we have finished to parse the html
                            worker.ReportProgress(++searchStep, new ProgressParameter(currentUrlIndex, parameters.searchURLs.Count));
                        }
                    }
                }
                catch
                {
                    // report that the error
                    worker.ReportProgress(3, new ProgressParameter(currentUrlIndex, parameters.searchURLs.Count));
                }
            }

            // set the result in the event of the background worker
            e.Result = result;
        }