public int DeleteFileDelegate(string filename, DokanFileInfo info)
        {
            var client = _clientList.ResolveByPath(filename);

            filename = _clientList.ToLocalPath(filename);
            var file = new FileNameComponents(filename);

            if (info.TryGetApplicationContext(client, filename).MetaData == null)
            {
                return(-DokanNet.ERROR_FILE_NOT_FOUND);
            }

            info.TryGetApplicationContext().MetaData = client.Delete(file.UnixFullFileName);
            return(0);
        }
        public int CreateDirectoryDelegate(string filename, DokanFileInfo info)
        {
            if (filename == "\\")
            {
                info.IsDirectory = true;
                return(-DokanNet.ERROR_ALREADY_EXISTS);
            }
            var client         = _clientList.ResolveByPath(filename);
            var globalFileName = filename;

            filename = _clientList.ToLocalPath(filename);
            var file     = new FileNameComponents(filename);
            var metaData = info.TryGetApplicationContext(client, filename, globalFileName).MetaData;

            if (metaData != null)
            {
                return(-DokanNet.ERROR_ALREADY_EXISTS);
            }
            info.TryGetApplicationContext().MetaData = client.CreateFolder(file.UnixFullFileName);
            return(0);
        }
        public static ApplicationContext TryGetApplicationContext(this DokanFileInfo info, DropNetClient client = null, string filename = null, string cachingKey = null)
        {
            var file = new FileNameComponents(filename);

            if (info.Context == null)
            {
                if (client == null)
                {
                    throw new ArgumentNullException("client");
                }
                if (cachingKey == null)
                {
                    throw new ArgumentNullException("cachingKey");
                }
                info.Context = new ApplicationContext(client, file)
                {
                    GlobalFileName = cachingKey
                };
            }
            return(info.Context as ApplicationContext);
        }
        public int OnCreateFileDelegate(string filename, FileAccess access, FileShare share, FileMode mode, FileOptions options, DokanFileInfo info)
        {
            if (filename == "\\")
            {
                info.IsDirectory = true;
                return(0);
            }
            DropNetClient client;

            try
            {
                client = _clientList.ResolveByPath(filename);
            }
            catch (Exception)
            {
                Log.Debug("CreateFile could not resolve name {0}", filename);
                return(-DokanNet.ERROR_PATH_NOT_FOUND);
            }
            var globalFileName = filename;

            filename = _clientList.ToLocalPath(filename);
            var file       = new FileNameComponents(filename);
            var appContext = info.TryGetApplicationContext(client, filename, globalFileName);
            var exists     = false;

            if (appContext.MetaData != null)
            {
                info.IsDirectory = appContext.MetaData.Is_Dir;
                exists           = true;
            }
            switch (mode)
            {
            case FileMode.Open:
            {
                if (exists)
                {
                    return(0);
                }
                return(-DokanNet.ERROR_FILE_NOT_FOUND);
            }

            case FileMode.CreateNew:
            {
                if (exists)
                {
                    return(-DokanNet.ERROR_ALREADY_EXISTS);
                }
                appContext.MetaData = client.UploadFile(file.UnixPath, file.Name, new byte[] { });
                return(0);
            }

            case FileMode.Create:
            {
                appContext.MetaData = client.UploadFile(file.UnixPath, file.Name, new byte[] { });
                return(0);
            }

            case FileMode.OpenOrCreate:
            {
                if (!exists)
                {
                    appContext.MetaData = client.UploadFile(file.UnixPath, file.Name, new byte[] { });
                }
                return(0);
            }

            case FileMode.Truncate:
            {
                if (!exists)
                {
                    return(-DokanNet.ERROR_FILE_NOT_FOUND);
                }
                appContext.MetaData = client.UploadFile(file.UnixPath, file.Name, new byte[] { });
                return(0);
            }

            case FileMode.Append:
            {
                if (exists)
                {
                    return(0);
                }
                appContext.MetaData = client.UploadFile(file.UnixPath, file.Name, new byte[] { });
                return(0);
            }

            default:
                return(-1);
            }
        }
Beispiel #5
0
 public void Init()
 {
     _emptyFile         = new FileNameComponents("\\");
     _testFileExtension = new FileNameComponents("\\testFolder\\testFile.extension.ext");
     _multilevelFile    = new FileNameComponents("\\testFolder\\level2\\level3\\testFile.extension.ext");
 }
Beispiel #6
0
        public void DropboxCachedFile_Read()
        {
            var fileData = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 });
            var client   = new DropNetClient("", "", "", "");
            var filename = new FileNameComponents(@"\\test\test.ext");
            var metadata = new MetaData
            {
                Bytes  = fileData.Length,
                Is_Dir = false,
            };
            var dokanFileInfo = new DokanFileInfo(1)
            {
                Context = new ApplicationContext(client, filename)
                {
                    MetaData = metadata
                },
                IsDirectory = false,
            };

            using (ShimsContext.Create())
            {
                Dokan.Fakes.ShimDokanNet.DokanResetTimeoutUInt32DokanFileInfo = (u, info) => true;
                DropNet.Fakes.ShimDropNetClient.AllInstances.GetFileStringInt64Int64String =
                    (netClient, path, startByte, endByte, rev) =>
                {
                    fileData.Seek(startByte, SeekOrigin.Begin);
                    var buf = new byte[endByte - startByte + 1];
                    fileData.Read(buf, 0, (int)(endByte - startByte + 1));
                    return(buf);
                };
                var cf = new DropboxCachedFile(dokanFileInfo)
                {
                    PreloadWindow = 5     // we will set a preload window to a small value so we could see how cache kicks in
                };
                var res  = new byte[fileData.Length];
                var read = cf.Read(res, 22, 1); // will return 0
                Assert.AreEqual(0, read);

                read = cf.Read(res, 15, 15); // will return only last 5 bytes
                Assert.AreEqual(5, read);
                for (var i = 0; i < read; i++)
                {
                    Assert.AreEqual(fileData.ToArray()[15 + i], res[i]);//we've requested buffer from 15th byte. so we're comparing with reference from this offset
                }
                Array.Clear(res, 0, res.Length);

                read = cf.Read(res, 0, 10);
                Assert.AreEqual(10, read);
                for (var i = 0; i < read; i++)
                {
                    Assert.AreEqual(fileData.ToArray()[i], res[i]);
                }
                Array.Clear(res, 0, res.Length);

                read = cf.Read(res, 0, 2); // this one will be served from cache
                Assert.AreEqual(2, read);
                for (var i = 0; i < read; i++)
                {
                    Assert.AreEqual(fileData.ToArray()[i], res[i]);
                }
                Array.Clear(res, 0, res.Length);

                read = cf.Read(res, 2, 3); // so as this one
                Assert.AreEqual(3, read);
                for (var i = 0; i < read; i++)
                {
                    Assert.AreEqual(fileData.ToArray()[2 + i], res[i]);
                }
                Array.Clear(res, 0, res.Length);

                read = cf.Read(res, 4, 2);
                Assert.AreEqual(2, read);
                for (var i = 0; i < read; i++)
                {
                    Assert.AreEqual(fileData.ToArray()[4 + i], res[i]);
                }
                Array.Clear(res, 0, res.Length);

                read = cf.Read(res, 10, 2);
                Assert.AreEqual(2, read);
                for (var i = 0; i < read; i++)
                {
                    Assert.AreEqual(fileData.ToArray()[10 + i], res[i]);
                }
                Array.Clear(res, 0, res.Length);

                read = cf.Read(res, 0, 20);
                Assert.AreEqual(20, read);
                for (var i = 0; i < read; i++)
                {
                    Assert.AreEqual(fileData.ToArray()[i], res[i]);
                }
            }
        }
Beispiel #7
0
        internal static SizeLimitedLogFile Next(this SizeLimitedLogFile previous)
        {
            var componentsIncremented = new FileNameComponents(previous.FileNameComponents.Name, previous.FileNameComponents.Sequence + 1, previous.FileNameComponents.Extension);

            return(new SizeLimitedLogFile(componentsIncremented, previous.SizeLimitBytes));
        }