/// <summary>
        /// Выполнить синхронизацию.
        /// </summary>
        public void Sync(
            ISyncContext context,
            TSvc svc,
            int retries,
            ITaskIndicator indicator)
        {
            if (context == null)
                throw new ArgumentNullException("context");
            if (svc == null)
                throw new ArgumentNullException("svc");
            if (indicator == null)
                throw new ArgumentNullException("indicator");

            indicator.SetTaskState(SyncTaskState.Sync);
            try
            {
                context.CheckState();

                indicator.SetStatusText(SyncResources.IndicatorPrepareRequest);
                var rq = PrepareRequest(context);
                if (rq == null)
                    return; // Nothing to do

                context.CheckState();

                indicator.SetStatusText(SyncResources.IndicatorMakeRequest);
                var rsp = context.CallWithRetries(rq, GetDisplayName(), retries,
                    () => MakeRequest(context, svc, rq));

                context.CheckState();

                indicator.SetStatusText(SyncResources.IndicatorProcessResponse);
                ProcessResponse(context, rq, rsp);

                context.CheckState();

                indicator.SetTaskState(SyncTaskState.Succeed);
                indicator.SetStatusText(SyncResources.IndicatorSuccessFinish);
            }
            // Отмену пользователем не трактуем как ошибку и выкидываем наверх
            catch (UserCancelledException)
            {
                throw;
            }
            catch (Exception ex)
            {
                indicator.SetTaskState(SyncTaskState.Failed);
                indicator.SetStatusText(ex.Message);
                context.TryAddSyncError(
                    new SyncErrorInfo(SyncErrorType.CriticalError, GetDisplayName(), ex.ToString()));
            }
        }
Example #2
0
        protected static void InitTransferProgress(ISyncContext context, T svc)
        {
            var notificator = svc as ITransferNotificator;

            if (notificator == null)
            {
                return;
            }
            var progressProv = context.GetService <ISyncProgressVisualizer>();

            if (progressProv == null)
            {
                return;
            }
            notificator.TransferBegin +=
                (total, direction, state) =>
            {
                context.CheckState();
                progressProv.ReportProgress(total, 0);
                var progressTextFormat = (direction == TransferDirection.Receive
                                                ? SyncResources.Receiving
                                                : SyncResources.Sending) + " {0}/{1}";
                progressProv.SetProgressText(
                    progressTextFormat.FormatStr(0, total.ToInfoSizeString()));
                progressProv.SetCompressionSign(state);
            };
            notificator.TransferProgress +=
                (total, current, direction) =>
            {
                context.CheckState();
                progressProv.ReportProgress(total, current);
                var progressTextFormat = (direction == TransferDirection.Receive
                                                ? SyncResources.Receiving
                                                : SyncResources.Sending) + " {0}/{1}";
                progressProv.SetProgressText(
                    progressTextFormat
                    .FormatStr(
                        current.ToInfoSizeString(),
                        total.ToInfoSizeString()));
            };
            notificator.TransferComplete +=
                (total, direction) => progressProv.SetCompressionSign(CompressionState.Off);
        }
Example #3
0
 /// <summary>
 /// Запустить периодические задачи.
 /// </summary>
 public void SyncPeriodicTasks(ISyncContext context)
 {
     PerformSyncProvider(context,
                         svc =>
                         GetPeriodicTaskNames()
                         .Select(name => _tasks[name])                 // Выбираем все периодические задачи
                         .Where(task => task.IsTaskActive())           // Отфильтровываем неактивные
                         .Select(
                             task => new
     {
         Task      = task,
         Indicator = context.AppendTaskIndicator(task.GetDisplayName())
     })                                             // Создаем индикаторы
                         .ToArray()                 // Сразу выполняем. чтобы все индикаторы добавились до начала синхронизации
                         .ForEach(
                             data =>
     {
         data.Task.Sync(context, svc, _webConSvc.GetConfig().RetriesCount, data.Indicator);
         context.CheckState();
     }));
 }
Example #4
0
        public static TRsp CallWithRetries <TRq, TRsp>(
            this ISyncContext context,
            TRq request,
            string taskName,
            int retriesCount,
            Func <TRsp> requestMaker)
        {
            var resp    = default(TRsp);
            var retries = retriesCount + 1;

            while (retries-- > 0)
            {
                try
                {
                    resp = requestMaker();
                }
                // Отмену пользователем не трактуем как ошибку и выкидываем наверх
                catch (UserCancelledException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    if (retries > 0)
                    {
                        context.LogWarning(SyncResources.ErrorMessage.FormatStr(ex.Message));
                        context.TryAddSyncError(
                            new SyncErrorInfo(SyncErrorType.Warning, taskName, ex.ToString()));
                        context.CheckState();
                        continue;
                    }
                    throw;
                }
                break;
            }
            return(resp);
        }
Example #5
0
 protected override PostResponse MakeRequest(ISyncContext context, JanusAT svc, PostRequest rq)
 {
     svc.PostChange(rq);
     context.CheckState();
     return(svc.PostChangeCommit());
 }