예제 #1
0
        public IDocumentId MakeDocument(IContentManagerArenaId arena, string filePath,
                                        FileUsingMode mode = FileUsingMode.AutoDetect, bool deleteSourceFile = false, string fileName = null)
        {
            if (arena is null)
            {
                throw new ArgumentNullException(nameof(arena));
            }
            if (string.IsNullOrWhiteSpace(filePath))
            {
                throw new ArgumentException(nameof(filePath));
            }
            if (!File.Exists(filePath))
            {
                throw new ArgumentException($"{nameof(filePath)} = '{filePath}' does not exists.");
            }
            fileName = fileName ?? Path.GetFileName(filePath);
            if (string.IsNullOrWhiteSpace(fileName))
            {
                throw new ArgumentException(nameof(fileName) + " is empty.");
            }
            if (mode == FileUsingMode.AutoDetect)
            {
                mode = PathIsNetworkPath(filePath) ? FileUsingMode.CopySourceFile : FileUsingMode.UseSourceFile;
            }
            IDocumentId          documentId      = null;
            IContentProvider     contentProvider = null;
            Action <IDocumentId> onCloseArena    = OnCloseArenaDeleteDocument;

            switch (mode)
            {
            case FileUsingMode.UseSourceFile:
            {
                if (!deleteSourceFile)
                {
                    onCloseArena = null;
                }
                documentId = new DocumentIdImpl(arena, filePath);
            } break;

            case FileUsingMode.CopySourceFile:
            {
                var arenaFilePath = Path.GetTempFileName();
                if (deleteSourceFile)
                {
                    File.Move(filePath, arenaFilePath, true);
                    documentId = new DocumentIdImpl(arena, arenaFilePath);
                }
                else
                {
                    contentProvider = new FileContentProvider(contentDestinationPath => File.Copy(filePath, contentDestinationPath, true), () => File.Length(filePath));
                    documentId      = new DocumentIdImpl(arena, arenaFilePath);
                }
            } break;

            default:
                throw new NotImplementedException($"{nameof(mode)}={mode}");
            }
            AddDocumentInfo(documentId, new DocumentInfo(fileName, onCloseArena, contentProvider));
            return(documentId);
        }
예제 #2
0
 private ArenaInfo GetArenaInfo(IContentManagerArenaId arena, IDocumentId documentId = null /*for logging only*/)
 {
     if (Arenas.TryGetValue(arena, out var currentArenaInfo))
     {
         return(currentArenaInfo);
     }
     throw new ArgumentException($"Working with disposed arena {arena} for document id '{documentId?.ToString() ?? ""}'");
 }
예제 #3
0
 public INamedStream MakeWritableEmptyDocument(IContentManagerArenaId arena, string name, out IDocumentId documentId)
 {
     using (var empty = System.IO.Stream.Null)
         documentId = MakeDocument(arena, new Document()
         {
             Name = name, Stream = empty
         });
     return(ExclusiveReadWriteDocument(documentId));
 }
예제 #4
0
        public IDocumentId MakeLazyDocument(IContentManagerArenaId arena, string name, IContentProvider contentProvider)
        {
            if (contentProvider is null)
            {
                throw new ArgumentNullException(nameof(contentProvider));
            }
            var documentId = new DocumentIdImpl(arena);

            AddDocumentInfo(documentId, new DocumentInfo(name, OnCloseArenaDeleteDocument, contentProvider));
            return(documentId);
        }
예제 #5
0
 private void OnCloseArena(IContentManagerArenaId arena)
 {
     if (!Arenas.TryRemove(arena, out var arenaInfo))
     {
         throw new ArgumentException("Already disposed content manager arena " + arena);
     }
     foreach (var documentId in arenaInfo.ToList())
     {
         documentId.Value.OnCloseArena?.Invoke(documentId.Key);
     }
 }
예제 #6
0
        public IDocumentId MakeDocument(IContentManagerArenaId arena, INamedStream document)
        {
            if (document is null)
            {
                throw new ArgumentNullException(nameof(document));
            }
            if (document.Stream is null)
            {
                throw new ArgumentNullException(nameof(document) + "." + nameof(document.Stream));
            }
            var documentId = new DocumentIdImpl(arena);

            using (var content = File.Open(documentId.DocumentId, FileMode.Open, FileAccess.Write, FileShare.None))
            {
                //document.Stream.Flush();
                document.Stream.CopyTo(content);
                //content.Flush();
            };
            AddDocumentInfo(documentId, new DocumentInfo(document.Name, OnCloseArenaDeleteDocument, null));
            return(documentId);
        }
예제 #7
0
 public DocumentIdImpl(IContentManagerArenaId arena, string documentId = null)
 {
     DocumentId = documentId ?? Path.GetTempFileName();
     Arena      = arena;
 }
예제 #8
0
 public bool Equals(IContentManagerArenaId other)
 {
     return((!(other is null)) && other.ArenaId.Equals(ArenaId));
 }