예제 #1
0
 public void AddFile(VirtualFile vfile)
 {
     if(!mFileList.Contains(vfile))
     {
         mFileList.Add(vfile);
         ResetEnumeration();
     }
 }
예제 #2
0
 public bool GetFile(string FileName, ref VirtualFile vfile)
 {
     foreach(VirtualFile vf in mFileList)
     {
         if(vf.Name.Equals(FileName))
         {
             vfile = vf;
             return true;
         }
     }
     return false;
 }
예제 #3
0
        public bool WriteFile(VirtualFile vfile, string filePath, string entityName)
        {
            HttpWebRequest webRequest = null;

            string _filePath = filePath.Replace("\\", "/");
            string _fileName = vfile.Name;
            string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

            Console.WriteLine("{0}", "HTTP WriteFile...");
            Console.WriteLine("\t {0}::{1}", "File Path", _filePath);
            Console.WriteLine("\t {0}::{1}", "File Name", _fileName);

            try {

                // HttpWebRequest
                string url = String.Format(OccamFileApiUri + "/write-file?deviceId&driveLetter&filePath={0}&entityName={1}", _filePath, entityName);
                webRequest = InitializeHttpWebRequest(new Uri(url));
                webRequest.ContentType = "multipart/form-data; boundary=" + boundary; //"application/x-www-form-urlencoded";
                webRequest.Method = "POST";
                webRequest.KeepAlive = true;
                webRequest.CookieContainer = cookieContainer;
                //webRequest.Headers.Add("User-Agent", "Chrome");
                webRequest.AllowWriteStreamBuffering = false;
                webRequest.SendChunked = true;
                //webRequest.ContentLength = memStream.Length;

                Stream requestStream = webRequest.GetRequestStream();//new GZipStream(webRequest.GetRequestStream(), CompressionMode.Decompress);

                // Create a request to the file to be  downloaded.

                byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                //Stream memStream = new System.IO.MemoryStream();
                requestStream.Write(boundarybytes, 0, boundarybytes.Length);

                string headerFileTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
                string headerFile = headerFile = string.Format(headerFileTemplate, "file", Path.GetFileName(_fileName));

                byte[] headerFileBytes = System.Text.Encoding.UTF8.GetBytes(headerFile);
                requestStream.Write(headerFileBytes, 0, headerFileBytes.Length);

                //FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                byte[] buffer = new byte[1024 * 10]; //EndPoint-StartPoint];
                int bytesRead = 0;
                int location = 0;
                //fileStream.Seek(0, SeekOrigin.Begin);

                do {
                    vfile.Read(buffer, location, buffer.Length, ref bytesRead);
                    requestStream.Write(buffer, 0, bytesRead);
                    location += bytesRead;
                } while (bytesRead != 0);

                byte[] tailBoundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
                requestStream.Write(tailBoundarybytes, 0, tailBoundarybytes.Length);
                //fileStream.Close();

                /*
                memStream.Position = 0;
                byte[] tempBuffer = new byte[1024*10]; //memStream.Length];
                bytesRead = 0;
                while ((bytesRead = memStream.Read(tempBuffer, 0, tempBuffer.Length)) != 0) {
                    requestStream.Write(tempBuffer, 0, bytesRead);
                }
                memStream.Close();*/
                requestStream.Close();

                // 요청, 응답 받기
                HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();

                // 응답 Stream 읽기
                Stream stReadData = response.GetResponseStream();
                StreamReader srReadData = new StreamReader(stReadData, Encoding.UTF8);//Default);

                // 응답 Stream -> 응답 String 변환
                string strResult = srReadData.ReadToEnd();
                response.Close();

            } catch (Exception ex) {
                // Fire the DownloadCompleted event with the error.
                Console.WriteLine("\t{0}::{1}", "Writefile exception", ex.Message);
                return false;
            }

            return true;
        }
예제 #4
0
        public bool CreateWriteFileStream(VirtualFile vfile, string filePath, string entityName, ref HttpWebRequest webRequest, ref byte[] tailBoundarybytes)
        {
            string _filePath = filePath.Replace("\\", "/");
            string _fileName = vfile.Name;
            string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

            Console.WriteLine("{0}", "HTTP WriteFile...");
            Console.WriteLine("\t {0}::{1}", "File Path", _filePath);
            Console.WriteLine("\t {0}::{1}", "File Name", _fileName);

            try {

                // HttpWebRequest
                string url = String.Format(OccamFileApiUri + "/write-file?deviceId&driveLetter&filePath={0}&entityName={1}", _filePath, entityName);
                webRequest = InitializeHttpWebRequest(new Uri(url));
                webRequest.ContentType = "multipart/form-data; boundary=" + boundary; //"application/x-www-form-urlencoded";
                webRequest.Method = "POST";
                webRequest.KeepAlive = true;
                webRequest.CookieContainer = cookieContainer;
                //webRequest.Headers.Add("User-Agent", "Chrome");
                webRequest.AllowWriteStreamBuffering = false;
                webRequest.SendChunked = true;
                //webRequest.ContentLength = memStream.Length;

                Stream requestStream = webRequest.GetRequestStream();//new GZipStream(webRequest.GetRequestStream(), CompressionMode.Decompress);

                // Create a request to the file to be  downloaded.

                byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                //Stream memStream = new System.IO.MemoryStream();
                requestStream.Write(boundarybytes, 0, boundarybytes.Length);

                string headerFileTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
                string headerFile = headerFile = string.Format(headerFileTemplate, "file", Path.GetFileName(_fileName));

                byte[] headerFileBytes = System.Text.Encoding.UTF8.GetBytes(headerFile);
                requestStream.Write(headerFileBytes, 0, headerFileBytes.Length);

                tailBoundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");

            } catch (Exception ex) {
                // Fire the DownloadCompleted event with the error.
                Console.WriteLine("\t{0}::{1}", "Writefile exception", ex.Message);
                return false;
            }

            return true;
        }
예제 #5
0
        public bool GetFile(int Index, ref VirtualFile vfile)
        {
            bool Result = false;

            if( Index < mFileList.Count)
            {
                vfile = (VirtualFile)mFileList[Index];
                Result = true;
            }
            return Result;
        }
예제 #6
0
        private void CbFsCreateFile(object sender,
            string FileName,
            uint DesiredAccess,
            uint FileAttributes,
            uint ShareMode,
			CbFsFileInfo FileInfo,
			CbFsHandleInfo HandleInfo
            )
        {
            Console.WriteLine("{0}::{1}", "CbFsCreateFile", "Event Call.....");

            // TODO : HTTP Get Query.
            // url is create-file
            // parameter is deviceId, driveLetter, filePath
            // response body is null.

            VirtualFile vfile = null, vdir = null;

            try {

                FindVirtualDirectory(FileName, ref vdir);
                vfile = new VirtualFile(GetFileName(FileName));

                vfile.Attributes = (FileAttributes)FileAttributes;

                vfile.CreationTime = vfile.LastAccessTime = vfile.LastWriteTime = DateTime.UtcNow;

                vdir.AddFile(vfile);

                GCHandle gch = GCHandle.Alloc(vfile);

                FileInfo.UserContext = GCHandle.ToIntPtr(gch);

                if (FileAttributes == 16) {
                    Console.WriteLine("\t \t is Directory");
                    g_OccamFile.WriteFile(vfile, FileInfo.FileName, "Folder");
                    vfile.Waiting();
                }

            }
            catch (Exception err) {
                Console.WriteLine("{0}::{1}", "\t CbFsCreateFile.Exception", err.Message);
            }
        }
예제 #7
0
        private void CbFsEnumerateDirectory(
            object sender,
            CbFsFileInfo DirectoryInfo,
			CbFsHandleInfo HandleInfo,
			CbFsDirectoryEnumerationInfo EnumerationInfo,
            string Mask,
            int Index,
            bool Restart,
            ref bool FileFound,
            ref string FileName,
            ref string ShortFileName,
            ref DateTime CreationTime,
            ref DateTime LastAccessTime,
            ref DateTime LastWriteTime,
            ref long EndOfFile,
            ref long AllocationSize,
            ref CBFS_LARGE_INTEGER FileId,
            ref uint FileAttributes
            )
        {
            //Console.WriteLine("{0}::{1}", "CbFsEnumerateDirectory", "Event Call.....");
            //Console.WriteLine("{0}::{1}::{2}", "CbFsEnumerateDirectory \t DirectoryInfo.FileName", DirectoryInfo.FileName, Mask);

            bool ResetEnumeration = false;
            bool ExactMatch = false;
            FileFound = false;
            ENUM_INFO pInfo = null;
            VirtualFile vfile = null, vdir = null;

            ExactMatch = !Mask.Equals("*");

            if ((Restart || EnumerationInfo.UserContext == IntPtr.Zero) && !ExactMatch) {
                ResetEnumeration = true;
                //Console.WriteLine("{0}", " \t Restart.");
            }

            if (Restart && (EnumerationInfo.UserContext != IntPtr.Zero)) {
                if (GCHandle.FromIntPtr(EnumerationInfo.UserContext).IsAllocated) {
                    GCHandle.FromIntPtr(EnumerationInfo.UserContext).Free();
                }
                EnumerationInfo.UserContext = IntPtr.Zero;
                //Console.WriteLine("{0}", " \t EnumerationInfo.UserContext = IntPtr.Zero");
            }

            if (EnumerationInfo.UserContext.Equals(IntPtr.Zero)) {

                //Console.WriteLine("{0}::{1}", "\t Restart", Restart);

                pInfo = new ENUM_INFO();

                GCHandle gch = GCHandle.Alloc(pInfo);

                EnumerationInfo.UserContext = GCHandle.ToIntPtr(gch);

                FindVirtualFile(DirectoryInfo.FileName, ref vdir);

                //Mask가 * 이 아니면 파일 실행시이다.
                //

                // 전체(*)를 가져와야 할 경우 Web에서 리스트를 가져온다, 파일 실행 시 제외.

                if (!ExactMatch && vdir.CanLoadList()) {
                    // occam 에서 리스트 가져오기
                    ListDirectory occamList = g_OccamFile.getList(DirectoryInfo.FileName);
                    int count = occamList.Total;

                    vdir.SetLoadListTime();

                    for (int i = 0; i < count; i++) {
                        string fileName = occamList.Data[i].Name.Replace("/", "\\");

                        VirtualFile replaceVfile = null;
                        if (vdir.Context.GetFile(fileName, ref replaceVfile) == false) {
                            // 새로 만들기
                            replaceVfile = new VirtualFile(GetFileName(fileName));//, contentSize);
                            replaceVfile.Attributes = (FileAttributes)(occamList.Data[i].ItemType.Equals("Folder") ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL);
                            replaceVfile.EndOfFile = occamList.Data[i].ContentSize;
                            replaceVfile.CreationTime = Convert.ToDateTime(occamList.Data[i].CreatedDate);
                            replaceVfile.LastAccessTime = Convert.ToDateTime(occamList.Data[i].LastModifiedDate);
                            replaceVfile.LastWriteTime = Convert.ToDateTime(occamList.Data[i].LastModifiedDate); // TODO : writetime 값 가져오기

                            replaceVfile.Waiting();
                            vdir.AddFile(replaceVfile);
                        } else if (replaceVfile.EndOfFile != occamList.Data[i].ContentSize) {
                            // reset
                            replaceVfile.Attributes = (FileAttributes)(occamList.Data[i].ItemType.Equals("Folder") ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL);
                            replaceVfile.EndOfFile = occamList.Data[i].ContentSize;
                            replaceVfile.CreationTime = Convert.ToDateTime(occamList.Data[i].CreatedDate);
                            replaceVfile.LastAccessTime = Convert.ToDateTime(occamList.Data[i].LastModifiedDate);
                            replaceVfile.LastWriteTime = Convert.ToDateTime(occamList.Data[i].LastModifiedDate); // TODO : writetime 값 가져오기

                            replaceVfile.Waiting();
                            vdir.AddFile(replaceVfile);
                        }
                    }

                    // vdir file count loop
                    int vCount = vdir.Context.GetCount();

                    for (int i = 0; i < vCount; i++) {
                        VirtualFile replaceVfile = null;
                        vdir.Context.GetFile(i, ref replaceVfile);

                        Item OccamData = null;
                        if (occamList.GetItem(replaceVfile.Name, ref OccamData) == false) {
                            //remove
                            if(replaceVfile.GetVFStatus.Equals(VirtualFileStatus.Waiting)) {
                                vdir.Context.Remove(replaceVfile);
                            }
                        }
                    }
                }

                pInfo.vfile = vdir;

                //Console.WriteLine("{0}", " \t create a vfile.");

            } else {
                pInfo = (ENUM_INFO)GCHandle.FromIntPtr(EnumerationInfo.UserContext).Target;

                vdir = pInfo.vfile;

                //Console.WriteLine("{0}", " \t EnumerationInfo.UserContext use.");
            }

            if (ResetEnumeration) {
                pInfo.Index = 0;
                //Console.WriteLine("{0}", " \t pInfo.Index = 0");
            } else {
                //Console.WriteLine("{0}::{1}", "pInfo.Index", pInfo.Index);
            }

            if (pInfo.ExactMatch == true) {
                FileFound = false;
                //Console.WriteLine("{0}", " \t File found.");
            } else {
                FileFound = ExactMatch ?
                    vdir.Context.GetFile(Mask, ref vfile) : vdir.Context.GetFile(pInfo.Index, ref vfile);
                //Console.WriteLine("{0}", " \t file not found.");
            }

            if (FileFound) {
                //Console.WriteLine("{0}::{1}", " \t create file", vfile.Name);
                FileName = vfile.Name;

                CreationTime = vfile.CreationTime;

                LastAccessTime = vfile.LastAccessTime;

                LastWriteTime = vfile.LastWriteTime;

                EndOfFile = vfile.EndOfFile;

                AllocationSize = vfile.AllocationSize;

                FileId.QuadPart = 0;

                FileAttributes = Convert.ToUInt32(vfile.Attributes);

            }
            pInfo.ExactMatch = ExactMatch;
            ++pInfo.Index;
        }
예제 #8
0
        private void btnMount_Click(object sender, EventArgs e)
        {
            try
            {
                g_DiskContext = new VirtualFile(@"\");
                g_DiskContextHandle = GCHandle.Alloc(g_DiskContext);
                mCbFs.MountMedia(5000);  // set time out.

                btnUnmount.Enabled = true;
                btnAddPoint.Enabled = true;
            }
            catch(ECBFSError err)
            {
                MessageBox.Show(this, err.Message, "OccamDrive", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
예제 #9
0
        long CalculateFolderSize(VirtualFile root)
        {
            VirtualFile vfile = null;
            long DiskSize = 0;
            int Index = 0;

            while (root.Context.GetFile(Index++, ref vfile))
            {
                if (vfile.Attributes == FileAttributes.Directory)
                {
                    DiskSize += CalculateFolderSize(vfile);
                }
                DiskSize += (vfile.AllocationSize + mCbFs.SectorSize - 1) & ~( mCbFs.SectorSize - 1 );
            }
            return DiskSize;
        }
예제 #10
0
 public void Remove()
 {
     mParent.Context.Remove(this);
     mParent = null;
 }
예제 #11
0
 public ENUM_INFO()
 {
     Index = 0;
     vfile = null;
     ExactMatch = false;
 }
예제 #12
0
 public void AddFile(VirtualFile vfile)
 {
     Context.AddFile(vfile);
     vfile.Parent = this;
 }
예제 #13
0
 public void Remove(VirtualFile vfile)
 {
     if(mFileList.Contains(vfile))
     {
         mFileList.Remove(vfile);
         ResetEnumeration();
     }
 }
예제 #14
0
        private bool FindVirtualFile(string FileName, ref VirtualFile vfile)
        {
            bool result = true;
            int i = 0;

            VirtualFile root = g_DiskContext;

            vfile = root;

            if (FileName == "\\") return result;

            string[] buffer = FileName.Split(new char[] { '\\' });

            while (i < buffer.Length)
            {
                if(result = root.Context.GetFile(buffer[i], ref vfile))
                {
                    root = vfile;
                }
                i++;
            }
            return result;
        }
예제 #15
0
        private void FindVirtualDirectory(string FileName, ref VirtualFile vfile)
        {
            int i = 0;

            VirtualFile root = g_DiskContext;

            vfile = root;

            string[] buffer = FileName.Split(new char[] { '\\' });

            while (i < (buffer.Length - 1))
            {
                if(root.Context.GetFile(buffer[i], ref vfile))
                {
                    root = vfile;
                }
                i++;
            }
        }
예제 #16
0
        public bool GetNextFile(ref VirtualFile vfile)
        {
            bool Result = false;

            if (mIndex < mFileList.Count)
            {
                vfile = (VirtualFile)mFileList[mIndex];
                ++mIndex;
                Result = true;
            }
            else
            {
                vfile = null;
            }
            return Result;
        }