You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by fi...@apache.org on 2012/06/19 01:02:29 UTC

wp7 commit: [CB-795] Added HTTP status code to WP7 FileTransferError interface. Catches 404 on download.

Updated Branches:
  refs/heads/master c42bbd50e -> 9f21cfc2e


[CB-795] Added HTTP status code to WP7 FileTransferError interface. Catches 404 on download.


Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/commit/9f21cfc2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/tree/9f21cfc2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/diff/9f21cfc2

Branch: refs/heads/master
Commit: 9f21cfc2e2659e7300aff334c97aca7d5a98e709
Parents: c42bbd5
Author: filmaj <ma...@gmail.com>
Authored: Mon Jun 18 16:02:18 2012 -0700
Committer: filmaj <ma...@gmail.com>
Committed: Mon Jun 18 16:02:18 2012 -0700

----------------------------------------------------------------------
 framework/Cordova/Commands/FileTransfer.cs |   76 ++++++++++++++++++-----
 1 files changed, 60 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cordova-wp7/blob/9f21cfc2/framework/Cordova/Commands/FileTransfer.cs
----------------------------------------------------------------------
diff --git a/framework/Cordova/Commands/FileTransfer.cs b/framework/Cordova/Commands/FileTransfer.cs
index 1cbf451..eee682a 100644
--- a/framework/Cordova/Commands/FileTransfer.cs
+++ b/framework/Cordova/Commands/FileTransfer.cs
@@ -20,6 +20,7 @@ using System.Net;
 using System.Runtime.Serialization;
 using System.Windows;
 using System.Security;
+using System.Diagnostics;
 
 namespace WP7CordovaClassLib.Cordova.Commands
 {
@@ -190,12 +191,40 @@ namespace WP7CordovaClassLib.Cordova.Commands
             public int Code { get; set; }
 
             /// <summary>
+            /// The source URI
+            /// </summary>
+            [DataMember(Name = "source", IsRequired = true)]
+            public string Source { get; set; }
+
+            /// <summary>
+            /// The target URI
+            /// </summary>
+            [DataMember(Name = "target", IsRequired = true)]
+            public string Target { get; set; }
+
+            /// <summary>
+            /// The http status code response from the remote URI
+            /// </summary>
+            [DataMember(Name = "http_status", IsRequired = true)]
+            public int HttpStatus { get; set; }
+
+            /// <summary>
             /// Creates FileTransferError object
             /// </summary>
             /// <param name="errorCode">Error code</param>
             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;
             }
         }
 
@@ -236,7 +265,7 @@ namespace WP7CordovaClassLib.Cordova.Commands
                 }
                 catch (Exception)
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR,new FileTransferError(InvalidUrlError)));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR,new FileTransferError(InvalidUrlError, uploadOptions.Server, null, 0)));
                     return;
                 }
                 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(serverUri);
@@ -271,7 +300,7 @@ namespace WP7CordovaClassLib.Cordova.Commands
             }
             catch (Exception)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(InvalidUrlError)));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(InvalidUrlError, downloadOptions.Url, null, 0)));
                 return;
             }
 
@@ -300,7 +329,7 @@ namespace WP7CordovaClassLib.Cordova.Commands
             {
                 HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
 
-                 using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
+                using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
                 {
                     // create the file if not exists
                     if (!isoFile.FileExists(reqState.options.FilePath))
@@ -315,7 +344,7 @@ namespace WP7CordovaClassLib.Cordova.Commands
                         int bytesRead = 0;
                         using (BinaryReader reader = new BinaryReader(response.GetResponseStream()))
                         {
-                           
+
                             using (BinaryWriter writer = new BinaryWriter(fileStream))
                             {
                                 int BUFFER_SIZE = 1024;
@@ -338,31 +367,46 @@ namespace WP7CordovaClassLib.Cordova.Commands
                                         break;
                                     }
                                 }
-                            }  
+                            }
 
                         }
 
-                      
+
                     }
                 }
-                 WP7CordovaClassLib.Cordova.Commands.File.FileEntry entry = new WP7CordovaClassLib.Cordova.Commands.File.FileEntry(reqState.options.FilePath);
-                 DispatchCommandResult(new PluginResult(PluginResult.Status.OK, entry));
+                WP7CordovaClassLib.Cordova.Commands.File.FileEntry entry = new WP7CordovaClassLib.Cordova.Commands.File.FileEntry(reqState.options.FilePath);
+                DispatchCommandResult(new PluginResult(PluginResult.Status.OK, entry));
             }
             catch (IsolatedStorageException)
             {
-               // DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new ErrorCode(INVALID_MODIFICATION_ERR)));
+                // Trying to write the file somewhere within the IsoStorage.
+                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(FileNotFoundError)));
             }
             catch (SecurityException)
             {
-                //DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new ErrorCode(SECURITY_ERR)));
+                // Trying to write the file somewhere not allowed.
+                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(FileNotFoundError)));
             }
-            catch (Exception ex)
+            catch (WebException webex)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new File.ErrorCode(File.NOT_FOUND_ERR)));
+                // 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)));
+            }             
         }
 
 
@@ -399,7 +443,7 @@ namespace WP7CordovaClassLib.Cordova.Commands
                     {
                         if (!isoFile.FileExists(uploadOptions.FilePath))
                         {
-                            DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(FileNotFoundError)));
+                            DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, new FileTransferError(FileNotFoundError, uploadOptions.Server, uploadOptions.FilePath, 0)));
                             return;
                         }