Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXperience 13.1 Demos/ASP.NET/CS/MVCDemos.Razor/Models/
Upload File :
Current File : C:/Users/Public/Documents/DXperience 13.1 Demos/ASP.NET/CS/MVCDemos.Razor/Models/Arts.cs

using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.IO;
using System.Linq;
using System.Web;
using DevExpress.Web.ASPxFileManager;
using DevExpress.Web.Demos.Models;

namespace DevExpress.Web.Demos {
    public static class ArtsDataProvider {
        const string ArtsDataContextKey = "DXArtsDataContext";

        public static ArtsDataContext DB {
            get {
                if(HttpContext.Current.Items[ArtsDataContextKey] == null)
                    HttpContext.Current.Items[ArtsDataContextKey] = new ArtsDataContext();
                return (ArtsDataContext)HttpContext.Current.Items[ArtsDataContextKey];
            }
        }

        public static List<ArtsFileSystemItem> GetArts() {
            List<ArtsFileSystemItem> arts = (List<ArtsFileSystemItem>)HttpContext.Current.Session["Arts"];
            if(arts == null) {
                arts = (from art in DB.Arts
                            select new ArtsFileSystemItem {
                                ArtID = art.ID,
                                ParentID = art.ParentID,
                                Name = art.Name,
                                IsFolder = art.IsFolder ?? false,
                                Data = art.Data,
                                LastWriteTime = art.LastWriteTime
                            }
                        ).ToList();
                HttpContext.Current.Session["Arts"] = arts;
            }
            return arts;
        }
        public static void InsertArt(ArtsFileSystemItem newArt) {
            newArt.ArtID = GetNewArtID();
            GetArts().Add(newArt);
        }
        public static void DeleteArt(ArtsFileSystemItem art) {
            if(art.IsFolder) {
                List<ArtsFileSystemItem> childFolders = GetArts().FindAll(item => item.IsFolder && item.ParentID == art.ArtID);
                if(childFolders != null) {
                    foreach(ArtsFileSystemItem childFolder in childFolders) {
                        DeleteArt(childFolder);
                    }
                }
            }
            GetArts().Remove(art);
        }
        public static void UpdateArt(ArtsFileSystemItem art, Action<ArtsFileSystemItem> update) {
            update(art);
        }

        static int GetNewArtID() {
            IEnumerable<ArtsFileSystemItem> arts = GetArts();
            return (arts.Count() > 0) ? arts.Last().ArtID + 1 : 0;
        }
    }

    public class ArtsFileSystemItem {
        public int ArtID { get; set; }

        public int? ParentID { get; set; }

        public string Name { get; set; }

        public bool IsFolder { get; set; }

        public Binary Data { get; set; }

        public DateTime? LastWriteTime { get; set; }
    }

    public class ArtsFileSystemProvider : FileSystemProviderBase {
        const int ArtsRootItemID = 1;
        string rootFolderDisplayName;
        Dictionary<int, ArtsFileSystemItem> folderCache;

        public ArtsFileSystemProvider(string rootFolder)
            : base(rootFolder) {
            RefreshFolderCache();
        }

        public override string RootFolderDisplayName { get { return rootFolderDisplayName; } }
        public Dictionary<int, ArtsFileSystemItem> FolderCache { get { return folderCache; } }

        public override IEnumerable<FileManagerFile> GetFiles(FileManagerFolder folder) {
            ArtsFileSystemItem artFolderItem = FindArtsFolderItem(folder);
            return from artItem in ArtsDataProvider.GetArts()
                where !artItem.IsFolder && artItem.ParentID == artFolderItem.ArtID
                select new FileManagerFile(this, folder, artItem.Name);
        }
        public override IEnumerable<FileManagerFolder> GetFolders(FileManagerFolder parentFolder) {
            ArtsFileSystemItem artFolderItem = FindArtsFolderItem(parentFolder);
            return from artItem in FolderCache.Values
                where artItem.IsFolder && artItem.ParentID == artFolderItem.ArtID
                select new FileManagerFolder(this, parentFolder, artItem.Name);
        }
        public override bool Exists(FileManagerFile file) {
            return FindArtsFileItem(file) != null;
        }
        public override bool Exists(FileManagerFolder folder) {
            return FindArtsFolderItem(folder) != null;
        }
        public override Stream ReadFile(FileManagerFile file) {
            return new MemoryStream(FindArtsFileItem(file).Data.ToArray());
        }
        public override DateTime GetLastWriteTime(FileManagerFile file) {
            var artsFileItem = FindArtsFileItem(file);
            return artsFileItem.LastWriteTime.GetValueOrDefault(DateTime.Now);
        }
        public override long GetLength(FileManagerFile file) {
            var artsFileItem = FindArtsFileItem(file);
            return artsFileItem.Data.Length;
        }

        // File/folder management operations
        public override void CreateFolder(FileManagerFolder parent, string name) {
            ArtsDataProvider.InsertArt(new ArtsFileSystemItem { 
                IsFolder = true,
                LastWriteTime = DateTime.Now,
                Name = name,
                ParentID = FindArtsFolderItem(parent).ArtID
            });
            RefreshFolderCache();
        }
        public override void RenameFile(FileManagerFile file, string name) {
            ArtsDataProvider.UpdateArt(FindArtsFileItem(file), artItem => artItem.Name = name);
        }
        public override void RenameFolder(FileManagerFolder folder, string name) {
            ArtsDataProvider.UpdateArt(FindArtsFolderItem(folder), artItem => artItem.Name = name);
            RefreshFolderCache();
        }
        public override void MoveFile(FileManagerFile file, FileManagerFolder newParentFolder) {
            ArtsDataProvider.UpdateArt(FindArtsFileItem(file), artItem => artItem.ParentID = FindArtsFolderItem(newParentFolder).ArtID);
        }
        public override void MoveFolder(FileManagerFolder folder, FileManagerFolder newParentFolder) {
            ArtsDataProvider.UpdateArt(FindArtsFolderItem(folder), artItem => artItem.ParentID = FindArtsFolderItem(newParentFolder).ArtID);
            RefreshFolderCache();
        }
        public override void UploadFile(FileManagerFolder folder, string fileName, Stream content) {
            ArtsDataProvider.InsertArt(new ArtsFileSystemItem {
                IsFolder = false,
                LastWriteTime = DateTime.Now,
                Name = fileName,
                ParentID = FindArtsFolderItem(folder).ArtID,
                Data = ReadAllBytes(content)
            });
        }
        public override void DeleteFile(FileManagerFile file) {
            ArtsDataProvider.DeleteArt(FindArtsFileItem(file));
        }
        public override void DeleteFolder(FileManagerFolder folder) {
            ArtsDataProvider.DeleteArt(FindArtsFolderItem(folder));
            RefreshFolderCache();
        }

        protected ArtsFileSystemItem FindArtsFileItem(FileManagerFile file) {
            ArtsFileSystemItem artsFolderItem = FindArtsFolderItem(file.Folder);
            if(artsFolderItem == null)
                return null;
            return ArtsDataProvider.GetArts().FindAll(item => (int)item.ParentID == artsFolderItem.ArtID && !item.IsFolder && item.Name == file.Name).FirstOrDefault();
        }
        protected ArtsFileSystemItem FindArtsFolderItem(FileManagerFolder folder) {
            return (from artFolderItem in FolderCache.Values 
                where artFolderItem.IsFolder && GetRelativeName(artFolderItem) == folder.RelativeName
                select artFolderItem).FirstOrDefault();
        }
        protected string GetRelativeName(ArtsFileSystemItem artFolderItem) {
            if(artFolderItem.ArtID == ArtsRootItemID) return string.Empty;
            if(artFolderItem.ParentID == ArtsRootItemID) return artFolderItem.Name;
            if(!FolderCache.ContainsKey((int)artFolderItem.ParentID)) return null;
            string name = GetRelativeName(FolderCache[(int)artFolderItem.ParentID]);
            return name == null ? null : Path.Combine(name, artFolderItem.Name);
        }
        protected void RefreshFolderCache() {
            this.folderCache = ArtsDataProvider.GetArts().FindAll(artItem => artItem.IsFolder).ToDictionary(artItem => artItem.ArtID);
            this.rootFolderDisplayName = (from artFolderItem in FolderCache.Values where artFolderItem.ArtID == ArtsRootItemID select artFolderItem.Name).First();
        }
        protected static byte[] ReadAllBytes(Stream stream) {
            byte[] buffer = new byte[16 * 1024];
            int readCount;
            using(MemoryStream ms = new MemoryStream()) {
                while((readCount = stream.Read(buffer, 0, buffer.Length)) > 0) {
                    ms.Write(buffer, 0, readCount);
                }
                return ms.ToArray();
            }
        }
    }
}