Repository: cordova-plugin-file-transfer Updated Branches: refs/heads/master a59eb7731 -> 77e83c70d
CB-6466 Auto-create directories in download Bringing WP8 in line with the other platforms to automatically create missing directories in filetransfer.download(). Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/commit/2043b4e8 Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/tree/2043b4e8 Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/diff/2043b4e8 Branch: refs/heads/master Commit: 2043b4e8b087f6d112883beaefbd5825de29d3dc Parents: eb63c46 Author: Staci <[email protected]> Authored: Tue Apr 22 13:40:56 2014 -0400 Committer: Staci <[email protected]> Committed: Tue Apr 22 13:40:56 2014 -0400 ---------------------------------------------------------------------- src/wp/FileTransfer.cs | 90 ++++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 45 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/blob/2043b4e8/src/wp/FileTransfer.cs ---------------------------------------------------------------------- diff --git a/src/wp/FileTransfer.cs b/src/wp/FileTransfer.cs index f8b6ed5..f6b85ae 100644 --- a/src/wp/FileTransfer.cs +++ b/src/wp/FileTransfer.cs @@ -41,7 +41,6 @@ namespace WPCordovaClassLib.Cordova.Commands } } - public class TransferOptions { /// File path to upload OR File path to download to @@ -87,7 +86,6 @@ namespace WPCordovaClassLib.Cordova.Commands private static Dictionary<string, DownloadRequestState> InProcDownloads = new Dictionary<string,DownloadRequestState>(); - /// <summary> /// Uploading response info /// </summary> @@ -209,8 +207,6 @@ namespace WPCordovaClassLib.Cordova.Commands BytesLoaded = bLoaded; BytesTotal = bTotal; } - - } /// <summary> @@ -249,7 +245,6 @@ namespace WPCordovaClassLib.Cordova.Commands uploadOptions.MimeType = args[4]; uploadOptions.Params = args[5]; - bool trustAll = false; bool.TryParse(args[6],out trustAll); uploadOptions.TrustAllHosts = trustAll; @@ -303,15 +298,11 @@ namespace WPCordovaClassLib.Cordova.Commands InProcDownloads[uploadOptions.Id] = reqState; - webRequest.BeginGetRequestStream(uploadCallback, reqState); } catch (Exception /*ex*/) { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(ConnectionError)),callbackId); - - } } @@ -350,8 +341,6 @@ namespace WPCordovaClassLib.Cordova.Commands return null; } - - public void download(string options) { TransferOptions downloadOptions = null; @@ -374,7 +363,6 @@ namespace WPCordovaClassLib.Cordova.Commands downloadOptions.Id = optionStrings[3]; downloadOptions.Headers = optionStrings[4]; downloadOptions.CallbackId = callbackId = optionStrings[5]; - } catch (Exception) { @@ -389,6 +377,15 @@ namespace WPCordovaClassLib.Cordova.Commands { using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) { + string cleanUrl = downloadOptions.Url.Replace("x-wmapp0:", "").Replace("file:", ""); + + // pre-emptively create any directories in the FilePath that do not exist + string directoryName = getDirectoryName(downloadOptions.FilePath); + if (!string.IsNullOrEmpty(directoryName) && !isoFile.DirectoryExists(directoryName)) + { + isoFile.CreateDirectory(directoryName); + } + // just copy from one area of iso-store to another ... if (isoFile.FileExists(downloadOptions.Url)) { @@ -397,7 +394,6 @@ namespace WPCordovaClassLib.Cordova.Commands else { // need to unpack resource from the dll - string cleanUrl = downloadOptions.Url.Replace("x-wmapp0:", "").Replace("file:", ""); Uri uri = new Uri(cleanUrl, UriKind.Relative); var resource = Application.GetResourceStream(uri); @@ -440,12 +436,10 @@ namespace WPCordovaClassLib.Cordova.Commands } } } - } } } } - } File.FileEntry entry = File.FileEntry.GetEntry(downloadOptions.FilePath); @@ -459,7 +453,6 @@ namespace WPCordovaClassLib.Cordova.Commands } return; - } else { @@ -511,7 +504,6 @@ namespace WPCordovaClassLib.Cordova.Commands } } } - } public void abort(string options) @@ -523,22 +515,21 @@ namespace WPCordovaClassLib.Cordova.Commands if (InProcDownloads.ContainsKey(id)) { - DownloadRequestState state = InProcDownloads[id]; - if (!state.isCancelled) - { // prevent multiple callbacks for the same abort - state.isCancelled = true; - if (!state.request.HaveResponse) - { - state.request.Abort(); - InProcDownloads.Remove(id); - //callbackId = state.options.CallbackId; - //state = null; - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, - new FileTransferError(FileTransfer.AbortError)), - state.options.CallbackId); - } - } - + DownloadRequestState state = InProcDownloads[id]; + if (!state.isCancelled) + { // prevent multiple callbacks for the same abort + state.isCancelled = true; + if (!state.request.HaveResponse) + { + state.request.Abort(); + InProcDownloads.Remove(id); + //callbackId = state.options.CallbackId; + //state = null; + DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, + new FileTransferError(FileTransfer.AbortError)), + state.options.CallbackId); + } + } } else { @@ -564,8 +555,6 @@ namespace WPCordovaClassLib.Cordova.Commands /// <param name="asynchronousResult"></param> private void downloadCallback(IAsyncResult asynchronousResult) { - - DownloadRequestState reqState = (DownloadRequestState)asynchronousResult.AsyncState; HttpWebRequest request = reqState.request; @@ -579,6 +568,13 @@ namespace WPCordovaClassLib.Cordova.Commands using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) { + // create any directories in the path that do not exist + string directoryName = getDirectoryName(reqState.options.FilePath); + if (!string.IsNullOrEmpty(directoryName) && !isoFile.DirectoryExists(directoryName)) + { + isoFile.CreateDirectory(directoryName); + } + // create the file if not exists if (!isoFile.FileExists(reqState.options.FilePath)) { @@ -617,21 +613,18 @@ namespace WPCordovaClassLib.Cordova.Commands System.Threading.Thread.Sleep(1); } } - } } if (reqState.isCancelled) { isoFile.DeleteFile(reqState.options.FilePath); } - } if (reqState.isCancelled) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(AbortError)), callbackId); - } else { @@ -659,7 +652,6 @@ namespace WPCordovaClassLib.Cordova.Commands if ((webex.Status == WebExceptionStatus.ProtocolError && response.StatusCode == HttpStatusCode.NotFound) || webex.Status == WebExceptionStatus.UnknownError) { - // Weird MSFT detection of 404... seriously... just give us the f(*&#$@ status code as a number ffs!!! // "Numbers for HTTP status codes? Nah.... let's create our own set of enums/structs to abstract that stuff away." // FACEPALM @@ -707,11 +699,8 @@ namespace WPCordovaClassLib.Cordova.Commands { InProcDownloads.Remove(reqState.options.Id); } - } - - /// <summary> /// Read file from Isolated Storage and sends it to server /// </summary> @@ -731,8 +720,6 @@ namespace WPCordovaClassLib.Cordova.Commands byte[] boundaryBytes = System.Text.Encoding.UTF8.GetBytes(lineStart + Boundary + lineEnd); string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"" + lineEnd + lineEnd + "{1}" + lineEnd; - - if (!string.IsNullOrEmpty(reqState.options.Params)) { Dictionary<string, string> paramMap = parseHeaders(reqState.options.Params); @@ -758,7 +745,6 @@ namespace WPCordovaClassLib.Cordova.Commands using (FileStream fileStream = new IsolatedStorageFileStream(reqState.options.FilePath, FileMode.Open, isoFile)) { - string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"" + lineEnd + "Content-Type: {2}" + lineEnd + lineEnd; string header = string.Format(headerTemplate, reqState.options.FileKey, reqState.options.FileName, reqState.options.MimeType); byte[] headerBytes = System.Text.Encoding.UTF8.GetBytes(header); @@ -857,8 +843,22 @@ namespace WPCordovaClassLib.Cordova.Commands { FileTransferError transferError = new FileTransferError(ConnectionError, reqState.options.Server, reqState.options.FilePath, 403); DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, transferError), reqState.options.CallbackId); + } + } + // Gets the full path without the filename + private string getDirectoryName(String filePath) + { + string directoryName; + try + { + directoryName = filePath.Substring(0, filePath.LastIndexOf('/')); + } + catch + { + directoryName = ""; } + return directoryName; } } }
