Example #1
0
        public override bool ShowDialog(out string log)
        {
            if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
            {
                throw new InvalidOperationException("Main関数にSTAThreadAttributeが設定されていることを確認してください");
            }
            var path = Engine.Tool.SaveDialog(Filter ?? string.Empty, Directory.Exists(InitialDirectory) ? InitialDirectory : string.Empty);

            if (string.IsNullOrEmpty(path))
            {
                log = null;
                return(false);
            }
            if (AddExtension && !string.IsNullOrEmpty(DefaultExtension) && path.IndexOfAny(Path.GetInvalidPathChars()) < 0 && !string.IsNullOrWhiteSpace(path))
            {
                var ex = $".{DefaultExtension.TrimStart('.')}";
                if (Path.GetExtension(path).Length == 0)
                {
                    path += ex;
                }
            }
            if (CheckFileExists && !Engine.File.Exists(path))
            {
                log = $"File does not exists\nPath: {path}";
                return(false);
            }
            if (CheckPathExists && !CheckFilePath(path, out log))
            {
                return(false);
            }
            log      = null;
            FileName = path;
            return(true);
        }
Example #2
0
        private VirtualPathStatus ExistsPath(string urlPath, ref string localPath)
        {
            // check if the path is just a directoy and return
            if (UseDirectoryBrowser && Directory.Exists(localPath))
            {
                return(VirtualPathStatus.Directory);
            }

            if (string.IsNullOrWhiteSpace(DefaultExtension) == false && DefaultExtension.StartsWith(".") &&
                File.Exists(localPath) == false)
            {
                localPath += DefaultExtension;
            }

            if (File.Exists(localPath))
            {
                return(VirtualPathStatus.File);
            }

            if (File.Exists(Path.Combine(localPath, DefaultDocument)))
            {
                localPath = Path.Combine(localPath, DefaultDocument);
            }
            else
            {
                // Try to fallback to root
                var rootLocalPath = Path.Combine(FileSystemPath, urlPath);

                if (UseDirectoryBrowser && Directory.Exists(rootLocalPath))
                {
                    localPath = rootLocalPath;
                    return(VirtualPathStatus.Directory);
                }

                if (File.Exists(rootLocalPath))
                {
                    localPath = rootLocalPath;
                }
                else if (File.Exists(Path.Combine(rootLocalPath, DefaultDocument)))
                {
                    localPath = Path.Combine(rootLocalPath, DefaultDocument);
                }
                else
                {
                    return(VirtualPathStatus.Invalid);
                }
            }

            return(VirtualPathStatus.File);
        }
Example #3
0
        internal bool ExistsLocalPath(string urlPath, ref string localPath)
        {
            if (_validPaths.TryGetValue(localPath, out var tempPath))
            {
                localPath = tempPath;
                return(true);
            }

            var originalPath = localPath;

            if (string.IsNullOrWhiteSpace(DefaultExtension) == false && DefaultExtension.StartsWith(".") &&
                File.Exists(localPath) == false)
            {
                localPath += DefaultExtension;
            }

            if (File.Exists(localPath))
            {
                _validPaths.TryAdd(originalPath, localPath);
                return(true);
            }

            if (Directory.Exists(localPath) && File.Exists(Path.Combine(localPath, DefaultDocument)))
            {
                localPath = Path.Combine(localPath, DefaultDocument);
            }
            else
            {
                // Try to fallback to root
                var rootLocalPath = Path.Combine(FileSystemPath, urlPath);

                if (File.Exists(rootLocalPath))
                {
                    localPath = rootLocalPath;
                }
                else if (Directory.Exists(rootLocalPath) && File.Exists(Path.Combine(rootLocalPath, DefaultDocument)))
                {
                    localPath = Path.Combine(rootLocalPath, DefaultDocument);
                }
                else
                {
                    return(false);
                }
            }

            _validPaths.TryAdd(originalPath, localPath);

            return(true);
        }
Example #4
0
        private bool ExistsLocalPath(string urlPath, ref string localPath)
        {
            if (string.IsNullOrWhiteSpace(DefaultExtension) == false && DefaultExtension.StartsWith(".") &&
                File.Exists(localPath) == false)
            {
                localPath += DefaultExtension;
            }

            if (File.Exists(localPath))
            {
                return(true);
            }

            if (Directory.Exists(localPath) && File.Exists(Path.Combine(localPath, DefaultDocument)))
            {
                localPath = Path.Combine(localPath, DefaultDocument);
            }
            else
            {
                // Try to fallback to root
                var rootLocalPath = Path.Combine(FileSystemPath, urlPath);

                if (File.Exists(rootLocalPath))
                {
                    localPath = rootLocalPath;
                }
                else if (Directory.Exists(rootLocalPath) && File.Exists(Path.Combine(rootLocalPath, DefaultDocument)))
                {
                    localPath = Path.Combine(rootLocalPath, DefaultDocument);
                }
                else
                {
                    return(false);
                }
            }

            return(true);
        }
 public override bool ShowDialog(out string log)
 {
     if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
     {
         throw new InvalidOperationException("Main関数にSTAThreadAttributeが設定されていることを確認してください");
     }
     if (MultiSelect)
     {
         var path = Engine.Tool.OpenDialogMultiple(Filter ?? string.Empty, Directory.Exists(InitialDirectory) ? InitialDirectory : string.Empty);
         if (string.IsNullOrEmpty(path))
         {
             log = null;
             return(false);
         }
         var array = path.Split(',');
         if (AddExtension && !string.IsNullOrEmpty(DefaultExtension))
         {
             for (int i = 0; i < array.Length; i++)
             {
                 if (array[i].IndexOfAny(Path.GetInvalidPathChars()) < 0 && !string.IsNullOrWhiteSpace(array[i]))
                 {
                     var ex = $".{DefaultExtension.TrimStart('.')}";
                     if (Path.GetExtension(array[i]).Length == 0)
                     {
                         array[i] += ex;
                     }
                 }
             }
         }
         if (CheckFileExists)
         {
             for (int i = 0; i < array.Length; i++)
             {
                 if (!Engine.File.Exists(array[i]))
                 {
                     log = $"File does not exists\nPath: {array[i]}";
                     return(false);
                 }
             }
         }
         if (CheckPathExists)
         {
             for (int i = 0; i < array.Length; i++)
             {
                 if (!CheckFilePath(array[i], out log))
                 {
                     return(false);
                 }
             }
         }
         log       = null;
         FileName  = path;
         FileNames = array;
         return(true);
     }
     else
     {
         var path = Engine.Tool.OpenDialog(Filter ?? string.Empty, Directory.Exists(InitialDirectory) ? InitialDirectory : string.Empty);
         if (string.IsNullOrEmpty(path))
         {
             log = null;
             return(false);
         }
         if (AddExtension && !string.IsNullOrEmpty(DefaultExtension) && path.IndexOfAny(Path.GetInvalidPathChars()) < 0 && !string.IsNullOrWhiteSpace(path))
         {
             var ex = $".{DefaultExtension.TrimStart('.')}";
             if (Path.GetExtension(path).Length == 0)
             {
                 path += ex;
             }
         }
         if (CheckFileExists && !Engine.File.Exists(path))
         {
             log = $"File does not exists\nPath: {path}";
             return(false);
         }
         if (CheckPathExists && !CheckFilePath(path, out log))
         {
             return(false);
         }
         log       = null;
         FileName  = path;
         FileNames = new[] { path };
         return(true);
     }
 }
Example #6
0
        private bool HandleGet(HttpListenerContext context, WebServer server, bool sendBuffer = true)
        {
            var urlPath = context.Request.Url.LocalPath.Replace('/', Path.DirectorySeparatorChar);

            // adjust the path to see if we've got a default document
            if (urlPath.Last() == Path.DirectorySeparatorChar)
            {
                urlPath = urlPath + DefaultDocument;
            }

            urlPath = urlPath.TrimStart(new char[] { Path.DirectorySeparatorChar });

            var localPath = Path.Combine(FileSystemPath, urlPath);
            var eTagValid = false;

            byte[] buffer        = null;
            var    fileDate      = DateTime.Today;
            var    partialHeader = context.RequestHeader(Constants.HeaderRange);
            var    usingPartial  = String.IsNullOrWhiteSpace(partialHeader) == false && partialHeader.StartsWith("bytes=");

            if (string.IsNullOrWhiteSpace(DefaultExtension) == false && DefaultExtension.StartsWith(".") &&
                File.Exists(localPath) == false)
            {
                var newPath = localPath + DefaultExtension;
                if (File.Exists(newPath))
                {
                    localPath = newPath;
                }
            }

            if (File.Exists(localPath) == false)
            {
                return(false);
            }

            if (usingPartial == false)
            {
                fileDate = File.GetLastWriteTime(localPath);
                var requestHash = context.RequestHeader(Constants.HeaderIfNotMatch);

                if (RamCache.ContainsKey(localPath) && RamCache[localPath].LastModified == fileDate)
                {
                    server.Log.DebugFormat("RAM Cache: {0}", localPath);
                    var currentHash = Extensions.ComputeMd5Hash(RamCache[localPath].Buffer) + '-' + fileDate.Ticks;

                    if (String.IsNullOrWhiteSpace(requestHash) || requestHash != currentHash)
                    {
                        buffer = RamCache[localPath].Buffer;
                        context.Response.AddHeader(Constants.HeaderETag, currentHash);
                    }
                    else
                    {
                        eTagValid = true;
                    }
                }
                else
                {
                    server.Log.DebugFormat("File System: {0}", localPath);
                    if (sendBuffer)
                    {
                        buffer = File.ReadAllBytes(localPath);

                        var currentHash = Extensions.ComputeMd5Hash(buffer) + '-' + fileDate.Ticks;

                        if (String.IsNullOrWhiteSpace(requestHash) || requestHash != currentHash)
                        {
                            if (UseRamCache && buffer.Length <= MaxRamCacheFileSize)
                            {
                                RamCache[localPath] = new RamCacheEntry()
                                {
                                    LastModified = fileDate, Buffer = buffer
                                };
                            }

                            context.Response.AddHeader(Constants.HeaderETag, currentHash);
                        }
                        else
                        {
                            eTagValid = true;
                        }
                    }
                }
            }

            // check to see if the file was modified or etag is the same
            var utcFileDateString = fileDate.ToUniversalTime()
                                    .ToString(Constants.BrowserTimeFormat, CultureInfo.InvariantCulture);

            if (usingPartial == false &&
                (eTagValid || context.RequestHeader(Constants.HeaderIfModifiedSince).Equals(utcFileDateString)))
            {
                context.Response.AddHeader(Constants.HeaderCacheControl, "private");
                context.Response.AddHeader(Constants.HeaderPragma, string.Empty);
                context.Response.AddHeader(Constants.HeaderExpires, string.Empty);
                context.Response.ContentType = string.Empty;

                context.Response.StatusCode = 304;
            }
            else
            {
                var extension = Path.GetExtension(localPath).ToLowerInvariant();
                if (MimeTypes.ContainsKey(extension))
                {
                    context.Response.ContentType = MimeTypes[extension];
                }

                context.Response.AddHeader(Constants.HeaderCacheControl, "private");
                context.Response.AddHeader(Constants.HeaderPragma, string.Empty);
                context.Response.AddHeader(Constants.HeaderExpires, string.Empty);
                context.Response.AddHeader(Constants.HeaderLastModified, utcFileDateString);
                context.Response.AddHeader(Constants.HeaderAcceptRanges, "bytes");

                if (sendBuffer)
                {
                    var lrange    = 0;
                    var urange    = 0;
                    var size      = (long)0;
                    var isPartial = false;
                    var fileSize  = new FileInfo(localPath).Length;

                    if (usingPartial)
                    {
                        var range = partialHeader.Replace("bytes=", "").Split('-');
                        if (range.Length == 2 && int.TryParse(range[0], out lrange) &&
                            int.TryParse(range[1], out urange))
                        {
                            isPartial = true;
                        }

                        if ((range.Length == 2 && int.TryParse(range[0], out lrange) &&
                             string.IsNullOrWhiteSpace(range[1])) ||
                            (range.Length == 1 && int.TryParse(range[0], out lrange)))
                        {
                            urange    = (int)fileSize - 1;
                            isPartial = true;
                        }

                        if (range.Length == 2 && string.IsNullOrWhiteSpace(range[0]) &&
                            int.TryParse(range[1], out urange))
                        {
                            lrange    = (int)fileSize - urange;
                            urange    = (int)fileSize - 1;
                            isPartial = true;
                        }
                    }

                    if (isPartial)
                    {
                        if (urange > fileSize)
                        {
                            context.Response.StatusCode = 416;
                            context.Response.AddHeader(Constants.HeaderContentRanges,
                                                       string.Format("bytes */{0}", fileSize));
                            return(true);
                        }

                        size = (urange - lrange) + 1;

                        context.Response.AddHeader(Constants.HeaderContentRanges,
                                                   string.Format("bytes {0}-{1}/{2}", lrange, urange, fileSize));

                        context.Response.StatusCode = 206;

                        server.Log.DebugFormat("Opening stream {0} bytes {1}-{2} size {3}", localPath, lrange, urange,
                                               size);

                        buffer = new byte[size];

                        // Open FileStream with FileShare
                        using (var fs = new FileStream(localPath, FileMode.Open, FileAccess.Read, FileShare.Read))
                        {
                            if (lrange + size > fs.Length)
                            {
                                size = fs.Length - lrange;
                            }
                            fs.Seek(lrange, SeekOrigin.Begin);
                            fs.Read(buffer, 0, (int)size);
                            fs.Close();
                        }

                        // Reset lower range
                        lrange = 0;
                    }
                    else
                    {
                        size = buffer.LongLength;

                        // Perform compression if available
                        if (context.RequestHeader(Constants.HeaderAcceptEncoding).Contains("gzip"))
                        {
                            buffer = buffer.Compress();
                            context.Response.AddHeader(Constants.HeaderContentEncoding, "gzip");
                            size   = buffer.LongLength;
                            lrange = 0;
                        }
                    }

                    context.Response.ContentLength64 = size;

                    try
                    {
                        context.Response.OutputStream.Write(buffer, lrange, (int)size);
                    }
                    catch (HttpListenerException)
                    {
                        // Connection error, nothing else to do
                    }
                }
                else
                {
                    context.Response.ContentLength64 = buffer == null
                        ? new FileInfo(localPath).Length
                        : buffer.LongLength;
                }
            }

            return(true);
        }