jsc 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,75 @@
1
+ module JSCompiler
2
+ module Parser
3
+
4
+ class << self
5
+
6
+ # this methos calls the right parser for result
7
+ def parse(result)
8
+ return flymake_parser(result) if JSCompiler.format_type == "flymake"
9
+ default_parser(result)
10
+ end
11
+
12
+ # window_message_handlers.js:73: strict warning: trailing comma is not legal in ECMA-262 object initializers:
13
+ def flymake_parser(result)
14
+ if $debug
15
+ puts "#DEBUG flymake parser \n"
16
+ end
17
+
18
+ #TODO
19
+ out = ""
20
+ op = JSCompiler.op
21
+ unless result.nil?
22
+ file = JSCompiler.file
23
+ format_type = JSCompiler.format_type
24
+
25
+ num = result.size
26
+ result.each do |message|
27
+ out << "#{file}:#{message['lineno']}: #{op.singularize}: #{message['type']}: " + message[op.singularize] +"\n"
28
+ out << "#{file}:#{message['lineno']}: #{op.singularize}: #{message['line']} \n" unless message['line'].nil?
29
+ out << "#{file}:#{message['lineno']}: #{op.singularize}: " + print_under_character(message['charno'])
30
+ end
31
+ else
32
+ out = "No #{op}"
33
+ end
34
+ return out
35
+ end
36
+
37
+ def default_parser(result)
38
+ out = ""
39
+
40
+ if $debug
41
+ puts "#DEBUG default parser \n"
42
+ end
43
+
44
+ op = JSCompiler.op
45
+ unless result.nil?
46
+ num = result.size
47
+ out << "You've got #{result.size} #{op}\n"
48
+ i = 0
49
+ result.each do |message|
50
+ i += 1
51
+ out << "\n#{op.singularize.capitalize} n.#{i}\n"
52
+ out << "\t#{message['type']}: " + message[op.singularize] + " at line #{message['lineno']} character #{message['charno']}\n"
53
+ out << "\t" + message['line'] + "\n" unless message['line'].nil?
54
+ out << "\t" + print_under_character(message['charno'])
55
+ end
56
+ out
57
+ else
58
+ "No #{op}"
59
+ end
60
+ end
61
+
62
+ def print_under_character(pos)
63
+ i = 0
64
+ auto_fill = ""
65
+ while i < pos -1
66
+ auto_fill << "."
67
+ i = i+1
68
+ end
69
+
70
+ auto_fill << " ^ \n"
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -82,7 +82,7 @@ describe JSCompiler do
82
82
 
83
83
  describe 'compile code and get compiled code' do
84
84
  before do
85
- @resp = JSCompiler.compile(COMPILE_CODE, false, "compiled_code", "SIMPLE_OPTIMIZATIONS")
85
+ @resp = JSCompiler.compile(COMPILE_CODE, false, "compiled_code", "SIMPLE_OPTIMIZATIONS", "default")
86
86
  end
87
87
 
88
88
  it 'should receive the compiled code' do
@@ -92,7 +92,7 @@ describe JSCompiler do
92
92
 
93
93
  describe 'compile code and find errors' do
94
94
  before do
95
- @resp = JSCompiler.compile(ERROR_CODE, false, "errors", "SIMPLE_OPTIMIZATIONS")
95
+ @resp = JSCompiler.compile(ERROR_CODE, false, "errors", "SIMPLE_OPTIMIZATIONS", "default")
96
96
  end
97
97
 
98
98
  it 'should return the result string' do
@@ -102,7 +102,7 @@ describe JSCompiler do
102
102
 
103
103
  describe 'compile code and find warnings' do
104
104
  before do
105
- @resp = JSCompiler.compile(WARNING_CODE, false, "warnings", "SIMPLE_OPTIMIZATIONS")
105
+ @resp = JSCompiler.compile(WARNING_CODE, false, "warnings", "SIMPLE_OPTIMIZATIONS", "default")
106
106
  end
107
107
 
108
108
  it 'should return the result string' do
@@ -112,7 +112,7 @@ describe JSCompiler do
112
112
 
113
113
  describe 'compile code and obtain statistics' do
114
114
  before do
115
- @resp = JSCompiler.compile(COMPILE_CODE, false, "statistics", "SIMPLE_OPTIMIZATIONS")
115
+ @resp = JSCompiler.compile(COMPILE_CODE, false, "statistics", "SIMPLE_OPTIMIZATIONS", "")
116
116
  end
117
117
 
118
118
  it 'should return the result string' do
@@ -124,7 +124,7 @@ describe JSCompiler do
124
124
  describe 'FULL code compile' do
125
125
  describe 'without errors or warnings' do
126
126
  before do
127
- @resp = JSCompiler.full_compile(COMPILE_CODE, false, "SIMPLE_OPTIMIZATIONS")
127
+ @resp = JSCompiler.full_compile(COMPILE_CODE, false, "SIMPLE_OPTIMIZATIONS", "")
128
128
  end
129
129
 
130
130
  it 'should receive the compiled code' do
@@ -134,7 +134,7 @@ describe JSCompiler do
134
134
 
135
135
  describe 'and get errors' do
136
136
  before do
137
- @resp = JSCompiler.full_compile(ERROR_CODE, false, "SIMPLE_OPTIMIZATIONS")
137
+ @resp = JSCompiler.full_compile(ERROR_CODE, false, "SIMPLE_OPTIMIZATIONS", "")
138
138
  end
139
139
 
140
140
  it 'should return the result string' do
@@ -144,7 +144,7 @@ describe JSCompiler do
144
144
 
145
145
  describe 'and get warnings' do
146
146
  before do
147
- @resp = JSCompiler.full_compile(WARNING_CODE, false, "SIMPLE_OPTIMIZATIONS")
147
+ @resp = JSCompiler.full_compile(WARNING_CODE, false, "SIMPLE_OPTIMIZATIONS", "")
148
148
  end
149
149
 
150
150
  it 'should return the result string' do
metadata CHANGED
@@ -1,104 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 2
9
+ version: 0.2.2
5
10
  platform: ruby
6
11
  authors:
7
- - sub
12
+ - Davide Saurino
8
13
  autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-25 00:00:00 +01:00
13
- default_executable:
17
+ date: 2010-02-27 00:00:00 +01:00
18
+ default_executable: jsc
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
- name: bones
17
- type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
21
+ name: term-ansicolor
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
- - - ">="
25
+ - - "="
22
26
  - !ruby/object:Gem::Version
23
- version: 3.1.0
24
- version:
25
- description: Simple Ruby API to Google Closure Compiler Web service.
26
- email: fitzkarraldo@gmail.com
27
+ segments:
28
+ - 1
29
+ - 0
30
+ - 4
31
+ version: 1.0.4
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ description:
35
+ email: davide.saurino@gmail.com
27
36
  executables:
28
- - "#jsc#"
29
37
  - jsc
30
38
  extensions: []
31
39
 
32
40
  extra_rdoc_files:
33
- - History.txt
41
+ - LICENSE
34
42
  - README.rdoc
35
- - bin/#jsc#
36
- - bin/jsc
37
43
  files:
44
+ - .bnsignore
38
45
  - .gitignore
39
46
  - History.txt
47
+ - LICENSE
40
48
  - README.rdoc
41
49
  - Rakefile
42
50
  - TODO.org
43
- - bin/#jsc#
51
+ - VERSION
44
52
  - bin/jsc
53
+ - features/run_command.feature
54
+ - features/support/env.rb
45
55
  - js/compiled_code.js
46
56
  - js/errors.js
47
- - js/extra/alcadialer_im.js
48
- - js/extra/strophe.js
49
57
  - js/warnings.js
50
- - jsc.gemspec
51
58
  - lib/jsc.rb
52
59
  - lib/jsc/closure_compiler.rb
60
+ - lib/jsc/parser.rb
53
61
  - plugins/jsc.el
54
- - rdoc/classes/JSCompiler.html
55
- - rdoc/classes/String.html
56
- - rdoc/created.rid
57
- - rdoc/files/README_rdoc.html
58
- - rdoc/files/lib/jsc/closure_compiler_rb.html
59
- - rdoc/files/lib/jsc_rb.html
60
- - rdoc/fr_class_index.html
61
- - rdoc/fr_file_index.html
62
- - rdoc/fr_method_index.html
63
- - rdoc/index.html
64
- - rdoc/rdoc-style.css
65
- - spec/#wip_spec.rb#
66
62
  - spec/jsc_spec.rb
67
63
  - spec/spec_helper.rb
68
- - spec/wip_spec.rb
69
64
  - tasks/jsc.rake
70
65
  - test/test_jsc.rb
71
- - tmp/aruba/js/compiled_code.js
72
- - tmp/aruba/js/errors.js
73
- - tmp/aruba/js/warnings.js
74
66
  has_rdoc: true
75
67
  homepage: http://github.com/sub/jsc
76
68
  licenses: []
77
69
 
78
70
  post_install_message:
79
71
  rdoc_options:
80
- - --main
81
- - README.rdoc
72
+ - --charset=UTF-8
82
73
  require_paths:
83
74
  - lib
84
75
  required_ruby_version: !ruby/object:Gem::Requirement
85
76
  requirements:
86
77
  - - ">="
87
78
  - !ruby/object:Gem::Version
79
+ segments:
80
+ - 0
88
81
  version: "0"
89
- version:
90
82
  required_rubygems_version: !ruby/object:Gem::Requirement
91
83
  requirements:
92
84
  - - ">="
93
85
  - !ruby/object:Gem::Version
86
+ segments:
87
+ - 0
94
88
  version: "0"
95
- version:
96
89
  requirements: []
97
90
 
98
- rubyforge_project: jsc
99
- rubygems_version: 1.3.5
91
+ rubyforge_project:
92
+ rubygems_version: 1.3.6
100
93
  signing_key:
101
94
  specification_version: 3
102
- summary: Simple Ruby API to Google Closure Compiler Web service
95
+ summary: Ruby API to Google Closure Compiler Web service
103
96
  test_files:
97
+ - spec/jsc_spec.rb
98
+ - spec/spec_helper.rb
104
99
  - test/test_jsc.rb
@@ -1,559 +0,0 @@
1
- /*
2
- AlcaDialer_IM: Modulo di messagistica istantanea
3
-
4
- Configurazione dei parametri di una connessione,
5
- configurazione degli handlers,
6
- connessione e disconnessione,
7
- invio di dati,
8
- amministrazione pubsub,
9
- iscrizione e ricezione pubsub
10
- */
11
-
12
- // REQUIRE: jQuery e StropheJS
13
- //
14
- // jQuery: XML parsing
15
- // StropheJS: XMPP
16
-
17
- // NOTE: create a module private context
18
- (function(){
19
- var base_im_config = {
20
- max_conn_retry: 0,
21
- username: null,
22
- password: null,
23
- jid: null,
24
- fulljid: null,
25
- hostname: null,
26
- boshurl: null,
27
- resource: "AlcaBosh"
28
- };
29
-
30
- var dummy_handler = function() { };
31
-
32
- var base_call_callbacks = {
33
- ok: dummy_handler,
34
- fail: dummy_handler
35
- };
36
-
37
- var base_global_callbacks = {
38
- connected: dummy_handler,
39
- connection_error: dummy_handler,
40
- disconnecting: dummy_handler,
41
- disconnected: dummy_handler,
42
- receive_message: dummy_handler,
43
- receive_pubsub_item: dummy_handler
44
- };
45
-
46
- var DEBUG = false;
47
-
48
- var NS_PUBSUB = 'http://jabber.org/protocol/pubsub';
49
-
50
- // NOTE: current configuration
51
- var im_config = null;
52
- // NOTE: current connection
53
- var im_conn = null;
54
- // NOTE: current persistent exported handlers
55
- var im_handlers = null;
56
-
57
- // AlcaDialer_IM constructor
58
- var AlcaDialer_IM = mixin({}, {
59
- init: IM_init,
60
- connect: IM_connect,
61
- disconnect: IM_disconnect,
62
- send_message: IM_send_message,
63
- ping: IM_ping,
64
- create_user: IM_create_user,
65
- flush: IM_flush,
66
- pubsub: {
67
- create_node: PUBSUB_create_node,
68
- remove_node: PUBSUB_remove_node,
69
- list_nodes: PUBSUB_list_nodes,
70
- publish_item: PUBSUB_publish_item,
71
- subscribe: PUBSUB_subscribe,
72
- list_subscribed: PUBSUB_list_subscribed,
73
- unsubscribe: PUBSUB_unsubscribe,
74
- unsubscribe_all: PUBSUB_unsubscribe_all
75
- },
76
- get_connection: function() { return im_conn; },
77
- jid: jid,
78
- fulljid: fulljid,
79
- STATUS: Strophe.Status // Export Strophe Status consts
80
- });
81
-
82
- // NOTE: Export AlcaDialer_IM
83
- window.AlcaDialer_IM = AlcaDialer_IM;
84
-
85
- // PUBLIC NETHODS IMPLEMENTATIONS
86
- function jid(config) {
87
- var cfg = config ? config : im_config;
88
-
89
- return cfg.username+"@"+cfg.hostname;
90
- }
91
-
92
- function fulljid(config) {
93
- var cfg = config ? config : im_config;
94
-
95
- return jid(cfg)+'/'+cfg.resource;
96
- }
97
-
98
- function IM_init(config) {
99
- // Mix configuration parameters
100
- im_config = mixin({}, base_im_config, config);
101
- im_config.fulljid = fulljid(im_config);
102
- im_config.jid = jid(im_config);
103
- im_handlers = mixin({}, base_global_callbacks, config.handlers);
104
-
105
- return true;
106
- }
107
-
108
- function IM_connect() {
109
- var fulljid = im_config.fulljid;
110
-
111
- im_conn = new Strophe.Connection(im_config.boshurl);
112
- // AlcaBosh.conn.rawInput = AlcaBosh._raw_input;
113
- // AlcaBosh.conn.rawOutput = AlcaBosh._raw_output;
114
- im_conn.connect(fulljid, im_config.password, _IM_connection_manager);
115
- }
116
-
117
- function IM_disconnect(reason) {
118
- im_conn.flush();
119
- im_conn.disconnect(reason);
120
- im_config.conn_retry = 0;
121
- }
122
-
123
- function IM_create_user(callbacks) {
124
- var cb = mixin({},base_call_callbacks,callbacks);
125
- var xmpp_id = im_conn.getUniqueId('reg');
126
-
127
- var xmpp = $iq(
128
- {
129
- "id": xmpp_id,
130
- "type": "set",
131
- "to": im_config.hostname
132
- }).
133
- c("query", {"xmlns": "jabber:iq:register"}).
134
- c("username").t(im_config.username).
135
- up().c("password").t(im_config.password);
136
-
137
- _IM_sendSysIQ(xmpp, cb.ok, cb.fail);
138
- im_conn.flush();
139
- }
140
-
141
- function IM_ping() {
142
- _IM_send_data($iq({
143
- type: 'get',
144
- id: im_conn.getUniqueId('ping')
145
- }).c('ping', { xmlns: 'urn:xmpp:ping' }));
146
-
147
- im_conn.flush();
148
- // don't remove the time handler
149
- return true;
150
- }
151
-
152
- function IM_flush() {
153
- im_conn.flush();
154
- }
155
-
156
- function IM_send_message(to, text) {
157
- _IM_send_data(
158
- $msg({ to: to, type: 'chat'}).
159
- c('body').t(text)
160
- );
161
- }
162
-
163
- function PUBSUB_list_nodes(rootnode, callbacks) {
164
- var cb = mixin({},base_call_callbacks,callbacks);
165
- var xmpp_id = im_conn.getUniqueId('list');
166
- var xmpp = $iq(
167
- {
168
- id: xmpp_id,
169
- type: 'get',
170
- from: im_config.fulljid,
171
- to: im_config.pubsub
172
- }).
173
- c('query',
174
- {
175
- xmlns: Strophe.NS.DISCO_ITEMS,
176
- node: rootnode
177
- });
178
-
179
- // TODO: import from first prototype
180
- _IM_sendIQ(xmpp, ok, fail);
181
- function ok(data) {
182
- var content = [];
183
- $(data).find('item').each(function() {
184
- content.push($(this).attr('node'));
185
- });
186
- cb.ok(content);
187
- }
188
- function fail(data) {
189
- cb.fail(data);
190
- }
191
- }
192
-
193
- /*
194
- NOTE: xml fragment generation con jquery
195
-
196
- var iq = $iq({ id: "12312312", type: "set"});
197
- $(iq.tree()).append( $("<c xmlns='test'>"));
198
- $('c', iq.tree()).append($("<value pippo='34'/>"));
199
- iq.toString();
200
-
201
- ====> <iq id='12312312' type='set' xmlns='jabber:client'><c xmlns='test'><value pippo='34'/></c></iq>
202
- */
203
-
204
- function PUBSUB_create_node(node, callbacks) {
205
- var cb = mixin({},base_call_callbacks,callbacks);
206
- var xmpp_id = im_conn.getUniqueId('list');
207
- /* TODO: TOOOOOOO BIG */
208
- var xmpp_iq = $iq(
209
- {
210
- id: xmpp_id,
211
- type: 'set',
212
- from: im_config.fulljid,
213
- to: im_config.pubsub,
214
- xmlns: Strophe.NS.CLIENT
215
- }).
216
- c('pubsub',{xmlns: NS_PUBSUB}).
217
- c('create',{node: node});
218
-
219
- // NOTE: Crea i fragment xml con gli helper strophe
220
- var xmpp_configure = $build("configure", {node: node}).
221
- c('x', {'type': 'submit', 'xmlns': 'jabber:x:data'});
222
-
223
- var xmpp_field_formtype = $build('field', {'type': 'hidden', 'var': 'FORM_TYPE'}).
224
- c('value').t('http://jabber.org/protocol/pubsub#node_config');
225
-
226
- var xmpp_field_lastpub = $build('field', {'var': 'pubsub#send_last_published_item'}).
227
- c('value').t('never');
228
-
229
- var xmpp_field_presencedelivery = $build('field', {'var': 'pubsub#presence_based_delivery'}).
230
- c('value').t('1');
231
-
232
- var xmpp_field_publishmodel = $build('field', {'var': 'pubsub#publish_model'}).
233
- c('value').t('open');
234
-
235
- // NOTE: Assembla il pacchetto xml dai fragment mediante jQuery
236
- $('pubsub', xmpp_iq.tree()).append(xmpp_configure.tree());
237
- $('x', xmpp_configure.tree()).
238
- append(xmpp_field_formtype.tree()).
239
- append(xmpp_field_lastpub.tree()).
240
- append(xmpp_field_presencedelivery.tree()).
241
- append(xmpp_field_publishmodel.tree());
242
-
243
- _IM_sendIQ(xmpp_iq, cb.ok, cb.fail);
244
-
245
- return xmpp_id;
246
- }
247
-
248
- function PUBSUB_remove_node(node, callbacks) {
249
- var cb = mixin({},base_call_callbacks,callbacks);
250
- var xmpp_id = im_conn.getUniqueId('del');
251
- var xmpp_iq = $iq(
252
- {
253
- 'type':'set',
254
- 'from': im_config.fulljid,
255
- 'to': im_config.pubsub,
256
- 'id': xmpp_id
257
- }).
258
- c('pubsub', {'xmlns': 'http://jabber.org/protocol/pubsub#owner'}).
259
- c('delete', {'node': node});
260
-
261
- _IM_sendIQ(xmpp_iq, cb.ok, cb.fail);
262
- }
263
-
264
- function PUBSUB_publish_item(node, text, callbacks) {
265
- var cb = mixin({},base_call_callbacks,callbacks);
266
- var xmpp_id = im_conn.getUniqueId('pub');
267
- var xmpp_iq = $iq(
268
- {
269
- 'type':'set',
270
- 'from': im_config.fulljid,
271
- 'to': im_config.pubsub,
272
- 'id': xmpp_id
273
- }).
274
- c('pubsub', {'xmlns': 'http://jabber.org/protocol/pubsub'}).
275
- c('publish', {'node': node }).
276
- c('item').t(text);
277
-
278
- _IM_sendIQ(xmpp_iq, cb.ok, cb.fail);
279
- }
280
-
281
-
282
- function PUBSUB_subscribe(node, callbacks) {
283
- var cb = mixin({},base_call_callbacks,callbacks);
284
- var xmpp_id = im_conn.getUniqueId('sub');
285
- var bare_jid = Strophe.getBareJidFromJid(im_config.fulljid);
286
- var xmpp_iq = $iq(
287
- {
288
- 'type':'set',
289
- 'from': im_config.fulljid,
290
- 'to': im_config.pubsub,
291
- 'id': xmpp_id
292
- }).
293
- c('pubsub', {'xmlns': 'http://jabber.org/protocol/pubsub'}).
294
- c('subscribe', {'node': node, 'jid': bare_jid});
295
-
296
- _IM_sendIQ(xmpp_iq, parse_subscribe_ok, parse_subscribe_fail);
297
-
298
- var result = { node: node, success: false };
299
-
300
- function parse_subscribe_ok(data) {
301
- result.success = true;
302
- cb.ok(result);
303
- }
304
- function parse_subscribe_fail(data) {
305
- //NOTE: result.success is already false
306
- cb.ok(result);
307
- }
308
- }
309
-
310
- function PUBSUB_unsubscribe(node, callbacks) {
311
- var cb = mixin({},base_call_callbacks,callbacks);
312
- var xmpp_id = im_conn.getUniqueId('unsub');
313
- var bare_jid = Strophe.getBareJidFromJid(im_config.fulljid);
314
- var xmpp_iq = $iq(
315
- {
316
- 'type':'set',
317
- 'from': im_config.fulljid,
318
- 'to': im_config.pubsub,
319
- 'id': xmpp_id
320
- }).
321
- c('pubsub', {'xmlns': 'http://jabber.org/protocol/pubsub'}).
322
- c('unsubscribe', {'node': node, 'jid': bare_jid});
323
-
324
- _IM_sendIQ(xmpp_iq, parse_unsubscribe_ok, parse_unsubscribe_fail);
325
-
326
- var result = { node: node, success: false };
327
-
328
- function parse_unsubscribe_ok(data) {
329
- result.success = true;
330
- cb.ok(result);
331
- }
332
- function parse_unsubscribe_fail(data) {
333
- //NOTE: result.success is already false
334
- cb.ok(result);
335
- }
336
- return xmpp_id;
337
- }
338
-
339
- function PUBSUB_list_subscribed(callbacks) {
340
- var cb = mixin({},base_call_callbacks,callbacks);
341
- var xmpp_id = im_conn.getUniqueId('list');
342
- var bare_jid = Strophe.getBareJidFromJid(im_config.fulljid);
343
- var xmpp_iq = $iq(
344
- {
345
- 'type':'get',
346
- 'from': im_config.fulljid,
347
- 'to': im_config.pubsub,
348
- 'id': xmpp_id
349
- }).
350
- c('pubsub', {'xmlns': 'http://jabber.org/protocol/pubsub'}).
351
- c('subscriptions');
352
-
353
- _IM_sendIQ(xmpp_iq, parse_subscriptions, cb.fail);
354
- function parse_subscriptions(data) {
355
- var content = [];
356
-
357
- $(data).find('subscription').each(function () {
358
- content.push($(this).attr('node'));
359
- });
360
-
361
- cb.ok(content);
362
- }
363
-
364
- }
365
-
366
- // TODO: dovrebbe controllare l'effetivo esito delle desottoscrizioni richieste
367
- function PUBSUB_unsubscribe_all(callbacks) {
368
- var cb = mixin({},base_call_callbacks,callbacks);
369
-
370
- PUBSUB_list_subscribed({
371
- ok: function(data) {
372
- var nodes = [];
373
- var result = true;
374
- $(data).each(function() {
375
- PUBSUB_unsubscribe(this, {
376
- ok: function(unsub_reply) {
377
- nodes.push(unsub_reply);
378
- if(nodes.length === data.length) {
379
- if(result === true)
380
- cb.ok(nodes);
381
- else
382
- cb.fail(nodes);
383
- }
384
- },
385
- fail: function(unsub_reply) {
386
- result = false;
387
- nodes.push(unsub_reply);
388
- if(nodes.length === data.length)
389
- cb.fail(nodes);
390
- }
391
- });
392
- im_conn.flush();
393
- });
394
-
395
-
396
- im_conn.flush();
397
- }
398
- });
399
- }
400
-
401
- // PRIVATE FUNCTIONS
402
-
403
- function _IM_sendIQ(data, cb_ok, cb_fail) {
404
- im_conn.sendIQ(data, cb_ok, cb_fail);
405
- }
406
-
407
- // NOTE: this helper send an IQ with attached system handlers which don't require
408
- // an authenticated session
409
- function _IM_sendSysIQ(elem, callback, errback, timeout) {
410
- var timeoutHandler = null;
411
- var that = im_conn;
412
-
413
- if (typeof(elem.tree) === "function") {
414
- elem = elem.tree();
415
- }
416
- var id = elem.getAttribute('id');
417
-
418
- // inject id if not found
419
- if (!id) {
420
- id = im_conn.getUniqueId("sendIQ");
421
- elem.setAttribute("id", id);
422
- }
423
-
424
- var handler = im_conn._addSysHandler(function (stanza) {
425
-
426
- // remove timeout handler if there is one
427
- if (timeoutHandler) {
428
- that.deleteTimedHandler(timeoutHandler);
429
- }
430
-
431
- var iqtype = stanza.getAttribute('type');
432
-
433
- if (iqtype === 'result') {
434
- if (callback) {
435
- callback(stanza);
436
- }
437
- } else if (iqtype === 'error') {
438
- if (errback) {
439
- errback(stanza);
440
- }
441
- } else {
442
- throw {
443
- name: "StropheError",
444
- message: "Got bad IQ type of " + iqtype
445
- };
446
- }
447
- }, null, 'iq', null, id);
448
-
449
- // if timeout specified, setup timeout handler.
450
- if (timeout) {
451
- timeoutHandler = im_conn.addTimedHandler(timeout, function () {
452
- // get rid of normal handler
453
- that.deleteHandler(handler);
454
-
455
- // call errback on timeout with null stanza
456
- if (errback) {
457
- errback(null);
458
- }
459
- return false;
460
- });
461
- }
462
-
463
- im_conn.send(elem);
464
-
465
- return id;
466
- }
467
-
468
- function _IM_connection_manager(status, reason) {
469
- var fulljid = im_config.fulljid;
470
- var fail_event = {
471
- fulljid: fulljid,
472
- status: status,
473
- error: reason
474
- };
475
-
476
- switch(status) {
477
- case Strophe.Status.ERROR:
478
- im_handlers.connection_error(fail_event);
479
- break;
480
- case Strophe.Status.CONNFAIL:
481
- im_handlers.connection_error(fail_event);
482
- break;
483
- case Strophe.Status.AUTHFAIL:
484
- //im_conn.flush();
485
- fail_event.error = "Authentication Error";
486
- im_handlers.connection_error(fail_event);
487
- break;
488
- case Strophe.Status.CONNECTED:
489
- _IM_connected();
490
- im_handlers.connected({fulljid: fulljid});
491
- break;
492
- case Strophe.Status.DISCONNECTING:
493
- im_handlers.disconnecting({
494
- fulljid: fulljid,
495
- reason: reason
496
- });
497
- break;
498
- case Strophe.Status.DISCONNECTED:
499
- im_handlers.disconnected({
500
- fulljid: fulljid,
501
- reason: reason
502
- });
503
- break;
504
- }
505
- }
506
-
507
- function _IM_connected() {
508
- // Install Message XMPP Stanzas receiver
509
- im_conn.addHandler(_IM_receive_message, null, 'message',null,null,null,null);
510
- // Send presence XMPP Stanzas
511
- _IM_send_data($pres());
512
- // Set periodic 5 min ping to confirm our presence
513
- im_conn.addTimedHandler(5*60*1000, IM_ping);
514
- }
515
-
516
- function _IM_send_data(data) {
517
- im_conn.send(data);
518
- }
519
-
520
- function _IM_receive_message(data) {
521
- var message = $(data);
522
- var from = message.attr('from');
523
- var to = message.attr('to');
524
- var type = message.attr('type');
525
-
526
- var content = [];
527
-
528
- if (from.match(/pubsub/i)) {
529
- var items = $(message.find('items')[0]);
530
- var node = items.attr('node');
531
- message.find('item').each(function () {
532
- content.push($(this).text());
533
- });
534
-
535
- if (content.length > 0)
536
- im_handlers.receive_pubsub_item({node: node, content: content});
537
- }
538
- else if (type === "chat") {
539
- content.push($(message.find('body')[0]).text());
540
- im_handlers.receive_message({from: from, content: content});
541
- }
542
-
543
- return true;
544
- }
545
-
546
- // NOTE: simple (non-deep) mixin utility function
547
- function mixin(target) {
548
- var src=null;
549
- for (var i=1; i<arguments.length; i++) {
550
- src = arguments[i];
551
- for (var j in src) {
552
- target[j] = src[j];
553
- }
554
- }
555
-
556
- return target;
557
- }
558
-
559
- })();