Grammalecte  Hex Artifact Content

Artifact 6a1367bab5a2645f02d7e55eba3fe8a70a1b0352fb14c5862d67a2d7808b0b70:


0000: 2f 2f 20 4a 61 76 61 53 63 72 69 70 74 0a 0a 22  // JavaScript.."
0010: 75 73 65 20 73 74 72 69 63 74 22 3b 0a 0a 2f 2f  use strict";..//
0020: 20 41 73 73 75 6d 69 6e 67 20 74 68 61 74 20 43   Assuming that C
0030: 63 2c 20 43 69 20 61 6e 64 20 43 75 20 61 72 65  c, Ci and Cu are
0040: 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 0a   already loaded.
0050: 0a 63 6f 6e 73 74 20 7b 54 65 78 74 44 65 63 6f  .const {TextDeco
0060: 64 65 72 2c 20 54 65 78 74 45 6e 63 6f 64 65 72  der, TextEncoder
0070: 2c 20 4f 53 7d 20 3d 20 43 6f 6d 70 6f 6e 65 6e  , OS} = Componen
0080: 74 73 2e 75 74 69 6c 73 2e 69 6d 70 6f 72 74 28  ts.utils.import(
0090: 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 65 2f  "resource://gre/
00a0: 6d 6f 64 75 6c 65 73 2f 6f 73 66 69 6c 65 2e 6a  modules/osfile.j
00b0: 73 6d 22 2c 20 7b 7d 29 3b 0a 0a 0a 63 6f 6e 73  sm", {});...cons
00c0: 74 20 6f 46 69 6c 65 48 61 6e 64 6c 65 72 20 3d  t oFileHandler =
00d0: 20 7b 0a 20 20 20 20 2f 2f 20 68 74 74 70 73 3a   {.    // https:
00e0: 2f 2f 64 65 76 65 6c 6f 70 65 72 2e 6d 6f 7a 69  //developer.mozi
00f0: 6c 6c 61 2e 6f 72 67 2f 66 72 2f 64 6f 63 73 2f  lla.org/fr/docs/
0100: 4d 6f 7a 69 6c 6c 61 2f 4a 61 76 61 53 63 72 69  Mozilla/JavaScri
0110: 70 74 5f 63 6f 64 65 5f 6d 6f 64 75 6c 65 73 2f  pt_code_modules/
0120: 4f 53 46 69 6c 65 2e 6a 73 6d 2f 4f 53 2e 46 69  OSFile.jsm/OS.Fi
0130: 6c 65 5f 66 6f 72 5f 74 68 65 5f 6d 61 69 6e 5f  le_for_the_main_
0140: 74 68 72 65 61 64 0a 0a 20 20 20 20 78 44 61 74  thread..    xDat
0150: 61 46 6f 6c 64 65 72 3a 20 6e 75 6c 6c 2c 0a 0a  aFolder: null,..
0160: 20 20 20 20 70 72 65 70 61 72 65 44 61 74 61 46      prepareDataF
0170: 6f 6c 64 65 72 3a 20 66 75 6e 63 74 69 6f 6e 20  older: function 
0180: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74  () {.        let
0190: 20 78 44 69 72 65 63 74 6f 72 79 53 65 72 76 69   xDirectoryServi
01a0: 63 65 20 3d 20 43 63 5b 22 40 6d 6f 7a 69 6c 6c  ce = Cc["@mozill
01b0: 61 2e 6f 72 67 2f 66 69 6c 65 2f 64 69 72 65 63  a.org/file/direc
01c0: 74 6f 72 79 5f 73 65 72 76 69 63 65 3b 31 22 5d  tory_service;1"]
01d0: 2e 67 65 74 53 65 72 76 69 63 65 28 43 69 2e 6e  .getService(Ci.n
01e0: 73 49 50 72 6f 70 65 72 74 69 65 73 29 3b 0a 20  sIProperties);. 
01f0: 20 20 20 20 20 20 20 2f 2f 20 74 68 69 73 20 69         // this i
0200: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
0210: 20 74 68 65 20 70 72 6f 66 69 6c 65 20 64 69 72   the profile dir
0220: 20 28 50 72 6f 66 44 29 20 6e 6f 77 2e 0a 20 20   (ProfD) now..  
0230: 20 20 20 20 20 20 6c 65 74 20 78 45 78 74 46 6f        let xExtFo
0240: 6c 64 65 72 20 3d 20 78 44 69 72 65 63 74 6f 72  lder = xDirector
0250: 79 53 65 72 76 69 63 65 2e 67 65 74 28 22 50 72  yService.get("Pr
0260: 6f 66 44 22 2c 20 43 69 2e 6e 73 49 46 69 6c 65  ofD", Ci.nsIFile
0270: 29 3b 0a 20 20 20 20 20 20 20 20 78 45 78 74 46  );.        xExtF
0280: 6f 6c 64 65 72 2e 61 70 70 65 6e 64 28 22 67 72  older.append("gr
0290: 61 6d 6d 61 6c 65 63 74 65 2d 64 61 74 61 22 29  ammalecte-data")
02a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 78  ;.        if (!x
02b0: 45 78 74 46 6f 6c 64 65 72 2e 65 78 69 73 74 73  ExtFolder.exists
02c0: 28 29 20 7c 7c 20 21 78 45 78 74 46 6f 6c 64 65  () || !xExtFolde
02d0: 72 2e 69 73 44 69 72 65 63 74 6f 72 79 28 29 29  r.isDirectory())
02e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
02f0: 2f 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  / read and write
0300: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   permissions to 
0310: 6f 77 6e 65 72 20 61 6e 64 20 67 72 6f 75 70 2c  owner and group,
0320: 20 72 65 61 64 2d 6f 6e 6c 79 20 66 6f 72 20 6f   read-only for o
0330: 74 68 65 72 73 2e 0a 20 20 20 20 20 20 20 20 20  thers..         
0340: 20 20 20 78 45 78 74 46 6f 6c 64 65 72 2e 63 72     xExtFolder.cr
0350: 65 61 74 65 28 43 69 2e 6e 73 49 46 69 6c 65 2e  eate(Ci.nsIFile.
0360: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 2c 20  DIRECTORY_TYPE, 
0370: 37 37 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  774);.        }.
0380: 20 20 20 20 20 20 20 20 74 68 69 73 2e 78 44 61          this.xDa
0390: 74 61 46 6f 6c 64 65 72 20 3d 20 78 45 78 74 46  taFolder = xExtF
03a0: 6f 6c 64 65 72 3b 0a 20 20 20 20 7d 2c 0a 0a 20  older;.    },.. 
03b0: 20 20 20 63 72 65 61 74 65 50 61 74 68 46 69 6c     createPathFil
03c0: 65 4e 61 6d 65 3a 20 66 75 6e 63 74 69 6f 6e 20  eName: function 
03d0: 28 73 46 69 6c 65 6e 61 6d 65 29 20 7b 0a 20 20  (sFilename) {.  
03e0: 20 20 20 20 20 20 6c 65 74 20 73 70 66 44 65 73        let spfDes
03f0: 74 20 3d 20 74 68 69 73 2e 78 44 61 74 61 46 6f  t = this.xDataFo
0400: 6c 64 65 72 2e 70 61 74 68 3b 0a 20 20 20 20 20  lder.path;.     
0410: 20 20 20 73 70 66 44 65 73 74 20 2b 3d 20 28 2f     spfDest += (/
0420: 5e 5b 41 2d 5a 5d 3a 2f 2e 74 65 73 74 28 74 68  ^[A-Z]:/.test(th
0430: 69 73 2e 78 44 61 74 61 46 6f 6c 64 65 72 2e 70  is.xDataFolder.p
0440: 61 74 68 29 29 20 3f 20 22 5c 5c 22 20 2b 20 73  ath)) ? "\\" + s
0450: 46 69 6c 65 6e 61 6d 65 20 3a 20 22 2f 22 20 2b  Filename : "/" +
0460: 20 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   sFilename;.    
0470: 20 20 20 20 72 65 74 75 72 6e 20 73 70 66 44 65      return spfDe
0480: 73 74 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20  st;.    },..    
0490: 6c 6f 61 64 46 69 6c 65 3a 20 61 73 79 6e 63 20  loadFile: async 
04a0: 66 75 6e 63 74 69 6f 6e 20 28 73 46 69 6c 65 6e  function (sFilen
04b0: 61 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69  ame) {.        i
04c0: 66 20 28 21 74 68 69 73 2e 78 44 61 74 61 46 6f  f (!this.xDataFo
04d0: 6c 64 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20  lder) {.        
04e0: 20 20 20 20 74 68 69 73 2e 70 72 65 70 61 72 65      this.prepare
04f0: 44 61 74 61 46 6f 6c 64 65 72 28 29 3b 0a 20 20  DataFolder();.  
0500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0510: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
0520: 20 20 6c 65 74 20 78 44 65 63 6f 64 65 72 20 3d    let xDecoder =
0530: 20 6e 65 77 20 54 65 78 74 44 65 63 6f 64 65 72   new TextDecoder
0540: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
0550: 6c 65 74 20 61 72 72 61 79 20 3d 20 61 77 61 69  let array = awai
0560: 74 20 4f 53 2e 46 69 6c 65 2e 72 65 61 64 28 74  t OS.File.read(t
0570: 68 69 73 2e 63 72 65 61 74 65 50 61 74 68 46 69  his.createPathFi
0580: 6c 65 4e 61 6d 65 28 73 46 69 6c 65 6e 61 6d 65  leName(sFilename
0590: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
05a0: 72 65 74 75 72 6e 20 78 44 65 63 6f 64 65 72 2e  return xDecoder.
05b0: 64 65 63 6f 64 65 28 61 72 72 61 79 29 3b 0a 20  decode(array);. 
05c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
05d0: 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20   catch (e) {.   
05e0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
05f0: 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20  .error(e);.     
0600: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75         return nu
0610: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
0620: 20 20 7d 2c 0a 0a 20 20 20 20 6c 6f 61 64 41 73    },..    loadAs
0630: 3a 20 66 75 6e 63 74 69 6f 6e 20 28 63 61 6c 6c  : function (call
0640: 62 61 63 6b 29 20 7b 0a 20 20 20 20 20 20 20 20  back) {.        
0650: 6c 65 74 20 78 46 69 6c 65 50 69 63 6b 65 72 20  let xFilePicker 
0660: 3d 20 43 63 5b 22 40 6d 6f 7a 69 6c 6c 61 2e 6f  = Cc["@mozilla.o
0670: 72 67 2f 66 69 6c 65 70 69 63 6b 65 72 3b 31 22  rg/filepicker;1"
0680: 5d 2e 63 72 65 61 74 65 49 6e 73 74 61 6e 63 65  ].createInstance
0690: 28 43 69 2e 6e 73 49 46 69 6c 65 50 69 63 6b 65  (Ci.nsIFilePicke
06a0: 72 29 3b 0a 20 20 20 20 20 20 20 20 78 46 69 6c  r);.        xFil
06b0: 65 50 69 63 6b 65 72 2e 69 6e 69 74 28 77 69 6e  ePicker.init(win
06c0: 64 6f 77 2c 20 22 43 68 61 72 67 65 72 20 66 69  dow, "Charger fi
06d0: 63 68 69 65 72 22 2c 20 43 69 2e 6e 73 49 46 69  chier", Ci.nsIFi
06e0: 6c 65 50 69 63 6b 65 72 2e 6d 6f 64 65 4f 70 65  lePicker.modeOpe
06f0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 78 46 69 6c  n);.        xFil
0700: 65 50 69 63 6b 65 72 2e 61 70 70 65 6e 64 46 69  ePicker.appendFi
0710: 6c 74 65 72 73 28 43 69 2e 6e 73 49 46 69 6c 65  lters(Ci.nsIFile
0720: 50 69 63 6b 65 72 2e 66 69 6c 74 65 72 41 6c 6c  Picker.filterAll
0730: 20 7c 20 43 69 2e 6e 73 49 46 69 6c 65 50 69 63   | Ci.nsIFilePic
0740: 6b 65 72 2e 66 69 6c 74 65 72 54 65 78 74 29 3b  ker.filterText);
0750: 0a 20 20 20 20 20 20 20 20 78 46 69 6c 65 50 69  .        xFilePi
0760: 63 6b 65 72 2e 6f 70 65 6e 28 61 73 79 6e 63 20  cker.open(async 
0770: 66 75 6e 63 74 69 6f 6e 20 28 6e 52 65 74 75 72  function (nRetur
0780: 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20  nValue) {.      
0790: 20 20 20 20 20 20 69 66 20 28 6e 52 65 74 75 72        if (nRetur
07a0: 6e 56 61 6c 75 65 20 3d 3d 20 43 69 2e 6e 73 49  nValue == Ci.nsI
07b0: 46 69 6c 65 50 69 63 6b 65 72 2e 72 65 74 75 72  FilePicker.retur
07c0: 6e 4f 4b 20 7c 7c 20 6e 52 65 74 75 72 6e 56 61  nOK || nReturnVa
07d0: 6c 75 65 20 3d 3d 20 43 69 2e 6e 73 49 46 69 6c  lue == Ci.nsIFil
07e0: 65 50 69 63 6b 65 72 2e 72 65 74 75 72 6e 52 65  ePicker.returnRe
07f0: 70 6c 61 63 65 29 20 7b 0a 20 20 20 20 20 20 20  place) {.       
0800: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
0810: 2e 6c 6f 67 28 78 46 69 6c 65 50 69 63 6b 65 72  .log(xFilePicker
0820: 2e 66 69 6c 65 2e 70 61 74 68 29 3b 0a 20 20 20  .file.path);.   
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
0840: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0850: 20 20 20 20 20 20 20 6c 65 74 20 78 44 65 63 6f         let xDeco
0860: 64 65 72 20 3d 20 6e 65 77 20 54 65 78 74 44 65  der = new TextDe
0870: 63 6f 64 65 72 28 29 3b 0a 20 20 20 20 20 20 20  coder();.       
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
0890: 20 61 72 72 61 79 20 3d 20 61 77 61 69 74 20 4f   array = await O
08a0: 53 2e 46 69 6c 65 2e 72 65 61 64 28 78 46 69 6c  S.File.read(xFil
08b0: 65 50 69 63 6b 65 72 2e 66 69 6c 65 2e 70 61 74  ePicker.file.pat
08c0: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h);.            
08d0: 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
08e0: 28 78 44 65 63 6f 64 65 72 2e 64 65 63 6f 64 65  (xDecoder.decode
08f0: 28 61 72 72 61 79 29 29 3b 0a 20 20 20 20 20 20  (array));.      
0900: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0910: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
0920: 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20  h (e) {.        
0930: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
0940: 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20  ole.error(e);.  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 63 61 6c 6c 62 61 63 6b 28 6e 75 6c 6c 29    callback(null)
0970: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0980: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
0990: 7d 0a 20 20 20 20 20 20 20 20 7d 29 3b 0a 20 20  }.        });.  
09a0: 20 20 7d 2c 0a 0a 20 20 20 20 73 61 76 65 46 69    },..    saveFi
09b0: 6c 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 46  le: function (sF
09c0: 69 6c 65 6e 61 6d 65 2c 20 73 44 61 74 61 29 20  ilename, sData) 
09d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 74  {.        if (!t
09e0: 68 69 73 2e 78 44 61 74 61 46 6f 6c 64 65 72 29  his.xDataFolder)
09f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   {.            t
0a00: 68 69 73 2e 70 72 65 70 61 72 65 44 61 74 61 46  his.prepareDataF
0a10: 6f 6c 64 65 72 28 29 3b 0a 20 20 20 20 20 20 20  older();.       
0a20: 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 74 20 78   }.        let x
0a30: 45 6e 63 6f 64 65 72 20 3d 20 6e 65 77 20 54 65  Encoder = new Te
0a40: 78 74 45 6e 63 6f 64 65 72 28 29 3b 0a 20 20 20  xtEncoder();.   
0a50: 20 20 20 20 20 6c 65 74 20 78 45 6e 63 6f 64 65       let xEncode
0a60: 64 52 65 73 20 3d 20 78 45 6e 63 6f 64 65 72 2e  dRes = xEncoder.
0a70: 65 6e 63 6f 64 65 28 73 44 61 74 61 29 3b 0a 20  encode(sData);. 
0a80: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
0a90: 6f 67 28 22 73 61 76 65 20 64 69 63 74 69 6f 6e  og("save diction
0aa0: 61 72 79 3a 20 22 20 2b 20 74 68 69 73 2e 63 72  ary: " + this.cr
0ab0: 65 61 74 65 50 61 74 68 46 69 6c 65 4e 61 6d 65  eatePathFileName
0ac0: 28 73 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  (sFilename));.  
0ad0: 20 20 20 20 20 20 4f 53 2e 46 69 6c 65 2e 77 72        OS.File.wr
0ae0: 69 74 65 41 74 6f 6d 69 63 28 74 68 69 73 2e 63  iteAtomic(this.c
0af0: 72 65 61 74 65 50 61 74 68 46 69 6c 65 4e 61 6d  reatePathFileNam
0b00: 65 28 73 46 69 6c 65 6e 61 6d 65 29 2c 20 78 45  e(sFilename), xE
0b10: 6e 63 6f 64 65 64 52 65 73 29 3b 0a 20 20 20 20  ncodedRes);.    
0b20: 20 20 20 20 2f 2f 4f 53 2e 46 69 6c 65 2e 77 72      //OS.File.wr
0b30: 69 74 65 41 74 6f 6d 69 63 28 74 68 69 73 2e 63  iteAtomic(this.c
0b40: 72 65 61 74 65 50 61 74 68 46 69 6c 65 4e 61 6d  reatePathFileNam
0b50: 65 28 73 46 69 6c 65 6e 61 6d 65 29 2c 20 78 45  e(sFilename), xE
0b60: 6e 63 6f 64 65 64 52 65 73 2c 20 7b 74 6d 70 50  ncodedRes, {tmpP
0b70: 61 74 68 3a 20 22 66 69 6c 65 2e 74 78 74 2e 74  ath: "file.txt.t
0b80: 6d 70 22 7d 29 3b 20 2f 2f 20 65 72 72 6f 72 20  mp"}); // error 
0b90: 77 69 74 68 20 61 20 74 65 6d 70 6f 72 61 72 79  with a temporary
0ba0: 20 66 69 6c 65 20 28 63 61 6e e2 80 99 74 20 6d   file (can...t m
0bb0: 6f 76 65 20 69 74 29 0a 20 20 20 20 7d 2c 0a 0a  ove it).    },..
0bc0: 20 20 20 20 64 65 6c 65 74 65 46 69 6c 65 3a 20      deleteFile: 
0bd0: 66 75 6e 63 74 69 6f 6e 20 28 73 46 69 6c 65 6e  function (sFilen
0be0: 61 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69  ame) {.        i
0bf0: 66 20 28 21 74 68 69 73 2e 78 44 61 74 61 46 6f  f (!this.xDataFo
0c00: 6c 64 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20  lder) {.        
0c10: 20 20 20 20 74 68 69 73 2e 70 72 65 70 61 72 65      this.prepare
0c20: 44 61 74 61 46 6f 6c 64 65 72 28 29 3b 0a 20 20  DataFolder();.  
0c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0c40: 4f 53 2e 46 69 6c 65 2e 72 65 6d 6f 76 65 28 74  OS.File.remove(t
0c50: 68 69 73 2e 63 72 65 61 74 65 50 61 74 68 46 69  his.createPathFi
0c60: 6c 65 4e 61 6d 65 28 73 46 69 6c 65 6e 61 6d 65  leName(sFilename
0c70: 29 2c 20 7b 69 67 6e 6f 72 65 41 62 73 65 6e 74  ), {ignoreAbsent
0c80: 3a 20 74 72 75 65 7d 29 3b 0a 20 20 20 20 7d 2c  : true});.    },
0c90: 0a 0a 20 20 20 20 73 61 76 65 41 73 3a 20 66 75  ..    saveAs: fu
0ca0: 6e 63 74 69 6f 6e 20 28 73 44 61 74 61 29 20 7b  nction (sData) {
0cb0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 73 61 76 65  .        // save
0cc0: 20 61 6e 79 77 68 65 72 65 20 77 69 74 68 20 66   anywhere with f
0cd0: 69 6c 65 20 70 69 63 6b 65 72 0a 20 20 20 20 20  ile picker.     
0ce0: 20 20 20 6c 65 74 20 78 46 69 6c 65 50 69 63 6b     let xFilePick
0cf0: 65 72 20 3d 20 43 63 5b 22 40 6d 6f 7a 69 6c 6c  er = Cc["@mozill
0d00: 61 2e 6f 72 67 2f 66 69 6c 65 70 69 63 6b 65 72  a.org/filepicker
0d10: 3b 31 22 5d 2e 63 72 65 61 74 65 49 6e 73 74 61  ;1"].createInsta
0d20: 6e 63 65 28 43 69 2e 6e 73 49 46 69 6c 65 50 69  nce(Ci.nsIFilePi
0d30: 63 6b 65 72 29 3b 0a 20 20 20 20 20 20 20 20 78  cker);.        x
0d40: 46 69 6c 65 50 69 63 6b 65 72 2e 69 6e 69 74 28  FilePicker.init(
0d50: 77 69 6e 64 6f 77 2c 20 22 45 6e 72 65 67 69 73  window, "Enregis
0d60: 74 72 65 72 20 73 6f 75 73 22 2c 20 43 69 2e 6e  trer sous", Ci.n
0d70: 73 49 46 69 6c 65 50 69 63 6b 65 72 2e 6d 6f 64  sIFilePicker.mod
0d80: 65 53 61 76 65 29 3b 0a 20 20 20 20 20 20 20 20  eSave);.        
0d90: 78 46 69 6c 65 50 69 63 6b 65 72 2e 61 70 70 65  xFilePicker.appe
0da0: 6e 64 46 69 6c 74 65 72 73 28 43 69 2e 6e 73 49  ndFilters(Ci.nsI
0db0: 46 69 6c 65 50 69 63 6b 65 72 2e 66 69 6c 74 65  FilePicker.filte
0dc0: 72 41 6c 6c 20 7c 20 43 69 2e 6e 73 49 46 69 6c  rAll | Ci.nsIFil
0dd0: 65 50 69 63 6b 65 72 2e 66 69 6c 74 65 72 54 65  ePicker.filterTe
0de0: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 78 46 69  xt);.        xFi
0df0: 6c 65 50 69 63 6b 65 72 2e 6f 70 65 6e 28 66 75  lePicker.open(fu
0e00: 6e 63 74 69 6f 6e 20 28 6e 52 65 74 75 72 6e 56  nction (nReturnV
0e10: 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20  alue) {.        
0e20: 20 20 20 20 69 66 20 28 6e 52 65 74 75 72 6e 56      if (nReturnV
0e30: 61 6c 75 65 20 3d 3d 20 43 69 2e 6e 73 49 46 69  alue == Ci.nsIFi
0e40: 6c 65 50 69 63 6b 65 72 2e 72 65 74 75 72 6e 4f  lePicker.returnO
0e50: 4b 20 7c 7c 20 6e 52 65 74 75 72 6e 56 61 6c 75  K || nReturnValu
0e60: 65 20 3d 3d 20 43 69 2e 6e 73 49 46 69 6c 65 50  e == Ci.nsIFileP
0e70: 69 63 6b 65 72 2e 72 65 74 75 72 6e 52 65 70 6c  icker.returnRepl
0e80: 61 63 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ace) {.         
0e90: 20 20 20 20 20 20 20 6c 65 74 20 78 45 6e 63 6f         let xEnco
0ea0: 64 65 72 20 3d 20 6e 65 77 20 54 65 78 74 45 6e  der = new TextEn
0eb0: 63 6f 64 65 72 28 29 3b 0a 20 20 20 20 20 20 20  coder();.       
0ec0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 78 45 6e           let xEn
0ed0: 63 6f 64 65 64 52 65 73 20 3d 20 78 45 6e 63 6f  codedRes = xEnco
0ee0: 64 65 72 2e 65 6e 63 6f 64 65 28 73 44 61 74 61  der.encode(sData
0ef0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0f00: 20 20 20 4f 53 2e 46 69 6c 65 2e 77 72 69 74 65     OS.File.write
0f10: 41 74 6f 6d 69 63 28 78 46 69 6c 65 50 69 63 6b  Atomic(xFilePick
0f20: 65 72 2e 66 69 6c 65 2e 70 61 74 68 2c 20 78 45  er.file.path, xE
0f30: 6e 63 6f 64 65 64 52 65 73 2c 20 7b 74 6d 70 50  ncodedRes, {tmpP
0f40: 61 74 68 3a 20 22 66 69 6c 65 2e 74 78 74 2e 74  ath: "file.txt.t
0f50: 6d 70 22 7d 29 3b 0a 20 20 20 20 20 20 20 20 20  mp"});.         
0f60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 29 3b     }.        });
0f70: 0a 20 20 20 20 7d 0a 7d 0a                       .    }.}.