view components/nttMultipartFormData.js @ 0:dada0ac40a8f

initial import
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Tue, 02 Dec 2008 20:31:01 +0900
parents
children
line wrap: on
line source

const Ci = Components.interfaces;
const Cc = Components.classes;
const Cr = Components.results;

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

function NTT_MakeStream(data)
{
  var stream = Cc["@mozilla.org/io/string-input-stream;1"]
                 .createInstance(Ci.nsIStringInputStream);
  stream.setData(data, data.length);
  return stream;
}

const keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function NTT_decode64(input)
{
  var output = "";
  var chr1, chr2, chr3;
  var enc1, enc2, enc3, enc4;
  var i = 0;

  // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

  do
  {
    enc1 = keyStr.indexOf(input.charAt(i++));
    enc2 = keyStr.indexOf(input.charAt(i++));
    enc3 = keyStr.indexOf(input.charAt(i++));
    enc4 = keyStr.indexOf(input.charAt(i++));

    chr1 = (enc1 << 2) | (enc2 >> 4);
    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
    chr3 = ((enc3 & 3) << 6) | enc4;

    output = output + String.fromCharCode(chr1);

    if (enc3 != 64)
    {
      output = output + String.fromCharCode(chr2);
    }
    if (enc4 != 64)
    {
      output = output + String.fromCharCode(chr3);
    }
  }
  while (i < input.length);

  return output;
}

function MultipartFormData()
{
  this.boundary = "hsdluicmwos";
  this.controls = [];
  this.files = [];
  this.postdata = "";
}

MultipartFormData.prototype = {

boundary: null,
controls: null,
files: null,
length: null,
postdata: null,

getPostData: function()
{
  if (this.postdata)
    return this.postdata;
  
  var data = "";
  
  for (var name in this.controls)
  {
    data+="\r\n--"+this.boundary+"\r\n";
    data+="Content-Disposition: form-data; name=\""+name+"\"\r\n\r\n";
    data+=this.controls[name];
  }
  
  for (var name in this.files)
  {
    var filedata = this.files[name];
    data+="\r\n--"+this.boundary+"\r\n";
    data+="Content-Disposition: form-data; name=\""+name+"\"; filename=\""+filedata.filename+"\"\r\n";
    data+="Content-Type: "+filedata.contenttype+"\r\n";
    if (filedata.source)
    {
      data+="Content-Transfer-Encoding: base64\r\n\r\n";
      
      var fis = Cc["@mozilla.org/network/file-input-stream;1"]
                  .createInstance(Ci.nsIFileInputStream);
      fis.init(filedata.source, 1, 384, Ci.nsIFileInputStream.CLOSE_ON_EOF);
      
      var bis = Cc["@mozilla.org/binaryinputstream;1"]
                  .createInstance(Ci.nsIBinaryInputStream);
      bis.setInputStream(fis);
      
      //TODO this isnt needed as yet
    }
    else
    {
      data+="Content-Transfer-Encoding: binary\r\n\r\n";
      if (filedata.encoding == "base64")
      {
        data+=NTT_decode64(filedata.data);
      }
      else if (filedata.encoding == "binary")
      {
        data+=filedata.data;
      }
    }
  }
  data+="\r\n--"+this.boundary+"--\r\n";

  this.length = data.length-2;
  this.postdata = data;
  
  return data;
},
  
getPostDataStream: function()
{
  return NTT_MakeStream(this.getPostData());
},
  
getHeaders: function()
{
  if (!this.length)
    this.getPostData();
  
  var headers = "";
  headers+="Content-Type: "+this.getContentType()+"\r\n";
  headers+="Content-Length: "+this.length+"\r\n";
  return headers;
},
  
getHeaderStream: function()
{
  return NTT_MakeStream(this.getHeaders());
},
  
getContentType: function()
{
  return "multipart/form-data; boundary=\""+this.boundary+"\"";
},
  
addControl: function(name, value)
{
  this.controls[name]=value;
  this.postdata = null;
  this.length = null;
},
  
addFile: function(name, contenttype, file)
{
  throw Components.results.NS_NOT_IMPLEMENTED;
  var filedata = {
    filename: file.leafName,
    contenttype: contenttype,
    source: file
  };
  this.files[name] = filedata;
  this.postdata = null;
  this.length = null;
},
  
addFileData: function(name, filename, contenttype, encoding, data)
{
  var filedata = {
    filename: filename,
    contenttype: contenttype,
    encoding: encoding,
    data: data
  };
  this.files[name] = filedata;
  this.postdata = null;
  this.length = null;
},

classDescription: "Nightly Tester Multipart Form Data",
contractID: "@blueprintit.co.uk/multipartformdata;1",
classID: Components.ID("{46c8b0c6-216c-41e8-ace2-03d61783e278}"),
QueryInterface: XPCOMUtils.generateQI([Ci.nttIMultipartFormData])
}

function NSGetModule(compMgr, fileSpec)
  XPCOMUtils.generateModule([MultipartFormData]);