| OLD | NEW | 
|    1 // |    1 // | 
|    2 // No direct file system access, using FileSystem API |    2 // No direct file system access, using FileSystem API | 
|    3 // |    3 // | 
|    4  |    4  | 
|    5 var IO = exports.IO = |    5 var IO = exports.IO = | 
|    6 { |    6 { | 
|    7   _getFileEntry: function(file, create, successCallback, errorCallback) |  | 
|    8   { |  | 
|    9     if (file instanceof FakeFile) |  | 
|   10       file = file.path; |  | 
|   11     else if ("spec" in file) |  | 
|   12       file = file.spec; |  | 
|   13  |  | 
|   14     // Remove directory path - we operate on a single directory in Chrome |  | 
|   15     file = file.replace(/^.*[\/\\]/, ""); |  | 
|   16  |  | 
|   17     // We request a gigabyte of space, just in case |  | 
|   18     (window.requestFileSystem || window.webkitRequestFileSystem)(window.PERSISTE
     NT, 1024*1024*1024, function(fs) |  | 
|   19     { |  | 
|   20       fs.root.getFile(file, {create: create}, function(fileEntry) |  | 
|   21       { |  | 
|   22         successCallback(fs, fileEntry); |  | 
|   23       }, errorCallback); |  | 
|   24     }, errorCallback); |  | 
|   25   }, |  | 
|   26  |  | 
|   27   lineBreak: "\n", |    7   lineBreak: "\n", | 
|   28  |    8  | 
|   29   resolveFilePath: function(path) |    9   resolveFilePath: function(path) | 
|   30   { |   10   { | 
|   31     return new FakeFile(path); |   11     return new FakeFile(path); | 
|   32   }, |   12   }, | 
|   33  |   13  | 
|   34   readFromFile: function(file, decode, listener, callback, timeLineID) |   14   readFromFile: function(file, decode, listener, callback, timeLineID) | 
|   35   { |   15   { | 
|   36     if ("spec" in file && /^defaults\b/.test(file.spec)) |   16     if ("spec" in file && /^defaults\b/.test(file.spec)) | 
|   37     { |   17     { | 
|   38       // Code attempts to read the default patterns.ini, we don't have that. |   18       // Code attempts to read the default patterns.ini, we don't have that. | 
|   39       // Make sure to execute first-run actions instead. |   19       // Make sure to execute first-run actions instead. | 
|   40       callback(null); |   20       callback(null); | 
|   41       if (localStorage.currentVersion) |   21       if (localStorage.currentVersion) | 
|   42         seenDataCorruption = true; |   22         seenDataCorruption = true; | 
|   43       delete localStorage.currentVersion; |   23       delete localStorage.currentVersion; | 
|   44       return; |   24       return; | 
|   45     } |   25     } | 
|   46  |   26  | 
|   47     this._getFileEntry(file, false, function(fs, fileEntry) |   27     _fileSystem.read(file, function(result) | 
|   48     { |   28     { | 
|   49       fileEntry.file(function(file) |   29       if (result.error) | 
 |   30         callback(result.error); | 
 |   31       else | 
|   50       { |   32       { | 
|   51         var reader = new FileReader(); |   33         var lines = result.data.split(/[\r\n]+/); | 
|   52         reader.onloadend = function() |   34         for (var i = 0; i < lines.length; i++) | 
|   53         { |   35           listener.process(lines[i]); | 
|   54           if (reader.error) |   36         listener.process(null); | 
|   55             callback(reader.error); |   37         callback(null); | 
|   56           else |   38       } | 
|   57           { |   39     }); | 
|   58             var lines = reader.result.split(/[\r\n]+/); |  | 
|   59             for (var i = 0; i < lines.length; i++) |  | 
|   60               listener.process(lines[i]); |  | 
|   61             listener.process(null); |  | 
|   62             callback(null); |  | 
|   63           } |  | 
|   64         }; |  | 
|   65         reader.readAsText(file); |  | 
|   66       }, callback); |  | 
|   67     }, callback); |  | 
|   68   }, |   40   }, | 
|   69  |   41  | 
|   70   writeToFile: function(file, encode, data, callback, timeLineID) |   42   writeToFile: function(file, encode, data, callback, timeLineID) | 
|   71   { |   43   { | 
|   72     this._getFileEntry(file, true, function(fs, fileEntry) |   44     var content = data.join(this.lineBreak) + this.lineBreak; | 
|   73     { |   45     _fileSystem.write(file, content, callback); | 
|   74       fileEntry.createWriter(function(writer) |  | 
|   75       { |  | 
|   76         var executeWriteOperation = function(op, nextOperation) |  | 
|   77         { |  | 
|   78           writer.onwriteend = function() |  | 
|   79           { |  | 
|   80             if (writer.error) |  | 
|   81               callback(writer.error); |  | 
|   82             else |  | 
|   83               nextOperation(); |  | 
|   84           }.bind(this); |  | 
|   85  |  | 
|   86           op(); |  | 
|   87         }.bind(this); |  | 
|   88  |  | 
|   89         executeWriteOperation(writer.truncate.bind(writer, 0), function() |  | 
|   90         { |  | 
|   91           var blob; |  | 
|   92           try |  | 
|   93           { |  | 
|   94             blob = new Blob([data.join(this.lineBreak) + this.lineBreak], {type:
      "text/plain"}); |  | 
|   95           } |  | 
|   96           catch (e) |  | 
|   97           { |  | 
|   98             if (!(e instanceof TypeError)) |  | 
|   99               throw e; |  | 
|  100  |  | 
|  101             // Blob wasn't a constructor before Chrome 20 |  | 
|  102             var builder = new (window.BlobBuilder || window.WebKitBlobBuilder); |  | 
|  103             builder.append(data.join(this.lineBreak) + this.lineBreak); |  | 
|  104             blob = builder.getBlob("text/plain"); |  | 
|  105           } |  | 
|  106           executeWriteOperation(writer.write.bind(writer, blob), callback.bind(n
     ull, null)); |  | 
|  107         }.bind(this)); |  | 
|  108       }.bind(this), callback); |  | 
|  109     }.bind(this), callback); |  | 
|  110   }, |   46   }, | 
|  111  |   47  | 
|  112   copyFile: function(fromFile, toFile, callback) |   48   copyFile: function(fromFile, toFile, callback) | 
|  113   { |   49   { | 
|  114     // Simply combine read and write operations |   50     // Simply combine read and write operations | 
|  115     var data = []; |   51     var data = []; | 
|  116     this.readFromFile(fromFile, false, { |   52     this.readFromFile(fromFile, false, { | 
|  117       process: function(line) |   53       process: function(line) | 
|  118       { |   54       { | 
|  119         if (line !== null) |   55         if (line !== null) | 
|  120           data.push(line); |   56           data.push(line); | 
|  121       } |   57       } | 
|  122     }, function(e) |   58     }, function(e) | 
|  123     { |   59     { | 
|  124       if (e) |   60       if (e) | 
|  125         callback(e); |   61         callback(e); | 
|  126       else |   62       else | 
|  127         this.writeToFile(toFile, false, data, callback); |   63         this.writeToFile(toFile, false, data, callback); | 
|  128     }.bind(this)); |   64     }.bind(this)); | 
|  129   }, |   65   }, | 
|  130  |   66  | 
|  131   renameFile: function(fromFile, newName, callback) |   67   renameFile: function(fromFile, newName, callback) | 
|  132   { |   68   { | 
|  133     this._getFileEntry(fromFile, false, function(fs, fileEntry) |   69     _fileSystem.move(fromFile, newName, callback); | 
|  134     { |  | 
|  135       fileEntry.moveTo(fs.root, newName, function() |  | 
|  136       { |  | 
|  137         callback(null); |  | 
|  138       }, callback); |  | 
|  139     }, callback); |  | 
|  140   }, |   70   }, | 
|  141  |   71  | 
|  142   removeFile: function(file, callback) |   72   removeFile: function(file, callback) | 
|  143   { |   73   { | 
|  144     this._getFileEntry(file, false, function(fs, fileEntry) |   74     _fileSystem.remove(file, callback); | 
|  145     { |  | 
|  146       fileEntry.remove(function() |  | 
|  147       { |  | 
|  148         callback(null); |  | 
|  149       }, callback); |  | 
|  150     }, callback); |  | 
|  151   }, |   75   }, | 
|  152  |   76  | 
|  153   statFile: function(file, callback) |   77   statFile: function(file, callback) | 
|  154   { |   78   { | 
|  155     this._getFileEntry(file, false, function(fs, fileEntry) |   79     _fileSystem.stat(file, callback); | 
|  156     { |  | 
|  157       fileEntry.getMetadata(function(metadata) |  | 
|  158       { |  | 
|  159         callback(null, { |  | 
|  160           exists: true, |  | 
|  161           isDirectory: fileEntry.isDirectory, |  | 
|  162           isFile: fileEntry.isFile, |  | 
|  163           lastModified: metadata.modificationTime.getTime() |  | 
|  164         }); |  | 
|  165       }, callback); |  | 
|  166     }, callback); |  | 
|  167   } |   80   } | 
|  168 }; |   81 }; | 
| OLD | NEW |