public void ShowLogDialog(LogWindowVM vm)
        {
            var win = new LogWindow()
            {
                DataContext = vm
            };

            win.ShowDialog();
        }
示例#2
0
        private async void OnStartBackup()
        {
            if (Directory.Exists(Folder) == false)
            {
                ShowError("폴더가 존재하지 않습니다.");

                return;
            }


            string blogName;

            if (SelectedBlogIndex >= 0 && SelectedBlogIndex < BlogList.Count)
            {
                blogName = BlogList[SelectedBlogIndex].Name;
            }
            else
            {
                ShowError("선택된 블로그가 유효하지 않습니다.");

                return;
            }


            FindFolderCommand.IsEnabled  = false;
            StartBackupCommand.IsEnabled = false;

            IsIdle = false;
            OnPropertyChanged("IsIdle");

            HideError();


            var logger = new BackupLogger();
            var bakMgr = new BackupManager(Folder, blogName);

            bakMgr.Logger = logger;


            try
            {
                var categories = await Api.ListCategory(blogName);

                if (categories.Categories != null)
                {
                    foreach (var category in categories.Categories)
                    {
                        bakMgr.AddCategory(category.Id, category.Name, category.Parent);
                    }
                }


                int pageNum  = 1;
                var postList = await Api.ListPost(blogName, pageNum);

                TotalPageCount = postList.TotalCount;
                OnPropertyChanged("TotalPageCount");

                NumPageCompleted = 0;
                OnPropertyChanged("NumPageCompleted");


                while (NumPageCompleted < TotalPageCount)
                {
                    // 현재 페이지의 글 백업.
                    foreach (var page in postList.Posts)
                    {
                        // 작업 중인 페이지 표시.
                        CurrentPage = string.Format("[{0}] {1}", page.Id, page.Title);
                        OnPropertyChanged("CurrentPage");

                        // 존재하는 백업이 없으면 백업 진행.
                        if (bakMgr.BackupExists(page.CategoryId, page.Id) == false)
                        {
                            string content = string.Empty;

                            int maxRetryCount = 5;
                            for (int retry = 0; retry <= maxRetryCount; ++retry)
                            {
                                try
                                {
                                    var post = await Api.ReadPost(blogName, page.Id);

                                    content = post.Content;

                                    break;
                                }
                                catch (Exception e)
                                {
                                    if (retry < maxRetryCount)
                                    {
                                        ShowError(e.Message + " > 재시도 대기...");
                                        await Task.Delay(3000);

                                        HideError();
                                    }
                                    else
                                    {
                                        ShowError($"{page.Id}번 게시글을 불러올 수 없습니다.");
                                        logger.Add(page.Id, "글의 내용을 받아올 수 없습니다.");

                                        content = string.Empty;
                                    }
                                }
                            }

                            if (string.IsNullOrEmpty(content) == false)
                            {
                                try
                                {
                                    await bakMgr.Backup(page.CategoryId, page.Id,
                                                        page.Title, content);
                                }
                                catch
                                {
                                    ShowError($"{page.Id}번 게시글의 백업에 실패하였습니다.");
                                    logger.Add(page.Id, "불완전 백업.");
                                }
                            }
                        }

                        NumPageCompleted += 1;
                        OnPropertyChanged("NumPageCompleted");
                    }

                    // 다음 페이지 불러오기.
                    if (NumPageCompleted < TotalPageCount)
                    {
                        pageNum += 1;

                        int maxRetryCount = 10;
                        for (int retry = 0; retry <= maxRetryCount; ++retry)
                        {
                            try
                            {
                                postList = await Api.ListPost(blogName, pageNum);

                                break;
                            }
                            catch (Exception e)
                            {
                                if (retry < maxRetryCount)
                                {
                                    ShowError(e.Message + " > 재시도 대기...");
                                    await Task.Delay(5000);

                                    HideError();
                                }
                                else
                                {
                                    ShowError("다음 페이지를 불러올 수 없습니다.");
                                    return;
                                }
                            }
                        }
                    }
                }


                HideError();

                CurrentPage = string.Empty;
                OnPropertyChanged("CurrentPage");
            }
            catch (Exception e)
            {
                if (e.InnerException == null)
                {
                    ShowError(e.Message);

                    CreateDebugLog(e.Message, e.StackTrace);
                }
                else
                {
                    var inner = e.InnerException;

                    ShowError(inner.Message);

                    CreateDebugLog(e.Message, e.StackTrace, "---- Inner Exception ----",
                                   inner.Message, inner.StackTrace);
                }
            }
            finally
            {
                // Show backup log.
                if (logger.IsEmpty == false)
                {
                    var logVm = new LogWindowVM();
                    logVm.SetLog(logger);

                    LogService.ShowLogDialog(logVm);
                }


                IsIdle = true;
                OnPropertyChanged("IsIdle");

                FindFolderCommand.IsEnabled  = true;
                StartBackupCommand.IsEnabled = true;
            }
        }