/src/name/carter/mark/flex/util/remote/xmlrpc/XMLRPCClient.as

http://transcriptstudio4isha.googlecode.com/ · ActionScript · 93 lines · 75 code · 11 blank · 7 comment · 7 complexity · bf28fd19405dae8d94dca2b07cadff91 MD5 · raw file

  1. package name.carter.mark.flex.util.remote.xmlrpc
  2. {
  3. import flash.net.URLRequestHeader;
  4. import flash.net.URLRequestMethod;
  5. import flash.utils.getTimer;
  6. import mx.rpc.events.FaultEvent;
  7. import mx.rpc.events.ResultEvent;
  8. import mx.rpc.http.HTTPService;
  9. public class XMLRPCClient {
  10. private var url:String;
  11. private var authHeader:URLRequestHeader;
  12. public function XMLRPCClient(dbURL:String, authHeader:URLRequestHeader = null) {
  13. this.url = dbURL + "/xmlrpc";
  14. this.authHeader = authHeader;
  15. }
  16. /**
  17. * @param successFunc Takes the form successFunc(response:Object):void
  18. * @param failureFunc Takes the form failureFunc(msg:String):void
  19. */
  20. public function call(methodCallXML:XML, successFunc:Function, failureFunc:Function):void {
  21. var callStartTime:int = getTimer();
  22. trace("Calling XML-RPC method: " + condense(methodCallXML.toXMLString()));
  23. var httpService:HTTPService = new HTTPService();
  24. httpService.method = URLRequestMethod.POST;
  25. httpService.url = url;
  26. httpService.contentType = HTTPService.CONTENT_TYPE_XML;
  27. httpService.resultFormat = HTTPService.RESULT_FORMAT_TEXT;
  28. if (authHeader != null) {
  29. httpService.headers = new Object();
  30. httpService.headers[authHeader.name] = authHeader.value;
  31. }
  32. //httpService.requestTimeout = 5;
  33. httpService.addEventListener(ResultEvent.RESULT, function(evt:ResultEvent):void {
  34. trace("XML-RPC took " + (getTimer() - callStartTime) + "ms");
  35. var responseXML:XML;
  36. try {
  37. responseXML = new XML(evt.result);
  38. }
  39. catch (e:TypeError) {
  40. failureFunc("Response from XML-RPC is not valid XML: " + evt.result);
  41. return;
  42. }
  43. var parser:ResponseParser = new ResponseParser();
  44. if (responseXML.fault.length() > 0)
  45. {
  46. var parsedFault:Object = parser.parse(responseXML.fault.value.*[0]);
  47. failureFunc(parsedFault.faultCode + ": " + parsedFault.faultString);
  48. }
  49. else if (responseXML.params.length() > 0)
  50. {
  51. var parsedResponse:Object = parser.parse(responseXML.params.param.value[0]);
  52. successFunc(parsedResponse);
  53. //successFunc(new XML("<result>" + evt.result + "</result>"));
  54. }
  55. else
  56. {
  57. failureFunc("Response to XML-RPC includes neither params nor fault");
  58. }
  59. });
  60. httpService.addEventListener(FaultEvent.FAULT, function (evt:FaultEvent):void {
  61. failureFunc("XML-RPC failed because: " + evt.fault.faultString);
  62. });
  63. httpService.send(methodCallXML);
  64. }
  65. private static function condense(xmlString:String):String {
  66. var regexp:RegExp = />([^<]{401,})</gs; // more than 200 chars from open to close tag
  67. var result:String = "";
  68. var index:int = 0;
  69. var arr:Array = regexp.exec(xmlString);
  70. while (arr != null) {
  71. result += xmlString.substring(index, arr.index + 1);
  72. result += "\n" + xmlString.substring(arr.index + 1, arr.index + 200);
  73. result += "\n...<skipped>...\n";
  74. result += xmlString.substring(regexp.lastIndex - 200, regexp.lastIndex - 1) + "\n";
  75. index = regexp.lastIndex - 1;
  76. arr = regexp.exec(xmlString);
  77. }
  78. // add the rest of the string
  79. return result += xmlString.substring(index);
  80. }
  81. }
  82. }