brontes3d-xmpp4r 0.4

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.
Files changed (211) hide show
  1. data/CHANGELOG +83 -0
  2. data/COPYING +340 -0
  3. data/LICENSE +59 -0
  4. data/README.rdoc +112 -0
  5. data/README_ruby19.txt +43 -0
  6. data/Rakefile +252 -0
  7. data/data/doc/xmpp4r/examples/advanced/adventure/README +56 -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 +424 -0
  13. data/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
  14. data/data/doc/xmpp4r/examples/advanced/fileserve.rb +346 -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 +88 -0
  18. data/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
  19. data/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
  20. data/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
  21. data/data/doc/xmpp4r/examples/advanced/recvfile.rb +84 -0
  22. data/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +129 -0
  23. data/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
  24. data/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
  25. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
  26. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
  27. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
  28. data/data/doc/xmpp4r/examples/advanced/versionpoll.rb +109 -0
  29. data/data/doc/xmpp4r/examples/advanced/xmpping.rb +146 -0
  30. data/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +14 -0
  31. data/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
  32. data/data/doc/xmpp4r/examples/basic/client.rb +70 -0
  33. data/data/doc/xmpp4r/examples/basic/component.rb +11 -0
  34. data/data/doc/xmpp4r/examples/basic/echo.rb +37 -0
  35. data/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
  36. data/data/doc/xmpp4r/examples/basic/mass_sender.rb +68 -0
  37. data/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +12 -0
  38. data/data/doc/xmpp4r/examples/basic/mucinfo.rb +41 -0
  39. data/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +82 -0
  40. data/data/doc/xmpp4r/examples/basic/register.rb +42 -0
  41. data/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
  42. data/data/doc/xmpp4r/examples/basic/roster.rb +44 -0
  43. data/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
  44. data/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
  45. data/data/doc/xmpp4r/examples/basic/rosterwatch.rb +171 -0
  46. data/data/doc/xmpp4r/examples/basic/send_vcard.rb +67 -0
  47. data/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
  48. data/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
  49. data/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
  50. data/lib/xmpp4r.rb +116 -0
  51. data/lib/xmpp4r/base64.rb +32 -0
  52. data/lib/xmpp4r/bytestreams.rb +15 -0
  53. data/lib/xmpp4r/bytestreams/helper/filetransfer.rb +319 -0
  54. data/lib/xmpp4r/bytestreams/helper/ibb/base.rb +257 -0
  55. data/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +31 -0
  56. data/lib/xmpp4r/bytestreams/helper/ibb/target.rb +54 -0
  57. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +152 -0
  58. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +86 -0
  59. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +198 -0
  60. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +65 -0
  61. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +79 -0
  62. data/lib/xmpp4r/bytestreams/iq/bytestreams.rb +170 -0
  63. data/lib/xmpp4r/bytestreams/iq/si.rb +206 -0
  64. data/lib/xmpp4r/callbacks.rb +133 -0
  65. data/lib/xmpp4r/caps.rb +1 -0
  66. data/lib/xmpp4r/caps/c.rb +67 -0
  67. data/lib/xmpp4r/caps/helper/generator.rb +160 -0
  68. data/lib/xmpp4r/caps/helper/helper.rb +84 -0
  69. data/lib/xmpp4r/client.rb +344 -0
  70. data/lib/xmpp4r/command/helper/responder.rb +53 -0
  71. data/lib/xmpp4r/command/iq/command.rb +154 -0
  72. data/lib/xmpp4r/component.rb +103 -0
  73. data/lib/xmpp4r/connection.rb +223 -0
  74. data/lib/xmpp4r/dataforms.rb +5 -0
  75. data/lib/xmpp4r/dataforms/x/data.rb +297 -0
  76. data/lib/xmpp4r/debuglog.rb +63 -0
  77. data/lib/xmpp4r/delay.rb +5 -0
  78. data/lib/xmpp4r/delay/x/delay.rb +99 -0
  79. data/lib/xmpp4r/discovery.rb +8 -0
  80. data/lib/xmpp4r/discovery/helper/helper.rb +58 -0
  81. data/lib/xmpp4r/discovery/helper/responder.rb +165 -0
  82. data/lib/xmpp4r/discovery/iq/discoinfo.rb +211 -0
  83. data/lib/xmpp4r/discovery/iq/discoitems.rb +147 -0
  84. data/lib/xmpp4r/errors.rb +284 -0
  85. data/lib/xmpp4r/feature_negotiation.rb +5 -0
  86. data/lib/xmpp4r/feature_negotiation/iq/feature.rb +28 -0
  87. data/lib/xmpp4r/framework/base.rb +55 -0
  88. data/lib/xmpp4r/framework/bot.rb +148 -0
  89. data/lib/xmpp4r/httpbinding.rb +5 -0
  90. data/lib/xmpp4r/httpbinding/client.rb +275 -0
  91. data/lib/xmpp4r/idgenerator.rb +37 -0
  92. data/lib/xmpp4r/iq.rb +221 -0
  93. data/lib/xmpp4r/jid.rb +167 -0
  94. data/lib/xmpp4r/last.rb +2 -0
  95. data/lib/xmpp4r/last/helper/helper.rb +37 -0
  96. data/lib/xmpp4r/last/iq/last.rb +67 -0
  97. data/lib/xmpp4r/message.rb +180 -0
  98. data/lib/xmpp4r/muc.rb +14 -0
  99. data/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
  100. data/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
  101. data/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
  102. data/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
  103. data/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
  104. data/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
  105. data/lib/xmpp4r/muc/item.rb +143 -0
  106. data/lib/xmpp4r/muc/x/muc.rb +70 -0
  107. data/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
  108. data/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
  109. data/lib/xmpp4r/presence.rb +232 -0
  110. data/lib/xmpp4r/pubsub.rb +8 -0
  111. data/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
  112. data/lib/xmpp4r/pubsub/children/event.rb +49 -0
  113. data/lib/xmpp4r/pubsub/children/item.rb +35 -0
  114. data/lib/xmpp4r/pubsub/children/items.rb +53 -0
  115. data/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
  116. data/lib/xmpp4r/pubsub/children/publish.rb +38 -0
  117. data/lib/xmpp4r/pubsub/children/retract.rb +41 -0
  118. data/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
  119. data/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
  120. data/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
  121. data/lib/xmpp4r/pubsub/helper/nodebrowser.rb +129 -0
  122. data/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
  123. data/lib/xmpp4r/pubsub/helper/servicehelper.rb +456 -0
  124. data/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
  125. data/lib/xmpp4r/query.rb +15 -0
  126. data/lib/xmpp4r/reliable.rb +105 -0
  127. data/lib/xmpp4r/rexmladdons.rb +157 -0
  128. data/lib/xmpp4r/roster.rb +7 -0
  129. data/lib/xmpp4r/roster/helper/roster.rb +522 -0
  130. data/lib/xmpp4r/roster/iq/roster.rb +215 -0
  131. data/lib/xmpp4r/roster/x/roster.rb +138 -0
  132. data/lib/xmpp4r/rpc.rb +2 -0
  133. data/lib/xmpp4r/rpc/helper/client.rb +123 -0
  134. data/lib/xmpp4r/rpc/helper/server.rb +74 -0
  135. data/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
  136. data/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
  137. data/lib/xmpp4r/sasl.rb +243 -0
  138. data/lib/xmpp4r/semaphore.rb +38 -0
  139. data/lib/xmpp4r/stream.rb +599 -0
  140. data/lib/xmpp4r/streamparser.rb +85 -0
  141. data/lib/xmpp4r/tune.rb +2 -0
  142. data/lib/xmpp4r/tune/helper/helper.rb +58 -0
  143. data/lib/xmpp4r/tune/tune.rb +113 -0
  144. data/lib/xmpp4r/vcard.rb +6 -0
  145. data/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
  146. data/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
  147. data/lib/xmpp4r/version.rb +7 -0
  148. data/lib/xmpp4r/version/helper/responder.rb +72 -0
  149. data/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
  150. data/lib/xmpp4r/version/iq/version.rb +105 -0
  151. data/lib/xmpp4r/x.rb +37 -0
  152. data/lib/xmpp4r/xhtml.rb +1 -0
  153. data/lib/xmpp4r/xhtml/html.rb +115 -0
  154. data/lib/xmpp4r/xmpp4r.rb +19 -0
  155. data/lib/xmpp4r/xmppelement.rb +168 -0
  156. data/lib/xmpp4r/xmppstanza.rb +162 -0
  157. data/setup.rb +1586 -0
  158. data/test/bytestreams/tc_ibb.rb +188 -0
  159. data/test/bytestreams/tc_socks5bytestreams.rb +114 -0
  160. data/test/caps/tc_helper.rb +158 -0
  161. data/test/dataforms/tc_data.rb +81 -0
  162. data/test/delay/tc_xdelay.rb +51 -0
  163. data/test/discovery/tc_responder.rb +91 -0
  164. data/test/last/tc_helper.rb +75 -0
  165. data/test/lib/assert_equal_xml.rb +14 -0
  166. data/test/lib/clienttester.rb +149 -0
  167. data/test/muc/tc_muc_mucclient.rb +834 -0
  168. data/test/muc/tc_muc_simplemucclient.rb +114 -0
  169. data/test/muc/tc_mucowner.rb +50 -0
  170. data/test/pubsub/tc_helper.rb +722 -0
  171. data/test/pubsub/tc_nodeconfig.rb +54 -0
  172. data/test/pubsub/tc_subscriptionconfig.rb +41 -0
  173. data/test/reliable/listener_mocker.rb +90 -0
  174. data/test/reliable/tc_disconnect_cleanup.rb +334 -0
  175. data/test/reliable/tc_disconnect_exception.rb +37 -0
  176. data/test/reliable/tc_listener_mocked_test.rb +40 -0
  177. data/test/reliable/tc_reliable_connection.rb +32 -0
  178. data/test/roster/tc_helper.rb +524 -0
  179. data/test/roster/tc_iqqueryroster.rb +173 -0
  180. data/test/roster/tc_xroster.rb +73 -0
  181. data/test/rpc/tc_helper.rb +96 -0
  182. data/test/tc_callbacks.rb +129 -0
  183. data/test/tc_class_names.rb +146 -0
  184. data/test/tc_client.rb +30 -0
  185. data/test/tc_errors.rb +146 -0
  186. data/test/tc_idgenerator.rb +30 -0
  187. data/test/tc_iq.rb +113 -0
  188. data/test/tc_iqquery.rb +31 -0
  189. data/test/tc_jid.rb +204 -0
  190. data/test/tc_message.rb +131 -0
  191. data/test/tc_presence.rb +150 -0
  192. data/test/tc_rexml.rb +139 -0
  193. data/test/tc_stream.rb +167 -0
  194. data/test/tc_streamComponent.rb +95 -0
  195. data/test/tc_streamError.rb +129 -0
  196. data/test/tc_streamSend.rb +59 -0
  197. data/test/tc_streamparser.rb +125 -0
  198. data/test/tc_xmppstanza.rb +135 -0
  199. data/test/ts_xmpp4r.rb +53 -0
  200. data/test/tune/tc_helper_recv.rb +82 -0
  201. data/test/tune/tc_helper_send.rb +74 -0
  202. data/test/tune/tc_tune.rb +79 -0
  203. data/test/vcard/tc_helper.rb +49 -0
  204. data/test/vcard/tc_iqvcard.rb +62 -0
  205. data/test/version/tc_helper.rb +60 -0
  206. data/test/version/tc_iqqueryversion.rb +97 -0
  207. data/test/xhtml/tc_html.rb +41 -0
  208. data/tools/gen_requires.bash +31 -0
  209. data/tools/xmpp4r-gemspec-test.rb +11 -0
  210. data/xmpp4r.gemspec +307 -0
  211. metadata +349 -0
data/lib/xmpp4r/jid.rb ADDED
@@ -0,0 +1,167 @@
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
+ ##
7
+ # The JID class represents a Jabber Identifier as described by
8
+ # RFC3920 section 3.1.
9
+ #
10
+ # Note that you can use JIDs also for Sorting, Hash keys, ...
11
+ class JID
12
+ include Comparable
13
+
14
+ PATTERN = /^(?:([^@]*)@)??([^@\/]*)(?:\/(.*?))?$/
15
+
16
+ begin
17
+ require 'idn'
18
+ USE_STRINGPREP = true
19
+ rescue LoadError
20
+ USE_STRINGPREP = false
21
+ end
22
+
23
+ ##
24
+ # Create a new JID. If called as new('a@b/c'), parse the string and
25
+ # split (node, domain, resource)
26
+ def initialize(node = "", domain = nil, resource = nil)
27
+ @resource = resource
28
+ @domain = domain
29
+ @node = node
30
+ if @domain.nil? and @resource.nil? and @node
31
+ @node, @domain, @resource = @node.to_s.scan(PATTERN).first
32
+ end
33
+
34
+ if USE_STRINGPREP
35
+ @node = IDN::Stringprep.nodeprep(@node) if @node
36
+ @domain = IDN::Stringprep.nameprep(@domain) if @domain
37
+ @resource = IDN::Stringprep.resourceprep(@resource) if @resource
38
+ else
39
+ @node.downcase! if @node
40
+ @domain.downcase! if @domain
41
+ end
42
+
43
+ raise ArgumentError, 'Node too long' if (@node || '').length > 1023
44
+ raise ArgumentError, 'Domain too long' if (@domain || '').length > 1023
45
+ raise ArgumentError, 'Resource too long' if (@resource || '').length > 1023
46
+ end
47
+
48
+ ##
49
+ # Returns a string representation of the JID
50
+ # * ""
51
+ # * "domain"
52
+ # * "node@domain"
53
+ # * "domain/resource"
54
+ # * "node@domain/resource"
55
+ def to_s
56
+ s = @domain
57
+ s = "#{@node}@#{s}" if @node
58
+ s += "/#{@resource}" if @resource
59
+ return s
60
+ end
61
+
62
+ ##
63
+ # Returns a new JID with resource removed.
64
+ # return:: [JID]
65
+ def strip
66
+ JID.new(@node, @domain)
67
+ end
68
+ alias_method :bare, :strip
69
+
70
+ ##
71
+ # Removes the resource (sets it to nil)
72
+ # return:: [JID] self
73
+ def strip!
74
+ @resource = nil
75
+ self
76
+ end
77
+ alias_method :bare!, :strip!
78
+
79
+ ##
80
+ # Returns a hash value of the String representation
81
+ # (see JID#to_s)
82
+ def hash
83
+ return to_s.hash
84
+ end
85
+
86
+ ##
87
+ # Ccompare to another JID
88
+ #
89
+ # String representations are compared, see JID#to_s
90
+ def eql?(o)
91
+ to_s.eql?(o.to_s)
92
+ end
93
+
94
+ ##
95
+ # Ccompare to another JID
96
+ #
97
+ # String representations are compared, see JID#to_s
98
+ def ==(o)
99
+ to_s == o.to_s
100
+ end
101
+
102
+ ##
103
+ # Compare two JIDs,
104
+ # helpful for sorting etc.
105
+ #
106
+ # String representations are compared, see JID#to_s
107
+ def <=>(o)
108
+ to_s <=> o.to_s
109
+ end
110
+
111
+ # Get the JID's node
112
+ def node
113
+ @node
114
+ end
115
+
116
+ # Set the JID's node
117
+ def node=(v)
118
+ @node = v.to_s
119
+ if USE_STRINGPREP
120
+ @node = IDN::Stringprep.nodeprep(@node) if @node
121
+ end
122
+ end
123
+
124
+ # Get the JID's domain
125
+ def domain
126
+ return nil if @domain.empty?
127
+ @domain
128
+ end
129
+
130
+ # Set the JID's domain
131
+ def domain=(v)
132
+ @domain = v.to_s
133
+ if USE_STRINGPREP
134
+ @domain = IDN::Stringprep.nodeprep(@domain)
135
+ end
136
+ end
137
+
138
+ # Get the JID's resource
139
+ def resource
140
+ @resource
141
+ end
142
+
143
+ # Set the JID's resource
144
+ def resource=(v)
145
+ @resource = v.to_s
146
+ if USE_STRINGPREP
147
+ @resource = IDN::Stringprep.nodeprep(@resource)
148
+ end
149
+ end
150
+
151
+ # Escape JID
152
+ def JID::escape(jid)
153
+ return jid.to_s.gsub('@', '%')
154
+ end
155
+
156
+ # Test if jid is empty
157
+ def empty?
158
+ to_s.empty?
159
+ end
160
+
161
+ # Test id jid is strepped
162
+ def stripped?
163
+ @resource.nil?
164
+ end
165
+ alias_method :bared?, :stripped?
166
+ end
167
+ end
@@ -0,0 +1,2 @@
1
+ require 'xmpp4r/last/iq/last'
2
+ require 'xmpp4r/last/helper/helper'
@@ -0,0 +1,37 @@
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'
6
+ require 'xmpp4r/last'
7
+
8
+ module Jabber
9
+ module LastActivity
10
+ ##
11
+ # A Helper to manage discovery of Last Activity.
12
+ class Helper
13
+ def initialize(client)
14
+ @stream = client
15
+ end
16
+
17
+ ##
18
+ # Gets the last activity from a JID.
19
+ # jid:: [JID]
20
+ # return:: [Jabber::LastActivity::IqQueryLastActivity]
21
+ def get_last_activity_from(jid)
22
+ iq = Jabber::Iq.new(:get, jid)
23
+ iq.from = @stream.jid
24
+ iq.add(Jabber::LastActivity::IqQueryLastActivity.new)
25
+
26
+ reply = @stream.send_with_id(iq)
27
+
28
+ if reply.query && reply.query.kind_of?(IqQueryLastActivity)
29
+ reply.query
30
+ else
31
+ nil
32
+ end
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,67 @@
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/query'
6
+
7
+ module Jabber
8
+ module LastActivity
9
+ NS_LAST_ACTIVITY = 'jabber:iq:last'
10
+
11
+ ##
12
+ # Class for handling Last Activity queries
13
+ # (XEP-0012)
14
+ class IqQueryLastActivity < IqQuery
15
+ name_xmlns 'query', NS_LAST_ACTIVITY
16
+
17
+ ##
18
+ # Get the number of seconds since last activity.
19
+ #
20
+ # With a bare jid, this will return the number of seconds since the
21
+ # client was last seen (offline user query).
22
+ #
23
+ # With a full jid, this will return the number of seconds that the
24
+ # client has been idle (online user query).
25
+ #
26
+ # With a server, this will return the server or component's uptime in
27
+ # seconds (server / component query).
28
+ def seconds
29
+ attributes['seconds'] ? attributes['seconds'].to_i : nil
30
+ end
31
+
32
+ ##
33
+ # Set the number of seconds since last activity
34
+ def seconds=(val)
35
+ attributes['seconds'] = val.to_s
36
+ end
37
+
38
+ ##
39
+ # Set the number of seconds since last activity
40
+ # (chaining-friendly)
41
+ def set_second(val)
42
+ self.seconds = val
43
+ self
44
+ end
45
+
46
+ ##
47
+ # For an offline user query, get the last status.
48
+ def status
49
+ self.text
50
+ end
51
+
52
+ ##
53
+ # For an offline user query, set the last status.
54
+ def status=(val)
55
+ self.text = val
56
+ end
57
+
58
+ ##
59
+ # For an offline user query, set the last status.
60
+ # (chaining-friendly)
61
+ def set_status(val)
62
+ self.status = val
63
+ self
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,180 @@
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/xmppstanza'
6
+ require 'xmpp4r/x'
7
+
8
+ module Jabber
9
+ ##
10
+ # The Message class manages the <message/> stanzas,
11
+ # which is used for all messaging communication.
12
+ class Message < XMPPStanza
13
+
14
+ CHAT_STATES = %w(active composing gone inactive paused).freeze
15
+
16
+ name_xmlns 'message', 'jabber:client'
17
+ force_xmlns true
18
+
19
+ include XParent
20
+
21
+ ##
22
+ # Create a new message
23
+ # >to:: a JID or a String object to send the message to.
24
+ # >body:: the message's body
25
+ def initialize(to = nil, body = nil)
26
+ super()
27
+ if not to.nil?
28
+ set_to(to)
29
+ end
30
+ if !body.nil?
31
+ add_element(REXML::Element.new("body").add_text(body))
32
+ end
33
+ end
34
+
35
+ ##
36
+ # Get the type of the Message stanza
37
+ #
38
+ # The following Symbols are allowed:
39
+ # * :chat
40
+ # * :error
41
+ # * :groupchat
42
+ # * :headline
43
+ # * :normal
44
+ # result:: [Symbol] or nil
45
+ def type
46
+ case super
47
+ when 'chat' then :chat
48
+ when 'error' then :error
49
+ when 'groupchat' then :groupchat
50
+ when 'headline' then :headline
51
+ when 'normal' then :normal
52
+ else nil
53
+ end
54
+ end
55
+
56
+ ##
57
+ # Set the type of the Message stanza (see Message#type for details)
58
+ # v:: [Symbol] or nil
59
+ def type=(v)
60
+ case v
61
+ when :chat then super('chat')
62
+ when :error then super('error')
63
+ when :groupchat then super('groupchat')
64
+ when :headline then super('headline')
65
+ when :normal then super('normal')
66
+ else super(nil)
67
+ end
68
+ end
69
+
70
+ ##
71
+ # Set the type of the Message stanza (chaining-friendly)
72
+ # v:: [Symbol] or nil
73
+ def set_type(v)
74
+ self.type = v
75
+ self
76
+ end
77
+
78
+ ##
79
+ # Returns the message's body, or nil.
80
+ # This is the message's plain-text content.
81
+ def body
82
+ first_element_text('body')
83
+ end
84
+
85
+ ##
86
+ # Sets the message's body
87
+ #
88
+ # b:: [String] body to set
89
+ def body=(b)
90
+ replace_element_text('body', b)
91
+ end
92
+
93
+ ##
94
+ # Sets the message's body
95
+ #
96
+ # b:: [String] body to set
97
+ # return:: [REXML::Element] self for chaining
98
+ def set_body(b)
99
+ self.body = b
100
+ self
101
+ end
102
+
103
+ ##
104
+ # sets the message's subject
105
+ #
106
+ # s:: [String] subject to set
107
+ def subject=(s)
108
+ replace_element_text('subject', s)
109
+ end
110
+
111
+ ##
112
+ # sets the message's subject
113
+ #
114
+ # s:: [String] subject to set
115
+ # return:: [REXML::Element] self for chaining
116
+ def set_subject(s)
117
+ self.subject = s
118
+ self
119
+ end
120
+
121
+ ##
122
+ # Returns the message's subject, or nil
123
+ def subject
124
+ first_element_text('subject')
125
+ end
126
+
127
+ ##
128
+ # sets the message's thread
129
+ # s:: [String] thread to set
130
+ def thread=(s)
131
+ delete_elements('thread')
132
+ replace_element_text('thread', s) unless s.nil?
133
+ end
134
+
135
+ ##
136
+ # gets the message's thread (chaining-friendly)
137
+ # Please note that this are not [Thread] but a [String]-Identifier to track conversations
138
+ # s:: [String] thread to set
139
+ def set_thread(s)
140
+ self.thread = s
141
+ self
142
+ end
143
+
144
+ ##
145
+ # Returns the message's thread, or nil
146
+ def thread
147
+ first_element_text('thread')
148
+ end
149
+
150
+ ##
151
+ # Returns the current chat state, or nil if no chat state is set
152
+ def chat_state
153
+ each_elements(*CHAT_STATES) { |el| return el.name.to_sym }
154
+ return nil
155
+ end
156
+
157
+ ##
158
+ # Sets the chat state :active, :composing, :gone, :inactive, :paused
159
+ def chat_state=(s)
160
+ s = s.to_s
161
+ raise InvalidChatState, "Chat state must be one of #{CHAT_STATES.join(', ')}" unless CHAT_STATES.include?(s)
162
+ CHAT_STATES.each { |state| delete_elements(state) }
163
+ add_element(REXML::Element.new(s).add_namespace('http://jabber.org/protocol/chatstates'))
164
+ end
165
+
166
+ ##
167
+ # Sets the message's chat state
168
+ def set_chat_state(s)
169
+ self.state = s
170
+ self
171
+ end
172
+
173
+ CHAT_STATES.each do |state|
174
+ define_method("#{state}?") do
175
+ chat_state == state.to_sym
176
+ end
177
+ end
178
+
179
+ end
180
+ end