Exemplo n.º 1
0
        private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            // Progress information
            ProgressInfo progress = new ProgressInfo(entries.Length);

            // Custom icons that will be added to the database
            PwCustomIcon[] icons = new PwCustomIcon[entries.Length];

            // Set up proxy information for all WebClients
            FaviconDownloader.Proxy = Util.GetKeePassProxy();

            using (ManualResetEvent waiter = new ManualResetEvent(false))
            {
                for (int j = 0; j < entries.Length; j++)
                {
                    PwEntry entry = entries[j];
                    ThreadPool.QueueUserWorkItem(delegate(object notUsed)
                    {
                        // Checks whether the user pressed the cancel button or the close button
                        if (!logger.ContinueWork())
                        {
                            e.Cancel = true;
                        }
                        else
                        {
                            int i = Interlocked.Increment(ref progress.Current) - 1;

                            // Fields
                            string url = entry.Strings.ReadSafe(PwDefs.UrlField);

                            if (url == string.Empty)
                            {
                                // If the user wants to use the title field, let's give it a try
                                if (YetAnotherFaviconDownloaderExt.Config.GetUseTitleField())
                                {
                                    url = entry.Strings.ReadSafe(PwDefs.TitleField);
                                }
                            }

                            // Empty URL field
                            if (url == string.Empty)
                            {
                                // Can't find an icon
                                Interlocked.Increment(ref progress.NotFound);
                            }
                            else
                            {
                                Util.Log("Downloading: {0}", url);

                                using (FaviconDownloader fd = new FaviconDownloader())
                                {
                                    try
                                    {
                                        // Download favicon
                                        byte[] data = fd.GetIcon(url);
                                        Util.Log("Icon downloaded with success");

                                        // Hash icon data (avoid duplicates)
                                        byte[] hash = Util.HashData(data);

                                        // Creates an icon only if your UUID does not exist
                                        PwUuid uuid = new PwUuid(hash);
                                        if (!pluginHost.Database.CustomIcons.Exists(delegate(PwCustomIcon x) { return(x.Uuid.Equals(uuid)); }))
                                        {
                                            // Add icon
                                            icons[i] = new PwCustomIcon(uuid, data);

                                            #region For KeePass 2.48+ only
                                            if (PwDefs.FileVersion64 >= 0x0002003000000000UL)
                                            {
                                                var pwCustomIconType = icons[i].GetType();

                                                // Name the icon
                                                var nameProperty = pwCustomIconType.GetProperty("Name");
                                                if (nameProperty != null)
                                                {
                                                    // Since the URL was valid, we just force a valid scheme prefix to be able to get the Host
                                                    var host = fd.GetValidHost(url);
                                                    nameProperty.SetValue(icons[i], "yafd-" + host);
                                                }

                                                // Update last modification time
                                                var lastModificationTimeProperty = pwCustomIconType.GetProperty("LastModificationTime");
                                                if (lastModificationTimeProperty != null)
                                                {
                                                    lastModificationTimeProperty.SetValue(icons[i], DateTime.UtcNow);
                                                }
                                            }
                                            #endregion
                                        }

                                        // Check if icon is the same
                                        if (entry.CustomIconUuid.Equals(uuid))
                                        {
                                            // Avoid updating the entry
                                            entries[i] = null;
                                        }
                                        else
                                        {
                                            // Associate with this entry
                                            entry.CustomIconUuid = uuid;
                                        }

                                        // Icon downloaded with success
                                        Interlocked.Increment(ref progress.Success);
                                    }
                                    catch (FaviconDownloaderException ex)
                                    {
                                        Util.Log("Failed to download favicon");

                                        if (ex.Status == FaviconDownloaderExceptionStatus.NotFound)
                                        {
                                            // Can't find an icon
                                            Interlocked.Increment(ref progress.NotFound);
                                        }
                                        else
                                        {
                                            // Some other error (network, etc)
                                            Interlocked.Increment(ref progress.Error);
                                        }

                                        // Avoid updating the entry
                                        entries[i] = null;
                                    }
                                }
                            }
                        }

                        // Notifies that all downloads are finished
                        if (Interlocked.Decrement(ref progress.Remaining) == 0)
                        {
                            waiter.Set();
                        }
                    });
                }

                // Wait until the downloads are finished
                int lastValue = 0;
                do
                {
                    // Update progress only when needed
                    if (lastValue != progress.Remaining)
                    {
                        ReportProgress(progress);
                        lastValue = progress.Remaining;
                    }
                } while (!waiter.WaitOne(100));
            }

            // Progress 100%
            ReportProgress(progress);
            status = string.Format("YAFD: Success: {0} / Not Found: {1} / Error: {2}.", progress.Success, progress.NotFound, progress.Error);

            // Prevents inserting duplicate icons
            MergeCustomIcons(icons);

            // Refresh icons on database
            pluginHost.Database.UINeedsIconUpdate = true;

            // Waits long enough until we can see the output
            Thread.Sleep(3000);
        }
        private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            PwEntry[] entries = e.Argument as PwEntry[];

            // Progress information
            ProgressInfo progress = new ProgressInfo(entries.Length);

            // Custom icons that will be added to the database
            PwCustomIcon[] icons = new PwCustomIcon[entries.Length];

            // Set up proxy information for all WebClients
            FaviconDownloader.Proxy = Util.GetKeePassProxy();

            using (ManualResetEvent waiter = new ManualResetEvent(false))
            {
                for (int j = 0; j < entries.Length; j++)
                {
                    PwEntry entry = entries[j];
                    ThreadPool.QueueUserWorkItem(delegate(object notUsed)
                    {
                        // Checks whether the user pressed the cancel button or the close button
                        if (!logger.ContinueWork())
                        {
                            e.Cancel = true;
                        }
                        else
                        {
                            int i = Interlocked.Increment(ref progress.Current) - 1;

                            // Fields
                            string url = entry.Strings.ReadSafe(PwDefs.UrlField);

                            if (url == string.Empty)
                            {
                                url = entry.Strings.ReadSafe(PwDefs.TitleField);
                            }

                            // Empty URL field
                            if (url == string.Empty)
                            {
                                // Can't find an icon
                                Interlocked.Increment(ref progress.NotFound);
                            }
                            else
                            {
                                Util.Log("Downloading: {0}", url);

                                using (FaviconDownloader fd = new FaviconDownloader())
                                {
                                    try
                                    {
                                        // Download favicon
                                        byte[] data = fd.GetIcon(url);
                                        Util.Log("Icon downloaded with success");

                                        // Hash icon data (avoid duplicates)
                                        byte[] hash = Util.HashData(data);

                                        // Creates an icon only if your UUID does not exist
                                        PwUuid uuid = new PwUuid(hash);
                                        if (!pluginHost.Database.CustomIcons.Exists(delegate(PwCustomIcon x) { return(x.Uuid.Equals(uuid)); }))
                                        {
                                            // Add icon
                                            icons[i] = new PwCustomIcon(uuid, data);
                                        }

                                        // Associate with this entry
                                        entry.CustomIconUuid = uuid;

                                        // Save it
                                        entry.Touch(true, false);

                                        // Icon downloaded with success
                                        Interlocked.Increment(ref progress.Success);
                                    }
                                    catch (FaviconDownloaderException ex)
                                    {
                                        Util.Log("Failed to download favicon");

                                        if (ex.Status == FaviconDownloaderExceptionStatus.NotFound)
                                        {
                                            // Can't find an icon
                                            Interlocked.Increment(ref progress.NotFound);
                                        }
                                        else
                                        {
                                            // Some other error (network, etc)
                                            Interlocked.Increment(ref progress.Error);
                                        }
                                    }
                                }
                            }
                        }

                        // Notifies that all downloads are finished
                        if (Interlocked.Decrement(ref progress.Remaining) == 0)
                        {
                            waiter.Set();
                        }
                    });
                }

                // Wait until the downloads are finished
                int lastValue = 0;
                do
                {
                    // Update progress only when needed
                    if (lastValue != progress.Remaining)
                    {
                        ReportProgress(progress);
                        lastValue = progress.Remaining;
                    }
                } while (!waiter.WaitOne(100));
            }

            // Progress 100%
            ReportProgress(progress);
            status = String.Format("YAFD: Success: {0} / Not Found: {1} / Error: {2}.", progress.Success, progress.NotFound, progress.Error);

            // Prevents inserting duplicate icons
            MergeCustomIcons(icons);

            // Refresh icons on database
            pluginHost.Database.UINeedsIconUpdate = true;

            // Waits long enough until we can see the output
            Thread.Sleep(3000);
        }