/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";

const { Cc, Ci, Cu } = require("chrome");

const system = require("sdk/system");
const file = require("sdk/io/file");
const unload = require("sdk/system/unload");

// Retrieve the path to the OS temporary directory:
const tmpDir = require("sdk/system").pathFor("TmpD");

const { Services } = Cu.import("resource://gre/modules/Services.jsm");

// List of all tmp file created
let files = [];

// Remove all tmp files on addon disabling
unload.when(function () {
  files.forEach(function (path){
    // Catch exception in order to avoid leaking following files
    try {
      if (file.exists(path))
        file.remove(path);
    }
    catch(e) {
      console.exception(e);
    }
  });
});

// Utility function that synchronously reads local resource from the given
// `uri` and returns content string. Read in binary mode.
function readBinaryURI(uri) {
  let ioservice = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  let channel = ioservice.newChannel2(uri,
                                      "UTF-8",
                                      null,
                                      null,      // aLoadingNode
                                      Services.scriptSecurityManager.getSystemPrincipal(),
                                      null,      // aTriggeringPrincipal
                                      Ci.nsILoadInfo.SEC_NORMAL,
                                      Ci.nsIContentPolicy.TYPE_OTHER);
  let stream = Cc["@mozilla.org/binaryinputstream;1"].
               createInstance(Ci.nsIBinaryInputStream);
  stream.setInputStream(channel.open());

  let data = "";
  while (true) {
    let available = stream.available();
    if (available <= 0)
      break;
    data += stream.readBytes(available);
  }
  stream.close();

  return data;
}

// Create a temporary file from a given string and returns its path
exports.createFromString = function createFromString(data, tmpName) {  
  let filename = (tmpName ? tmpName : "tmp-file") + "-" + (new Date().getTime());
  let path = file.join(tmpDir, filename);

  let tmpFile = file.open(path, "wb");
  tmpFile.write(data);
  tmpFile.close();

  // Register tmp file path
  files.push(path);

  return path;
}

// Create a temporary file from a given URL and returns its path
exports.createFromURL = function createFromURL(url, tmpName) {
  let data = readBinaryURI(url);
  return exports.createFromString(data, tmpName);
}

