ln-xmpp4r 0.5

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 (215) hide show
  1. data/CHANGELOG +91 -0
  2. data/COPYING +340 -0
  3. data/LICENSE +59 -0
  4. data/README.rdoc +113 -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/location.rb +2 -0
  98. data/lib/xmpp4r/location/helper/helper.rb +56 -0
  99. data/lib/xmpp4r/location/location.rb +179 -0
  100. data/lib/xmpp4r/message.rb +180 -0
  101. data/lib/xmpp4r/muc.rb +14 -0
  102. data/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
  103. data/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
  104. data/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
  105. data/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
  106. data/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
  107. data/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
  108. data/lib/xmpp4r/muc/item.rb +143 -0
  109. data/lib/xmpp4r/muc/x/muc.rb +70 -0
  110. data/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
  111. data/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
  112. data/lib/xmpp4r/presence.rb +232 -0
  113. data/lib/xmpp4r/pubsub.rb +8 -0
  114. data/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
  115. data/lib/xmpp4r/pubsub/children/event.rb +49 -0
  116. data/lib/xmpp4r/pubsub/children/item.rb +35 -0
  117. data/lib/xmpp4r/pubsub/children/items.rb +53 -0
  118. data/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
  119. data/lib/xmpp4r/pubsub/children/publish.rb +38 -0
  120. data/lib/xmpp4r/pubsub/children/retract.rb +41 -0
  121. data/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
  122. data/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
  123. data/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
  124. data/lib/xmpp4r/pubsub/helper/nodebrowser.rb +129 -0
  125. data/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
  126. data/lib/xmpp4r/pubsub/helper/oauth_service_helper.rb +90 -0
  127. data/lib/xmpp4r/pubsub/helper/servicehelper.rb +456 -0
  128. data/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
  129. data/lib/xmpp4r/query.rb +15 -0
  130. data/lib/xmpp4r/reliable.rb +168 -0
  131. data/lib/xmpp4r/rexmladdons.rb +157 -0
  132. data/lib/xmpp4r/roster.rb +7 -0
  133. data/lib/xmpp4r/roster/helper/roster.rb +522 -0
  134. data/lib/xmpp4r/roster/iq/roster.rb +215 -0
  135. data/lib/xmpp4r/roster/x/roster.rb +138 -0
  136. data/lib/xmpp4r/rpc.rb +2 -0
  137. data/lib/xmpp4r/rpc/helper/client.rb +123 -0
  138. data/lib/xmpp4r/rpc/helper/server.rb +74 -0
  139. data/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
  140. data/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
  141. data/lib/xmpp4r/sasl.rb +248 -0
  142. data/lib/xmpp4r/semaphore.rb +38 -0
  143. data/lib/xmpp4r/stream.rb +599 -0
  144. data/lib/xmpp4r/streamparser.rb +85 -0
  145. data/lib/xmpp4r/test/listener_mocker.rb +118 -0
  146. data/lib/xmpp4r/tune.rb +2 -0
  147. data/lib/xmpp4r/tune/helper/helper.rb +58 -0
  148. data/lib/xmpp4r/tune/tune.rb +113 -0
  149. data/lib/xmpp4r/vcard.rb +6 -0
  150. data/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
  151. data/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
  152. data/lib/xmpp4r/version.rb +7 -0
  153. data/lib/xmpp4r/version/helper/responder.rb +72 -0
  154. data/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
  155. data/lib/xmpp4r/version/iq/version.rb +105 -0
  156. data/lib/xmpp4r/x.rb +37 -0
  157. data/lib/xmpp4r/xhtml.rb +1 -0
  158. data/lib/xmpp4r/xhtml/html.rb +115 -0
  159. data/lib/xmpp4r/xmpp4r.rb +20 -0
  160. data/lib/xmpp4r/xmppelement.rb +168 -0
  161. data/lib/xmpp4r/xmppstanza.rb +162 -0
  162. data/setup.rb +1586 -0
  163. data/test/bytestreams/tc_ibb.rb +188 -0
  164. data/test/bytestreams/tc_socks5bytestreams.rb +114 -0
  165. data/test/caps/tc_helper.rb +158 -0
  166. data/test/dataforms/tc_data.rb +81 -0
  167. data/test/delay/tc_xdelay.rb +51 -0
  168. data/test/discovery/tc_responder.rb +91 -0
  169. data/test/last/tc_helper.rb +75 -0
  170. data/test/lib/assert_equal_xml.rb +14 -0
  171. data/test/lib/clienttester.rb +149 -0
  172. data/test/muc/tc_muc_mucclient.rb +834 -0
  173. data/test/muc/tc_muc_simplemucclient.rb +114 -0
  174. data/test/muc/tc_mucowner.rb +50 -0
  175. data/test/pubsub/tc_helper.rb +785 -0
  176. data/test/pubsub/tc_nodeconfig.rb +61 -0
  177. data/test/pubsub/tc_subscriptionconfig.rb +41 -0
  178. data/test/reliable/tc_disconnect_cleanup.rb +334 -0
  179. data/test/reliable/tc_disconnect_exception.rb +37 -0
  180. data/test/reliable/tc_listener_mocked_test.rb +68 -0
  181. data/test/reliable/tc_reliable_connection.rb +31 -0
  182. data/test/roster/tc_helper.rb +524 -0
  183. data/test/roster/tc_iqqueryroster.rb +173 -0
  184. data/test/roster/tc_xroster.rb +73 -0
  185. data/test/rpc/tc_helper.rb +96 -0
  186. data/test/tc_callbacks.rb +129 -0
  187. data/test/tc_class_names.rb +146 -0
  188. data/test/tc_client.rb +30 -0
  189. data/test/tc_errors.rb +146 -0
  190. data/test/tc_idgenerator.rb +30 -0
  191. data/test/tc_iq.rb +113 -0
  192. data/test/tc_iqquery.rb +31 -0
  193. data/test/tc_jid.rb +204 -0
  194. data/test/tc_message.rb +131 -0
  195. data/test/tc_presence.rb +150 -0
  196. data/test/tc_rexml.rb +139 -0
  197. data/test/tc_stream.rb +167 -0
  198. data/test/tc_streamComponent.rb +95 -0
  199. data/test/tc_streamError.rb +129 -0
  200. data/test/tc_streamSend.rb +59 -0
  201. data/test/tc_streamparser.rb +125 -0
  202. data/test/tc_xmppstanza.rb +135 -0
  203. data/test/ts_xmpp4r.rb +44 -0
  204. data/test/tune/tc_helper_recv.rb +82 -0
  205. data/test/tune/tc_helper_send.rb +74 -0
  206. data/test/tune/tc_tune.rb +79 -0
  207. data/test/vcard/tc_helper.rb +49 -0
  208. data/test/vcard/tc_iqvcard.rb +62 -0
  209. data/test/version/tc_helper.rb +60 -0
  210. data/test/version/tc_iqqueryversion.rb +97 -0
  211. data/test/xhtml/tc_html.rb +41 -0
  212. data/tools/gen_requires.bash +31 -0
  213. data/tools/xmpp4r-gemspec-test.rb +11 -0
  214. data/xmpp4r.gemspec +238 -0
  215. metadata +280 -0
@@ -0,0 +1,85 @@
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 'rexml/parsers/sax2parser'
6
+ require 'rexml/source'
7
+ require 'xmpp4r/rexmladdons'
8
+
9
+ module Jabber
10
+
11
+ ##
12
+ # The StreamParser uses REXML to parse the incoming XML stream
13
+ # of the Jabber protocol and fires XMPPStanza at the Connection
14
+ # instance.
15
+ #
16
+ class StreamParser
17
+ # status if the parser is started
18
+ attr_reader :started
19
+
20
+ ##
21
+ # Constructs a parser for the supplied stream (socket input)
22
+ #
23
+ # stream:: [IO] Socket input stream
24
+ # listener:: [Object.receive(XMPPStanza)] The listener (usually a Jabber::Protocol::Connection instance)
25
+ #
26
+ def initialize(stream, listener)
27
+ @stream = stream
28
+ @listener = listener
29
+ @current = nil
30
+ end
31
+
32
+ ##
33
+ # Begins parsing the XML stream and does not return until
34
+ # the stream closes.
35
+ #
36
+ def parse
37
+ @started = false
38
+ begin
39
+ parser = REXML::Parsers::SAX2Parser.new @stream
40
+
41
+ parser.listen( :start_element ) do |uri, localname, qname, attributes|
42
+ e = REXML::Element.new(qname)
43
+ e.add_attributes attributes
44
+ @current = @current.nil? ? e : @current.add_element(e)
45
+
46
+ # Handling <stream:stream> not only when it is being
47
+ # received as a top-level tag but also as a child of the
48
+ # top-level element itself. This way, we handle stream
49
+ # restarts (ie. after SASL authentication).
50
+ if @current.name == 'stream' and @current.parent.nil?
51
+ @started = true
52
+ @listener.receive(@current)
53
+ @current = nil
54
+ end
55
+ end
56
+
57
+ parser.listen( :end_element ) do |uri, localname, qname|
58
+ if qname == 'stream:stream' and @current.nil?
59
+ @started = false
60
+ @listener.parser_end
61
+ else
62
+ @listener.receive(@current) unless @current.parent
63
+ @current = @current.parent
64
+ end
65
+ end
66
+
67
+ parser.listen( :end_document ) do
68
+ raise Jabber::ServerDisconnected, "Server Disconnected!"
69
+ end
70
+
71
+ parser.listen( :characters ) do | text |
72
+ @current.add(REXML::Text.new(text.to_s, @current.whitespace, nil, true)) if @current
73
+ end
74
+
75
+ parser.listen( :cdata ) do | text |
76
+ @current.add(REXML::CData.new(text)) if @current
77
+ end
78
+
79
+ parser.parse
80
+ rescue REXML::ParseException => e
81
+ @listener.parse_failure(e)
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,118 @@
1
+ module Jabber
2
+ module Test
3
+ class ListenerMocker
4
+
5
+ class << self
6
+ attr_accessor :with_socket_mocked_callback_proc
7
+ end
8
+
9
+ def self.with_socket_mocked(callback_proc)
10
+ TCPSocket.class_eval{ ListenerMocker.with_socket_mocked_callback_proc = callback_proc }
11
+ TCPSocket.class_eval do
12
+ alias_method :initialize_old, :initialize
13
+ def initialize(*args)
14
+ initialize_old(*args) if ListenerMocker.with_socket_mocked_callback_proc.call(args)
15
+ end
16
+ end
17
+ yield
18
+ ensure
19
+ TCPSocket.class_eval do
20
+ if method_defined?(:initialize_old)
21
+ alias_method :initialize, :initialize_old
22
+ end
23
+ end
24
+ end
25
+
26
+ class << self
27
+ attr_accessor :mock_clients, :tracker_of_callers
28
+ end
29
+
30
+ def self.mocker_proc
31
+ Proc.new do
32
+ attr_accessor :messagecbs, :connected
33
+ ListenerMocker.mock_clients ||= {}
34
+ ListenerMocker.tracker_of_callers ||= {}
35
+
36
+ def connect
37
+ Jabber::debuglog("(in mock) connected #{@jid.bare}")
38
+ self.connected = true
39
+ end
40
+
41
+ def close!
42
+ ListenerMocker.mock_clients[@jid.bare.to_s] = nil
43
+ ListenerMocker.tracker_of_callers[@jid.bare.to_s] = nil
44
+ self.connected = false
45
+ end
46
+
47
+ def auth(password)
48
+ auth_nonsasl(password)
49
+ end
50
+
51
+ def auth_nonsasl(password, digest=true)
52
+ Jabber::debuglog("(in mock) authed #{@jid.bare}")
53
+
54
+ if(ListenerMocker.mock_clients[@jid.bare.to_s])
55
+ #raise a stack trace about multiple clients
56
+ raise "\n\n ---> READ ME: this is actualy 2 stack traces: <---- \n\n"+
57
+ "There is already a client connected on that jid #{@jid.bare.to_s}. "+
58
+ "The mock library cannot support multiple listeners connected as the same user! originally called in:\n"+
59
+ ListenerMocker.tracker_of_callers[@jid.bare.to_s].backtrace.join("\n")+"\n\n second trace: \n"
60
+ else
61
+ #store a stack trace so that next time we have multiple client, we can alert about it...
62
+ begin
63
+ throw "just saving a stack trace"
64
+ rescue => e
65
+ ListenerMocker.tracker_of_callers[@jid.bare.to_s] = e
66
+ end
67
+ end
68
+
69
+ ListenerMocker.mock_clients[@jid.bare.to_s] = self
70
+ true
71
+ end
72
+
73
+ def send(xml, &block)
74
+ Jabber::debuglog("(in mock) sending #{xml} #{xml.class}")
75
+ if(xml.is_a?(Jabber::Message))
76
+ xml.from = @jid
77
+ # unless xml.to
78
+ # raise "no jid!"
79
+ # end
80
+ if ListenerMocker.mock_clients[xml.to.bare.to_s]
81
+ Jabber::debuglog("(in mock) to #{xml.to.bare.to_s}")
82
+ ListenerMocker.mock_clients[xml.to.bare.to_s].messagecbs.process(xml)
83
+ else
84
+ Jabber::debuglog("(in mock) no client listening as #{xml.to.bare.to_s}")
85
+ end
86
+ end
87
+ end
88
+
89
+ def is_connected?
90
+ self.connected
91
+ end
92
+ end
93
+ end
94
+
95
+ def self.mock_out_all_connections
96
+ Jabber::Reliable::Connection.class_eval(&Jabber::Test::ListenerMocker.mocker_proc)
97
+ end
98
+
99
+ def self.mock_out(listener)
100
+ listener.instance_eval do
101
+ class << self
102
+ def setup_connection
103
+ super
104
+ @connection.instance_eval do
105
+ class << self
106
+ self.class_eval(&Jabber::Test::ListenerMocker.mocker_proc)
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ listener
114
+ end
115
+
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,2 @@
1
+ require 'xmpp4r/tune/tune'
2
+ require 'xmpp4r/tune/helper/helper'
@@ -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
+ require 'xmpp4r'
6
+ require 'xmpp4r/pubsub'
7
+ require 'xmpp4r/tune/tune'
8
+
9
+ module Jabber
10
+ module UserTune
11
+ ##
12
+ # A Helper for XEP-0118 User Tune
13
+ #
14
+ # Use this helper to send user tunes, or receive them from a
15
+ # specified jid. Described at http://www.xmpp.org/extensions/xep-0118.html
16
+ #
17
+ # For example:
18
+ # <pre>
19
+ # h = UserTune::Helper( @client, 'radio1@hug.hellomatty.com' )
20
+ # h.add_usertune_callback do |tune|
21
+ # puts "Now playing: #{tune.title} by #{tune.artist}"
22
+ # end
23
+ # </pre>
24
+ #
25
+ # Also see the examples provided.
26
+ class Helper < PubSub::ServiceHelper
27
+ ##
28
+ # Send out the tune currently playing.
29
+ #
30
+ # track:: [Jabber::UserTune::Tune] the tune currently playing
31
+ def now_playing(track)
32
+ item = Jabber::PubSub::Item.new()
33
+ item.add(track)
34
+
35
+ publish_item_to(NS_USERTUNE, item)
36
+ end
37
+
38
+ ##
39
+ # Use this method to indicate that you have stopped playing
40
+ # a tune.
41
+ def stop_playing
42
+ now_playing(Jabber::UserTune::Tune.new())
43
+ end
44
+
45
+ ##
46
+ # Add a callback that will be invoked when a tune is received
47
+ # from the jid specified when you constructed the Helper.
48
+ def add_usertune_callback(prio = 200, ref = nil, &block)
49
+ add_event_callback(prio, ref) do |event|
50
+ tune = event.first_element('items/item/tune')
51
+ if tune
52
+ block.call(tune)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,113 @@
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/xmppelement'
6
+ require 'rexml/element'
7
+
8
+ module Jabber
9
+ module UserTune
10
+ NS_USERTUNE = 'http://jabber.org/protocol/tune'
11
+
12
+ ##
13
+ # The <tune> XMPP element, as defined in XEP-0118 User Tune
14
+ #
15
+ # See http://www.xmpp.org/extensions/xep-0118.html - this element
16
+ # encapsulates metadata (artist, track etc) about a tune the user
17
+ # is currently playing. These are expressed as child elements
18
+ # such as <artist>, <title> etc which are also managed by this class.
19
+ #
20
+ # If the element has no children then it indicates that the user
21
+ # has stopped playing a tune. Use the Tune#playing? method to discover
22
+ # this?
23
+ class Tune < XMPPElement
24
+ name_xmlns 'tune', NS_USERTUNE
25
+ force_xmlns true
26
+
27
+ ##
28
+ # Construct a new <tune> element.
29
+ #
30
+ # Supply no arguments to make an
31
+ # empty element to indicate that tune playing has stopped.
32
+ #
33
+ # artist:: [String] the artist or performer of the song or piece
34
+ # title:: [String] the title of the song or piece
35
+ # length:: [Fixnum] the duration of the song or piece in seconds
36
+ # track:: [String] a unique identifier for the tune; e.g., the track number within a collection or the specific URI for the object (e.g., a stream or audio file)
37
+ # source:: [String] the collection (e.g., album) or other source (e.g., a band website that hosts streams or audio files)
38
+ # uri:: [String] a URI or URL pointing to information about the song, collection, or artist
39
+ # rating:: [Numeric] a number indicating how much you like this song - will be clamped into an integer 0 <= x <= 10
40
+ def initialize(artist = nil, title = nil, length = nil, track = nil, source = nil, uri = nil, rating = nil)
41
+ super()
42
+
43
+ add_element(REXML::Element.new('artist')).text = artist if artist
44
+
45
+ add_element(REXML::Element.new('title')).text = title if title
46
+
47
+ add_element(REXML::Element.new('length')).text = length.to_s if length
48
+
49
+ add_element(REXML::Element.new('track')).text = track if track
50
+
51
+ add_element(REXML::Element.new('source')).text = source if source
52
+
53
+ add_element(REXML::Element.new('uri')).text = uri if uri
54
+
55
+ if rating and rating.kind_of?(Numeric)
56
+ r = rating.to_i
57
+ r = 0 if r < 0
58
+ r = 10 if r > 10
59
+ add_element(REXML::Element.new('rating')).text = r.to_s
60
+ end
61
+ end
62
+
63
+
64
+ ##
65
+ # Returns true if a tune is currently playing, otherwise false.
66
+ def playing?
67
+ (elements.size > 0)
68
+ end
69
+
70
+ ##
71
+ # Get the artist for this tune.
72
+ def artist
73
+ first_element('artist').text if first_element('artist')
74
+ end
75
+
76
+ ##
77
+ # Get the title of this tune.
78
+ def title
79
+ first_element('title').text if first_element('title')
80
+ end
81
+
82
+ ##
83
+ # Get the length of this tune, in seconds.
84
+ def length
85
+ first_element('length').text.to_i if first_element('length')
86
+ end
87
+
88
+ ##
89
+ # Get an identitier for this tune.
90
+ def track
91
+ first_element('track').text if first_element('track')
92
+ end
93
+
94
+ ##
95
+ # Get the source of this tune, such as an album.
96
+ def source
97
+ first_element('source').text if first_element('source')
98
+ end
99
+
100
+ ##
101
+ # Get a URI that represents this tune.
102
+ def uri
103
+ first_element('uri').text if first_element('uri')
104
+ end
105
+
106
+ ##
107
+ # Get the rating for this track
108
+ def rating
109
+ first_element('rating').text.to_i if first_element('rating')
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,6 @@
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/vcard/helper/vcard.rb'
6
+ require 'xmpp4r/vcard/iq/vcard.rb'
@@ -0,0 +1,84 @@
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
+ module Vcard
9
+ ##
10
+ # The Vcard helper retrieves vCards
11
+ class Helper
12
+ ##
13
+ # Initialize a new Vcard helper
14
+ def initialize(stream)
15
+ @stream = stream
16
+ end
17
+
18
+ ##
19
+ # Retrieve vCard of an entity
20
+ #
21
+ # Raises exception upon retrieval error, please catch that!
22
+ # (The exception is ServerError and is raisen by
23
+ # Stream#send_with_id.
24
+ #
25
+ # Usage of Threads is suggested here as vCards can be very
26
+ # big (see <tt>/iq/vCard/PHOTO/BINVAL</tt>).
27
+ #
28
+ # jid:: [Jabber::JID] or nil (should be stripped, nil for the client's own vCard)
29
+ # result:: [Jabber::IqVcard] or nil (nil results may be handled as empty vCards)
30
+ def get(jid=nil)
31
+ res = nil
32
+ request = Iq.new(:get, jid)
33
+ request.from = @stream.jid # Enable components to use this
34
+ request.add(IqVcard.new)
35
+ @stream.send_with_id(request) { |answer|
36
+ # No check for sender or queryns needed (see send_with_id)
37
+ if answer.type == :result
38
+ res = answer.vcard
39
+ true
40
+ else
41
+ false
42
+ end
43
+ }
44
+ res
45
+ end
46
+
47
+ ##
48
+ # Set your own vCard (Clients only)
49
+ #
50
+ # Raises exception when setting fails
51
+ #
52
+ # Usage of Threads suggested here, too. The function
53
+ # waits for approval from the server.
54
+ #
55
+ # iqvcard:: [Jabber::IqVcard]
56
+ def set(iqvcard)
57
+ iq = Iq.new(:set)
58
+ iq.add(iqvcard)
59
+
60
+ @stream.send_with_id(iq) { |answer|
61
+ if answer.type == :result
62
+ true
63
+ else
64
+ false
65
+ end
66
+ }
67
+ end
68
+
69
+ ##
70
+ # Quickly initialize a Vcard helper and get
71
+ # a vCard. See Vcard#get
72
+ def self.get(stream, jid=nil)
73
+ new(stream).get(jid)
74
+ end
75
+
76
+ ##
77
+ # Quickly initialize a Vcard helper and set
78
+ # your vCard. See Vcard#set
79
+ def self.set(stream, iqvcard)
80
+ new(stream).set(iqvcard)
81
+ end
82
+ end
83
+ end
84
+ end