private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
      WorkerArgument argument = (WorkerArgument)e.Argument;

      var progressStatus = new ParseProgressStatus { PresentationControl = argument.PresentationControl };

      MySQLPresentationTable abstractpresTable = null;
      PresentationInfo presInfo = null;

      try
      {
        #region Парсинг презентации

        ((BackgroundWorker)sender).ReportProgress(0,
          new ParseProgressStatus
          {
            PresentationControl = argument.PresentationControl,
            Message = "Начало парсинга презентации",
            IsOnlyMessage = true
          });


        using (PPTFiles pptFiles = new PPTFiles())
        {
          #region Получаюданные настройки соединения с БД

          string dbRemoteHost = null,
            dbName = null,
            dbUser = null,
            dbPassword = null;

          try
          {
            XDocument xmlDBDoc = XDocument.Load("Lib\\FCashProfile.tss");

            var XdbRemoteHost = xmlDBDoc.Root.Element(XName.Get("ExportDBInfo")).Element(XName.Get("DBRemoteHost"));
            dbRemoteHost = XdbRemoteHost.Value;

            var XdbName = xmlDBDoc.Root.Element(XName.Get("ExportDBInfo")).Element(XName.Get("DBName"));
            dbName = XdbName.Value;

            var XdbUser = xmlDBDoc.Root.Element(XName.Get("ExportDBInfo")).Element(XName.Get("DBUser"));
            dbUser = XdbUser.Value;

            var XdbPassword = xmlDBDoc.Root.Element(XName.Get("ExportDBInfo")).Element(XName.Get("DBPassword"));
            dbPassword = XdbPassword.Value;
          }
          catch (Exception ex)
          {
            throw new Exception(
              String.Format("Не получилось получить конфигурационные данные из файла конфигурации: {0}", ex.Message));
          }

          //if (!String.IsNullOrEmpty(argument.UrlNews))
          //    presInfo.UrlNews = argument.UrlNews;


          if (String.IsNullOrEmpty(dbRemoteHost) || String.IsNullOrEmpty(dbName) || String.IsNullOrEmpty(dbUser))
            throw new Exception(
              "У вас не заполнена конфигурация соединения с базой данных для экспорта\nПожалуйста заполните ее через настройки");

          MySQLPresentationTable presTable = new MySQLPresentationTable(dbRemoteHost, dbName, dbUser, dbPassword);
          abstractpresTable = presTable;

          #endregion

          pptFiles.ParseSlideCompleteCallback += (object pptFile, SlideCompleteParsingInfo slideParsingInfo) =>
          {
            ((BackgroundWorker)sender).ReportProgress(
              (int)((decimal)slideParsingInfo.SlideCurrentNumber / (decimal)slideParsingInfo.SlideTotalNumber * 100),
              new ParseProgressStatus
              {
                PresentationControl = argument.PresentationControl,
                Message = "Обработка слайдов"
              });
          };

          presTable.CreateTable();

          presInfo = pptFiles.ExtractInfo(argument.PresentationFullPath, presTable);
          presInfo.Name = argument.PresentationName;
          presInfo.Title = argument.PresentationTitle;
          presInfo.Login = argument.Login;
          presInfo.Categorie = ((KeyValuePair<string, string>)argument.SelectedItem);
        }

        #endregion

        #region Заливка информации по презентации в БД

        {
          ((BackgroundWorker)sender).ReportProgress(0,
            new ParseProgressStatus
            {
              PresentationControl = argument.PresentationControl,
              Message = "Обновление данных на сервере",
              IsOnlyMessage = true
            });

          abstractpresTable.PutDataOnServer(presInfo);
        }

        #endregion

        #region Отправка на FTP

        try
        {
          ((BackgroundWorker)sender).ReportProgress(0,
            new ParseProgressStatus
            {
              PresentationControl = argument.PresentationControl,
              Message = "Подготовка к отправке файлов на FTP",
              IsOnlyMessage = true
            });

          XDocument xmlFtpDoc = XDocument.Load("Lib\\FCashProfile.tss");

          var ftpHost = xmlFtpDoc.Root.Element(XName.Get("ExportFtpInfo")).Element(XName.Get("Host"));
          var ftpUserName = xmlFtpDoc.Root.Element(XName.Get("ExportFtpInfo")).Element(XName.Get("UserName"));
          var ftpUserPassword = xmlFtpDoc.Root.Element(XName.Get("ExportFtpInfo")).Element(XName.Get("UserPassword"));
          var ftpImagesDir = xmlFtpDoc.Root.Element(XName.Get("ExportFtpInfo")).Element(XName.Get("ImagesDir"));

          FTP ftp = new FTP(ftpHost.Value, ftpUserName.Value, ftpUserPassword.Value, ftpImagesDir.Value);
          ftp.UploadImageCompleteCallback += (object ftpSender, UploadImageCompliteInfo completeInfo) =>
          {
            ((BackgroundWorker)sender).ReportProgress(
              (int)((decimal)completeInfo.CurrentImageNumber / (decimal)completeInfo.TotalImagesCount * 100),
              new ParseProgressStatus
              {
                PresentationControl = argument.PresentationControl,
                Message = "Загрузка изображений на FTP"
              });
          };

          ftp.OnUploadPresentationBlockCallbak += (object ftpSender, UploadPresentationBlockInfo blockInfo) =>
          {
            ((BackgroundWorker)sender).ReportProgress(blockInfo.PercentProgress,
              new ParseProgressStatus
              {
                PresentationControl = argument.PresentationControl,
                Message = "Загрузка презентации"
              });
          };

          List<string> imageNames = new List<string>();

          foreach (var slideInfo in presInfo.SlidersInfo)
          {
            if (!String.IsNullOrEmpty(slideInfo.ImageNameClientSmall))
              imageNames.Add(slideInfo.ImageNameClientSmall);

            if (!String.IsNullOrEmpty(slideInfo.ImageNameClientAverage))
              imageNames.Add(slideInfo.ImageNameClientAverage);

            if (!String.IsNullOrEmpty(slideInfo.ImageNameClientBig))
              imageNames.Add(slideInfo.ImageNameClientBig);
          }

          ftp.UploadImages(presInfo);
        }
        catch (Exception ex)
        {
          throw new Exception(String.Format("Во время отправки изображений на FTP возникла ошибка: {0}", ex.Message));
        }

        #endregion
      }
      catch (Exception ex)
      {
        lock (_exceptionLoger)
        {
          _exceptionLoger.WriteLog(string.Format(Environment.NewLine + Environment.NewLine + "[{0}] Во время обработки презентации [{1}] произошла ошибка.\r\n Ошибка: {2} \r\nСтек вызова: {3}", DateTime.Now, argument.PresentationName, ex.Message, ex.StackTrace));
        }

        // Удаляю пустую подготовленную строчку для презентации из таблицы
        if (presInfo != null)
        {
          try
          {
            abstractpresTable.DeleteFromMainTable((ulong)presInfo.DbId);
          }
          catch (Exception ex2)
          {
            lock (_exceptionLoger)
            {
              _exceptionLoger.WriteLog(string.Format(Environment.NewLine + Environment.NewLine + "[{0}] Во время обработки презентации [{1}] произошла ошибка.\r\n Ошибка: {2} \r\nСтек вызова: {3}", DateTime.Now, argument.PresentationName, ex2.Message, ex2.StackTrace));
            }
          }

        }

        progressStatus.IsError = true;
      }
      finally
      {
        e.Result = progressStatus;
      }
    }
Esempio n. 2
0
        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            WorkerArgument argument = (WorkerArgument)e.Argument;

            var progressStatus = new ParseProgressStatus {
                PresentationControl = argument.PresentationControl
            };

            MySQLPresentationTable abstractpresTable = null;
            PresentationInfo       presInfo          = null;

            try
            {
                #region Парсинг презентации

                ((BackgroundWorker)sender).ReportProgress(0,
                                                          new ParseProgressStatus
                {
                    PresentationControl = argument.PresentationControl,
                    Message             = "Начало парсинга презентации",
                    IsOnlyMessage       = true
                });


                using (PPTFiles pptFiles = new PPTFiles())
                {
                    #region Получаюданные настройки соединения с БД

                    string dbRemoteHost = null,
                           dbName       = null,
                           dbUser       = null,
                           dbPassword   = null;

                    try
                    {
                        XDocument xmlDBDoc = XDocument.Load("Lib\\FCashProfile.tss");

                        var XdbRemoteHost = xmlDBDoc.Root.Element(XName.Get("ExportDBInfo")).Element(XName.Get("DBRemoteHost"));
                        dbRemoteHost = XdbRemoteHost.Value;

                        var XdbName = xmlDBDoc.Root.Element(XName.Get("ExportDBInfo")).Element(XName.Get("DBName"));
                        dbName = XdbName.Value;

                        var XdbUser = xmlDBDoc.Root.Element(XName.Get("ExportDBInfo")).Element(XName.Get("DBUser"));
                        dbUser = XdbUser.Value;

                        var XdbPassword = xmlDBDoc.Root.Element(XName.Get("ExportDBInfo")).Element(XName.Get("DBPassword"));
                        dbPassword = XdbPassword.Value;
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(
                                  String.Format("Не получилось получить конфигурационные данные из файла конфигурации: {0}", ex.Message));
                    }

                    //if (!String.IsNullOrEmpty(argument.UrlNews))
                    //    presInfo.UrlNews = argument.UrlNews;


                    if (String.IsNullOrEmpty(dbRemoteHost) || String.IsNullOrEmpty(dbName) || String.IsNullOrEmpty(dbUser))
                    {
                        throw new Exception(
                                  "У вас не заполнена конфигурация соединения с базой данных для экспорта\nПожалуйста заполните ее через настройки");
                    }

                    MySQLPresentationTable presTable = new MySQLPresentationTable(dbRemoteHost, dbName, dbUser, dbPassword);
                    abstractpresTable = presTable;

                    #endregion

                    pptFiles.ParseSlideCompleteCallback += (object pptFile, SlideCompleteParsingInfo slideParsingInfo) =>
                    {
                        ((BackgroundWorker)sender).ReportProgress(
                            (int)((decimal)slideParsingInfo.SlideCurrentNumber / (decimal)slideParsingInfo.SlideTotalNumber * 100),
                            new ParseProgressStatus
                        {
                            PresentationControl = argument.PresentationControl,
                            Message             = "Обработка слайдов"
                        });
                    };

                    presTable.CreateTable();

                    presInfo           = pptFiles.ExtractInfo(argument.PresentationFullPath, presTable);
                    presInfo.Name      = argument.PresentationName;
                    presInfo.Title     = argument.PresentationTitle;
                    presInfo.Login     = argument.Login;
                    presInfo.Categorie = ((KeyValuePair <string, string>)argument.SelectedItem);
                }

                #endregion

                #region Заливка информации по презентации в БД

                {
                    ((BackgroundWorker)sender).ReportProgress(0,
                                                              new ParseProgressStatus
                    {
                        PresentationControl = argument.PresentationControl,
                        Message             = "Обновление данных на сервере",
                        IsOnlyMessage       = true
                    });

                    abstractpresTable.PutDataOnServer(presInfo);
                }

                #endregion

                #region Отправка на FTP

                try
                {
                    ((BackgroundWorker)sender).ReportProgress(0,
                                                              new ParseProgressStatus
                    {
                        PresentationControl = argument.PresentationControl,
                        Message             = "Подготовка к отправке файлов на FTP",
                        IsOnlyMessage       = true
                    });

                    XDocument xmlFtpDoc = XDocument.Load("Lib\\FCashProfile.tss");

                    var ftpHost         = xmlFtpDoc.Root.Element(XName.Get("ExportFtpInfo")).Element(XName.Get("Host"));
                    var ftpUserName     = xmlFtpDoc.Root.Element(XName.Get("ExportFtpInfo")).Element(XName.Get("UserName"));
                    var ftpUserPassword = xmlFtpDoc.Root.Element(XName.Get("ExportFtpInfo")).Element(XName.Get("UserPassword"));
                    var ftpImagesDir    = xmlFtpDoc.Root.Element(XName.Get("ExportFtpInfo")).Element(XName.Get("ImagesDir"));

                    FTP ftp = new FTP(ftpHost.Value, ftpUserName.Value, ftpUserPassword.Value, ftpImagesDir.Value);
                    ftp.UploadImageCompleteCallback += (object ftpSender, UploadImageCompliteInfo completeInfo) =>
                    {
                        ((BackgroundWorker)sender).ReportProgress(
                            (int)((decimal)completeInfo.CurrentImageNumber / (decimal)completeInfo.TotalImagesCount * 100),
                            new ParseProgressStatus
                        {
                            PresentationControl = argument.PresentationControl,
                            Message             = "Загрузка изображений на FTP"
                        });
                    };

                    ftp.OnUploadPresentationBlockCallbak += (object ftpSender, UploadPresentationBlockInfo blockInfo) =>
                    {
                        ((BackgroundWorker)sender).ReportProgress(blockInfo.PercentProgress,
                                                                  new ParseProgressStatus
                        {
                            PresentationControl = argument.PresentationControl,
                            Message             = "Загрузка презентации"
                        });
                    };

                    List <string> imageNames = new List <string>();

                    foreach (var slideInfo in presInfo.SlidersInfo)
                    {
                        if (!String.IsNullOrEmpty(slideInfo.ImageNameClientSmall))
                        {
                            imageNames.Add(slideInfo.ImageNameClientSmall);
                        }

                        if (!String.IsNullOrEmpty(slideInfo.ImageNameClientAverage))
                        {
                            imageNames.Add(slideInfo.ImageNameClientAverage);
                        }

                        if (!String.IsNullOrEmpty(slideInfo.ImageNameClientBig))
                        {
                            imageNames.Add(slideInfo.ImageNameClientBig);
                        }
                    }

                    ftp.UploadImages(presInfo);
                }
                catch (Exception ex)
                {
                    throw new Exception(String.Format("Во время отправки изображений на FTP возникла ошибка: {0}", ex.Message));
                }

                #endregion
            }
            catch (Exception ex)
            {
                lock (_exceptionLoger)
                {
                    _exceptionLoger.WriteLog(string.Format(Environment.NewLine + Environment.NewLine + "[{0}] Во время обработки презентации [{1}] произошла ошибка.\r\n Ошибка: {2} \r\nСтек вызова: {3}", DateTime.Now, argument.PresentationName, ex.Message, ex.StackTrace));
                }

                // Удаляю пустую подготовленную строчку для презентации из таблицы
                if (presInfo != null)
                {
                    try
                    {
                        abstractpresTable.DeleteFromMainTable((ulong)presInfo.DbId);
                    }
                    catch (Exception ex2)
                    {
                        lock (_exceptionLoger)
                        {
                            _exceptionLoger.WriteLog(string.Format(Environment.NewLine + Environment.NewLine + "[{0}] Во время обработки презентации [{1}] произошла ошибка.\r\n Ошибка: {2} \r\nСтек вызова: {3}", DateTime.Now, argument.PresentationName, ex2.Message, ex2.StackTrace));
                        }
                    }
                }

                progressStatus.IsError = true;
            }
            finally
            {
                e.Result = progressStatus;
            }
        }