]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | * A base provider for communicating using JSON. This is an abstract class\r | |
3 | * and should not be instanced directly.\r | |
4 | *\r | |
5 | * @abstract\r | |
6 | */\r | |
7 | \r | |
8 | Ext.define('Ext.direct.JsonProvider', {\r | |
9 | extend: 'Ext.direct.Provider',\r | |
10 | alias: 'direct.jsonprovider',\r | |
11 | \r | |
12 | uses: [\r | |
13 | 'Ext.direct.ExceptionEvent',\r | |
14 | 'Ext.direct.Manager'\r | |
15 | ],\r | |
16 | \r | |
17 | /**\r | |
18 | * Parse the JSON response\r | |
19 | * @private\r | |
20 | *\r | |
21 | * @param {Object} response The XHR response object\r | |
22 | *\r | |
23 | * @return {Object} The data in the response.\r | |
24 | */\r | |
25 | parseResponse: function(response) {\r | |
26 | var text = response && response.responseText;\r | |
27 | \r | |
28 | if (text) {\r | |
29 | if (Ext.isObject(text) || Ext.isArray(text)) {\r | |
30 | return text;\r | |
31 | }\r | |
32 | \r | |
33 | return Ext.decode(text);\r | |
34 | }\r | |
35 | \r | |
36 | return null;\r | |
37 | },\r | |
38 | \r | |
39 | /**\r | |
40 | * Creates a set of events based on the XHR response\r | |
41 | *\r | |
42 | * @param {Object} response The XHR response\r | |
43 | *\r | |
44 | * @return {Ext.direct.Event[]} An array of Ext.direct.Event\r | |
45 | */\r | |
46 | createEvents: function(response) {\r | |
47 | var me = this,\r | |
48 | data = null,\r | |
49 | events = [],\r | |
50 | event, i, len;\r | |
51 | \r | |
52 | try {\r | |
53 | data = me.parseResponse(response);\r | |
54 | }\r | |
55 | catch (e) {\r | |
56 | event = new Ext.direct.ExceptionEvent({\r | |
57 | data: e,\r | |
58 | xhr: response,\r | |
59 | code: Ext.direct.Manager.exceptions.PARSE,\r | |
60 | message: 'Error parsing json response: \n\n ' + e\r | |
61 | });\r | |
62 | \r | |
63 | return [event];\r | |
64 | }\r | |
65 | \r | |
66 | if (Ext.isArray(data)) {\r | |
67 | for (i = 0, len = data.length; i < len; ++i) {\r | |
68 | events.push(me.createEvent(data[i]));\r | |
69 | }\r | |
70 | }\r | |
71 | else if (Ext.isObject(data)) {\r | |
72 | events.push(me.createEvent(data));\r | |
73 | }\r | |
74 | \r | |
75 | return events;\r | |
76 | },\r | |
77 | \r | |
78 | /**\r | |
79 | * Create an event from a response object\r | |
80 | *\r | |
81 | * @param {Object} response Response object\r | |
82 | *\r | |
83 | * @return {Ext.direct.Event} The event\r | |
84 | */\r | |
85 | createEvent: function(response) {\r | |
86 | if (typeof response !== 'object'|| !('type' in response)) {\r | |
87 | return new Ext.direct.ExceptionEvent({\r | |
88 | data: response,\r | |
89 | code: Ext.direct.Manager.exceptions.DATA,\r | |
90 | message: 'Invalid data: event type is not specified'\r | |
91 | });\r | |
92 | }\r | |
93 | \r | |
94 | return Ext.create('direct.' + response.type, response);\r | |
95 | }\r | |
96 | }); |