Return-Path: X-Original-To: apmail-cordova-commits-archive@www.apache.org Delivered-To: apmail-cordova-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 95F4710157 for ; Tue, 30 Jul 2013 23:38:24 +0000 (UTC) Received: (qmail 85471 invoked by uid 500); 30 Jul 2013 23:38:24 -0000 Delivered-To: apmail-cordova-commits-archive@cordova.apache.org Received: (qmail 85409 invoked by uid 500); 30 Jul 2013 23:38:24 -0000 Mailing-List: contact commits-help@cordova.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cordova.apache.org Delivered-To: mailing list commits@cordova.apache.org Received: (qmail 85354 invoked by uid 99); 30 Jul 2013 23:38:24 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 30 Jul 2013 23:38:24 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 073F0830920; Tue, 30 Jul 2013 23:38:24 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: bennmapes@apache.org To: commits@cordova.apache.org Date: Tue, 30 Jul 2013 23:38:29 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [07/10] Killed the cordova-wp7 master branch http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/5c361be6/templates/standalone/Plugins/File.cs ---------------------------------------------------------------------- diff --git a/templates/standalone/Plugins/File.cs b/templates/standalone/Plugins/File.cs deleted file mode 100644 index cde7a1c..0000000 --- a/templates/standalone/Plugins/File.cs +++ /dev/null @@ -1,1676 +0,0 @@ -/* - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.IO.IsolatedStorage; -using System.Runtime.Serialization; -using System.Security; -using System.Text; -using System.Windows; -using System.Windows.Resources; - -namespace WPCordovaClassLib.Cordova.Commands -{ - /// - /// Provides access to isolated storage - /// - public class File : BaseCommand - { - // Error codes - public const int NOT_FOUND_ERR = 1; - public const int SECURITY_ERR = 2; - public const int ABORT_ERR = 3; - public const int NOT_READABLE_ERR = 4; - public const int ENCODING_ERR = 5; - public const int NO_MODIFICATION_ALLOWED_ERR = 6; - public const int INVALID_STATE_ERR = 7; - public const int SYNTAX_ERR = 8; - public const int INVALID_MODIFICATION_ERR = 9; - public const int QUOTA_EXCEEDED_ERR = 10; - public const int TYPE_MISMATCH_ERR = 11; - public const int PATH_EXISTS_ERR = 12; - - // File system options - public const int TEMPORARY = 0; - public const int PERSISTENT = 1; - public const int RESOURCE = 2; - public const int APPLICATION = 3; - - /// - /// Temporary directory name - /// - private readonly string TMP_DIRECTORY_NAME = "tmp"; - - /// - /// Represents error code for callback - /// - [DataContract] - public class ErrorCode - { - /// - /// Error code - /// - [DataMember(IsRequired = true, Name = "code")] - public int Code { get; set; } - - /// - /// Creates ErrorCode object - /// - public ErrorCode(int code) - { - this.Code = code; - } - } - - /// - /// Represents File action options. - /// - [DataContract] - public class FileOptions - { - /// - /// File path - /// - /// - private string _fileName; - [DataMember(Name = "fileName")] - public string FilePath - { - get - { - return this._fileName; - } - - set - { - int index = value.IndexOfAny(new char[] { '#', '?' }); - this._fileName = index > -1 ? value.Substring(0, index) : value; - } - } - - /// - /// Full entryPath - /// - [DataMember(Name = "fullPath")] - public string FullPath { get; set; } - - /// - /// Directory name - /// - [DataMember(Name = "dirName")] - public string DirectoryName { get; set; } - - /// - /// Path to create file/directory - /// - [DataMember(Name = "path")] - public string Path { get; set; } - - /// - /// The encoding to use to encode the file's content. Default is UTF8. - /// - [DataMember(Name = "encoding")] - public string Encoding { get; set; } - - /// - /// Uri to get file - /// - /// - private string _uri; - [DataMember(Name = "uri")] - public string Uri - { - get - { - return this._uri; - } - - set - { - int index = value.IndexOfAny(new char[] { '#', '?' }); - this._uri = index > -1 ? value.Substring(0, index) : value; - } - } - - /// - /// Size to truncate file - /// - [DataMember(Name = "size")] - public long Size { get; set; } - - /// - /// Data to write in file - /// - [DataMember(Name = "data")] - public string Data { get; set; } - - /// - /// Position the writing starts with - /// - [DataMember(Name = "position")] - public int Position { get; set; } - - /// - /// Type of file system requested - /// - [DataMember(Name = "type")] - public int FileSystemType { get; set; } - - /// - /// New file/directory name - /// - [DataMember(Name = "newName")] - public string NewName { get; set; } - - /// - /// Destination directory to copy/move file/directory - /// - [DataMember(Name = "parent")] - public string Parent { get; set; } - - /// - /// Options for getFile/getDirectory methods - /// - [DataMember(Name = "options")] - public CreatingOptions CreatingOpt { get; set; } - - /// - /// Creates options object with default parameters - /// - public FileOptions() - { - this.SetDefaultValues(new StreamingContext()); - } - - /// - /// Initializes default values for class fields. - /// Implemented in separate method because default constructor is not invoked during deserialization. - /// - /// - [OnDeserializing()] - public void SetDefaultValues(StreamingContext context) - { - this.Encoding = "UTF-8"; - this.FilePath = ""; - this.FileSystemType = -1; - } - } - - /// - /// Stores image info - /// - [DataContract] - public class FileMetadata - { - [DataMember(Name = "fileName")] - public string FileName { get; set; } - - [DataMember(Name = "fullPath")] - public string FullPath { get; set; } - - [DataMember(Name = "type")] - public string Type { get; set; } - - [DataMember(Name = "lastModifiedDate")] - public string LastModifiedDate { get; set; } - - [DataMember(Name = "size")] - public long Size { get; set; } - - public FileMetadata(string filePath) - { - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (string.IsNullOrEmpty(filePath)) - { - throw new FileNotFoundException("File doesn't exist"); - } - else if (!isoFile.FileExists(filePath)) - { - // attempt to get it from the resources - if (filePath.IndexOf("www") == 0) - { - Uri fileUri = new Uri(filePath, UriKind.Relative); - StreamResourceInfo streamInfo = Application.GetResourceStream(fileUri); - if (streamInfo != null) - { - this.Size = streamInfo.Stream.Length; - this.FileName = filePath.Substring(filePath.LastIndexOf("/") + 1); - this.FullPath = filePath; - } - } - else - { - throw new FileNotFoundException("File doesn't exist"); - } - } - else - { - //TODO get file size the other way if possible - using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filePath, FileMode.Open, FileAccess.Read, isoFile)) - { - this.Size = stream.Length; - } - this.FullPath = filePath; - this.FileName = System.IO.Path.GetFileName(filePath); - this.LastModifiedDate = isoFile.GetLastWriteTime(filePath).DateTime.ToString(); - } - this.Type = MimeTypeMapper.GetMimeType(this.FileName); - } - } - } - - /// - /// Represents file or directory modification metadata - /// - [DataContract] - public class ModificationMetadata - { - /// - /// Modification time - /// - [DataMember] - public string modificationTime { get; set; } - } - - /// - /// Represents file or directory entry - /// - [DataContract] - public class FileEntry - { - - /// - /// File type - /// - [DataMember(Name = "isFile")] - public bool IsFile { get; set; } - - /// - /// Directory type - /// - [DataMember(Name = "isDirectory")] - public bool IsDirectory { get; set; } - - /// - /// File/directory name - /// - [DataMember(Name = "name")] - public string Name { get; set; } - - /// - /// Full path to file/directory - /// - [DataMember(Name = "fullPath")] - public string FullPath { get; set; } - - public bool IsResource { get; set; } - - public static FileEntry GetEntry(string filePath, bool bIsRes=false) - { - FileEntry entry = null; - try - { - entry = new FileEntry(filePath, bIsRes); - - } - catch (Exception ex) - { - Debug.WriteLine("Exception in GetEntry for filePath :: " + filePath + " " + ex.Message); - } - return entry; - } - - /// - /// Creates object and sets necessary properties - /// - /// - public FileEntry(string filePath, bool bIsRes = false) - { - if (string.IsNullOrEmpty(filePath)) - { - throw new ArgumentException(); - } - - if(filePath.Contains(" ")) - { - Debug.WriteLine("FilePath with spaces :: " + filePath); - } - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - IsResource = bIsRes; - IsFile = isoFile.FileExists(filePath); - IsDirectory = isoFile.DirectoryExists(filePath); - if (IsFile) - { - this.Name = Path.GetFileName(filePath); - } - else if (IsDirectory) - { - this.Name = this.GetDirectoryName(filePath); - if (string.IsNullOrEmpty(Name)) - { - this.Name = "/"; - } - } - else - { - if (IsResource) - { - this.Name = Path.GetFileName(filePath); - } - else - { - throw new FileNotFoundException(); - } - } - - try - { - this.FullPath = filePath.Replace('\\', '/'); // new Uri(filePath).LocalPath; - } - catch (Exception) - { - this.FullPath = filePath; - } - } - } - - /// - /// Extracts directory name from path string - /// Path should refer to a directory, for example \foo\ or /foo. - /// - /// - /// - private string GetDirectoryName(string path) - { - if (String.IsNullOrEmpty(path)) - { - return path; - } - - string[] split = path.Split(new char[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries); - if (split.Length < 1) - { - return null; - } - else - { - return split[split.Length - 1]; - } - } - } - - - /// - /// Represents info about requested file system - /// - [DataContract] - public class FileSystemInfo - { - /// - /// file system type - /// - [DataMember(Name = "name", IsRequired = true)] - public string Name { get; set; } - - /// - /// Root directory entry - /// - [DataMember(Name = "root", EmitDefaultValue = false)] - public FileEntry Root { get; set; } - - /// - /// Creates class instance - /// - /// - /// Root directory - public FileSystemInfo(string name, FileEntry rootEntry = null) - { - Name = name; - Root = rootEntry; - } - } - - [DataContract] - public class CreatingOptions - { - /// - /// Create file/directory if is doesn't exist - /// - [DataMember(Name = "create")] - public bool Create { get; set; } - - /// - /// Generate an exception if create=true and file/directory already exists - /// - [DataMember(Name = "exclusive")] - public bool Exclusive { get; set; } - - - } - - // returns null value if it fails. - private string[] getOptionStrings(string options) - { - string[] optStings = null; - try - { - optStings = JSON.JsonHelper.Deserialize(options); - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), CurrentCommandCallbackId); - } - return optStings; - } - - /// - /// Gets amount of free space available for Isolated Storage - /// - /// No options is needed for this method - public void getFreeDiskSpace(string options) - { - string callbackId = getOptionStrings(options)[0]; - - try - { - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, isoFile.AvailableFreeSpace), callbackId); - } - } - catch (IsolatedStorageException) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - } - } - - /// - /// Check if file exists - /// - /// File path - public void testFileExists(string options) - { - IsDirectoryOrFileExist(options, false); - } - - /// - /// Check if directory exists - /// - /// directory name - public void testDirectoryExists(string options) - { - IsDirectoryOrFileExist(options, true); - } - - /// - /// Check if file or directory exist - /// - /// File path/Directory name - /// Flag to recognize what we should check - public void IsDirectoryOrFileExist(string options, bool isDirectory) - { - string[] args = getOptionStrings(options); - string callbackId = args[1]; - FileOptions fileOptions = JSON.JsonHelper.Deserialize(args[0]); - string filePath = args[0]; - - if (fileOptions == null) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId); - } - - try - { - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - bool isExist; - if (isDirectory) - { - isExist = isoFile.DirectoryExists(fileOptions.DirectoryName); - } - else - { - isExist = isoFile.FileExists(fileOptions.FilePath); - } - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, isExist), callbackId); - } - } - catch (IsolatedStorageException) // default handler throws INVALID_MODIFICATION_ERR - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - } - } - - } - - public void readAsDataURL(string options) - { - string[] optStrings = getOptionStrings(options); - string filePath = optStrings[0]; - int startPos = int.Parse(optStrings[1]); - int endPos = int.Parse(optStrings[2]); - string callbackId = optStrings[3]; - - if (filePath != null) - { - try - { - string base64URL = null; - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (!isoFile.FileExists(filePath)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - return; - } - string mimeType = MimeTypeMapper.GetMimeType(filePath); - - using (IsolatedStorageFileStream stream = isoFile.OpenFile(filePath, FileMode.Open, FileAccess.Read)) - { - string base64String = GetFileContent(stream); - base64URL = "data:" + mimeType + ";base64," + base64String; - } - } - - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, base64URL), callbackId); - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - } - } - } - - public void readAsArrayBuffer(string options) - { - string[] optStrings = getOptionStrings(options); - string filePath = optStrings[0]; - int startPos = int.Parse(optStrings[1]); - int endPos = int.Parse(optStrings[2]); - string callbackId = optStrings[3]; - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR), callbackId); - } - - public void readAsBinaryString(string options) - { - string[] optStrings = getOptionStrings(options); - string filePath = optStrings[0]; - int startPos = int.Parse(optStrings[1]); - int endPos = int.Parse(optStrings[2]); - string callbackId = optStrings[3]; - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR), callbackId); - } - - public void readAsText(string options) - { - string[] optStrings = getOptionStrings(options); - string filePath = optStrings[0]; - string encStr = optStrings[1]; - int startPos = int.Parse(optStrings[2]); - int endPos = int.Parse(optStrings[3]); - string callbackId = optStrings[4]; - - try - { - string text = ""; - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (!isoFile.FileExists(filePath)) - { - readResourceAsText(options); - return; - } - Encoding encoding = Encoding.GetEncoding(encStr); - - using (TextReader reader = new StreamReader(isoFile.OpenFile(filePath, FileMode.Open, FileAccess.Read), encoding)) - { - text = reader.ReadToEnd(); - if (startPos < 0) - { - startPos = Math.Max(text.Length + startPos, 0); - } - else if (startPos > 0) - { - startPos = Math.Min(text.Length, startPos); - } - - if (endPos > 0) - { - endPos = Math.Min(text.Length, endPos); - } - else if (endPos < 0) - { - endPos = Math.Max(endPos + text.Length, 0); - } - - - text = text.Substring(startPos, endPos - startPos); - - } - } - - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, text), callbackId); - } - catch (Exception ex) - { - if (!this.HandleException(ex, callbackId)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - } - } - - /// - /// Reads application resource as a text - /// - /// Path to a resource - public void readResourceAsText(string options) - { - string[] optStrings = getOptionStrings(options); - string pathToResource = optStrings[0]; - string encStr = optStrings[1]; - int start = int.Parse(optStrings[2]); - int endMarker = int.Parse(optStrings[3]); - string callbackId = optStrings[4]; - - try - { - if (pathToResource.StartsWith("/")) - { - pathToResource = pathToResource.Remove(0, 1); - } - - var resource = Application.GetResourceStream(new Uri(pathToResource, UriKind.Relative)); - - if (resource == null) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - return; - } - - string text; - StreamReader streamReader = new StreamReader(resource.Stream); - text = streamReader.ReadToEnd(); - - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, text), callbackId); - } - catch (Exception ex) - { - if (!this.HandleException(ex, callbackId)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - } - } - - public void truncate(string options) - { - string[] optStrings = getOptionStrings(options); - - string filePath = optStrings[0]; - int size = int.Parse(optStrings[1]); - string callbackId = optStrings[2]; - - try - { - long streamLength = 0; - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (!isoFile.FileExists(filePath)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - return; - } - - using (FileStream stream = new IsolatedStorageFileStream(filePath, FileMode.Open, FileAccess.ReadWrite, isoFile)) - { - if (0 <= size && size <= stream.Length) - { - stream.SetLength(size); - } - streamLength = stream.Length; - } - } - - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, streamLength), callbackId); - } - catch (Exception ex) - { - if (!this.HandleException(ex, callbackId)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - } - } - - //write:["filePath","data","position"], - public void write(string options) - { - // TODO: try/catch - string[] optStrings = getOptionStrings(options); - - string filePath = optStrings[0]; - string data = optStrings[1]; - int position = int.Parse(optStrings[2]); - string callbackId = optStrings[3]; - - try - { - if (string.IsNullOrEmpty(data)) - { - Debug.WriteLine("Expected some data to be send in the write command to {0}", filePath); - DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId); - return; - } - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - // create the file if not exists - if (!isoFile.FileExists(filePath)) - { - var file = isoFile.CreateFile(filePath); - file.Close(); - } - - using (FileStream stream = new IsolatedStorageFileStream(filePath, FileMode.Open, FileAccess.ReadWrite, isoFile)) - { - if (0 <= position && position <= stream.Length) - { - stream.SetLength(position); - } - using (BinaryWriter writer = new BinaryWriter(stream)) - { - writer.Seek(0, SeekOrigin.End); - writer.Write(data.ToCharArray()); - } - } - } - - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, data.Length), callbackId); - } - catch (Exception ex) - { - if (!this.HandleException(ex, callbackId)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - } - } - - /// - /// Look up metadata about this entry. - /// - /// filePath to entry - public void getMetadata(string options) - { - string[] optStings = getOptionStrings(options); - string filePath = optStings[0]; - string callbackId = optStings[1]; - - if (filePath != null) - { - try - { - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (isoFile.FileExists(filePath)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, - new ModificationMetadata() { modificationTime = isoFile.GetLastWriteTime(filePath).DateTime.ToString() }), callbackId); - } - else if (isoFile.DirectoryExists(filePath)) - { - string modTime = isoFile.GetLastWriteTime(filePath).DateTime.ToString(); - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, new ModificationMetadata() { modificationTime = modTime }), callbackId); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - } - - } - } - catch (IsolatedStorageException) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - } - } - - } - - - /// - /// Returns a File that represents the current state of the file that this FileEntry represents. - /// - /// filePath to entry - /// - public void getFileMetadata(string options) - { - string[] optStings = getOptionStrings(options); - string filePath = optStings[0]; - string callbackId = optStings[1]; - - if (filePath != null) - { - try - { - FileMetadata metaData = new FileMetadata(filePath); - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, metaData), callbackId); - } - catch (IsolatedStorageException) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_READABLE_ERR), callbackId); - } - } - } - } - - /// - /// Look up the parent DirectoryEntry containing this Entry. - /// If this Entry is the root of IsolatedStorage, its parent is itself. - /// - /// - public void getParent(string options) - { - string[] optStings = getOptionStrings(options); - string filePath = optStings[0]; - string callbackId = optStings[1]; - - if (filePath != null) - { - try - { - if (string.IsNullOrEmpty(filePath)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION),callbackId); - return; - } - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - FileEntry entry; - - if (isoFile.FileExists(filePath) || isoFile.DirectoryExists(filePath)) - { - - - string path = this.GetParentDirectory(filePath); - entry = FileEntry.GetEntry(path); - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, entry),callbackId); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR),callbackId); - } - - } - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR),callbackId); - } - } - } - } - - public void remove(string options) - { - string[] args = getOptionStrings(options); - string filePath = args[0]; - string callbackId = args[1]; - - if (filePath != null) - { - try - { - if (filePath == "/" || filePath == "" || filePath == @"\") - { - throw new Exception("Cannot delete root file system") ; - } - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (isoFile.FileExists(filePath)) - { - isoFile.DeleteFile(filePath); - } - else - { - if (isoFile.DirectoryExists(filePath)) - { - isoFile.DeleteDirectory(filePath); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR),callbackId); - return; - } - } - DispatchCommandResult(new PluginResult(PluginResult.Status.OK),callbackId); - } - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NO_MODIFICATION_ALLOWED_ERR),callbackId); - } - } - } - } - - public void removeRecursively(string options) - { - string[] args = getOptionStrings(options); - string filePath = args[0]; - string callbackId = args[1]; - - if (filePath != null) - { - if (string.IsNullOrEmpty(filePath)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION),callbackId); - } - else - { - if (removeDirRecursively(filePath, callbackId)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.OK), callbackId); - } - } - } - } - - public void readEntries(string options) - { - string[] args = getOptionStrings(options); - string filePath = args[0]; - string callbackId = args[1]; - - if (filePath != null) - { - try - { - if (string.IsNullOrEmpty(filePath)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION),callbackId); - return; - } - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (isoFile.DirectoryExists(filePath)) - { - string path = File.AddSlashToDirectory(filePath); - List entries = new List(); - string[] files = isoFile.GetFileNames(path + "*"); - string[] dirs = isoFile.GetDirectoryNames(path + "*"); - foreach (string file in files) - { - entries.Add(FileEntry.GetEntry(path + file)); - } - foreach (string dir in dirs) - { - entries.Add(FileEntry.GetEntry(path + dir + "/")); - } - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, entries),callbackId); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR),callbackId); - } - } - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NO_MODIFICATION_ALLOWED_ERR),callbackId); - } - } - } - } - - public void requestFileSystem(string options) - { - // TODO: try/catch - string[] optVals = getOptionStrings(options); - //FileOptions fileOptions = new FileOptions(); - int fileSystemType = int.Parse(optVals[0]); - double size = double.Parse(optVals[1]); - string callbackId = optVals[2]; - - - IsolatedStorageFile.GetUserStoreForApplication(); - - if (size > (10 * 1024 * 1024)) // 10 MB, compier will clean this up! - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, QUOTA_EXCEEDED_ERR), callbackId); - return; - } - - try - { - if (size != 0) - { - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - long availableSize = isoFile.AvailableFreeSpace; - if (size > availableSize) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, QUOTA_EXCEEDED_ERR), callbackId); - return; - } - } - } - - if (fileSystemType == PERSISTENT) - { - // TODO: this should be in it's own folder to prevent overwriting of the app assets, which are also in ISO - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, new FileSystemInfo("persistent", FileEntry.GetEntry("/"))), callbackId); - } - else if (fileSystemType == TEMPORARY) - { - using (IsolatedStorageFile isoStorage = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (!isoStorage.FileExists(TMP_DIRECTORY_NAME)) - { - isoStorage.CreateDirectory(TMP_DIRECTORY_NAME); - } - } - - string tmpFolder = "/" + TMP_DIRECTORY_NAME + "/"; - - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, new FileSystemInfo("temporary", FileEntry.GetEntry(tmpFolder))), callbackId); - } - else if (fileSystemType == RESOURCE) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, new FileSystemInfo("resource")), callbackId); - } - else if (fileSystemType == APPLICATION) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, new FileSystemInfo("application")), callbackId); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NO_MODIFICATION_ALLOWED_ERR), callbackId); - } - - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NO_MODIFICATION_ALLOWED_ERR), callbackId); - } - } - } - - public void resolveLocalFileSystemURI(string options) - { - - string[] optVals = getOptionStrings(options); - string uri = optVals[0].Split('?')[0]; - string callbackId = optVals[1]; - - if (uri != null) - { - // a single '/' is valid, however, '/someDir' is not, but '/tmp//somedir' and '///someDir' are valid - if (uri.StartsWith("/") && uri.IndexOf("//") < 0 && uri != "/") - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ENCODING_ERR), callbackId); - return; - } - try - { - // fix encoded spaces - string path = Uri.UnescapeDataString(uri); - - FileEntry uriEntry = FileEntry.GetEntry(path); - if (uriEntry != null) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, uriEntry), callbackId); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - } - } - catch (Exception ex) - { - if (!this.HandleException(ex, callbackId)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NO_MODIFICATION_ALLOWED_ERR), callbackId); - } - } - } - } - - public void copyTo(string options) - { - TransferTo(options, false); - } - - public void moveTo(string options) - { - TransferTo(options, true); - } - - public void getFile(string options) - { - GetFileOrDirectory(options, false); - } - - public void getDirectory(string options) - { - GetFileOrDirectory(options, true); - } - - #region internal functionality - - /// - /// Retrieves the parent directory name of the specified path, - /// - /// Path - /// Parent directory name - private string GetParentDirectory(string path) - { - if (String.IsNullOrEmpty(path) || path == "/") - { - return "/"; - } - - if (path.EndsWith(@"/") || path.EndsWith(@"\")) - { - return this.GetParentDirectory(Path.GetDirectoryName(path)); - } - - string result = Path.GetDirectoryName(path); - if (result == null) - { - result = "/"; - } - - return result; - } - - private bool removeDirRecursively(string fullPath,string callbackId) - { - try - { - if (fullPath == "/") - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NO_MODIFICATION_ALLOWED_ERR),callbackId); - return false; - } - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (isoFile.DirectoryExists(fullPath)) - { - string tempPath = File.AddSlashToDirectory(fullPath); - string[] files = isoFile.GetFileNames(tempPath + "*"); - if (files.Length > 0) - { - foreach (string file in files) - { - isoFile.DeleteFile(tempPath + file); - } - } - string[] dirs = isoFile.GetDirectoryNames(tempPath + "*"); - if (dirs.Length > 0) - { - foreach (string dir in dirs) - { - if (!removeDirRecursively(tempPath + dir, callbackId)) - { - return false; - } - } - } - isoFile.DeleteDirectory(fullPath); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR),callbackId); - } - } - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NO_MODIFICATION_ALLOWED_ERR),callbackId); - return false; - } - } - return true; - } - - private bool CanonicalCompare(string pathA, string pathB) - { - string a = pathA.Replace("//", "/"); - string b = pathB.Replace("//", "/"); - - return a.Equals(b, StringComparison.OrdinalIgnoreCase); - } - - /* - * copyTo:["fullPath","parent", "newName"], - * moveTo:["fullPath","parent", "newName"], - */ - private void TransferTo(string options, bool move) - { - // TODO: try/catch - string[] optStrings = getOptionStrings(options); - string fullPath = optStrings[0]; - string parent = optStrings[1]; - string newFileName = optStrings[2]; - string callbackId = optStrings[3]; - - char[] invalids = Path.GetInvalidPathChars(); - - if (newFileName.IndexOfAny(invalids) > -1 || newFileName.IndexOf(":") > -1 ) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ENCODING_ERR), callbackId); - return; - } - - try - { - if ((parent == null) || (string.IsNullOrEmpty(parent)) || (string.IsNullOrEmpty(fullPath))) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - return; - } - - string parentPath = File.AddSlashToDirectory(parent); - string currentPath = fullPath; - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - bool isFileExist = isoFile.FileExists(currentPath); - bool isDirectoryExist = isoFile.DirectoryExists(currentPath); - bool isParentExist = isoFile.DirectoryExists(parentPath); - - if ( ( !isFileExist && !isDirectoryExist ) || !isParentExist ) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - return; - } - string newName; - string newPath; - if (isFileExist) - { - newName = (string.IsNullOrEmpty(newFileName)) - ? Path.GetFileName(currentPath) - : newFileName; - - newPath = Path.Combine(parentPath, newName); - - // sanity check .. - // cannot copy file onto itself - if (CanonicalCompare(newPath,currentPath)) //(parent + newFileName)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, INVALID_MODIFICATION_ERR), callbackId); - return; - } - else if (isoFile.DirectoryExists(newPath)) - { - // there is already a folder with the same name, operation is not allowed - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, INVALID_MODIFICATION_ERR), callbackId); - return; - } - else if (isoFile.FileExists(newPath)) - { // remove destination file if exists, in other case there will be exception - isoFile.DeleteFile(newPath); - } - - if (move) - { - isoFile.MoveFile(currentPath, newPath); - } - else - { - isoFile.CopyFile(currentPath, newPath, true); - } - } - else - { - newName = (string.IsNullOrEmpty(newFileName)) - ? currentPath - : newFileName; - - newPath = Path.Combine(parentPath, newName); - - if (move) - { - // remove destination directory if exists, in other case there will be exception - // target directory should be empty - if (!newPath.Equals(currentPath) && isoFile.DirectoryExists(newPath)) - { - isoFile.DeleteDirectory(newPath); - } - - isoFile.MoveDirectory(currentPath, newPath); - } - else - { - CopyDirectory(currentPath, newPath, isoFile); - } - } - FileEntry entry = FileEntry.GetEntry(newPath); - if (entry != null) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, entry), callbackId); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - } - } - - } - catch (Exception ex) - { - if (!this.HandleException(ex, callbackId)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NO_MODIFICATION_ALLOWED_ERR), callbackId); - } - } - } - - private bool HandleException(Exception ex, string cbId="") - { - bool handled = false; - string callbackId = String.IsNullOrEmpty(cbId) ? this.CurrentCommandCallbackId : cbId; - if (ex is SecurityException) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, SECURITY_ERR), callbackId); - handled = true; - } - else if (ex is FileNotFoundException) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - handled = true; - } - else if (ex is ArgumentException) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ENCODING_ERR), callbackId); - handled = true; - } - else if (ex is IsolatedStorageException) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, INVALID_MODIFICATION_ERR), callbackId); - handled = true; - } - else if (ex is DirectoryNotFoundException) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - handled = true; - } - return handled; - } - - private void CopyDirectory(string sourceDir, string destDir, IsolatedStorageFile isoFile) - { - string path = File.AddSlashToDirectory(sourceDir); - - bool bExists = isoFile.DirectoryExists(destDir); - - if (!bExists) - { - isoFile.CreateDirectory(destDir); - } - - destDir = File.AddSlashToDirectory(destDir); - - string[] files = isoFile.GetFileNames(path + "*"); - - if (files.Length > 0) - { - foreach (string file in files) - { - isoFile.CopyFile(path + file, destDir + file,true); - } - } - string[] dirs = isoFile.GetDirectoryNames(path + "*"); - if (dirs.Length > 0) - { - foreach (string dir in dirs) - { - CopyDirectory(path + dir, destDir + dir, isoFile); - } - } - } - - private void GetFileOrDirectory(string options, bool getDirectory) - { - FileOptions fOptions = new FileOptions(); - string[] args = getOptionStrings(options); - - fOptions.FullPath = args[0]; - fOptions.Path = args[1]; - - string callbackId = args[3]; - - try - { - fOptions.CreatingOpt = JSON.JsonHelper.Deserialize(args[2]); - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId); - return; - } - - try - { - if ((string.IsNullOrEmpty(fOptions.Path)) || (string.IsNullOrEmpty(fOptions.FullPath))) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - return; - } - - string path; - - if (fOptions.Path.Split(':').Length > 2) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ENCODING_ERR), callbackId); - return; - } - - try - { - path = Path.Combine(fOptions.FullPath + "/", fOptions.Path); - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ENCODING_ERR), callbackId); - return; - } - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - bool isFile = isoFile.FileExists(path); - bool isDirectory = isoFile.DirectoryExists(path); - bool create = (fOptions.CreatingOpt == null) ? false : fOptions.CreatingOpt.Create; - bool exclusive = (fOptions.CreatingOpt == null) ? false : fOptions.CreatingOpt.Exclusive; - if (create) - { - if (exclusive && (isoFile.FileExists(path) || isoFile.DirectoryExists(path))) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, PATH_EXISTS_ERR), callbackId); - return; - } - - // need to make sure the parent exists - // it is an error to create a directory whose immediate parent does not yet exist - // see issue: https://issues.apache.org/jira/browse/CB-339 - string[] pathParts = path.Split('/'); - string builtPath = pathParts[0]; - for (int n = 1; n < pathParts.Length - 1; n++) - { - builtPath += "/" + pathParts[n]; - if (!isoFile.DirectoryExists(builtPath)) - { - Debug.WriteLine(String.Format("Error :: Parent folder \"{0}\" does not exist, when attempting to create \"{1}\"",builtPath,path)); - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - return; - } - } - - if ((getDirectory) && (!isDirectory)) - { - isoFile.CreateDirectory(path); - } - else - { - if ((!getDirectory) && (!isFile)) - { - - IsolatedStorageFileStream fileStream = isoFile.CreateFile(path); - fileStream.Close(); - } - } - } - else // (not create) - { - if ((!isFile) && (!isDirectory)) - { - if (path.IndexOf("//www") == 0) - { - Uri fileUri = new Uri(path.Remove(0,2), UriKind.Relative); - StreamResourceInfo streamInfo = Application.GetResourceStream(fileUri); - if (streamInfo != null) - { - FileEntry _entry = FileEntry.GetEntry(fileUri.OriginalString,true); - - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, _entry), callbackId); - - //using (BinaryReader br = new BinaryReader(streamInfo.Stream)) - //{ - // byte[] data = br.ReadBytes((int)streamInfo.Stream.Length); - - //} - - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - } - - - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - } - return; - } - if (((getDirectory) && (!isDirectory)) || ((!getDirectory) && (!isFile))) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, TYPE_MISMATCH_ERR), callbackId); - return; - } - } - FileEntry entry = FileEntry.GetEntry(path); - if (entry != null) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, entry), callbackId); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NOT_FOUND_ERR), callbackId); - } - } - } - catch (Exception ex) - { - if (!this.HandleException(ex)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, NO_MODIFICATION_ALLOWED_ERR), callbackId); - } - } - } - - private static string AddSlashToDirectory(string dirPath) - { - if (dirPath.EndsWith("/")) - { - return dirPath; - } - else - { - return dirPath + "/"; - } - } - - /// - /// Returns file content in a form of base64 string - /// - /// File stream - /// Base64 representation of the file - private string GetFileContent(Stream stream) - { - int streamLength = (int)stream.Length; - byte[] fileData = new byte[streamLength + 1]; - stream.Read(fileData, 0, streamLength); - stream.Close(); - return Convert.ToBase64String(fileData); - } - - #endregion - - } -} http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/5c361be6/templates/standalone/Plugins/FileTransfer.cs ---------------------------------------------------------------------- diff --git a/templates/standalone/Plugins/FileTransfer.cs b/templates/standalone/Plugins/FileTransfer.cs deleted file mode 100644 index e585895..0000000 --- a/templates/standalone/Plugins/FileTransfer.cs +++ /dev/null @@ -1,526 +0,0 @@ -/* - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.IsolatedStorage; -using System.Net; -using System.Runtime.Serialization; -using System.Windows; -using System.Security; -using System.Diagnostics; - -namespace WPCordovaClassLib.Cordova.Commands -{ - public class FileTransfer : BaseCommand - { - public class DownloadRequestState - { - // This class stores the State of the request. - public HttpWebRequest request; - public DownloadOptions options; - - public DownloadRequestState() - { - request = null; - options = null; - } - } - - /// - /// Boundary symbol - /// - private string Boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x"); - - // Error codes - public const int FileNotFoundError = 1; - public const int InvalidUrlError = 2; - public const int ConnectionError = 3; - - /// - /// Options for downloading file - /// - [DataContract] - public class DownloadOptions - { - /// - /// File path to download to - /// - [DataMember(Name = "filePath", IsRequired = true)] - public string FilePath { get; set; } - - /// - /// Server address to the file to download - /// - [DataMember(Name = "url", IsRequired = true)] - public string Url { get; set; } - } - - /// - /// Options for uploading file - /// - [DataContract] - public class UploadOptions - { - /// - /// File path to upload - /// - [DataMember(Name = "filePath", IsRequired = true)] - public string FilePath { get; set; } - - /// - /// Server address - /// - [DataMember(Name = "server", IsRequired = true)] - public string Server { get; set; } - - /// - /// File key - /// - [DataMember(Name = "fileKey")] - public string FileKey { get; set; } - - /// - /// File name on the server - /// - [DataMember(Name = "fileName")] - public string FileName { get; set; } - - /// - /// File Mime type - /// - [DataMember(Name = "mimeType")] - public string MimeType { get; set; } - - - /// - /// Additional options - /// - [DataMember(Name = "params")] - public string Params { get; set; } - - /// - /// Flag to recognize if we should trust every host (only in debug environments) - /// - [DataMember(Name = "debug")] - public bool Debug { get; set; } - - /// - /// Creates options object with default parameters - /// - public UploadOptions() - { - this.SetDefaultValues(new StreamingContext()); - } - - /// - /// Initializes default values for class fields. - /// Implemented in separate method because default constructor is not invoked during deserialization. - /// - /// - [OnDeserializing()] - public void SetDefaultValues(StreamingContext context) - { - this.FileKey = "file"; - this.FileName = "image.jpg"; - this.MimeType = "image/jpeg"; - } - - } - - /// - /// Uploading response info - /// - [DataContract] - public class FileUploadResult - { - /// - /// Amount of sent bytes - /// - [DataMember(Name = "bytesSent")] - public long BytesSent { get; set; } - - /// - /// Server response code - /// - [DataMember(Name = "responseCode")] - public long ResponseCode { get; set; } - - /// - /// Server response - /// - [DataMember(Name = "response", EmitDefaultValue = false)] - public string Response { get; set; } - - /// - /// Creates FileUploadResult object with response values - /// - /// Amount of sent bytes - /// Server response code - /// Server response - public FileUploadResult(long bytesSent, long responseCode, string response) - { - this.BytesSent = bytesSent; - this.ResponseCode = responseCode; - this.Response = response; - } - } - - /// - /// Represents transfer error codes for callback - /// - [DataContract] - public class FileTransferError - { - /// - /// Error code - /// - [DataMember(Name = "code", IsRequired = true)] - public int Code { get; set; } - - /// - /// The source URI - /// - [DataMember(Name = "source", IsRequired = true)] - public string Source { get; set; } - - /// - /// The target URI - /// - [DataMember(Name = "target", IsRequired = true)] - public string Target { get; set; } - - /// - /// The http status code response from the remote URI - /// - [DataMember(Name = "http_status", IsRequired = true)] - public int HttpStatus { get; set; } - - /// - /// Creates FileTransferError object - /// - /// Error code - public FileTransferError(int errorCode) - { - this.Code = errorCode; - this.Source = null; - this.Target = null; - this.HttpStatus = 0; - } - public FileTransferError(int errorCode, string source, string target, int status) - { - this.Code = errorCode; - this.Source = source; - this.Target = target; - this.HttpStatus = status; - } - } - - /// - /// Upload options - /// - private UploadOptions uploadOptions; - - /// - /// Bytes sent - /// - private long bytesSent; - - /// - /// sends a file to a server - /// - /// Upload options - public void upload(string options) - { - Debug.WriteLine("options = " + options); - options = options.Replace("{}", "null"); - - try - { - try - { - string[] args = JSON.JsonHelper.Deserialize(options); - uploadOptions = JSON.JsonHelper.Deserialize(args[0]); - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); - return; - } - - Uri serverUri; - try - { - serverUri = new Uri(uploadOptions.Server); - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(InvalidUrlError, uploadOptions.Server, null, 0))); - return; - } - HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(serverUri); - webRequest.ContentType = "multipart/form-data;boundary=" + Boundary; - webRequest.Method = "POST"; - webRequest.BeginGetRequestStream(WriteCallback, webRequest); - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(ConnectionError))); - } - } - - public void download(string options) - { - DownloadOptions downloadOptions = null; - HttpWebRequest webRequest = null; - - try - { - string[] optionStrings = JSON.JsonHelper.Deserialize(options); - - downloadOptions = new DownloadOptions();// JSON.JsonHelper.Deserialize(options); - downloadOptions.Url = optionStrings[0]; - downloadOptions.FilePath = optionStrings[1]; - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); - return; - } - - try - { - webRequest = (HttpWebRequest)WebRequest.Create(downloadOptions.Url); - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(InvalidUrlError, downloadOptions.Url, null, 0))); - return; - } - - if (downloadOptions != null && webRequest != null) - { - DownloadRequestState state = new DownloadRequestState(); - state.options = downloadOptions; - state.request = webRequest; - webRequest.BeginGetResponse(new AsyncCallback(downloadCallback), state); - } - - - - } - - /// - /// - /// - /// - private void downloadCallback(IAsyncResult asynchronousResult) - { - DownloadRequestState reqState = (DownloadRequestState)asynchronousResult.AsyncState; - HttpWebRequest request = reqState.request; - - try - { - HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); - - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - // create the file if not exists - if (!isoFile.FileExists(reqState.options.FilePath)) - { - var file = isoFile.CreateFile(reqState.options.FilePath); - file.Close(); - } - - using (FileStream fileStream = new IsolatedStorageFileStream(reqState.options.FilePath, FileMode.Open, FileAccess.Write, isoFile)) - { - long totalBytes = response.ContentLength; - int bytesRead = 0; - using (BinaryReader reader = new BinaryReader(response.GetResponseStream())) - { - - using (BinaryWriter writer = new BinaryWriter(fileStream)) - { - int BUFFER_SIZE = 1024; - byte[] buffer; - - while (true) - { - buffer = reader.ReadBytes(BUFFER_SIZE); - // fire a progress event ? - bytesRead += buffer.Length; - if (buffer.Length > 0) - { - writer.Write(buffer); - } - else - { - writer.Close(); - reader.Close(); - fileStream.Close(); - break; - } - } - } - - } - - - } - } - WPCordovaClassLib.Cordova.Commands.File.FileEntry entry = new WPCordovaClassLib.Cordova.Commands.File.FileEntry(reqState.options.FilePath); - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, entry)); - } - catch (IsolatedStorageException) - { - // Trying to write the file somewhere within the IsoStorage. - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(FileNotFoundError))); - } - catch (SecurityException) - { - // Trying to write the file somewhere not allowed. - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(FileNotFoundError))); - } - catch (WebException webex) - { - // TODO: probably need better work here to properly respond with all http status codes back to JS - // Right now am jumping through hoops just to detect 404. - if ((webex.Status == WebExceptionStatus.ProtocolError && ((HttpWebResponse)webex.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 - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(ConnectionError, null, null, 404))); - } - else - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(ConnectionError))); - } - } - catch (Exception) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(FileNotFoundError))); - } - } - - - - /// - /// Read file from Isolated Storage and sends it to server - /// - /// - private void WriteCallback(IAsyncResult asynchronousResult) - { - try - { - HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; - using (Stream requestStream = (webRequest.EndGetRequestStream(asynchronousResult))) - { - string lineStart = "--"; - string lineEnd = Environment.NewLine; - byte[] boundaryBytes = System.Text.Encoding.UTF8.GetBytes(lineStart + Boundary + lineEnd); - string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"" + lineEnd + lineEnd + "{1}" + lineEnd; - - if (uploadOptions.Params != null) - { - - string[] arrParams = uploadOptions.Params.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries); - - foreach (string param in arrParams) - { - string[] split = param.Split('='); - string key = split[0]; - string val = split[1]; - requestStream.Write(boundaryBytes, 0, boundaryBytes.Length); - string formItem = string.Format(formdataTemplate, key, val); - byte[] formItemBytes = System.Text.Encoding.UTF8.GetBytes(formItem); - requestStream.Write(formItemBytes, 0, formItemBytes.Length); - } - requestStream.Write(boundaryBytes, 0, boundaryBytes.Length); - } - using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication()) - { - if (!isoFile.FileExists(uploadOptions.FilePath)) - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(FileNotFoundError, uploadOptions.Server, uploadOptions.FilePath, 0))); - return; - } - - using (FileStream fileStream = new IsolatedStorageFileStream(uploadOptions.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, uploadOptions.FileKey, uploadOptions.FileName, uploadOptions.MimeType); - byte[] headerBytes = System.Text.Encoding.UTF8.GetBytes(header); - requestStream.Write(boundaryBytes, 0, boundaryBytes.Length); - requestStream.Write(headerBytes, 0, headerBytes.Length); - byte[] buffer = new byte[4096]; - int bytesRead = 0; - - while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) - { - requestStream.Write(buffer, 0, bytesRead); - bytesSent += bytesRead; - } - } - byte[] endRequest = System.Text.Encoding.UTF8.GetBytes(lineEnd + lineStart + Boundary + lineStart + lineEnd); - requestStream.Write(endRequest, 0, endRequest.Length); - } - } - webRequest.BeginGetResponse(ReadCallback, webRequest); - } - catch (Exception) - { - Deployment.Current.Dispatcher.BeginInvoke(() => - { - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(ConnectionError))); - }); - } - } - - /// - /// Reads response into FileUploadResult - /// - /// - private void ReadCallback(IAsyncResult asynchronousResult) - { - try - { - HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; - using (HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult)) - { - using (Stream streamResponse = response.GetResponseStream()) - { - using (StreamReader streamReader = new StreamReader(streamResponse)) - { - string responseString = streamReader.ReadToEnd(); - Deployment.Current.Dispatcher.BeginInvoke(() => - { - DispatchCommandResult(new PluginResult(PluginResult.Status.OK, new FileUploadResult(bytesSent, (long)response.StatusCode, responseString))); - }); - } - } - } - } - catch (Exception) - { - Deployment.Current.Dispatcher.BeginInvoke(() => - { - FileTransferError transferError = new FileTransferError(ConnectionError, uploadOptions.Server, uploadOptions.FilePath, 403); - DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, transferError)); - }); - } - } - } -} http://git-wip-us.apache.org/repos/asf/cordova-wp7/blob/5c361be6/templates/standalone/Plugins/GeoLocation.cs ---------------------------------------------------------------------- diff --git a/templates/standalone/Plugins/GeoLocation.cs b/templates/standalone/Plugins/GeoLocation.cs deleted file mode 100644 index c53cb29..0000000 --- a/templates/standalone/Plugins/GeoLocation.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -using System; -using System.Collections.Generic; -using System.Runtime.Serialization; -using System.Threading; -using System.Device.Location; - -namespace WPCordovaClassLib.Cordova.Commands -{ - /// - /// This is a command stub, the browser provides the correct implementation. We use this to trigger the static analyzer that we require this permission - /// - public class GeoLocation - { - /* Unreachable code, by design -jm */ - private void triggerGeoInclusion() - { - new GeoCoordinateWatcher(); - } - } -}