Exemple #1
0
        /// <summary>
        ///     Saves the dictionary according to its filename
        /// </summary>
        public void Save()
        {
            Util.DontNotify(() =>
            {
                if (Watcher != null)
                {
                    Watcher.StopWatching();
                }

                Updater updater = new Updater(true);
                updater.visit(this);

                VersionedWriter writer = new VersionedWriter(FilePath);
                unParse(writer, false);
                writer.Close();

                updater = new Updater(false);
                updater.visit(this);

                if (Watcher != null)
                {
                    Watcher.StartWatching();
                }

                foreach (DeleteFilesHandler file in FilesToDelete)
                {
                    file.DeleteFile();
                }
                FilesToDelete.Clear();
            });
        }
        public static void RegisterFilesToDelete(this IUnitOfWork unitOfWork, FilesToDelete filesToDelete)
        {
            unitOfWork.OnCommit += delegate()
            {
                try
                {
                    filesToDelete.KeepNewFiles();
                    filesToDelete.Dispose();
                }
                catch
                {
                }
            };

            unitOfWork.OnRollback += delegate()
            {
                try
                {
                    filesToDelete.Dispose();
                }
                catch
                {
                }
            };
        }
Exemple #3
0
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var field = (StringField)(handler.Row.FindField(this.filesField) ?? handler.Row.FindFieldByPropertyName(filesField));

            if (!handler.Row.IsAssigned(field))
            {
                return;
            }

            var oldFilesJSON = (handler.IsCreate ? null : field[handler.Old]).TrimToNull();
            var newFilesJSON = field[handler.Row] = field[handler.Row].TrimToNull();

            if (oldFilesJSON.IsTrimmedSame(newFilesJSON))
            {
                field[handler.Row] = oldFilesJSON;
                return;
            }

            var oldFileList = ParseAndValidate(oldFilesJSON, "oldFiles");
            var newFileList = ParseAndValidate(newFilesJSON, "newFiles");

            var filesToDelete = new FilesToDelete();

            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_FilesToDelete"] = filesToDelete;

            foreach (var file in oldFileList)
            {
                var filename = file.Filename.Trim();
                if (newFileList.Any(x => String.Compare(x.Filename.Trim(), filename, StringComparison.OrdinalIgnoreCase) == 0))
                {
                    continue;
                }

                var actualOldFile = ((subFolder != null && !storeSubFolderInDB) ? (subFolder + "/") : "") + filename;
                filesToDelete.RegisterOldFile(actualOldFile);

                if (copyFilesToHistory)
                {
                    var    oldFilePath = UploadHelper.ToPath(actualOldFile);
                    string date        = DateTime.UtcNow.ToString("yyyyMM", Invariants.DateTimeFormat);
                    string historyFile = "history/" + date + "/" + Path.GetFileName(oldFilePath);
                    if (File.Exists(UploadHelper.DbFilePath(oldFilePath)))
                    {
                        UploadHelper.CopyFileAndRelated(UploadHelper.DbFilePath(oldFilePath), UploadHelper.DbFilePath(historyFile), overwrite: true);
                    }
                }
            }

            if (newFileList.IsEmptyOrNull())
            {
                field[handler.Row] = null;
                return;
            }

            if (handler.IsUpdate)
            {
                field[handler.Row] = CopyTemporaryFiles(handler, oldFileList, newFileList, filesToDelete);
            }
        }
Exemple #4
0
        private static List <Entities.MailAttachmentsRow> AttachFiles(BodyBuilder builder, string attachments,
                                                                      FilesToDelete filesToDelete, string fileNameFormat)
        {
            var result = new List <Entities.MailAttachmentsRow>();

            if (string.IsNullOrEmpty(attachments))
            {
                return(result);
            }

            var list = JSON.Parse <UploadedFile[]>(attachments);

            foreach (var att in list)
            {
                if (!att.Filename.ToLowerInvariant().StartsWith("temporary/"))
                {
                    throw new InvalidOperationException("Only temporary files can be used for upload!");
                }

                UploadHelper.CheckFileNameSecurity(att.Filename);

                var path = UploadHelper.DbFilePath(att.Filename);

                string originalName;
                var    origFile = System.IO.Path.ChangeExtension(path, ".orig");
                if (System.IO.File.Exists(origFile))
                {
                    using (var sr = new System.IO.StreamReader(System.IO.File.OpenRead(origFile)))
                        originalName = sr.ReadLine();
                }
                else
                {
                    originalName = "att" + (builder.Attachments.Count + 1) + System.IO.Path.GetExtension(path);
                }

                var bytes      = System.IO.File.ReadAllBytes(path);
                var attachment = builder.Attachments.Add(originalName, bytes);
                MimeKit.Parameter param;
                if (attachment.ContentDisposition.Parameters.TryGetValue("filename", out param))
                {
                    param.EncodingMethod = ParameterEncodingMethod.Rfc2047;
                }

                var copyResult = new UploadHelper(fileNameFormat).CopyTemporaryFile(
                    att.Filename, -1, filesToDelete);

                result.Add(new Entities.MailAttachmentsRow
                {
                    MimeType         = attachment.ContentType.MimeType,
                    Size             = bytes.Length,
                    OriginalFileName = originalName,
                    FilePath         = copyResult.DbFileName
                });
            }

            return(result);
        }
Exemple #5
0
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var filesToDelete = new FilesToDelete();

            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_FilesToDelete"] = filesToDelete;

            var filename    = (StringField)(handler.Row.FindField(this.fileNameField) ?? handler.Row.FindFieldByPropertyName(fileNameField));
            var oldFilename = handler.IsCreate ? null : filename[handler.Old];
            var newFilename = filename[handler.Row] = filename[handler.Row].TrimToNull();

            if (oldFilename.IsTrimmedSame(newFilename))
            {
                filename[handler.Row] = oldFilename;
                return;
            }

            if (!oldFilename.IsEmptyOrNull())
            {
                var actualOldFile = ((subFolder != null && !storeSubFolderInDB) ? (subFolder + "/") : "") + oldFilename;
                filesToDelete.RegisterOldFile(actualOldFile);

                if (copyFileToHistory)
                {
                    var    oldFilePath = UploadHelper.ToPath(actualOldFile);
                    string date        = DateTime.UtcNow.ToString("yyyyMM", Invariants.DateTimeFormat);
                    string historyFile = "history/" + date + "/" + Path.GetFileName(oldFilePath);
                    if (File.Exists(UploadHelper.DbFilePath(oldFilePath)))
                    {
                        UploadHelper.CopyFileAndRelated(UploadHelper.DbFilePath(oldFilePath), UploadHelper.DbFilePath(historyFile), overwrite: true);
                    }
                }
            }


            if (newFilename == null)
            {
                if (oldFilename.IsTrimmedEmpty())
                {
                    return;
                }

                filename[handler.Row] = null;
                return;
            }

            if (!newFilename.ToLowerInvariant().StartsWith("temporary/"))
            {
                throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");
            }

            if (handler.IsUpdate)
            {
                var copyResult = CopyTemporaryFile(handler, filesToDelete);
                filename[handler.Row] = copyResult.DbFileName;
            }
        }
Exemple #6
0
        public void SetOutputFilePath(string path)
        {
            _outputFilePath = path;
            FilesToDelete.Add(path);

            if (OutputFilePath != null && File.Exists(OutputFilePath))
            {
                FileSize = new FileInfo(OutputFilePath).Length;
            }
        }
Exemple #7
0
 public DGIIndexJob(string input, string output, int demuxType, List <AudioTrackInfo> audioTracks, bool loadSources, bool demuxVideo)
 {
     Input       = input;
     Output      = output;
     DemuxMode   = demuxType;
     AudioTracks = audioTracks;
     LoadSources = loadSources;
     DemuxVideo  = demuxVideo;
     FilesToDelete.Add(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(input), System.IO.Path.GetFileNameWithoutExtension(input) + ".log"));
 }
Exemple #8
0
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var filesToDelete = new FilesToDelete();

            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_" + Target.Name + "_FilesToDelete"] = filesToDelete;

            var filename    = (StringField)(Target);
            var oldFilename = handler.IsCreate ? null : filename[handler.Old];
            var newFilename = filename[handler.Row] = filename[handler.Row].TrimToNull();

            if (oldFilename.IsTrimmedSame(newFilename))
            {
                filename[handler.Row] = oldFilename;
                return;
            }

            DeleteOldFile(filesToDelete, oldFilename);

            if (newFilename == null)
            {
                if (oldFilename.IsTrimmedEmpty())
                {
                    return;
                }

                filename[handler.Row] = null;

                if (!ReferenceEquals(null, originalNameField))
                {
                    originalNameField[handler.Row] = null;
                }

                return;
            }

            if (!newFilename.ToLowerInvariant().StartsWith("temporary/"))
            {
                throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");
            }

            if (!ReferenceEquals(null, originalNameField))
            {
                var originalName = File.ReadAllText(Path.ChangeExtension(
                                                        UploadHelper.DbFilePath(newFilename), ".orig")).TrimToNull();

                originalNameField[handler.Row] = originalName;
            }

            if (handler.IsUpdate)
            {
                var copyResult = CopyTemporaryFile(handler, filesToDelete);
                filename[handler.Row] = copyResult.DbFileName;
            }
        }
 private CopyTemporaryFileResult CopyTemporaryFile(ISaveRequestHandler handler, FilesToDelete filesToDelete)
 {
     var filename = (StringField)(handler.Row.FindField(this.fileNameField) ?? handler.Row.FindFieldByPropertyName(fileNameField));
     var newFilename = filename[handler.Row] = filename[handler.Row].TrimToNull();
     var uploadHelper = new UploadHelper((subFolder.IsEmptyOrNull() ? "" : (subFolder + "/")) + fileNameFormat);
     var idField = (Field)(((IIdRow)handler.Row).IdField);
     var copyResult = uploadHelper.CopyTemporaryFile(newFilename, idField.AsObject(handler.Row), filesToDelete);
     if (subFolder != null && !this.storeSubFolderInDB)
         copyResult.DbFileName = copyResult.DbFileName.Substring(subFolder.Length + 1);
     return copyResult;
 }
Exemple #10
0
 public PgcDemuxJob(string strInput, string strOutputPath, int pgcNumber)
     : base(strInput, null)
 {
     this._strOutputPath = strOutputPath;
     this._pgcNumber     = pgcNumber;
     if (!String.IsNullOrEmpty(strOutputPath))
     {
         FilesToDelete.Add(System.IO.Path.Combine(strOutputPath, "LogFile.txt"));
         FilesToDelete.Add(System.IO.Path.Combine(strOutputPath, "Celltimes.txt"));
     }
 }
Exemple #11
0
        private void SafeAddFileToDelete(string path)
        {
            if (string.IsNullOrWhiteSpace(path))
            {
                return;
            }

            if (!FilesToDelete.Contains(path) && path != FileContainer.OriginFilePath)
            {
                FilesToDelete.Add(path);
            }
        }
Exemple #12
0
 public D2VIndexJob(string input, string output, int demuxType, List <AudioTrackInfo> audioTracks, bool loadSources, bool demuxVideo)
     : base()
 {
     Input       = input;
     Output      = output;
     DemuxMode   = demuxType;
     AudioTracks = audioTracks;
     LoadSources = loadSources;
     DemuxVideo  = demuxVideo;
     FilesToDelete.Add(Path.Combine(Path.GetDirectoryName(input), Path.GetFileNameWithoutExtension(input) + ".log"));
     FilesToDelete.Add(output + ".bad");
     FilesToDelete.Add(Path.ChangeExtension(output, ".fix.txt"));
 }
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var field = (StringField)(handler.Row.FindField(this.filesField) ?? handler.Row.FindFieldByPropertyName(filesField));

            if (!handler.Row.IsAssigned(field))
                return;

            var oldFilesJSON = (handler.IsCreate ? null : field[handler.Old]).TrimToNull();
            var newFilesJSON = field[handler.Row] = field[handler.Row].TrimToNull();

            if (oldFilesJSON.IsTrimmedSame(newFilesJSON))
            {
                field[handler.Row] = oldFilesJSON;
                return;
            }

            var oldFileList = ParseAndValidate(oldFilesJSON, "oldFiles");
            var newFileList = ParseAndValidate(newFilesJSON, "newFiles");

            var filesToDelete = new FilesToDelete();
            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_FilesToDelete"] = filesToDelete;

            foreach (var file in oldFileList)
            {
                var filename = file.Filename.Trim();
                if (newFileList.Any(x => String.Compare(x.Filename.Trim(), filename, StringComparison.OrdinalIgnoreCase) == 0))
                    continue;

                var actualOldFile = ((subFolder != null && !storeSubFolderInDB) ? (subFolder + "/") : "") + filename;
                filesToDelete.RegisterOldFile(actualOldFile);

                if (copyFilesToHistory)
                {
                    var oldFilePath = UploadHelper.ToPath(actualOldFile);
                    string date = DateTime.UtcNow.ToString("yyyyMM", Invariants.DateTimeFormat);
                    string historyFile = "history/" + date + "/" + Path.GetFileName(oldFilePath);
                    if (File.Exists(UploadHelper.DbFilePath(oldFilePath)))
                        UploadHelper.CopyFileAndRelated(UploadHelper.DbFilePath(oldFilePath), UploadHelper.DbFilePath(historyFile), overwrite: true);
                }
            }

            if (newFileList.IsEmptyOrNull())
            {
                field[handler.Row] = null;
                return;
            }

            if (handler.IsUpdate)
                field[handler.Row] = CopyTemporaryFiles(handler, oldFileList, newFileList, filesToDelete);
        }
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var filesToDelete = new FilesToDelete();
            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_FilesToDelete"] = filesToDelete;

            var filename = (StringField)(handler.Row.FindField(this.fileNameField) ?? handler.Row.FindFieldByPropertyName(fileNameField));
            var oldFilename = handler.IsCreate ? null : filename[handler.Old];
            var newFilename = filename[handler.Row] = filename[handler.Row].TrimToNull();

            if (oldFilename.IsTrimmedSame(newFilename))
            {
                filename[handler.Row] = oldFilename;
                return;
            }

            if (!oldFilename.IsEmptyOrNull())
            {
                var actualOldFile = ((subFolder != null && !storeSubFolderInDB) ? (subFolder + "/") : "") + oldFilename;
                filesToDelete.RegisterOldFile(actualOldFile);

                if (copyFileToHistory)
                {
                    var oldFilePath = UploadHelper.ToPath(actualOldFile);
                    string date = DateTime.UtcNow.ToString("yyyyMM", Invariants.DateTimeFormat);
                    string historyFile = "history/" + date + "/" + Path.GetFileName(oldFilePath);
                    if (File.Exists(UploadHelper.DbFilePath(oldFilePath)))
                        UploadHelper.CopyFileAndRelated(UploadHelper.DbFilePath(oldFilePath), UploadHelper.DbFilePath(historyFile), overwrite: true);
                }
            }


            if (newFilename == null)
            {
                if (oldFilename.IsTrimmedEmpty())
                    return;

                filename[handler.Row] = null;
                return;
            }

            if (!newFilename.ToLowerInvariant().StartsWith("temporary/"))
                throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");

            if (handler.IsUpdate)
            {
                var copyResult = CopyTemporaryFile(handler, filesToDelete);
                filename[handler.Row] = copyResult.DbFileName;
            }
        }
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var filesToDelete = new FilesToDelete();
            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_" + Target.Name + "_FilesToDelete"] = filesToDelete;

            var filename = (StringField)(Target);
            var oldFilename = handler.IsCreate ? null : filename[handler.Old];
            var newFilename = filename[handler.Row] = filename[handler.Row].TrimToNull();

            if (oldFilename.IsTrimmedSame(newFilename))
            {
                filename[handler.Row] = oldFilename;
                return;
            }

            DeleteOldFile(filesToDelete, oldFilename);

            if (newFilename == null)
            {
                if (oldFilename.IsTrimmedEmpty())
                    return;

                filename[handler.Row] = null;

                if (!ReferenceEquals(null, originalNameField))
                    originalNameField[handler.Row] = null;

                return;
            }

            if (!newFilename.ToLowerInvariant().StartsWith("temporary/"))
                throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");

            if (!ReferenceEquals(null, originalNameField))
            {
                var originalName = File.ReadAllText(Path.ChangeExtension(
                    UploadHelper.DbFilePath(newFilename), ".orig")).TrimToNull();

                originalNameField[handler.Row] = originalName;
            }

            if (handler.IsUpdate)
            {
                var copyResult = CopyTemporaryFile(handler, filesToDelete);
                filename[handler.Row] = copyResult.DbFileName;
            }
        }
Exemple #16
0
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var field = (StringField)Target;

            if (!handler.Row.IsAssigned(field))
            {
                return;
            }

            var oldFilesJSON = (handler.IsCreate ? null : field[handler.Old]).TrimToNull();
            var newFilesJSON = field[handler.Row] = field[handler.Row].TrimToNull();

            if (oldFilesJSON.IsTrimmedSame(newFilesJSON))
            {
                field[handler.Row] = oldFilesJSON;
                return;
            }

            var oldFileList = ParseAndValidate(oldFilesJSON, "oldFiles");
            var newFileList = ParseAndValidate(newFilesJSON, "newFiles");

            var filesToDelete = new FilesToDelete();

            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_" + Target.Name + "_FilesToDelete"] = filesToDelete;

            foreach (var file in oldFileList)
            {
                var filename = file.Filename.Trim();
                if (newFileList.Any(x => String.Compare(x.Filename.Trim(), filename, StringComparison.OrdinalIgnoreCase) == 0))
                {
                    continue;
                }

                DeleteOldFile(filesToDelete, filename);
            }

            if (newFileList.IsEmptyOrNull())
            {
                field[handler.Row] = null;
                return;
            }

            if (handler.IsUpdate)
            {
                field[handler.Row] = CopyTemporaryFiles(handler, oldFileList, newFileList, filesToDelete);
            }
        }
Exemple #17
0
        public override void OnAfterDelete(IDeleteRequestHandler handler)
        {
            if (handler.Row is IIsActiveDeletedRow ||
                handler.Row is IDeleteLogRow)
            {
                return;
            }

            var filename      = (StringField)(Target);
            var oldFilename   = filename[handler.Row];
            var filesToDelete = new FilesToDelete();

            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);

            DeleteOldFile(filesToDelete, oldFilename);
        }
        public override void OnAfterDelete(IDeleteRequestHandler handler)
        {
            if (handler.Row is IIsActiveDeletedRow ||
                handler.Row is IDeleteLogRow)
                return;

            var field = (StringField)Target;
            var oldFilesJSON = field[handler.Row].TrimToNull();
            var oldFileList = ParseAndValidate(oldFilesJSON, "oldFiles");

            var filesToDelete = new FilesToDelete();
            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);

            foreach (var file in oldFileList)
                DeleteOldFile(filesToDelete, file.Filename);
        }
Exemple #19
0
        private void setTemporaryPath()
        {
            if (String.IsNullOrEmpty(this._strOutputFileName))
            {
                return;
            }

            this._strTemporaryPath = Path.Combine(Path.GetDirectoryName(_strOutputFileName),
                                                  Path.GetFileNameWithoutExtension(_strOutputFileName).Substring(0, Path.GetFileNameWithoutExtension(_strOutputFileName).Length - 2));

            FilesToDelete.Add(Path.Combine(_strTemporaryPath, "LogFile.txt"));
            FilesToDelete.Add(Path.Combine(_strTemporaryPath, "Celltimes.txt"));
            for (int i = 1; i < 10; i++)
            {
                FilesToDelete.Add(Path.Combine(_strTemporaryPath, "VTS_01_" + i + ".VOB"));
            }
            FilesToDelete.Add(_strTemporaryPath);
        }
Exemple #20
0
        private void DeleteOldFile(FilesToDelete filesToDelete, string oldFilename)
        {
            if (!oldFilename.IsEmptyOrNull())
            {
                var actualOldFile = (attr.SubFolder.IsEmptyOrNull() ? "" : (attr.SubFolder + "/")) + oldFilename;
                filesToDelete.RegisterOldFile(actualOldFile);

                if (attr.CopyToHistory)
                {
                    var    oldFilePath = UploadHelper.ToPath(actualOldFile);
                    string date        = DateTime.UtcNow.ToString("yyyyMM", Invariants.DateTimeFormat);
                    string historyFile = "history/" + date + "/" + Path.GetFileName(oldFilePath);
                    if (File.Exists(UploadHelper.DbFilePath(oldFilePath)))
                    {
                        UploadHelper.CopyFileAndRelated(UploadHelper.DbFilePath(oldFilePath), UploadHelper.DbFilePath(historyFile), overwrite: true);
                    }
                }
            }
        }
        public override void OnAfterDelete(IDeleteRequestHandler handler)
        {
            if (ServiceQueryHelper.UseSoftDelete(handler.Row))
            {
                return;
            }

            var field        = (StringField)Target;
            var oldFilesJSON = field[handler.Row].TrimToNull();
            var oldFileList  = ParseAndValidate(oldFilesJSON, "oldFiles");

            var filesToDelete = new FilesToDelete();

            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);

            foreach (var file in oldFileList)
            {
                DeleteOldFile(filesToDelete, file.Filename);
            }
        }
Exemple #22
0
        public static void CleanUp()
        {
            FilesToDelete.Each(file =>
            {
                if (File.Exists(file))
                {
                    File.Delete(file);
                }
            });

            Prepare();
            ApiKeyCollection keys = ApiKey.LoadAll();

            keys.Delete();
            SecureSessionCollection sessions = SecureSession.LoadAll();

            sessions.Delete();

            ApplicationCollection all = Application.LoadAll();

            all.Delete();
            ClearAppsAndStopServers();
        }
Exemple #23
0
 public string generateJoinCommandline(string tempFilename)
 {
     FilesToDelete.Add(tempFilename);
     return(string.Format("-core ( -input \"{0}\" -prefix \"{1}\" -type lst -join )",
                          tempFilename, Output));
 }
Exemple #24
0
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var filesToDelete = new FilesToDelete();

            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_" + Target.Name + "_FilesToDelete"] = filesToDelete;

            var filename    = (StringField)(Target);
            var oldFilename = handler.IsCreate ? null : filename[handler.Old];
            var newFilename = filename[handler.Row] = filename[handler.Row].TrimToNull();

            if (oldFilename.IsTrimmedSame(newFilename))
            {
                filename[handler.Row] = oldFilename;
                return;
            }

            if (!oldFilename.IsEmptyOrNull())
            {
                var actualOldFile = (attr.SubFolder.IsEmptyOrNull() ? "" : (attr.SubFolder + "/")) + oldFilename;
                filesToDelete.RegisterOldFile(actualOldFile);

                if (attr.CopyToHistory)
                {
                    var    oldFilePath = UploadHelper.ToPath(actualOldFile);
                    string date        = DateTime.UtcNow.ToString("yyyyMM", Invariants.DateTimeFormat);
                    string historyFile = "history/" + date + "/" + Path.GetFileName(oldFilePath);
                    if (File.Exists(UploadHelper.DbFilePath(oldFilePath)))
                    {
                        UploadHelper.CopyFileAndRelated(UploadHelper.DbFilePath(oldFilePath), UploadHelper.DbFilePath(historyFile), overwrite: true);
                    }
                }
            }

            if (newFilename == null)
            {
                if (oldFilename.IsTrimmedEmpty())
                {
                    return;
                }

                filename[handler.Row] = null;

                if (!ReferenceEquals(null, originalNameField))
                {
                    originalNameField[handler.Row] = null;
                }

                return;
            }

            if (!newFilename.ToLowerInvariant().StartsWith("temporary/"))
            {
                throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");
            }

            if (!ReferenceEquals(null, originalNameField))
            {
                var originalName = File.ReadAllText(Path.ChangeExtension(
                                                        UploadHelper.DbFilePath(newFilename), ".orig")).TrimToNull();

                originalNameField[handler.Row] = originalName;
            }

            if (handler.IsUpdate)
            {
                var copyResult = CopyTemporaryFile(handler, filesToDelete);
                filename[handler.Row] = copyResult.DbFileName;
            }
        }
Exemple #25
0
        private string CopyTemporaryFiles(ISaveRequestHandler handler,
                                          UploadedFile[] oldFileList, UploadedFile[] newFileList, FilesToDelete filesToDelete)
        {
            foreach (var file in newFileList)
            {
                var filename = file.Filename.Trim();
                if (oldFileList.Any(x => String.Compare(x.Filename.Trim(), filename, StringComparison.OrdinalIgnoreCase) == 0))
                {
                    continue;
                }

                if (!filename.ToLowerInvariant().StartsWith("temporary/"))
                {
                    throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");
                }

                var uploadHelper = new UploadHelper((subFolder.IsEmptyOrNull() ? "" : (subFolder + "/")) + fileNameFormat);
                var idField      = (Field)(((IIdRow)handler.Row).IdField);
                var copyResult   = uploadHelper.CopyTemporaryFile(filename, idField.AsObject(handler.Row), filesToDelete);
                if (subFolder != null && !this.storeSubFolderInDB)
                {
                    copyResult.DbFileName = copyResult.DbFileName.Substring(subFolder.Length + 1);
                }

                file.Filename = copyResult.DbFileName;
            }

            return(JSON.Stringify(newFileList));
        }
Exemple #26
0
 /// <summary>
 /// Adds a new file to delete
 /// </summary>
 /// <param name="element"></param>
 public void AddDeleteFilesElement(DeleteFilesHandler element)
 {
     FilesToDelete.Add(element);
 }
Exemple #27
0
        public static void RegisterFilesToDelete(IUnitOfWork unitOfWork, FilesToDelete filesToDelete)
        {
            unitOfWork.OnCommit += delegate()
            {
                try
                {
                    filesToDelete.KeepNewFiles();
                    filesToDelete.Dispose();
                }
                catch (Exception ex)
                {
                    ex.Log();
                }
            };

            unitOfWork.OnRollback += delegate()
            {
                try
                {
                    filesToDelete.Dispose();
                }
                catch (Exception ex)
                {
                    ex.Log();
                }
            };
        }
Exemple #28
0
        private string CopyTemporaryFiles(ISaveRequestHandler handler,
                                          UploadedFile[] oldFileList, UploadedFile[] newFileList, FilesToDelete filesToDelete)
        {
            foreach (var file in newFileList)
            {
                var filename = file.Filename.Trim();
                if (oldFileList.Any(x => String.Compare(x.Filename.Trim(), filename, StringComparison.OrdinalIgnoreCase) == 0))
                {
                    continue;
                }

                if (!filename.ToLowerInvariant().StartsWith("temporary/"))
                {
                    throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");
                }

                ImageUploadBehavior.CheckUploadedImageAndCreateThumbs(attr, ref filename);

                var idField    = (Field)(((IIdRow)handler.Row).IdField);
                var copyResult = uploadHelper.CopyTemporaryFile(filename, idField.AsObject(handler.Row), filesToDelete,
                                                                s => ImageUploadBehavior.ProcessReplaceFields(s, this.replaceFields, handler));

                if (!attr.SubFolder.IsEmptyOrNull())
                {
                    copyResult.DbFileName = copyResult.DbFileName.Substring(attr.SubFolder.Length + 1);
                }

                file.Filename = copyResult.DbFileName;
            }

            return(JSON.Stringify(newFileList));
        }
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var filesToDelete = new FilesToDelete();
            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_" + Target.Name + "_FilesToDelete"] = filesToDelete;

            var filename = (StringField)(Target);
            var oldFilename = handler.IsCreate ? null : filename[handler.Old];
            var newFilename = filename[handler.Row] = filename[handler.Row].TrimToNull();

            if (oldFilename.IsTrimmedSame(newFilename))
            {
                filename[handler.Row] = oldFilename;
                return;
            }

            if (!oldFilename.IsEmptyOrNull())
            {
                var actualOldFile = (attr.SubFolder.IsEmptyOrNull() ? "" : (attr.SubFolder + "/")) + oldFilename;
                filesToDelete.RegisterOldFile(actualOldFile);

                if (attr.CopyToHistory)
                {
                    var oldFilePath = UploadHelper.ToPath(actualOldFile);
                    string date = DateTime.UtcNow.ToString("yyyyMM", Invariants.DateTimeFormat);
                    string historyFile = "history/" + date + "/" + Path.GetFileName(oldFilePath);
                    if (File.Exists(UploadHelper.DbFilePath(oldFilePath)))
                        UploadHelper.CopyFileAndRelated(UploadHelper.DbFilePath(oldFilePath), UploadHelper.DbFilePath(historyFile), overwrite: true);
                }
            }

            if (newFilename == null)
            {
                if (oldFilename.IsTrimmedEmpty())
                    return;

                filename[handler.Row] = null;

                if (!ReferenceEquals(null, originalNameField))
                    originalNameField[handler.Row] = null;

                return;
            }

            if (!newFilename.ToLowerInvariant().StartsWith("temporary/"))
                throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");

            if (!ReferenceEquals(null, originalNameField))
            {
                var originalName = File.ReadAllText(Path.ChangeExtension(
                    UploadHelper.DbFilePath(newFilename), ".orig")).TrimToNull();

                originalNameField[handler.Row] = originalName;
            }

            if (handler.IsUpdate)
            {
                var copyResult = CopyTemporaryFile(handler, filesToDelete);
                filename[handler.Row] = copyResult.DbFileName;
            }
        }
        private void DeleteOldFile(FilesToDelete filesToDelete, string oldFilename)
        {
            if (!oldFilename.IsEmptyOrNull())
            {
                var actualOldFile = (attr.SubFolder.IsEmptyOrNull() ? "" : (attr.SubFolder + "/")) + oldFilename;
                filesToDelete.RegisterOldFile(actualOldFile);

                if (attr.CopyToHistory)
                {
                    var oldFilePath = UploadHelper.ToPath(actualOldFile);
                    string date = DateTime.UtcNow.ToString("yyyyMM", Invariants.DateTimeFormat);
                    string historyFile = "history/" + date + "/" + Path.GetFileName(oldFilePath);
                    if (File.Exists(UploadHelper.DbFilePath(oldFilePath)))
                        UploadHelper.CopyFileAndRelated(UploadHelper.DbFilePath(oldFilePath), UploadHelper.DbFilePath(historyFile), overwrite: true);
                }
            }
        }
        private string CopyTemporaryFiles(ISaveRequestHandler handler,
            UploadedFile[] oldFileList, UploadedFile[] newFileList, FilesToDelete filesToDelete)
        {
            foreach (var file in newFileList)
            {
                var filename = file.Filename.Trim();
                if (oldFileList.Any(x => String.Compare(x.Filename.Trim(), filename, StringComparison.OrdinalIgnoreCase) == 0))
                    continue;

                if (!filename.ToLowerInvariant().StartsWith("temporary/"))
                    throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");

                ImageUploadBehavior.CheckUploadedImageAndCreateThumbs(attr, ref filename);

                var idField = (Field)(((IIdRow)handler.Row).IdField);
                var copyResult = uploadHelper.CopyTemporaryFile(filename, idField.AsObject(handler.Row), filesToDelete,
                    s => ImageUploadBehavior.ProcessReplaceFields(s, this.replaceFields, handler));

                if (!attr.SubFolder.IsEmptyOrNull())
                    copyResult.DbFileName = copyResult.DbFileName.Substring(attr.SubFolder.Length + 1);

                file.Filename = copyResult.DbFileName;
            }

            return JSON.Stringify(newFileList);
        }
Exemple #32
0
 public void SetVideoAacTempFilePath(string path)
 {
     _videoAacTempFilePath = path;
     FilesToDelete.Add(path);
 }
Exemple #33
0
 public void SetTempFilePath(string path)
 {
     _tempFilePath = path;
     FilesToDelete.Add(path);
 }
        public override void OnBeforeSave(ISaveRequestHandler handler)
        {
            var field = (StringField)Target;

            if (!handler.Row.IsAssigned(field))
                return;

            var oldFilesJSON = (handler.IsCreate ? null : field[handler.Old]).TrimToNull();
            var newFilesJSON = field[handler.Row] = field[handler.Row].TrimToNull();

            if (oldFilesJSON.IsTrimmedSame(newFilesJSON))
            {
                field[handler.Row] = oldFilesJSON;
                return;
            }

            var oldFileList = ParseAndValidate(oldFilesJSON, "oldFiles");
            var newFileList = ParseAndValidate(newFilesJSON, "newFiles");

            var filesToDelete = new FilesToDelete();
            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);
            handler.StateBag[this.GetType().FullName + "_" + Target.Name + "_FilesToDelete"] = filesToDelete;

            foreach (var file in oldFileList)
            {
                var filename = file.Filename.Trim();
                if (newFileList.Any(x => String.Compare(x.Filename.Trim(), filename, StringComparison.OrdinalIgnoreCase) == 0))
                    continue;

                DeleteOldFile(filesToDelete, filename);
            }

            if (newFileList.IsEmptyOrNull())
            {
                field[handler.Row] = null;
                return;
            }

            if (handler.IsUpdate)
                field[handler.Row] = CopyTemporaryFiles(handler, oldFileList, newFileList, filesToDelete);
        }
        private string CopyTemporaryFiles(ISaveRequestHandler handler, 
            UploadedFile[] oldFileList, UploadedFile[] newFileList, FilesToDelete filesToDelete)
        {
            foreach (var file in newFileList)
            {
                var filename = file.Filename.Trim();
                if (oldFileList.Any(x => String.Compare(x.Filename.Trim(), filename, StringComparison.OrdinalIgnoreCase) == 0))
                    continue;

                if (!filename.ToLowerInvariant().StartsWith("temporary/"))
                    throw new InvalidOperationException("For security reasons, only temporary files can be used in uploads!");

                var uploadHelper = new UploadHelper((subFolder.IsEmptyOrNull() ? "" : (subFolder + "/")) + fileNameFormat);
                var copyResult = uploadHelper.CopyTemporaryFile(filename, ((IIdRow)handler.Row).IdField[handler.Row].Value, filesToDelete);
                if (subFolder != null && !this.storeSubFolderInDB)
                    copyResult.DbFileName = copyResult.DbFileName.Substring(subFolder.Length + 1);

                file.Filename = copyResult.DbFileName;
            }

            return JSON.Stringify(newFileList);
        }
        private CopyTemporaryFileResult CopyTemporaryFile(ISaveRequestHandler handler, FilesToDelete filesToDelete)
        {
            var fileName = (StringField)Target;
            var newFilename = fileName[handler.Row] = fileName[handler.Row].TrimToNull();
            CheckUploadedImageAndCreateThumbs(attr, ref newFilename);

            var copyResult = uploadHelper.CopyTemporaryFile(newFilename, ((IIdRow)handler.Row).IdField[handler.Row].Value, filesToDelete);
            if (!attr.SubFolder.IsEmptyOrNull())
                copyResult.DbFileName = copyResult.DbFileName.Substring(attr.SubFolder.Length + 1);
            return copyResult;
        }
Exemple #37
0
        public static AttachmentList GetAttachmentList(MimeMessage message,
                                                       bool forReply, FilesToDelete filesToDelete)
        {
            var uploadHelper = new UploadHelper("Nortwind/Mail/{3:yyyyMM}/{4}");

            var result = new AttachmentList();

            result.ByIndex = new Dictionary <int, AttachmentInfo>();

            result.InOrder = new List <AttachmentInfo>();
            var attachmentNumber = 0;
            var visitor          = new EmailPreviewVisitor(message, (mime, embedUrl) =>
            {
                var sameAttachment = result.InOrder.FirstOrDefault(x => x.Mime == mime);
                if (sameAttachment != null)
                {
                    sameAttachment.IsEmbedded = sameAttachment.IsEmbedded || embedUrl != null;
                    return(sameAttachment.Url);
                }

                ++attachmentNumber;
                string fileName;
                string downUrl = null;

                byte[] buffer;
                using (var output = new MemoryStream())
                {
                    (mime as MimePart).Content.DecodeTo(output);
                    buffer = output.GetBuffer();
                }

                if (mime is MessagePart)
                {
                    fileName = mime.ContentDisposition?.FileName ?? (mime.ContentType.Name ?? "attached" + attachmentNumber + ".eml");
                }
                else
                {
                    fileName = ((MimePart)mime).FileName ?? "file" + attachmentNumber + ".dat";
                }

                if (embedUrl != null)
                {
                    downUrl = string.Format("data:{0};base64,{1}",
                                            mime.ContentType.MimeType, Convert.ToBase64String(buffer, 0, buffer.Length));
                }
                else
                {
                    var processor = new UploadProcessor
                    {
                        ThumbWidth  = 128,
                        ThumbHeight = 96
                    };

                    if (processor.ProcessStream(new MemoryStream(buffer), Path.GetExtension(fileName)))
                    {
                        var temporaryFile = "temporary/" + Path.GetFileName(processor.FilePath);
                        using (var sw = new StreamWriter(Path.ChangeExtension(UploadHelper.DbFilePath(temporaryFile), ".orig")))
                            sw.WriteLine(fileName);

                        var copyResult = uploadHelper.CopyTemporaryFile(temporaryFile, -1, filesToDelete);
                        downUrl        = "/upload/" + copyResult.DbFileName;
                    }
                    else
                    {
                        downUrl = "?";
                    }
                }

                var info = new AttachmentInfo
                {
                    Key        = attachmentNumber,
                    Filename   = fileName,
                    Mime       = mime,
                    Url        = downUrl,
                    IsEmbedded = embedUrl != null,
                    Size       = buffer.Length
                };

                result.ByIndex[attachmentNumber] = info;
                result.InOrder.Add(info);
                return(downUrl);
            }, forReply);

            message.Accept(visitor);
            result.HtmlBody = visitor.HtmlBody;

            return(result);
        }
        public override void OnAfterDelete(IDeleteRequestHandler handler)
        {
            if (handler.Row is IIsActiveDeletedRow ||
                handler.Row is IDeleteLogRow)
                return;

            var filename = (StringField)(Target);
            var oldFilename = filename[handler.Row];
            var filesToDelete = new FilesToDelete();
            UploadHelper.RegisterFilesToDelete(handler.UnitOfWork, filesToDelete);

            DeleteOldFile(filesToDelete, oldFilename);
        }
Exemple #39
0
        public static ServiceResponse ComposeMail(IUnitOfWork uow, MailComposeRequest request, string requestRootUrl, string overrideDisplayName = null)
        {
            request.CheckNotNull();
            Check.NotNull(request.To, "to");
            var config  = Config.Get <MailSettings>();
            var message = new MimeMessage();

            var row = new Entities.MailRow();

            row.Uid           = Guid.NewGuid().ToString("N");
            message.MessageId = row.Uid;

            var subject = "Mobility Matters | " + request.Subject ?? "";

            string editLink = null;
            string editKind = null;

            row.Subject     = subject;
            message.Subject = subject;

            if (config.SenderAddress.IsTrimmedEmpty())
            {
                throw new ValidationError("Please set EmailSendAddress site setting!");
            }

            var user = Authorization.UserDefinition as UserDefinition;
            var from = new MailboxAddress(overrideDisplayName ?? user.DisplayName, config.SenderAddress);

            row.From = from.ToString();
            message.From.Add(from);

            var c = Entities.EmployeesRow.Fields;

            row.To = "";
            foreach (var toId in request.To)
            {
                var toVolunteers = uow.Connection.ById <Entities.EmployeesRow>(toId, q => q
                                                                               .Select(c.FirstName)
                                                                               .Select(c.LastName)
                                                                               .Select(c.Email));

                if (string.IsNullOrWhiteSpace(toVolunteers.Email))
                {
                    throw new ValidationError("To Volunteer " + toVolunteers.FirstName + " " + toVolunteers.LastName + " doesn't have an e-mail address, please set it!");
                }

                var to = new MailboxAddress(toVolunteers.FirstName + " " + toVolunteers.LastName, toVolunteers.Email);
                row.To = row.To + ";" + to.ToString();
                message.To.Add(to);
            }

            if (request.Cc != null)
            {
                var ccList = new List <string>();
                foreach (var contactId in request.Cc)
                {
                    var ccVolunteers = uow.Connection.ById <Entities.EmployeesRow>(contactId, q => q
                                                                                   .Select(c.FirstName)
                                                                                   .Select(c.LastName)
                                                                                   .Select(c.Email));
                    if (ccVolunteers.Email.IsTrimmedEmpty())
                    {
                        throw new ValidationError("CC Volunteer " + ccVolunteers.FirstName + " " + ccVolunteers.LastName + " doesn't have an e-mail address, please set it!");
                    }

                    var cc = new MailboxAddress(ccVolunteers.FirstName + " " + ccVolunteers.LastName, ccVolunteers.Email);
                    message.Cc.Add(cc);
                    ccList.Add(cc.ToString());
                }

                row.Cc = string.Join("; ", ccList);
            }

            var body = request.BodyHtml ?? "";

            if (body.IndexOf("</html>") < 0)
            {
                body = "<html><title>" + HttpUtility.HtmlEncode(request.Subject) +
                       "</title><body>" + body + "</body></html>";
            }

            if (editLink != null)
            {
                var externalUrl = Config.Get <EnvironmentSettings>().SiteExternalUrl ??
                                  requestRootUrl + VirtualPathUtility.ToAbsolute("~/");

                editLink = HttpUtility.HtmlAttributeEncode(UriHelper.Combine(externalUrl, editLink));

                var idx = body.IndexOf("</body>");
                body = body.Insert(idx, "<p></p><p style=\"margin-top: 15px;\">Click link below to open related " + editKind + ":</p>" +
                                   "<p><a href=\"" + editLink + "\">" + HttpUtility.HtmlEncode(editLink) + "</a></p>");
            }

            var bodyBuilder = new BodyBuilder();

            body = AttachEmbeddedImages(bodyBuilder, body);
            var filesToDelete = new FilesToDelete();

            UploadHelper.RegisterFilesToDelete(uow, filesToDelete);

            string fileNameFormat = "Northwind/Mail/{3:yyyyMM}/{4}";

            var attachmentRows = AttachFiles(bodyBuilder, request.Attachments, filesToDelete, fileNameFormat);

            bodyBuilder.HtmlBody = body;
            row.Body             = ConvertEmbeddedImagesToDataUris(bodyBuilder, body);
            message.Body         = bodyBuilder.ToMessageBody();
            row.Direction        = "o";
            row.SendDateTime     = DateTime.UtcNow;
            row.CreatedBy        = user?.UserId ?? user.UserId;
            row.CreatedOn        = DateTime.UtcNow;
            var rowId = Convert.ToInt32(uow.Connection.InsertAndGetID(row));

            foreach (var att in attachmentRows)
            {
                att.MailId    = rowId;
                att.CreatedBy = row.CreatedBy;
                att.CreatedOn = DateTime.UtcNow;
                uow.Connection.Insert(att);
            }

            var response = new ServiceResponse();

            uow.OnCommit += (() =>
            {
                UsingSmtp(client =>
                {
                    try
                    {
                        client.Send(message);

                        uow.Connection.UpdateById <Entities.MailRow>(new MyRow
                        {
                            MailId = rowId,
                            IsSent = true
                        });
                    }
                    catch (Exception ex)
                    {
                        ex.Log();
                        uow.Connection.UpdateById <Entities.MailRow>(new MyRow
                        {
                            MailId = rowId,
                            IsSent = false,
                            ErrorMessage = ex.Message
                        });
                    }
                });

                UsingClient(client =>
                {
                    try
                    {
                        client.GetFolder(SpecialFolder.Sent).Append(message, MessageFlags.Seen);
                    }
                    catch (Exception ex)
                    {
                        ex.Log();
                    }
                });
            });

            return(response);
        }
Exemple #40
0
        private CopyTemporaryFileResult CopyTemporaryFile(ISaveRequestHandler handler, FilesToDelete filesToDelete)
        {
            var filename     = (StringField)(handler.Row.FindField(this.fileNameField) ?? handler.Row.FindFieldByPropertyName(fileNameField));
            var newFilename  = filename[handler.Row] = filename[handler.Row].TrimToNull();
            var uploadHelper = new UploadHelper((subFolder.IsEmptyOrNull() ? "" : (subFolder + "/")) + fileNameFormat);
            var idField      = (Field)(((IIdRow)handler.Row).IdField);
            var copyResult   = uploadHelper.CopyTemporaryFile(newFilename, idField.AsObject(handler.Row), filesToDelete);

            if (subFolder != null && !this.storeSubFolderInDB)
            {
                copyResult.DbFileName = copyResult.DbFileName.Substring(subFolder.Length + 1);
            }
            return(copyResult);
        }
Exemple #41
0
 public CopyTemporaryFileResult CopyTemporaryFile(string dbTemporaryFile, Int64 entityId, FilesToDelete filesToDelete)
 {
     var result = CopyTemporaryFile(dbTemporaryFile, entityId);
     filesToDelete.Register(result);
     return result;
 }
Exemple #42
0
 public CopyTemporaryFileResult CopyTemporaryFile(string dbTemporaryFile, object entityId, FilesToDelete filesToDelete, Func<string, string> fileNameReplacer = null)
 {
     var result = CopyTemporaryFile(dbTemporaryFile, entityId, fileNameReplacer);
     filesToDelete.Register(result);
     return result;
 }
Exemple #43
0
 public void SetSourceFilePath(string path)
 {
     _sourceFilePath = path;
     FilesToDelete.Add(path);
 }
Exemple #44
0
        private CopyTemporaryFileResult CopyTemporaryFile(ISaveRequestHandler handler, FilesToDelete filesToDelete)
        {
            var fileName    = (StringField)Target;
            var newFilename = fileName[handler.Row] = fileName[handler.Row].TrimToNull();

            CheckUploadedImageAndCreateThumbs(attr, ref newFilename);

            var copyResult = uploadHelper.CopyTemporaryFile(newFilename, ((IIdRow)handler.Row).IdField[handler.Row].Value, filesToDelete);

            if (!attr.SubFolder.IsEmptyOrNull())
            {
                copyResult.DbFileName = copyResult.DbFileName.Substring(attr.SubFolder.Length + 1);
            }
            return(copyResult);
        }
Exemple #45
0
        private CopyTemporaryFileResult CopyTemporaryFile(ISaveRequestHandler handler, FilesToDelete filesToDelete)
        {
            var fileName    = (StringField)Target;
            var newFilename = fileName[handler.Row] = fileName[handler.Row].TrimToNull();

            CheckUploadedImageAndCreateThumbs(attr, ref newFilename);

            var idField = (Field)(((IIdRow)handler.Row).IdField);

            var copyResult = uploadHelper.CopyTemporaryFile(newFilename, idField.AsObject(handler.Row), filesToDelete,
                                                            s => ImageUploadBehavior.ProcessReplaceFields(s, this.replaceFields, handler.Row));

            if (!attr.SubFolder.IsEmptyOrNull())
            {
                copyResult.DbFileName = copyResult.DbFileName.Substring(attr.SubFolder.Length + 1);
            }

            return(copyResult);
        }
        private CopyTemporaryFileResult CopyTemporaryFile(ISaveRequestHandler handler, FilesToDelete filesToDelete)
        {
            var fileName = (StringField)Target;
            var newFilename = fileName[handler.Row] = fileName[handler.Row].TrimToNull();
            CheckUploadedImageAndCreateThumbs(attr, ref newFilename);

            var idField = (Field)(((IIdRow)handler.Row).IdField);

            var copyResult = uploadHelper.CopyTemporaryFile(newFilename, idField.AsObject(handler.Row), filesToDelete,
                s => ImageUploadBehavior.ProcessReplaceFields(s, this.replaceFields, handler));

            if (!attr.SubFolder.IsEmptyOrNull())
                copyResult.DbFileName = copyResult.DbFileName.Substring(attr.SubFolder.Length + 1);

            return copyResult;
        }