PageRenderTime 32ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/library/JSONService.py

http://pyjamas.googlecode.com/
Python | 110 lines | 84 code | 16 blank | 10 comment | 9 complexity | 80fa5ca27657123f9ca0b8f9c1c2cfc4 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0
  1. from HTTPRequest import HTTPRequest
  2. import pygwt
  3. from JSONParser import JSONParser
  4. # no stream support
  5. class JSONService:
  6. def __init__(self, url, handler = None):
  7. """
  8. Create a JSON remote service object. The url is the URL that will receive
  9. POST data with the JSON request. See the JSON-RPC spec for more information.
  10. The handler object should implement onRemoteResponse(value, requestInfo) to
  11. accept the return value of the remote method, and
  12. onRemoteError(code, message, requestInfo) to handle errors.
  13. """
  14. self.parser = JSONParser()
  15. self.url = url
  16. self.handler = handler
  17. def callMethod(self, method, params, handler = None):
  18. if handler == None:
  19. handler = self.handler
  20. if handler == None:
  21. return self.__sendNotify(method, params)
  22. else:
  23. return self.__sendRequest(method, params, handler)
  24. def onCompletion(self):
  25. pass
  26. def __sendNotify(self, method, params):
  27. msg = {"id":None, "method":method, "params":params}
  28. msg_data = self.parser.encode(msg)
  29. if not HTTPRequest().asyncPost(self.url, msg_data, self):
  30. return -1
  31. return 1
  32. def __sendRequest(self, method, params, handler):
  33. id = pygwt.getNextHashId()
  34. msg = {"id":id, "method":method, "params":params}
  35. msg_data = self.parser.encode(msg)
  36. request_info = JSONRequestInfo(id, method, handler)
  37. if not HTTPRequest().asyncPost(self.url, msg_data, JSONResponseTextHandler(request_info)):
  38. return -1
  39. return id
  40. class JSONRequestInfo:
  41. def __init__(self, id, method, handler):
  42. self.id = id
  43. self.method = method
  44. self.handler = handler
  45. class JSONResponseTextHandler:
  46. def __init__(self, request):
  47. self.request = request
  48. def onCompletion(self, json_str):
  49. response=JSONParser().decodeAsObject(json_str)
  50. if not response:
  51. self.request.handler.onRemoteError(0, "Server Error or Invalid Response", self.request)
  52. elif response["error"]:
  53. error = response["error"]
  54. self.request.handler.onRemoteError(error["code"], error["message"], self.request)
  55. else:
  56. self.request.handler.onRemoteResponse(response["result"], self.request)
  57. def onError(self, error_str, error_code):
  58. self.request.handler.onRemoteError(error_code, error_str, self.request)
  59. # reserved names: callMethod, onCompletion
  60. class JSONProxy(JSONService):
  61. def __init__(self, url, methods=None):
  62. JSONService.__init__(self, url)
  63. if methods:
  64. self.__registerMethods(methods)
  65. def __createMethod(self, method):
  66. JS("""
  67. return function() {
  68. var params = [];
  69. for (var n=0; n<arguments.length; n++) { params.push(arguments[n]); }
  70. if (params[params.length-1].onRemoteResponse) {
  71. var handler=params.pop();
  72. return this.__sendRequest(method, params, handler);
  73. }
  74. else {
  75. return this.__sendNotify(method, params);
  76. }
  77. };
  78. """)
  79. def __registerMethods(self, methods):
  80. JS("""
  81. methods=methods.l;
  82. for (var i in methods) {
  83. var method = methods[i];
  84. this[method]=this.__createMethod(method);
  85. }
  86. """)