tp-blather 0.8.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.
Files changed (150) hide show
  1. data/.autotest +13 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +19 -0
  4. data/.rspec +3 -0
  5. data/.travis.yml +8 -0
  6. data/CHANGELOG.md +249 -0
  7. data/Gemfile +4 -0
  8. data/Guardfile +5 -0
  9. data/LICENSE +22 -0
  10. data/README.md +413 -0
  11. data/Rakefile +20 -0
  12. data/TODO.md +2 -0
  13. data/blather.gemspec +51 -0
  14. data/examples/certs/README +20 -0
  15. data/examples/certs/ca-bundle.crt +3987 -0
  16. data/examples/echo.rb +19 -0
  17. data/examples/execute.rb +17 -0
  18. data/examples/ping_pong.rb +38 -0
  19. data/examples/print_hierarchy.rb +77 -0
  20. data/examples/rosterprint.rb +15 -0
  21. data/examples/stream_only.rb +28 -0
  22. data/examples/trusted_echo.rb +21 -0
  23. data/examples/xmpp4r/echo.rb +36 -0
  24. data/lib/blather.rb +112 -0
  25. data/lib/blather/cert_store.rb +53 -0
  26. data/lib/blather/client.rb +95 -0
  27. data/lib/blather/client/client.rb +345 -0
  28. data/lib/blather/client/dsl.rb +320 -0
  29. data/lib/blather/client/dsl/pubsub.rb +174 -0
  30. data/lib/blather/core_ext/eventmachine.rb +125 -0
  31. data/lib/blather/core_ext/ipaddr.rb +20 -0
  32. data/lib/blather/errors.rb +69 -0
  33. data/lib/blather/errors/sasl_error.rb +44 -0
  34. data/lib/blather/errors/stanza_error.rb +110 -0
  35. data/lib/blather/errors/stream_error.rb +84 -0
  36. data/lib/blather/file_transfer.rb +107 -0
  37. data/lib/blather/file_transfer/ibb.rb +68 -0
  38. data/lib/blather/file_transfer/s5b.rb +114 -0
  39. data/lib/blather/jid.rb +141 -0
  40. data/lib/blather/roster.rb +118 -0
  41. data/lib/blather/roster_item.rb +146 -0
  42. data/lib/blather/stanza.rb +167 -0
  43. data/lib/blather/stanza/disco.rb +32 -0
  44. data/lib/blather/stanza/disco/capabilities.rb +161 -0
  45. data/lib/blather/stanza/disco/disco_info.rb +205 -0
  46. data/lib/blather/stanza/disco/disco_items.rb +134 -0
  47. data/lib/blather/stanza/iq.rb +144 -0
  48. data/lib/blather/stanza/iq/command.rb +339 -0
  49. data/lib/blather/stanza/iq/ibb.rb +86 -0
  50. data/lib/blather/stanza/iq/ping.rb +50 -0
  51. data/lib/blather/stanza/iq/query.rb +53 -0
  52. data/lib/blather/stanza/iq/roster.rb +185 -0
  53. data/lib/blather/stanza/iq/s5b.rb +208 -0
  54. data/lib/blather/stanza/iq/si.rb +415 -0
  55. data/lib/blather/stanza/iq/vcard.rb +149 -0
  56. data/lib/blather/stanza/message.rb +428 -0
  57. data/lib/blather/stanza/message/muc_user.rb +119 -0
  58. data/lib/blather/stanza/muc/muc_user_base.rb +54 -0
  59. data/lib/blather/stanza/presence.rb +172 -0
  60. data/lib/blather/stanza/presence/c.rb +100 -0
  61. data/lib/blather/stanza/presence/muc.rb +35 -0
  62. data/lib/blather/stanza/presence/muc_user.rb +147 -0
  63. data/lib/blather/stanza/presence/status.rb +218 -0
  64. data/lib/blather/stanza/presence/subscription.rb +100 -0
  65. data/lib/blather/stanza/pubsub.rb +119 -0
  66. data/lib/blather/stanza/pubsub/affiliations.rb +79 -0
  67. data/lib/blather/stanza/pubsub/create.rb +65 -0
  68. data/lib/blather/stanza/pubsub/errors.rb +18 -0
  69. data/lib/blather/stanza/pubsub/event.rb +139 -0
  70. data/lib/blather/stanza/pubsub/items.rb +103 -0
  71. data/lib/blather/stanza/pubsub/publish.rb +103 -0
  72. data/lib/blather/stanza/pubsub/retract.rb +92 -0
  73. data/lib/blather/stanza/pubsub/subscribe.rb +68 -0
  74. data/lib/blather/stanza/pubsub/subscription.rb +135 -0
  75. data/lib/blather/stanza/pubsub/subscriptions.rb +83 -0
  76. data/lib/blather/stanza/pubsub/unsubscribe.rb +84 -0
  77. data/lib/blather/stanza/pubsub_owner.rb +51 -0
  78. data/lib/blather/stanza/pubsub_owner/delete.rb +52 -0
  79. data/lib/blather/stanza/pubsub_owner/purge.rb +52 -0
  80. data/lib/blather/stanza/x.rb +416 -0
  81. data/lib/blather/stream.rb +266 -0
  82. data/lib/blather/stream/client.rb +32 -0
  83. data/lib/blather/stream/component.rb +39 -0
  84. data/lib/blather/stream/features.rb +70 -0
  85. data/lib/blather/stream/features/register.rb +38 -0
  86. data/lib/blather/stream/features/resource.rb +63 -0
  87. data/lib/blather/stream/features/sasl.rb +190 -0
  88. data/lib/blather/stream/features/session.rb +45 -0
  89. data/lib/blather/stream/features/tls.rb +29 -0
  90. data/lib/blather/stream/parser.rb +102 -0
  91. data/lib/blather/version.rb +3 -0
  92. data/lib/blather/xmpp_node.rb +94 -0
  93. data/spec/blather/client/client_spec.rb +687 -0
  94. data/spec/blather/client/dsl/pubsub_spec.rb +492 -0
  95. data/spec/blather/client/dsl_spec.rb +266 -0
  96. data/spec/blather/errors/sasl_error_spec.rb +33 -0
  97. data/spec/blather/errors/stanza_error_spec.rb +129 -0
  98. data/spec/blather/errors/stream_error_spec.rb +108 -0
  99. data/spec/blather/errors_spec.rb +33 -0
  100. data/spec/blather/file_transfer_spec.rb +135 -0
  101. data/spec/blather/jid_spec.rb +87 -0
  102. data/spec/blather/roster_item_spec.rb +134 -0
  103. data/spec/blather/roster_spec.rb +107 -0
  104. data/spec/blather/stanza/discos/disco_info_spec.rb +247 -0
  105. data/spec/blather/stanza/discos/disco_items_spec.rb +154 -0
  106. data/spec/blather/stanza/iq/command_spec.rb +206 -0
  107. data/spec/blather/stanza/iq/ibb_spec.rb +124 -0
  108. data/spec/blather/stanza/iq/ping_spec.rb +45 -0
  109. data/spec/blather/stanza/iq/query_spec.rb +64 -0
  110. data/spec/blather/stanza/iq/roster_spec.rb +139 -0
  111. data/spec/blather/stanza/iq/s5b_spec.rb +57 -0
  112. data/spec/blather/stanza/iq/si_spec.rb +98 -0
  113. data/spec/blather/stanza/iq/vcard_spec.rb +93 -0
  114. data/spec/blather/stanza/iq_spec.rb +61 -0
  115. data/spec/blather/stanza/message/muc_user_spec.rb +152 -0
  116. data/spec/blather/stanza/message_spec.rb +282 -0
  117. data/spec/blather/stanza/presence/c_spec.rb +56 -0
  118. data/spec/blather/stanza/presence/muc_spec.rb +37 -0
  119. data/spec/blather/stanza/presence/muc_user_spec.rb +83 -0
  120. data/spec/blather/stanza/presence/status_spec.rb +144 -0
  121. data/spec/blather/stanza/presence/subscription_spec.rb +102 -0
  122. data/spec/blather/stanza/presence_spec.rb +125 -0
  123. data/spec/blather/stanza/pubsub/affiliations_spec.rb +57 -0
  124. data/spec/blather/stanza/pubsub/create_spec.rb +56 -0
  125. data/spec/blather/stanza/pubsub/event_spec.rb +98 -0
  126. data/spec/blather/stanza/pubsub/items_spec.rb +79 -0
  127. data/spec/blather/stanza/pubsub/publish_spec.rb +83 -0
  128. data/spec/blather/stanza/pubsub/retract_spec.rb +75 -0
  129. data/spec/blather/stanza/pubsub/subscribe_spec.rb +61 -0
  130. data/spec/blather/stanza/pubsub/subscription_spec.rb +97 -0
  131. data/spec/blather/stanza/pubsub/subscriptions_spec.rb +59 -0
  132. data/spec/blather/stanza/pubsub/unsubscribe_spec.rb +74 -0
  133. data/spec/blather/stanza/pubsub_owner/delete_spec.rb +50 -0
  134. data/spec/blather/stanza/pubsub_owner/purge_spec.rb +50 -0
  135. data/spec/blather/stanza/pubsub_owner_spec.rb +27 -0
  136. data/spec/blather/stanza/pubsub_spec.rb +68 -0
  137. data/spec/blather/stanza/x_spec.rb +231 -0
  138. data/spec/blather/stanza_spec.rb +134 -0
  139. data/spec/blather/stream/client_spec.rb +1090 -0
  140. data/spec/blather/stream/component_spec.rb +108 -0
  141. data/spec/blather/stream/parser_spec.rb +152 -0
  142. data/spec/blather/stream/ssl_spec.rb +32 -0
  143. data/spec/blather/xmpp_node_spec.rb +47 -0
  144. data/spec/blather_spec.rb +34 -0
  145. data/spec/fixtures/pubsub.rb +311 -0
  146. data/spec/spec_helper.rb +17 -0
  147. data/yard/templates/default/class/html/handlers.erb +18 -0
  148. data/yard/templates/default/class/setup.rb +10 -0
  149. data/yard/templates/default/class/text/handlers.erb +1 -0
  150. metadata +459 -0
@@ -0,0 +1,86 @@
1
+ module Blather
2
+ class Stanza
3
+ class Iq
4
+ # # In-Band Bytestreams Stanza
5
+ #
6
+ # [XEP-0047: In-Band Bytestreams](http://xmpp.org/extensions/xep-0047.html)
7
+ #
8
+ # @handler :ibb_open
9
+ # @handler :ibb_data
10
+ # @handler :ibb_close
11
+ class Ibb < Iq
12
+ # @private
13
+ NS_IBB = 'http://jabber.org/protocol/ibb'
14
+
15
+ # Overrides the parent method to remove open, close and data nodes
16
+ #
17
+ # @see Blather::Stanza#reply
18
+ def reply
19
+ reply = super
20
+ reply.remove_children :open
21
+ reply.remove_children :close
22
+ reply.remove_children :data
23
+ reply
24
+ end
25
+
26
+ # An Open stanza to
27
+ class Open < Ibb
28
+ register :ibb_open, :open, NS_IBB
29
+
30
+ # Find open node
31
+ #
32
+ # @return [Nokogiri::XML::Element]
33
+ def open
34
+ find_first('ns:open', :ns => NS_IBB)
35
+ end
36
+
37
+ # Get the sid of the file transfer
38
+ #
39
+ # @return [String]
40
+ def sid
41
+ open['sid']
42
+ end
43
+
44
+ end
45
+
46
+ # A Data stanza
47
+ class Data < Ibb
48
+ register :ibb_data, :data, NS_IBB
49
+
50
+ # Find data node
51
+ #
52
+ # @return [Nokogiri::XML::Element]
53
+ def data
54
+ find_first('ns:data', :ns => NS_IBB)
55
+ end
56
+
57
+ # Get the sid of the file transfer
58
+ #
59
+ # @return [String]
60
+ def sid
61
+ data['sid']
62
+ end
63
+ end
64
+
65
+ # A Close stanza
66
+ class Close < Ibb
67
+ register :ibb_close, :close, NS_IBB
68
+
69
+ # Find close node
70
+ #
71
+ # @return [Nokogiri::XML::Element]
72
+ def close
73
+ find_first('ns:close', :ns => NS_IBB)
74
+ end
75
+
76
+ # Get the sid of the file transfer
77
+ #
78
+ # @return [String]
79
+ def sid
80
+ close['sid']
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,50 @@
1
+ module Blather
2
+ class Stanza
3
+ class Iq
4
+
5
+ # # Ping Stanza
6
+ #
7
+ # [XEP-0199: XMPP Ping](http://xmpp.org/extensions/xep-0199.html)
8
+ #
9
+ # This is a base class for any Ping based Iq stanzas.
10
+ #
11
+ # @handler :ping
12
+ class Ping < Iq
13
+ # @private
14
+ register :ping, :ping, 'urn:xmpp:ping'
15
+
16
+ # Overrides the parent method to ensure a ping node is created
17
+ #
18
+ # @see Blather::Stanza::Iq.new
19
+ def self.new(type = :get, to = nil, id = nil)
20
+ node = super
21
+ node.ping
22
+ node
23
+ end
24
+
25
+ # Overrides the parent method to ensure the current ping node is destroyed
26
+ #
27
+ # @see Blather::Stanza::Iq#inherit
28
+ def inherit(node)
29
+ ping.remove
30
+ super
31
+ end
32
+
33
+ # Ping node accessor
34
+ # If a ping node exists it will be returned.
35
+ # Otherwise a new node will be created and returned
36
+ #
37
+ # @return [Balather::XMPPNode]
38
+ def ping
39
+ p = find_first 'ns:ping', :ns => self.class.registered_ns
40
+
41
+ unless p
42
+ (self << (p = XMPPNode.new('ping', self.document)))
43
+ p.namespace = self.class.registered_ns
44
+ end
45
+ p
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,53 @@
1
+ module Blather
2
+ class Stanza
3
+ class Iq
4
+
5
+ # # Query Stanza
6
+ #
7
+ # This is a base class for any query based Iq stanzas. It provides a base set
8
+ # of methods for working with query stanzas
9
+ #
10
+ # @handler :query
11
+ class Query < Iq
12
+ register :query, :query
13
+
14
+ # Overrides the parent method to ensure a query node is created
15
+ #
16
+ # @see Blather::Stanza::Iq.new
17
+ def self.new(type = nil)
18
+ node = super
19
+ node.query
20
+ node
21
+ end
22
+
23
+ # Overrides the parent method to ensure the current query node is destroyed
24
+ #
25
+ # @see Blather::Stanza::Iq#inherit
26
+ def inherit(node)
27
+ query.remove
28
+ super
29
+ end
30
+
31
+ # Query node accessor
32
+ # If a query node exists it will be returned.
33
+ # Otherwise a new node will be created and returned
34
+ #
35
+ # @return [Balather::XMPPNode]
36
+ def query
37
+ q = if self.class.registered_ns
38
+ find_first('query_ns:query', :query_ns => self.class.registered_ns)
39
+ else
40
+ find_first('query')
41
+ end
42
+
43
+ unless q
44
+ (self << (q = XMPPNode.new('query', self.document)))
45
+ q.namespace = self.class.registered_ns
46
+ end
47
+ q
48
+ end
49
+ end #Query
50
+
51
+ end #Iq
52
+ end #Stanza
53
+ end
@@ -0,0 +1,185 @@
1
+ module Blather
2
+ class Stanza
3
+ class Iq
4
+
5
+ # # Roster Stanza
6
+ #
7
+ # [RFC 3921 Section 7 - Roster Management](http://xmpp.org/rfcs/rfc3921.html#roster)
8
+ #
9
+ # @handler :roster
10
+ class Roster < Query
11
+ register :roster, nil, 'jabber:iq:roster'
12
+
13
+ # Create a new roster stanza and (optionally) load it with an item
14
+ #
15
+ # @param [<Blather::Stanza::Iq::VALID_TYPES>] type the stanza type
16
+ # @param [Blather::XMPPNode] item a roster item
17
+ def self.new(type = nil, item = nil)
18
+ node = super type
19
+ node.query << item if item
20
+ node
21
+ end
22
+
23
+ # Inherit the XMPPNode to create a proper Roster object.
24
+ # Creates RosterItem objects out of each roster item as well.
25
+ #
26
+ # @param [Blather::XMPPNode] node a node to inherit
27
+ def inherit(node)
28
+ # remove the current set of nodes
29
+ remove_children :item
30
+ super
31
+ # transmogrify nodes into RosterItems
32
+ items.each { |i| query << RosterItem.new(i); i.remove }
33
+ self
34
+ end
35
+
36
+ # The list of roster items
37
+ #
38
+ # @return [Array<Blather::Stanza::Iq::Roster::RosterItem>]
39
+ def items
40
+ query.find('//ns:item', :ns => self.class.registered_ns).map do |i|
41
+ RosterItem.new i
42
+ end
43
+ end
44
+
45
+ # # RosterItem Fragment
46
+ #
47
+ # Individual roster items.
48
+ # This is a convenience class to attach methods to the node
49
+ class RosterItem < XMPPNode
50
+
51
+ register :item, Roster.registered_ns
52
+
53
+ # Create a new RosterItem
54
+ # @overload new(XML::Node)
55
+ # Create a RosterItem by inheriting a node
56
+ # @param [XML::Node] node an xml node to inherit
57
+ # @overload new(opts)
58
+ # Create a RosterItem through a hash of options
59
+ # @param [Hash] opts the options
60
+ # @option opts [Blather::JID, String, nil] :jid the JID of the item
61
+ # @option opts [String, nil] :name the alias to give the JID
62
+ # @option opts [Symbol, nil] :subscription the subscription status of
63
+ # the RosterItem must be one of
64
+ # Blather::RosterItem::VALID_SUBSCRIPTION_TYPES
65
+ # @option opts [:subscribe, nil] :ask the ask value of the RosterItem
66
+ # @option opts [Array<#to_s>] :groups the group names the RosterItem is a member of
67
+ # @overload new(jid = nil, name = nil, subscription = nil, ask = nil)
68
+ # @param [Blather::JID, String, nil] jid the JID of the item
69
+ # @param [String, nil] name the alias to give the JID
70
+ # @param [Symbol, nil] subscription the subscription status of the
71
+ # RosterItem must be one of
72
+ # Blather::RosterItem::VALID_SUBSCRIPTION_TYPES
73
+ # @param [:subscribe, nil] ask the ask value of the RosterItem
74
+ # @param [Array<#to_s>] groups the group names the RosterItem is a member of
75
+ def self.new(jid = nil, name = nil, subscription = nil, ask = nil, groups = nil)
76
+ new_node = super :item
77
+
78
+ case jid
79
+ when Nokogiri::XML::Node
80
+ new_node.inherit jid
81
+ when Hash
82
+ new_node.jid = jid[:jid]
83
+ new_node.name = jid[:name]
84
+ new_node.subscription = jid[:subscription]
85
+ new_node.ask = jid[:ask]
86
+ new_node.groups = jid[:groups]
87
+ else
88
+ new_node.jid = jid
89
+ new_node.name = name
90
+ new_node.subscription = subscription
91
+ new_node.ask = ask
92
+ new_node.groups = groups
93
+ end
94
+ new_node
95
+ end
96
+
97
+ # Get the JID attached to the item
98
+ #
99
+ # @return [Blather::JID, nil]
100
+ def jid
101
+ (j = self[:jid]) ? JID.new(j) : nil
102
+ end
103
+
104
+ # Set the JID of the item
105
+ #
106
+ # @param [Blather::JID, String, nil] jid the new JID
107
+ def jid=(jid)
108
+ write_attr :jid, (jid.nil?) ? nil : JID.new(jid).stripped
109
+ end
110
+
111
+ # Get the item name
112
+ #
113
+ # @return [String, nil]
114
+ def name
115
+ read_attr :name
116
+ end
117
+
118
+ # Set the item name
119
+ #
120
+ # @param [#to_s] name the name of the item
121
+ def name=(name)
122
+ write_attr :name, name
123
+ end
124
+
125
+ # Get the subscription value of the item
126
+ #
127
+ # @return [<:both, :from, :none, :remove, :to>]
128
+ def subscription
129
+ read_attr :subscription, :to_sym
130
+ end
131
+
132
+ # Set the subscription value of the item
133
+ #
134
+ # @param [<:both, :from, :none, :remove, :to>] subscription
135
+ def subscription=(subscription)
136
+ write_attr :subscription, subscription
137
+ end
138
+
139
+ # Get the ask value of the item
140
+ #
141
+ # @return [<:subscribe, nil>]
142
+ def ask
143
+ read_attr :ask, :to_sym
144
+ end
145
+
146
+ # Set the ask value of the item
147
+ #
148
+ # @param [<:subscribe, nil>] ask
149
+ def ask=(ask)
150
+ write_attr :ask, ask
151
+ end
152
+
153
+ # The groups roster item belongs to
154
+ #
155
+ # @return [Array<String>]
156
+ def groups
157
+ find('child::*[local-name()="group"]').map { |g| g.content }
158
+ end
159
+
160
+ # Set the roster item's groups
161
+ #
162
+ # @param [Array<#to_s>] new_groups an array of group names
163
+ def groups=(new_groups)
164
+ remove_children :group
165
+ if new_groups
166
+ new_groups.uniq.each do |g|
167
+ self << (group = XMPPNode.new(:group, self.document))
168
+ group.content = g
169
+ end
170
+ end
171
+ end
172
+
173
+ # Convert the roster item to a proper stanza all wrapped up
174
+ # This facilitates new subscriptions
175
+ #
176
+ # @return [Blather::Stanza::Iq::Roster]
177
+ def to_stanza
178
+ Roster.new(:set, self)
179
+ end
180
+ end #RosterItem
181
+ end #Roster
182
+
183
+ end #Iq
184
+ end #Stanza
185
+ end
@@ -0,0 +1,208 @@
1
+ module Blather
2
+ class Stanza
3
+ class Iq
4
+ # # SOCKS5 Bytestreams Stanza
5
+ #
6
+ # [XEP-0065: SOCKS5 Bytestreams](http://xmpp.org/extensions/xep-0065.html)
7
+ #
8
+ # @handler :s5b_open
9
+ class S5b < Query
10
+ # @private
11
+ NS_S5B = 'http://jabber.org/protocol/bytestreams'
12
+
13
+ register :s5b_open, :query, NS_S5B
14
+
15
+ # Overrides the parent method to remove query node
16
+ #
17
+ # @see Blather::Stanza#reply
18
+ def reply
19
+ reply = super
20
+ reply.remove_children :query
21
+ reply
22
+ end
23
+
24
+ # Get the sid of the file transfer
25
+ #
26
+ # @return [String]
27
+ def sid
28
+ query['sid']
29
+ end
30
+
31
+ # Get the used streamhost
32
+ #
33
+ # @return [S5b::StreamHostUsed]
34
+ def streamhost_used
35
+ StreamHostUsed.new query.find_first('.//ns:streamhost-used', :ns => self.class.registered_ns)
36
+ end
37
+
38
+ # Set the used streamhost
39
+ #
40
+ # @param [Blather::JID, String, nil] jid the jid of the used streamhost
41
+ def streamhost_used=(jid)
42
+ query.find('.//ns:streamhost-used', :ns => self.class.registered_ns).remove
43
+
44
+ if jid
45
+ query << StreamHostUsed.new(jid)
46
+ end
47
+ end
48
+
49
+ # Get the streamhosts
50
+ #
51
+ # @return [Array<S5b::StreamHost>]
52
+ def streamhosts
53
+ query.find('.//ns:streamhost', :ns => self.class.registered_ns).map do |s|
54
+ StreamHost.new s
55
+ end
56
+ end
57
+
58
+ # Set the streamhosts
59
+ #
60
+ # @param streamhosts the array of streamhosts, passed directly to StreamHost.new
61
+ def streamhosts=(streamhosts)
62
+ query.find('.//ns:streamhost', :ns => self.class.registered_ns).remove
63
+ if streamhosts
64
+ [streamhosts].flatten.each { |s| self.query << StreamHost.new(s) }
65
+ end
66
+ end
67
+
68
+ # StreamHost Stanza
69
+ class StreamHost < XMPPNode
70
+ register 'streamhost', NS_S5B
71
+
72
+ # Create a new S5b::StreamHost
73
+ #
74
+ # @overload new(node)
75
+ # Create a new StreamHost by inheriting an existing node
76
+ # @param [XML::Node] node an XML::Node to inherit from
77
+ # @overload new(opts)
78
+ # Create a new StreamHost through a hash of options
79
+ # @param [Hash] opts a hash options
80
+ # @option opts [Blather::JID, String] :jid the JID of the StreamHost
81
+ # @option opts [#to_s] :host the host the StreamHost
82
+ # @option opts [#to_s] :port the post of the StreamHost
83
+ # @overload new(jid, host = nil, port = nil)
84
+ # Create a new StreamHost
85
+ # @param [Blather::JID, String] jid the JID of the StreamHost
86
+ # @param [#to_s] host the host the StreamHost
87
+ # @param [#to_s] port the post of the StreamHost
88
+ def self.new(jid, host = nil, port = nil)
89
+ new_node = super 'streamhost'
90
+
91
+ case jid
92
+ when Nokogiri::XML::Node
93
+ new_node.inherit jid
94
+ when Hash
95
+ new_node.jid = jid[:jid]
96
+ new_node.host = jid[:host]
97
+ new_node.port = jid[:port]
98
+ else
99
+ new_node.jid = jid
100
+ new_node.host = host
101
+ new_node.port = port
102
+ end
103
+ new_node
104
+ end
105
+
106
+ # Get the jid of the streamhost
107
+ #
108
+ # @return [Blather::JID, nil]
109
+ def jid
110
+ if j = read_attr(:jid)
111
+ JID.new(j)
112
+ else
113
+ nil
114
+ end
115
+ end
116
+
117
+ # Set the jid of the streamhost
118
+ #
119
+ # @param [Blather::JID, String, nil]
120
+ def jid=(j)
121
+ write_attr :jid, (j ? j.to_s : nil)
122
+ end
123
+
124
+ # Get the host address of the streamhost
125
+ #
126
+ # @return [String, nil]
127
+ def host
128
+ read_attr :host
129
+ end
130
+
131
+ # Set the host address of the streamhost
132
+ #
133
+ # @param [String, nil]
134
+ def host=(h)
135
+ write_attr :host, h
136
+ end
137
+
138
+ # Get the port of the streamhost
139
+ #
140
+ # @return [Fixnum, nil]
141
+ def port
142
+ if p = read_attr(:port)
143
+ p.to_i
144
+ else
145
+ nil
146
+ end
147
+ end
148
+
149
+ # Set the port of the streamhost
150
+ #
151
+ # @param [String, Fixnum, nil]
152
+ def port=(p)
153
+ write_attr :port, p
154
+ end
155
+ end
156
+
157
+ # Stream host used stanza
158
+ class StreamHostUsed < XMPPNode
159
+ register 'streamhost-used', NS_S5B
160
+
161
+ # Create a new S5b::StreamHostUsed
162
+ #
163
+ # @overload new(node)
164
+ # Create a new StreamHostUsed by inheriting an existing node
165
+ # @param [XML::Node] node an XML::Node to inherit from
166
+ # @overload new(opts)
167
+ # Create a new StreamHostUsed through a hash of options
168
+ # @param [Hash] opts a hash options
169
+ # @option opts [Blather::JID, String] :jid the JID of the StreamHostUsed
170
+ # @overload new(jid)
171
+ # Create a new StreamHostUsed
172
+ # @param [Blather::JID, String] jid the JID of the StreamHostUsed
173
+ def self.new(jid)
174
+ new_node = super 'streamhost-used'
175
+
176
+ case jid
177
+ when Nokogiri::XML::Node
178
+ new_node.inherit jid
179
+ when Hash
180
+ new_node.jid = jid[:jid]
181
+ else
182
+ new_node.jid = jid
183
+ end
184
+ new_node
185
+ end
186
+
187
+ # Get the jid of the used streamhost
188
+ #
189
+ # @return [Blather::JID, nil]
190
+ def jid
191
+ if j = read_attr(:jid)
192
+ JID.new(j)
193
+ else
194
+ nil
195
+ end
196
+ end
197
+
198
+ # Set the jid of the used streamhost
199
+ #
200
+ # @param [Blather::JID, String, nil]
201
+ def jid=(j)
202
+ write_attr :jid, (j ? j.to_s : nil)
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end