aboutsummaryrefslogblamecommitdiffstats
path: root/lib/xmlrpc.js
blob: 54dcd72ba0525a451066e061cc00dac313babace (plain) (tree)
1
2
3
4
5
6
7
8
9
                           
             
                                                                 
                                                     
  
  

                                                                           
  
                                                           

  


                                                                               
  

   

                                       
  

                  
                                       
  



                                                                              

                                                 
  

                            
                                                      
  



                                                                        
             

   



                     
   

           
 

                                                                   
                                            


                                           


                                               

                                                  


                   

                                                                   


                                                   
  
 
                                                             
                                          

  
                                                          


                                 

  
                                                       


                           

  
                                          
 
                           
 

                                    
 



                                                     
 
                             
                                      
                       


                                                       



                         
 
                        

  
                                                  




















                                 
     


              

  
                                                           

                                                        

  
                                                       


                                               

  
                                                    



                                 

  
                                                     
                              



                                                             


                             

  
                                                      
                         
                        

                                      


                                                             



                         

  
                                                            


















                                      
  
/* global exports: false */
"use strict";
// Modification of Matěj Cepl released under the MIT/X11 license
// http://www.opensource.org/licenses/mit-license.php
/*
 *
 * xmlrpc.js beta version 1 Tool for creating XML-RPC formatted requests in
 * JavaScript
 *
 * Copyright 2001 Scott Andrew LePera scott@scottandrew.com
 *
 *
 * License: You are granted the right to use and/or redistribute this code only
 * if this license and the copyright notice are included and you accept that no
 * warranty of any kind is made or implied by the author.
 *
 */

/**
 * checks whether parameter is an array
 *
 * @param obj
 *          Object
 * @return Boolean true if obj is array
 *
 * The problem is that in different contexts, Array is not same, and so obj is
 * not an instance of SAME Array.
 */

/**
 * pads a single number with a leading zero. Heh.
 *
 * @param n
 *          String or Number
 * @return String with leading zero added if necessary
 *
 * If the real parameter is not numerical, it is just returned as it is.
 */
var leadingZero = exports.leadingZero = function leadingZero(n) {
  if (isNaN(Number(n))) {
    return n;
  }
  ;

  var s = "0" + n;
  if (s.length > 2) {
    s = s.slice(1);
  }
  return s;
};

var dateToISO8601 = exports.dateToISO8601 = function dateToISO8601(
    date) {
  // wow I hate working with the Date object
  var year = date.getYear();
  var month = leadingZero(date.getMonth());
  var day = leadingZero(date.getDate());
  var time = leadingZero(date.getHours()) + ":"
      + leadingZero(date.getMinutes()) + ":"
      + leadingZero(date.getSeconds());

  var converted = year + month + day + "T" + time;
  return converted;
};

var XMLRPCMessage = exports.XMLRPCMessage = function XMLRPCMessage(
    methodname) {
  this.method = methodname || "system.listMethods";
  this.params = [];
  return this;
};

XMLRPCMessage.prototype.myIsArray = function myIsArray(obj) {
  return (typeof obj.sort === 'function');
};

XMLRPCMessage.prototype.setMethod = function(methodName) {
  if (methodName !== undefined) {
    this.method = methodName;
  }
};

XMLRPCMessage.prototype.addParameter = function(data) {
  if (data !== undefined) {
    this.params.push(data);
  }
};

XMLRPCMessage.prototype.xml = function() {

  var method = this.method;

  // assemble the XML message header
  var xml = "";

  xml += "<?xml version=\"1.0\"?>\n";
  xml += "<methodCall>\n";
  xml += "<methodName>" + method + "</methodName>\n";
  xml += "<params>\n";

  // do individual parameters
  this.params.forEach(function(data) {
    xml += "<param>\n";
    xml += "<value>"
        + this.getParamXML(this.dataTypeOf(data), data)
        + "</value>\n";
    xml += "</param>\n";
  }, this);
  xml += "</params>\n";
  xml += "</methodCall>";

  return xml; // for now
};

XMLRPCMessage.prototype.dataTypeOf = function(o) {
  // identifies the data type
  var type = typeof (o);
  type = type.toLowerCase();
  switch (type) {
  case "number":
    if (Math.round(o) === o) {
      type = "i4";
    }
    else {
      type = "double";
    }
    break;
  case "object":
    if ((o instanceof Date)) {
      type = "date";
    }
    else if (this.myIsArray(o)) {
      type = "array";
    }
    else {
      type = "struct";
    }
    break;
  }
  return type;
};

XMLRPCMessage.prototype.doValueXML = function(type, data) {
  var xml = "<" + type + ">" + data + "</" + type + ">";
  return xml;
};

XMLRPCMessage.prototype.doBooleanXML = function(data) {
  var value = (data === true) ? 1 : 0;
  var xml = "<boolean>" + value + "</boolean>";
  return xml;
};

XMLRPCMessage.prototype.doDateXML = function(data) {
  var xml = "<dateTime.iso8601>";
  xml += dateToISO8601(data);
  xml += "</dateTime.iso8601>";
  return xml;
};

XMLRPCMessage.prototype.doArrayXML = function(data) {
  var xml = "<array><data>\n";
  for ( var i = 0; i < data.length; i++) {
    xml += "<value>"
        + this.getParamXML(this.dataTypeOf(data[i]), data[i])
        + "</value>\n";
  }
  xml += "</data></array>\n";
  return xml;
};

XMLRPCMessage.prototype.doStructXML = function(data) {
  var xml = "<struct>\n";
  for ( var i in data) {
    xml += "<member>\n";
    xml += "<name>" + i + "</name>\n";
    xml += "<value>"
        + this.getParamXML(this.dataTypeOf(data[i]), data[i])
        + "</value>\n";
    xml += "</member>\n";
  }
  xml += "</struct>\n";
  return xml;
};

XMLRPCMessage.prototype.getParamXML = function(type, data) {
  var xml;
  switch (type) {
  case "date":
    xml = this.doDateXML(data);
    break;
  case "array":
    xml = this.doArrayXML(data);
    break;
  case "struct":
    xml = this.doStructXML(data);
    break;
  case "boolean":
    xml = this.doBooleanXML(data);
    break;
  default:
    xml = this.doValueXML(type, data);
    break;
  }
  return xml;
};