You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cordova.apache.org by "Jesse MacFadyen (JIRA)" <ji...@apache.org> on 2013/05/09 08:49:16 UTC

[jira] [Resolved] (CB-2084) CordovaWP7 FileEntry.write Intermittent Errors

     [ https://issues.apache.org/jira/browse/CB-2084?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jesse MacFadyen resolved CB-2084.
---------------------------------

       Resolution: Fixed
    Fix Version/s: 2.8.0

https://git-wip-us.apache.org/repos/asf?p=cordova-wp7.git;a=commit;h=4a79e5853929eb857ee0c366c5d78a667fb7a9b4
                
> CordovaWP7 FileEntry.write Intermittent Errors
> ----------------------------------------------
>
>                 Key: CB-2084
>                 URL: https://issues.apache.org/jira/browse/CB-2084
>             Project: Apache Cordova
>          Issue Type: Sub-task
>          Components: WP7, WP8
>    Affects Versions: 2.3.0
>         Environment: Windows Phone 7, Windows Phone 8
>            Reporter: Alan Neveu
>            Assignee: Jesse MacFadyen
>             Fix For: 2.8.0
>
>   Original Estimate: 24h
>  Remaining Estimate: 24h
>
> I have found problems due to strange behavior with writing new files to the device.  I found that the File.cs function called:
> public void write(string options)
> is intermittently losing the filePath value that comes in via options. This happens a lot when the file is being created and does not exist.  It does not happen 100% of the time, however.  What seems to be happening is that the call to getMetaData while getting a FileEntry object fails because the file does not exist and when the FileEntry is then used to write a new file to the device the filePath is null.  My application needs to downloads maybe 30 files from a web service and write them all to disk.  While I am looping through the files I downloaded and attempting to write them to disk, maybe 2 or 3 out of 30 will experience this problem.
>  
> I wrote a simple function for writing files called write2, and it lives in my File.cs file.  This is what it looks like:
>  
>  
>         public void write2(string options)
>         {
>             string[] optStrings = JSON.JsonHelper.Deserialize<string[]>(options);
>             string filename = optStrings[0];
>             string data = optStrings[1];
>  
>             try
>             {
>                 using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
>                 {
>                     bool booExists = isoFile.FileExists(filename);
>                     if (booExists)
>                     {
>                         isoFile.DeleteFile(filename);
>                     }
>                     IsolatedStorageFileStream myNewIsoFS = isoFile.CreateFile(filename);
>  
>                     byte[] bytData = System.Text.Encoding.UTF8.GetBytes(data);
>                     myNewIsoFS.Write(bytData, 0, bytData.Length);
>                     myNewIsoFS.Close();
>                 }
>             }
>             catch (Exception ex)
>             {
>                 string whaa = ex.Message;
>             }
>         } 
>  
>  It’s really lame and limited, I know, but it works every time.  I also had to modify cordova-2.3.0.js to shim my function in there.  All I did was copy the FileWriter.prototype.write function and name mine write2, and I also made mine so that it accepts two parameters - the first being the filename and the second being the data.  This allows me to pass these arguments to my write2 function in File.cs, and from there I definitely have the filename every time, which then allows me to simply write the file to disk.  I spent many hours trying to figure out how/why the normal write call is sometimes losing the filename and filePath, but I just can’t figure it out.  Here is what my FileWriter.prototype.write2 javascript function looks like:
>  
>  
> FileWriter.prototype.write2 = function (targetfilename, text) {
>     // Throw an exception if we are already writing a file
>     console.log("targetfilename=" + targetfilename);
>     if (this.readyState === FileWriter.WRITING) {
>         throw new FileError(FileError.INVALID_STATE_ERR);
>     }
>  
>     // WRITING state
>     this.readyState = FileWriter.WRITING;
>  
>     var me = this;
>  
>     // If onwritestart callback
>     if (typeof me.onwritestart === "function") {
>         me.onwritestart(new ProgressEvent("writestart", { "target": me }));
>     }
>  
>     // Write file
>     exec(
>         // Success callback
>         function (r) {
>             // If DONE (cancelled), then don't do anything
>             if (me.readyState === FileWriter.DONE) {
>                 return;
>             }
>  
>             // position always increases by bytes written because file would be extended
>             me.position += r;
>             // The length of the file is now where we are done writing.
>  
>             me.length = me.position;
>  
>             // DONE state
>             me.readyState = FileWriter.DONE;
>  
>             // If onwrite callback
>             if (typeof me.onwrite === "function") {
>                 me.onwrite(new ProgressEvent("write", { "target": me }));
>             }
>  
>             // If onwriteend callback
>             if (typeof me.onwriteend === "function") {
>                 me.onwriteend(new ProgressEvent("writeend", { "target": me }));
>             }
>         },
>         // Error callback
>         function (e) {
>             // If DONE (cancelled), then don't do anything
>             if (me.readyState === FileWriter.DONE) {
>                 return;
>             }
>  
>             // DONE state
>             me.readyState = FileWriter.DONE;
>  
>             // Save error
>             me.error = new FileError(e);
>  
>             // If onerror callback
>             if (typeof me.onerror === "function") {
>                 me.onerror(new ProgressEvent("error", { "target": me }));
>             }
>  
>             // If onwriteend callback
>             if (typeof me.onwriteend === "function") {
>                 me.onwriteend(new ProgressEvent("writeend", { "target": me }));
>             }
>         }, "File", "write2", [targetfilename, text]);
> };
>  
>  

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira