private void HandleSingle()
        {
            if (File.Exists(TAGS_FILENAME))
            {
                File.Delete(TAGS_FILENAME);
            }
            File.Move(TAGS_FILENAME + ".!tmp", TAGS_FILENAME);

            if (SelectedProvider != null)
            {
                string targetXml = "tags-" + SelectedProvider.Name + ".xml";
                if (File.Exists(targetXml))
                {
                    if (chkBackup.Checked)
                    {
                        string backupName = targetXml + ".bak";
                        if (File.Exists(backupName))
                        {
                            File.Delete(backupName);
                        }
                        File.Move(targetXml, backupName);
                    }
                    else
                    {
                        File.Delete(targetXml);
                    }
                }
                File.Copy(TAGS_FILENAME, targetXml);
                SelectedProvider.LoadProviderTagCollection();
                Program.Logger.Info(String.Format("[Download Tags] Private Tags.xml saved to {0}.", targetXml));
            }

            // merge operation
            if (chkMerge.Checked)
            {
                Program.Logger.Debug("[Download Tags] Merging...");
                lblStatus.Text = "Status: Merging..., this might take some times.";
                lblStatus.Invalidate();
                lblStatus.Update();
                lblStatus.Refresh();
                Application.DoEvents();

                var message = DanbooruTagsDao.Merge(TAGS_FILENAME + ".merge", TAGS_FILENAME);
                Program.Logger.Info("[Download Tags] " + message);
                MessageBox.Show(message, "Tags.xml merged.");
                File.Delete(TAGS_FILENAME + ".merge");
            }

            DanbooruTagsDao.Instance = new DanbooruTagsDao(TAGS_FILENAME);
            Program.Logger.Info("[Download Tags] Complete.");
            lblStatus.Text = "Status: Download complete.";
            if (chkAutoClose.Checked)
            {
                this.Close();
            }
        }
        public void TestMergeTagsXml()
        {
            string source       = @"../../../DanbooruDownloader3.test/TestXml/tags-source.xml";
            string actualTarget = @"../../../DanbooruDownloader3.test/TestXml/tags-target.xml";
            string target       = "tags-target.xml";

            File.Copy(actualTarget, target);
            var message        = DanbooruTagsDao.Merge(source, target);
            var targetInstance = new DanbooruTagsDao(target);

            Assert.IsTrue(targetInstance.Tags.Tag.Length > 0);
        }
        private void HandleLoop(string tempName)
        {
            DanbooruTagCollection tempTags = null;

            if (isSankaku)
            {
                string data = File.ReadAllText(tempName);
                if (!string.IsNullOrWhiteSpace(data))
                {
                    tempTags = new SankakuComplexParser().parseTagsPage(data, Page);
                }
                else
                {
                    string message = "Got empty response!";
                    Program.Logger.Error(message);
                    ++retry;
                    if (retry > Int32.Parse(DanbooruDownloader3.Properties.Settings.Default.retry))
                    {
                        WaitForDelay(message);
                        ProcessLoop(--Page);
                    }
                    else
                    {
                        MessageBox.Show(message);
                    }
                }
            }
            else
            {
                tempTags = new DanbooruTagsDao(tempName).Tags;
            }

            if (tempTags == null || tempTags.Tag == null || tempTags.Tag.Length == 0 ||
                (prevTag != null && prevTag.Tag.Last().Name == tempTags.Tag.Last().Name))
            {
                // no more tags
                chkUseLoop.Enabled = true;

                var newTagList = CombineLoopTag(Page);

                if (SelectedProvider != null)
                {
                    string targetXml = "tags-" + SelectedProvider.Name + ".xml";
                    if (File.Exists(targetXml))
                    {
                        if (chkBackup.Checked)
                        {
                            string backupName = targetXml + ".bak";
                            if (File.Exists(backupName))
                            {
                                File.Delete(backupName);
                            }
                            File.Move(targetXml, backupName);
                        }
                        else
                        {
                            File.Delete(targetXml);
                        }
                    }
                    DanbooruTagsDao.Save(targetXml, newTagList);
                    SelectedProvider.LoadProviderTagCollection();
                    Program.Logger.Info(String.Format("[Download Tags] Private Tags.xml saved to {0}.", targetXml));
                }

                if (chkMerge.Checked)
                {
                    Program.Logger.Debug("[Download Tags] Merging Old Tags.");
                    lblStatus.Text = "Status: Merging Old Tags, this might take some times.";
                    lblStatus.Invalidate();
                    lblStatus.Update();
                    lblStatus.Refresh();
                    Application.DoEvents();

                    DanbooruTagsDao.Save(TAGS_FILENAME + ".merge", newTagList);
                    var message = DanbooruTagsDao.Merge(TAGS_FILENAME + ".merge", TAGS_FILENAME);

                    Program.Logger.Info("[Download Tags] " + message);
                    MessageBox.Show(message, "Tags.xml merged.");

                    File.Delete(TAGS_FILENAME + ".merge");
                }
                else
                {
                    // write back to TAGS_FILENAME
                    DanbooruTagsDao.Save(TAGS_FILENAME, newTagList);
                }

                DanbooruTagsDao.Instance = new DanbooruTagsDao(TAGS_FILENAME);
                Program.Logger.Info("[Download Tags] Complete.");
                lblStatus.Text = "Status: Download complete.";
                if (chkAutoClose.Checked)
                {
                    this.Close();
                }
            }
            else
            {
                // continue next page
                ProcessLoop(Page);
                prevTag = tempTags;
            }
        }