Author: damoxc

Revision: 5117

Log:
        rewrite the rpcclient using ext

Diff:
Added: trunk/deluge/ui/web/js/Deluge.Client.js
===================================================================
--- trunk/deluge/ui/web/js/Deluge.Client.js                             (rev 0)
+++ trunk/deluge/ui/web/js/Deluge.Client.js     2009-04-21 17:27:55 UTC (rev 
5117)
@@ -0,0 +1,158 @@
+/*
+Script: Deluge.Client.js
+    A JSON-RPC proxy built on top of ext-core.
+
+Copyright:
+    (C) Damien Churchill 2009 <[email protected]>
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, write to:
+        The Free Software Foundation, Inc.,
+        51 Franklin Street, Fifth Floor
+        Boston, MA  02110-1301, USA.
+*/
+
+Ext.namespace('Ext.ux.util');
+(function() {
+    Ext.ux.util.RpcClient = Ext.extend(Ext.util.Observable, {
+
+        _methods: [],
+        
+        _requests: {},
+        
+        _url: null,
+        
+        _optionKeys: ['scope', 'success', 'failure'],
+        
+        constructor: function(config) {
+            Ext.ux.util.RpcClient.superclass.constructor.call(this, config);
+            this._url = config.url || null;
+            this._id = 0;
+            
+            this.addEvents(
+                // raw events
+                /**
+                 * @event ready
+                 * Fires when the client has retrieved the list of methods 
from the server.
+                 * @param {Ext.ux.util.RpcClient} this
+                 */
+                 'ready'
+            );
+            
+            this._execute('system.listMethods', {
+                success: this._setMethods,
+                scope: this
+            });
+        },
+    
+        _execute: function(method, options) {
+            options = options || {};
+            options.params = options.params || [];
+            options.id = this._id;
+            
+            var request = Ext.encode({
+                method: method,
+                params: options.params,
+                id: options.id
+            });
+            this._id++;
+            
+            return Ext.Ajax.request({
+                url: this._url,
+                method: 'POST',
+                success: this._onSuccess,
+                failure: this._onFailure,
+                scope: this,
+                jsonData: request,
+                options: options
+            });
+        },
+        
+        _onFailure: function(response, options) {
+            if (response.status == 500) {
+                //error
+            }
+            errorObj = {
+                id: options.options.id
+            }
+            alert(Ext.encode(errorObj));
+        },
+        
+        _onSuccess: function(response, requestOptions) {
+            var responseObj = Ext.decode(response.responseText);
+            var options = requestOptions.options;
+            if (responseObj.error) {
+                if (!options.failure) return;
+                if (options.scope) {
+                    options.failure.call(options.scope, responseObj.error, 
responseObj, response);
+                } else {
+                    options.failure(responseObj.error, responseObj, response);
+                }
+            } else {
+                if (!options.success) return;
+                if (options.scope) {
+                    options.success.call(options.scope, responseObj.result, 
responseObj, response);
+                } else {
+                    options.success(responseObj.result, responseObj, response);
+                }
+            }
+        },
+        
+        _parseArgs: function(args) {
+            var params = [];
+            Ext.each(args, function(arg) {
+                params.push(arg);
+            });
+            
+            var options = params[params.length - 1];
+            if (Ext.type(options) == 'object') {
+                var keys = Ext.keys(options), isOption = false;
+                
+                Ext.each(this._optionKeys, function(key) {
+                    if (keys.indexOf(key) > -1) isOption = true;
+                });
+                
+                if (isOption) {
+                    params.remove(options)
+                } else {
+                    options = {}
+                }
+            } else {
+                options = {}
+            }
+            options.params = params;
+            return options;
+        },
+    
+        _setMethods: function(methods) {
+            var components = {}, self = this;
+            
+            Ext.each(methods, function(method) {
+                var parts = method.split('.');
+                var component = components[parts[0]] || {};
+                
+                var fn = function() {
+                    var options = self._parseArgs(arguments);
+                    return self._execute(method, options);
+                }
+                component[parts[1]] = fn;
+                components[parts[0]] = component;
+            });
+            
+            for (var name in components) {
+                self[name] = components[name];
+            }
+            
+            this.fireEvent('ready', this);
+        }
+    });
+})();



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"deluge-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/deluge-commit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to