import { Injectable } from "@angular/core"; import { Http, Response, Headers, RequestOptions } from "@angular/http"; import { Observable } from "rxjs"; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/catch'; import 'rxjs/add/observable/throw' import { XmlRpcHelper } from "./xmlrpc-helper"; import { JsToXml } from "./js-to-xml"; import { Xml2Js } from "./xml-to-js"; @Injectable() export class XmlRpc { configuration: { host: string, pathName: string } constructor( private http: Http, private helper: XmlRpcHelper, private jsToXml: JsToXml, private xmlToJs: Xml2Js ) { } /** * */ serialize(xml: any): any { let text = xml.xml; if (text) { return text; } if (typeof XMLSerializer != undefined) { return new XMLSerializer().serializeToString(xml); } throw new Error('Your browser does not support serializing XML documents'); } /** * */ createCall(method: any, params: any): any { var doc = this.helper.createDocument('methodCall'); doc.firstChild.appendChild(this.helper.createNode(doc, 'methodName', method)); if (arguments.length > 2) { params = this.helper.cloneArray(arguments); params.shift(); } if (params && params.length > 0) { let paramsNode = this.helper.createNode(doc, params); for (let i = 0; i < params.length; i++) { paramsNode.appendChild(this.helper.createNode(doc, 'param', this.jsToXml.jsToXml(doc, params[i]))); } doc.firstChild.appendChild(paramsNode); } return (this.serialize(doc)).replace(/[\s\xa0]+$/, ''); } /** * */ callMethod(method: any, params: any): Observable { let xmlStr = this.createCall(method, params); let targetUrl = this.configuration.host + "" + this.configuration.pathName; let headers = new Headers({ 'Content-Type': 'text/xml' }); let options = new RequestOptions({ headers: headers }); return this.http.post(targetUrl, xmlStr, options).map(this.extractData); } /** * */ private extractData(response: Response): any { console.log(response); return response; } /** * */ private handleError(error: any): any { return Observable.throw(error); } /** * */ parseResponse(response: any): any { let doc = this.helper.loadXml(response); let rootNode = doc.firstChild; if (!rootNode) { return undefined; } var node = this.helper.selectSingleNode(rootNode, "//fault"); let isFault = (node != undefined); node = this.helper.selectSingleNode(rootNode, '//value'); var value = this.xmlToJs.xmlToJs(node); if (isFault) { throw value; } return value; } /** * */ configure(hostName: string, pathName: string): void { this.configuration.host = hostName; this.configuration.pathName = pathName; } }