xmpp4r 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. data/COPYING +340 -0
  2. data/ChangeLog +28 -0
  3. data/LICENSE +59 -0
  4. data/README +20 -0
  5. data/Rakefile +103 -0
  6. data/UPDATING +40 -0
  7. data/data/doc/xmpp4r/examples/advanced/adventure/README +57 -0
  8. data/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
  9. data/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
  10. data/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
  11. data/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
  12. data/data/doc/xmpp4r/examples/advanced/adventure/world.rb +425 -0
  13. data/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
  14. data/data/doc/xmpp4r/examples/advanced/fileserve.rb +344 -0
  15. data/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
  16. data/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
  17. data/data/doc/xmpp4r/examples/advanced/migrate.rb +89 -0
  18. data/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
  19. data/data/doc/xmpp4r/examples/advanced/recvfile.rb +83 -0
  20. data/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +130 -0
  21. data/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
  22. data/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
  23. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
  24. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
  25. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
  26. data/data/doc/xmpp4r/examples/advanced/versionpoll.rb +90 -0
  27. data/data/doc/xmpp4r/examples/advanced/xmpping.rb +134 -0
  28. data/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +9 -0
  29. data/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
  30. data/data/doc/xmpp4r/examples/basic/client.rb +68 -0
  31. data/data/doc/xmpp4r/examples/basic/component.rb +11 -0
  32. data/data/doc/xmpp4r/examples/basic/echo_nonthreaded.rb +32 -0
  33. data/data/doc/xmpp4r/examples/basic/echo_threaded.rb +32 -0
  34. data/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
  35. data/data/doc/xmpp4r/examples/basic/mass_sender.rb +67 -0
  36. data/data/doc/xmpp4r/examples/basic/mucinfo.rb +39 -0
  37. data/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +83 -0
  38. data/data/doc/xmpp4r/examples/basic/register.rb +25 -0
  39. data/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
  40. data/data/doc/xmpp4r/examples/basic/roster.rb +42 -0
  41. data/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
  42. data/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
  43. data/data/doc/xmpp4r/examples/basic/rosterwatch.rb +172 -0
  44. data/data/doc/xmpp4r/examples/basic/send_vcard.rb +68 -0
  45. data/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
  46. data/data/doc/xmpp4r/examples/buggy/jabber2jabber/jabber2jabber.rb +18 -0
  47. data/data/doc/xmpp4r/examples/buggy/miniedgarr_cgi.rb +192 -0
  48. data/data/doc/xmpp4r/examples/buggy/miniedgarr_watch.rb +82 -0
  49. data/lib/callbacks.rb +122 -0
  50. data/lib/xmpp4r/authenticationfailure.rb +13 -0
  51. data/lib/xmpp4r/bytestreams/helper/filetransfer.rb +315 -0
  52. data/lib/xmpp4r/bytestreams/helper/ibb/base.rb +256 -0
  53. data/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +30 -0
  54. data/lib/xmpp4r/bytestreams/helper/ibb/target.rb +46 -0
  55. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +151 -0
  56. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +85 -0
  57. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +178 -0
  58. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +56 -0
  59. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +61 -0
  60. data/lib/xmpp4r/bytestreams/iq/bytestreams.rb +177 -0
  61. data/lib/xmpp4r/bytestreams/iq/si.rb +221 -0
  62. data/lib/xmpp4r/bytestreams.rb +11 -0
  63. data/lib/xmpp4r/client.rb +249 -0
  64. data/lib/xmpp4r/component.rb +103 -0
  65. data/lib/xmpp4r/connection.rb +166 -0
  66. data/lib/xmpp4r/dataforms/x/data.rb +248 -0
  67. data/lib/xmpp4r/dataforms.rb +1 -0
  68. data/lib/xmpp4r/debuglog.rb +34 -0
  69. data/lib/xmpp4r/delay/x/delay.rb +100 -0
  70. data/lib/xmpp4r/delay.rb +1 -0
  71. data/lib/xmpp4r/discovery/iq/discoinfo.rb +225 -0
  72. data/lib/xmpp4r/discovery/iq/discoitems.rb +162 -0
  73. data/lib/xmpp4r/discovery.rb +2 -0
  74. data/lib/xmpp4r/error.rb +230 -0
  75. data/lib/xmpp4r/errorexception.rb +32 -0
  76. data/lib/xmpp4r/feature_negotiation/iq/feature.rb +42 -0
  77. data/lib/xmpp4r/feature_negotiation.rb +1 -0
  78. data/lib/xmpp4r/idgenerator.rb +37 -0
  79. data/lib/xmpp4r/iq.rb +229 -0
  80. data/lib/xmpp4r/jid.rb +167 -0
  81. data/lib/xmpp4r/message.rb +171 -0
  82. data/lib/xmpp4r/muc/helper/mucbrowser.rb +107 -0
  83. data/lib/xmpp4r/muc/helper/mucclient.rb +382 -0
  84. data/lib/xmpp4r/muc/helper/simplemucclient.rb +222 -0
  85. data/lib/xmpp4r/muc/x/muc.rb +98 -0
  86. data/lib/xmpp4r/muc/x/mucuserinvite.rb +58 -0
  87. data/lib/xmpp4r/muc/x/mucuseritem.rb +148 -0
  88. data/lib/xmpp4r/muc.rb +6 -0
  89. data/lib/xmpp4r/presence.rb +255 -0
  90. data/lib/xmpp4r/query.rb +43 -0
  91. data/lib/xmpp4r/rexmladdons.rb +826 -0
  92. data/lib/xmpp4r/roster/helper/roster.rb +514 -0
  93. data/lib/xmpp4r/roster/iq/roster.rb +244 -0
  94. data/lib/xmpp4r/roster/x/roster.rb +155 -0
  95. data/lib/xmpp4r/roster.rb +4 -0
  96. data/lib/xmpp4r/sasl.rb +167 -0
  97. data/lib/xmpp4r/stream.rb +543 -0
  98. data/lib/xmpp4r/streamparser.rb +77 -0
  99. data/lib/xmpp4r/vcard/helper/vcard.rb +86 -0
  100. data/lib/xmpp4r/vcard/iq/vcard.rb +102 -0
  101. data/lib/xmpp4r/vcard.rb +3 -0
  102. data/lib/xmpp4r/version/helper/responder.rb +71 -0
  103. data/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
  104. data/lib/xmpp4r/version/iq/version.rb +118 -0
  105. data/lib/xmpp4r/version.rb +3 -0
  106. data/lib/xmpp4r/x.rb +43 -0
  107. data/lib/xmpp4r/xmlstanza.rb +174 -0
  108. data/lib/xmpp4r/xmpp4r.rb +16 -0
  109. data/lib/xmpp4r.rb +122 -0
  110. data/setup.rb +1360 -0
  111. data/test/bytestreams/tc_ibb.rb +186 -0
  112. data/test/bytestreams/tc_socks5bytestreams.rb +57 -0
  113. data/test/delay/tc_xdelay.rb +51 -0
  114. data/test/lib/clienttester.rb +110 -0
  115. data/test/muc/tc_muc_mucclient.rb +569 -0
  116. data/test/muc/tc_muc_simplemucclient.rb +72 -0
  117. data/test/roster/.tc_helper.rb.swp +0 -0
  118. data/test/roster/tc_helper.rb +389 -0
  119. data/test/roster/tc_iqqueryroster.rb +140 -0
  120. data/test/roster/tc_xroster.rb +70 -0
  121. data/test/tc_callbacks.rb +128 -0
  122. data/test/tc_class_names.rb +129 -0
  123. data/test/tc_client.rb +30 -0
  124. data/test/tc_error.rb +103 -0
  125. data/test/tc_idgenerator.rb +30 -0
  126. data/test/tc_iq.rb +109 -0
  127. data/test/tc_iqquery.rb +31 -0
  128. data/test/tc_jid.rb +202 -0
  129. data/test/tc_message.rb +114 -0
  130. data/test/tc_presence.rb +148 -0
  131. data/test/tc_stream.rb +182 -0
  132. data/test/tc_streamError.rb +87 -0
  133. data/test/tc_streamSend.rb +59 -0
  134. data/test/tc_streamThreaded.rb +168 -0
  135. data/test/tc_xmlstanza.rb +76 -0
  136. data/test/ts_xmpp4r.rb +34 -0
  137. data/test/vcard/tc_iqvcard.rb +52 -0
  138. data/test/version/tc_helper.rb +46 -0
  139. data/test/version/tc_iqqueryversion.rb +96 -0
  140. data/tools/doctoweb.bash +30 -0
  141. data/tools/gen_requires.bash +10 -0
  142. metadata +232 -0
@@ -0,0 +1,58 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ module Jabber
6
+ module MUC
7
+ class XMUCUserInvite < REXML::Element
8
+ def initialize(to=nil, reason=nil)
9
+ super('invite')
10
+ set_to(to)
11
+ set_reason(reason)
12
+ end
13
+
14
+ def to
15
+ attributes['to'].nil? ? nil : JID::new(attributes['to'])
16
+ end
17
+
18
+ def to=(j)
19
+ attributes['to'] = j.nil? ? nil : j.to_s
20
+ end
21
+
22
+ def set_to(j)
23
+ self.to = j
24
+ self
25
+ end
26
+
27
+ def from
28
+ attributes['from'].nil? ? nil : JID::new(attributes['from'])
29
+ end
30
+
31
+ def from=(j)
32
+ attributes['from'] = (j.nil? ? nil : j.to_s)
33
+ end
34
+
35
+ def set_from(j)
36
+ self.from = j
37
+ self
38
+ end
39
+
40
+ def reason
41
+ first_element_text('reason')
42
+ end
43
+
44
+ def reason=(s)
45
+ if s
46
+ replace_element_text('reason', s)
47
+ else
48
+ delete_elements('reason')
49
+ end
50
+ end
51
+
52
+ def set_reason(s)
53
+ self.reason = s
54
+ self
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,148 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ module Jabber
6
+ module MUC
7
+ class XMUCUserItem < REXML::Element
8
+ def initialize(affiliation=nil, role=nil, jid=nil)
9
+ super('item')
10
+ set_affiliation(affiliation)
11
+ set_role(role)
12
+ set_jid(jid)
13
+ end
14
+
15
+ def affiliation
16
+ case attributes['affiliation']
17
+ when 'admin' then :admin
18
+ when 'member' then :member
19
+ when 'none' then :none
20
+ when 'outcast' then :outcast
21
+ when 'owner' then :owner
22
+ else nil
23
+ end
24
+ end
25
+
26
+ def affiliation=(v)
27
+ case v
28
+ when :admin then attributes['affiliation'] = 'admin'
29
+ when :member then attributes['affiliation'] = 'member'
30
+ when :none then attributes['affiliation'] = 'none'
31
+ when :outcast then attributes['affiliation'] = 'outcast'
32
+ when :owner then attributes['affiliation'] = 'owner'
33
+ else attributes['affiliation'] = nil
34
+ end
35
+ end
36
+
37
+ def set_affiliation(v)
38
+ self.affiliation = v
39
+ self
40
+ end
41
+
42
+ def jid
43
+ attributes['jid'].nil? ? nil : JID::new(attributes['jid'])
44
+ end
45
+
46
+ def jid=(j)
47
+ attributes['jid'] = j.nil? ? nil : j.to_s
48
+ end
49
+
50
+ def set_jid(j)
51
+ self.jid = j
52
+ self
53
+ end
54
+
55
+ def nick
56
+ attributes['nick']
57
+ end
58
+
59
+ def nick=(n)
60
+ attributes['nick'] = n
61
+ end
62
+
63
+ def set_nick(n)
64
+ self.nick = n
65
+ self
66
+ end
67
+
68
+ def role
69
+ case attributes['role']
70
+ when 'moderator' then :moderator
71
+ when 'none' then :none
72
+ when 'participant' then :participant
73
+ when 'visitor' then :visitor
74
+ else nil
75
+ end
76
+ end
77
+
78
+ def role=(r)
79
+ case r
80
+ when :moderator then attributes['role'] = 'moderator'
81
+ when :none then attributes['role'] = 'none'
82
+ when :participant then attributes['role'] = 'participant'
83
+ when :visitor then attributes['role'] = 'visitor'
84
+ else attributes['role'] = nil
85
+ end
86
+ end
87
+
88
+ def set_role(r)
89
+ self.role = r
90
+ self
91
+ end
92
+
93
+ def reason
94
+ text = nil
95
+ each_element('reason') { |xe| text = xe.text }
96
+ text
97
+ end
98
+
99
+ def reason=(s)
100
+ delete_elements('reasion')
101
+ add_element('reason').text = s
102
+ end
103
+
104
+ def set_reason(s)
105
+ self.reason = s
106
+ self
107
+ end
108
+
109
+ def continue
110
+ c = nil
111
+ each_element('continue') { |xe| c = xe }
112
+ c.nil?
113
+ end
114
+
115
+ def continue=(c)
116
+ delete_elements('continue')
117
+ add_element('continue') if c
118
+ end
119
+
120
+ def set_continue(c)
121
+ self.continue = c
122
+ self
123
+ end
124
+
125
+ def actors
126
+ a = []
127
+ each_element('actor') { |xe|
128
+ a.push(JID::new(xe.attributes['jid']))
129
+ }
130
+ a
131
+ end
132
+
133
+ def actors=(a)
134
+ delete_elements('actor')
135
+ a.each { |jid|
136
+ e = add_element('actor')
137
+ e.attributes['jid'] = jid.to_s
138
+ }
139
+ end
140
+
141
+ def set_actors(a)
142
+ self.actors = a
143
+ self
144
+ end
145
+ end
146
+ end
147
+ end
148
+
data/lib/xmpp4r/muc.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'xmpp4r/muc/x/muc'
2
+ require 'xmpp4r/muc/x/mucuserinvite'
3
+ require 'xmpp4r/muc/x/mucuseritem'
4
+ require 'xmpp4r/muc/helper/mucbrowser'
5
+ require 'xmpp4r/muc/helper/mucclient'
6
+ require 'xmpp4r/muc/helper/simplemucclient'
@@ -0,0 +1,255 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r/xmlstanza'
6
+ require 'xmpp4r/x'
7
+
8
+ module Jabber
9
+ ##
10
+ # The presence class is used to construct presence messages to
11
+ # send to the Jabber service.
12
+ class Presence < XMLStanza
13
+ include Comparable
14
+
15
+ ##
16
+ # Create presence stanza
17
+ # show:: [String] Initial Availability Status
18
+ # status:: [String] Initial status message
19
+ # priority:: [Fixnum] Initial priority value
20
+ def initialize(show=nil, status=nil, priority=nil)
21
+ super("presence")
22
+ set_show(show) if show
23
+ set_status(status) if status
24
+ set_priority(priority) if priority
25
+ end
26
+
27
+ ##
28
+ # Add an element to the presence stanza
29
+ # * <x/> elements are converted to [X]
30
+ # element:: [REXML::Element] to add
31
+ def typed_add(element)
32
+ if element.kind_of?(REXML::Element) && (element.name == 'x')
33
+ super(X::import(element))
34
+ else
35
+ super(element)
36
+ end
37
+ end
38
+
39
+ ##
40
+ # Create a new presence from a stanza
41
+ # result:: [Presence] Imported XMLStanza
42
+ def Presence.import(xmlstanza)
43
+ Presence::new.import(xmlstanza)
44
+ end
45
+
46
+ ##
47
+ # Get type of presence
48
+ #
49
+ # result:: [Symbol] or [Nil] Possible values are:
50
+ # * :error
51
+ # * :probe (Servers send this to request presence information)
52
+ # * :subscribe (Subscription request)
53
+ # * :subscribed (Subscription approval)
54
+ # * :unavailable (User has gone offline)
55
+ # * :unsubscribe (Unsubscription request)
56
+ # * :unsubscribed (Unsubscription approval)
57
+ # * [nil] (available)
58
+ # See RFC3921 - 2.2.1. for explanation.
59
+ def type
60
+ case super
61
+ when 'error' then :error
62
+ when 'probe' then :probe
63
+ when 'subscribe' then :subscribe
64
+ when 'subscribed' then :subscribed
65
+ when 'unavailable' then :unavailable
66
+ when 'unsubscribe' then :unsubscribe
67
+ when 'unsubscribed' then :unsubscribed
68
+ else nil
69
+ end
70
+ end
71
+
72
+ ##
73
+ # Set type of presence
74
+ # val:: [Symbol] See type for possible subscription types
75
+ def type=(val)
76
+ case val
77
+ when :error then super('error')
78
+ when :probe then super('probe')
79
+ when :subscribe then super('subscribe')
80
+ when :subscribed then super('subscribed')
81
+ when :unavailable then super('unavailable')
82
+ when :unsubscribe then super('unsubscribe')
83
+ when :unsubscribed then super('unsubscribed')
84
+ else super(nil)
85
+ end
86
+ end
87
+
88
+ ##
89
+ # Set type of presence (chaining-friendly)
90
+ # val:: [Symbol] See type for possible subscription types
91
+ def set_type(val)
92
+ self.type = val
93
+ self
94
+ end
95
+
96
+ ##
97
+ # Get the first <x/> element of this stanza
98
+ # result:: [REXML::Element] or nil
99
+ def x
100
+ xe = nil
101
+ each_element('x') { |e| xe = e }
102
+ xe
103
+ end
104
+
105
+ ##
106
+ # Get Availability Status (RFC3921 - 5.2)
107
+ # result:: [Symbol] or [Nil] Valid values according to RFC3921:
108
+ # * nil (Available, no <show/> element)
109
+ # * :away
110
+ # * :chat (Free for chat)
111
+ # * :dnd (Do not disturb)
112
+ # * :xa (Extended away)
113
+ def show
114
+ e = first_element('show')
115
+ text = e ? e.text : nil
116
+ case text
117
+ when 'away' then :away
118
+ when 'chat' then :chat
119
+ when 'dnd' then :dnd
120
+ when 'xa' then :xa
121
+ else nil
122
+ end
123
+ end
124
+
125
+ ##
126
+ # Set Availability Status
127
+ # val:: [Symbol] or [Nil] See show for explanation
128
+ def show=(val)
129
+ xe = first_element('show')
130
+ if xe.nil?
131
+ xe = add_element('show')
132
+ end
133
+ case val
134
+ when :away then text = 'away'
135
+ when :chat then text = 'chat'
136
+ when :dnd then text = 'dnd'
137
+ when :xa then text = 'xa'
138
+ when nil then text = nil
139
+ else raise "Invalid value for show."
140
+ end
141
+
142
+ if text.nil?
143
+ delete_element(xe)
144
+ else
145
+ xe.text = text
146
+ end
147
+ end
148
+
149
+ ##
150
+ # Set Availability Status (chaining-friendly)
151
+ # val:: [Symbol] or [Nil] See show for explanation
152
+ def set_show(val)
153
+ self.show = val
154
+ self
155
+ end
156
+
157
+ ##
158
+ # Get status message
159
+ # result:: [String] or nil
160
+ def status
161
+ first_element_text('status')
162
+ end
163
+
164
+ ##
165
+ # Set status message
166
+ # val:: [String] or nil
167
+ def status=(val)
168
+ if val.nil?
169
+ delete_element('status')
170
+ else
171
+ replace_element_text('status', val)
172
+ end
173
+ end
174
+
175
+ ##
176
+ # Set status message (chaining-friendly)
177
+ # val:: [String] or nil
178
+ def set_status(val)
179
+ self.status = val
180
+ self
181
+ end
182
+
183
+ ##
184
+ # Get presence priority, or nil if absent
185
+ # result:: [Integer]
186
+ def priority
187
+ e = first_element_text('priority')
188
+ if e
189
+ return e.to_i
190
+ else
191
+ return nil
192
+ end
193
+ end
194
+
195
+ ##
196
+ # Set presence priority
197
+ # val:: [Integer] Priority value between -128 and +127
198
+ #
199
+ # *Warning:* negative values make you receive no subscription requests etc.
200
+ # (RFC3921 - 2.2.2.3.)
201
+ def priority=(val)
202
+ if val.nil?
203
+ delete_element('priority')
204
+ else
205
+ replace_element_text('priority', val)
206
+ end
207
+ end
208
+
209
+ ##
210
+ # Set presence priority (chaining-friendly)
211
+ # val:: [Integer] Priority value between -128 and +127
212
+ def set_priority(val)
213
+ self.priority = val
214
+ self
215
+ end
216
+
217
+ ##
218
+ # Compare two presences using priority
219
+ # (with cmp_interest as fall-back).
220
+ def <=>(o)
221
+ if priority.to_i == o.priority.to_i
222
+ cmp_interest(o)
223
+ else
224
+ priority.to_i <=> o.priority.to_i
225
+ end
226
+ end
227
+
228
+ ##
229
+ # Compare two presences. The most suitable to talk with is the
230
+ # biggest.
231
+ PRESENCE_STATUS = { :chat => 4,
232
+ nil => 3,
233
+ :dnd => 2,
234
+ :away => 1,
235
+ :xa => 0,
236
+ :unavailable => -1,
237
+ :error => -2 }
238
+ def cmp_interest(o)
239
+ if type.nil?
240
+ if o.type.nil?
241
+ # both available.
242
+ PRESENCE_STATUS[show] <=> PRESENCE_STATUS[o.show]
243
+ else
244
+ return -1
245
+ end
246
+ elsif o.type.nil?
247
+ return 1
248
+ else
249
+ # both are non-nil. We consider this is equal.
250
+ return 0
251
+ end
252
+ end
253
+
254
+ end
255
+ end
@@ -0,0 +1,43 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r/iq'
6
+
7
+ module Jabber
8
+ ##
9
+ # A class used to build/parse IQ Query requests/responses
10
+ #
11
+ class IqQuery < REXML::Element
12
+ @@namespace_classes = {}
13
+
14
+ ##
15
+ # Initialize a <query/> element
16
+ #
17
+ # Does nothing more than setting the element's name to 'query'
18
+ def initialize
19
+ super("query")
20
+ end
21
+
22
+ ##
23
+ # Create a new [IqQuery] from iq.query
24
+ # element:: [REXML::Element] to import, will be automatically converted if namespace appropriate
25
+ def IqQuery.import(element)
26
+ if @@namespace_classes.has_key?(element.namespace)
27
+ @@namespace_classes[element.namespace]::new.import(element)
28
+ else
29
+ IqQuery::new.import(element)
30
+ end
31
+ end
32
+
33
+ ##
34
+ # Add a class by namespace for automatic IqQuery conversion (see IqQuery.import)
35
+ # ns:: [String] Namespace (e.g. 'jabber:iq:roster')
36
+ # queryclass:: [IqQuery] Query class derived from IqQuery
37
+ def IqQuery.add_namespaceclass(ns, queryclass)
38
+ @@namespace_classes[ns] = queryclass
39
+ end
40
+ end
41
+
42
+ Iq.add_elementclass('query', IqQuery)
43
+ end