blather 0.4.7 → 0.4.8
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +162 -0
- data/examples/{print_heirarchy.rb → print_hierarchy.rb} +5 -5
- data/examples/stream_only.rb +27 -0
- data/lib/blather.rb +4 -0
- data/lib/blather/client/client.rb +91 -73
- data/lib/blather/client/dsl.rb +156 -32
- data/lib/blather/client/dsl/pubsub.rb +86 -54
- data/lib/blather/core_ext/active_support.rb +9 -9
- data/lib/blather/core_ext/active_support/inheritable_attributes.rb +2 -2
- data/lib/blather/core_ext/nokogiri.rb +12 -7
- data/lib/blather/errors.rb +25 -14
- data/lib/blather/errors/sasl_error.rb +21 -3
- data/lib/blather/errors/stanza_error.rb +37 -21
- data/lib/blather/errors/stream_error.rb +27 -17
- data/lib/blather/jid.rb +79 -24
- data/lib/blather/roster.rb +39 -21
- data/lib/blather/roster_item.rb +43 -21
- data/lib/blather/stanza.rb +88 -40
- data/lib/blather/stanza/disco.rb +12 -2
- data/lib/blather/stanza/disco/disco_info.rb +112 -20
- data/lib/blather/stanza/disco/disco_items.rb +81 -12
- data/lib/blather/stanza/iq.rb +94 -38
- data/lib/blather/stanza/iq/query.rb +16 -22
- data/lib/blather/stanza/iq/roster.rb +98 -20
- data/lib/blather/stanza/message.rb +266 -111
- data/lib/blather/stanza/presence.rb +118 -42
- data/lib/blather/stanza/presence/status.rb +140 -60
- data/lib/blather/stanza/presence/subscription.rb +44 -10
- data/lib/blather/stanza/pubsub.rb +70 -15
- data/lib/blather/stanza/pubsub/affiliations.rb +36 -7
- data/lib/blather/stanza/pubsub/create.rb +26 -4
- data/lib/blather/stanza/pubsub/errors.rb +13 -4
- data/lib/blather/stanza/pubsub/event.rb +56 -10
- data/lib/blather/stanza/pubsub/items.rb +46 -6
- data/lib/blather/stanza/pubsub/publish.rb +52 -7
- data/lib/blather/stanza/pubsub/retract.rb +45 -6
- data/lib/blather/stanza/pubsub/subscribe.rb +30 -4
- data/lib/blather/stanza/pubsub/subscription.rb +74 -6
- data/lib/blather/stanza/pubsub/subscriptions.rb +35 -9
- data/lib/blather/stanza/pubsub/unsubscribe.rb +30 -4
- data/lib/blather/stanza/pubsub_owner.rb +17 -7
- data/lib/blather/stanza/pubsub_owner/delete.rb +23 -5
- data/lib/blather/stanza/pubsub_owner/purge.rb +23 -5
- data/lib/blather/stream.rb +96 -29
- data/lib/blather/stream/parser.rb +6 -9
- data/lib/blather/xmpp_node.rb +101 -153
- data/spec/blather/client/client_spec.rb +1 -1
- data/spec/blather/errors_spec.rb +5 -5
- data/spec/blather/stanza/message_spec.rb +56 -0
- data/spec/blather/stanza/presence/status_spec.rb +1 -1
- data/spec/blather/stanza_spec.rb +3 -3
- data/spec/blather/xmpp_node_spec.rb +19 -74
- metadata +6 -10
- data/README.rdoc +0 -185
- data/examples/drb_client.rb +0 -5
- data/examples/ping.rb +0 -11
- data/examples/pong.rb +0 -6
- data/examples/pubsub/cli.rb +0 -64
- data/examples/pubsub/ping_pong.rb +0 -18
@@ -2,14 +2,19 @@ module Blather
|
|
2
2
|
class Stanza
|
3
3
|
class PubSub
|
4
4
|
|
5
|
+
# # PubSub Subscriptions Stanza
|
6
|
+
#
|
7
|
+
# [XEP-0060 Section 5.6 Retrieve Subscriptions](http://xmpp.org/extensions/xep-0060.html#entity-subscriptions)
|
8
|
+
#
|
9
|
+
# @handler :pubsub_subscriptions
|
5
10
|
class Subscriptions < PubSub
|
6
11
|
register :pubsub_subscriptions, :subscriptions, self.registered_ns
|
7
12
|
|
8
13
|
include Enumerable
|
9
14
|
alias_method :find, :xpath
|
10
15
|
|
11
|
-
|
12
|
-
#
|
16
|
+
# Overrides the parent to ensure a subscriptions node is created
|
17
|
+
# @private
|
13
18
|
def self.new(type = nil, host = nil)
|
14
19
|
new_node = super type
|
15
20
|
new_node.to = host
|
@@ -17,27 +22,48 @@ class PubSub
|
|
17
22
|
new_node
|
18
23
|
end
|
19
24
|
|
20
|
-
|
21
|
-
#
|
25
|
+
# Overrides the parent to ensure the subscriptions node is destroyed
|
26
|
+
# @private
|
22
27
|
def inherit(node)
|
23
28
|
subscriptions.remove
|
24
29
|
super
|
25
30
|
end
|
26
31
|
|
32
|
+
# Get or create the actual subscriptions node
|
33
|
+
#
|
34
|
+
# @return [Blather::XMPPNode]
|
27
35
|
def subscriptions
|
28
36
|
aff = pubsub.find_first('subscriptions', self.class.registered_ns)
|
29
|
-
|
37
|
+
unless aff
|
38
|
+
(self.pubsub << (aff = XMPPNode.new('subscriptions', self.document)))
|
39
|
+
end
|
30
40
|
aff
|
31
41
|
end
|
32
42
|
|
43
|
+
# Iterate over the list of subscriptions
|
44
|
+
#
|
45
|
+
# @yieldparam [Hash] subscription
|
46
|
+
# @see {#list}
|
33
47
|
def each(&block)
|
34
48
|
list.each &block
|
35
49
|
end
|
36
50
|
|
51
|
+
# Get the size of the subscriptions list
|
52
|
+
#
|
53
|
+
# @return [Fixnum]
|
37
54
|
def size
|
38
55
|
list.size
|
39
56
|
end
|
40
57
|
|
58
|
+
# Get a hash of subscriptions
|
59
|
+
#
|
60
|
+
# @example
|
61
|
+
# { :subscribed => [{:node => 'node1', :jid => 'francisco@denmark.lit'}, {:node => 'node2', :jid => 'francisco@denmark.lit'}],
|
62
|
+
# :unconfigured => [{:node => 'node3', :jid => 'francisco@denmark.lit'}],
|
63
|
+
# :pending => [{:node => 'node4', :jid => 'francisco@denmark.lit'}],
|
64
|
+
# :none => [{:node => 'node5', :jid => 'francisco@denmark.lit'}] }
|
65
|
+
#
|
66
|
+
# @return [Hash]
|
41
67
|
def list
|
42
68
|
subscriptions.find('//ns:subscription', :ns => self.class.registered_ns).inject({}) do |hash, item|
|
43
69
|
hash[item[:subscription].to_sym] ||= []
|
@@ -48,8 +74,8 @@ class PubSub
|
|
48
74
|
hash
|
49
75
|
end
|
50
76
|
end
|
51
|
-
end
|
77
|
+
end # Subscriptions
|
52
78
|
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
79
|
+
end # PubSub
|
80
|
+
end # Stanza
|
81
|
+
end # Blather
|
@@ -2,9 +2,20 @@ module Blather
|
|
2
2
|
class Stanza
|
3
3
|
class PubSub
|
4
4
|
|
5
|
+
# # PubSub Unsubscribe Stanza
|
6
|
+
#
|
7
|
+
# [XEP-0060 Section 6.2 - Unsubscribe from a Node](http://xmpp.org/extensions/xep-0060.html#subscriber-unsubscribe)
|
8
|
+
#
|
9
|
+
# @handler :pubsub_unsubscribe
|
5
10
|
class Unsubscribe < PubSub
|
6
11
|
register :pubsub_unsubscribe, :unsubscribe, self.registered_ns
|
7
12
|
|
13
|
+
# Create a new unsubscribe node
|
14
|
+
#
|
15
|
+
# @param [Blather::Stanza::Iq::VALID_TYPES] type the IQ stanza type
|
16
|
+
# @param [String] host the host to send the request to
|
17
|
+
# @param [String] node the node to unsubscribe from
|
18
|
+
# @param [Blather::JID, #to_s] jid the JID of the unsubscription
|
8
19
|
def self.new(type = :set, host = nil, node = nil, jid = nil)
|
9
20
|
new_node = super(type, host)
|
10
21
|
new_node.node = node
|
@@ -12,22 +23,37 @@ class PubSub
|
|
12
23
|
new_node
|
13
24
|
end
|
14
25
|
|
26
|
+
# Get the JID of the unsubscription
|
27
|
+
#
|
28
|
+
# @return [Blather::JID]
|
15
29
|
def jid
|
16
30
|
JID.new(unsubscribe[:jid])
|
17
31
|
end
|
18
32
|
|
33
|
+
# Set the JID of the unsubscription
|
34
|
+
#
|
35
|
+
# @param [Blather::JID, #to_s] jid
|
19
36
|
def jid=(jid)
|
20
37
|
unsubscribe[:jid] = jid
|
21
38
|
end
|
22
39
|
|
40
|
+
# Get the name of the node to unsubscribe from
|
41
|
+
#
|
42
|
+
# @return [String]
|
23
43
|
def node
|
24
44
|
unsubscribe[:node]
|
25
45
|
end
|
26
46
|
|
47
|
+
# Set the name of the node to unsubscribe from
|
48
|
+
#
|
49
|
+
# @param [String] node
|
27
50
|
def node=(node)
|
28
51
|
unsubscribe[:node] = node
|
29
52
|
end
|
30
53
|
|
54
|
+
# Get or create the actual unsubscribe node
|
55
|
+
#
|
56
|
+
# @return [Blather::XMPPNode]
|
31
57
|
def unsubscribe
|
32
58
|
unless unsubscribe = pubsub.find_first('ns:unsubscribe', :ns => self.class.registered_ns)
|
33
59
|
self.pubsub << (unsubscribe = XMPPNode.new('unsubscribe', self.document))
|
@@ -35,8 +61,8 @@ class PubSub
|
|
35
61
|
end
|
36
62
|
unsubscribe
|
37
63
|
end
|
38
|
-
end
|
64
|
+
end # Unsubscribe
|
39
65
|
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
66
|
+
end # PubSub
|
67
|
+
end # Stanza
|
68
|
+
end # Blather
|
@@ -1,9 +1,16 @@
|
|
1
1
|
module Blather
|
2
2
|
class Stanza
|
3
3
|
|
4
|
+
# # PubSubOwner Base Class
|
5
|
+
#
|
6
|
+
# [XEP-0060 - Publish-Subscribe](http://xmpp.org/extensions/xep-0060.html)
|
7
|
+
#
|
8
|
+
# @handler :pubsub_owner
|
4
9
|
class PubSubOwner < Iq
|
5
10
|
register :pubsub_owner, :pubsub, 'http://jabber.org/protocol/pubsub#owner'
|
6
11
|
|
12
|
+
# Creates the proper class from the stana's child
|
13
|
+
# @private
|
7
14
|
def self.import(node)
|
8
15
|
klass = nil
|
9
16
|
if pubsub = node.document.find_first('//ns:pubsub', :ns => self.registered_ns)
|
@@ -12,8 +19,8 @@ class Stanza
|
|
12
19
|
(klass || self).new(node[:type]).inherit(node)
|
13
20
|
end
|
14
21
|
|
15
|
-
|
16
|
-
#
|
22
|
+
# Overrides the parent to ensure a pubsub node is created
|
23
|
+
# @private
|
17
24
|
def self.new(type = nil, host = nil)
|
18
25
|
new_node = super type
|
19
26
|
new_node.to = host
|
@@ -21,13 +28,16 @@ class Stanza
|
|
21
28
|
new_node
|
22
29
|
end
|
23
30
|
|
24
|
-
|
25
|
-
#
|
31
|
+
# Overrides the parent to ensure the pubsub node is destroyed
|
32
|
+
# @private
|
26
33
|
def inherit(node)
|
27
34
|
remove_children :pubsub
|
28
35
|
super
|
29
36
|
end
|
30
37
|
|
38
|
+
# Get or create the pubsub node on the stanza
|
39
|
+
#
|
40
|
+
# @return [Blather::XMPPNode]
|
31
41
|
def pubsub
|
32
42
|
unless p = find_first('ns:pubsub', :ns => self.class.registered_ns)
|
33
43
|
self << (p = XMPPNode.new('pubsub', self.document))
|
@@ -35,7 +45,7 @@ class Stanza
|
|
35
45
|
end
|
36
46
|
p
|
37
47
|
end
|
38
|
-
end
|
48
|
+
end # PubSubOwner
|
39
49
|
|
40
|
-
end
|
41
|
-
end
|
50
|
+
end # Stanza
|
51
|
+
end # Blather
|
@@ -2,24 +2,42 @@ module Blather
|
|
2
2
|
class Stanza
|
3
3
|
class PubSubOwner
|
4
4
|
|
5
|
+
# # PubSubOwner Delete Stanza
|
6
|
+
#
|
7
|
+
# [XEP-0060 Section 8.4 Delete a Node](http://xmpp.org/extensions/xep-0060.html#owner-delete)
|
8
|
+
#
|
9
|
+
# @handler :pubsub_delete
|
5
10
|
class Delete < PubSubOwner
|
6
|
-
|
7
11
|
register :pubsub_delete, :delete, self.registered_ns
|
8
12
|
|
13
|
+
# Create a new delete stanza
|
14
|
+
#
|
15
|
+
# @param [Blather::Stanza::Iq::VALID_TYPES] type the IQ stanza type
|
16
|
+
# @param [String] host the host to send the request to
|
17
|
+
# @param [String] node the name of the node to delete
|
9
18
|
def self.new(type = :set, host = nil, node = nil)
|
10
19
|
new_node = super(type, host)
|
11
20
|
new_node.node = node
|
12
21
|
new_node
|
13
22
|
end
|
14
23
|
|
24
|
+
# Get the name of the node to delete
|
25
|
+
#
|
26
|
+
# @return [String]
|
15
27
|
def node
|
16
28
|
delete_node[:node]
|
17
29
|
end
|
18
30
|
|
31
|
+
# Set the name of the node to delete
|
32
|
+
#
|
33
|
+
# @param [String] node
|
19
34
|
def node=(node)
|
20
35
|
delete_node[:node] = node
|
21
36
|
end
|
22
37
|
|
38
|
+
# Get or create the actual delete node on the stanza
|
39
|
+
#
|
40
|
+
# @return [Blather::XMPPNode]
|
23
41
|
def delete_node
|
24
42
|
unless delete_node = pubsub.find_first('ns:delete', :ns => self.class.registered_ns)
|
25
43
|
self.pubsub << (delete_node = XMPPNode.new('delete', self.document))
|
@@ -27,8 +45,8 @@ class PubSubOwner
|
|
27
45
|
end
|
28
46
|
delete_node
|
29
47
|
end
|
30
|
-
end
|
48
|
+
end # Retract
|
31
49
|
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
50
|
+
end # PubSub
|
51
|
+
end # Stanza
|
52
|
+
end # Blather
|
@@ -2,24 +2,42 @@ module Blather
|
|
2
2
|
class Stanza
|
3
3
|
class PubSubOwner
|
4
4
|
|
5
|
+
# # PubSubOwner Purge Stanza
|
6
|
+
#
|
7
|
+
# [XEP-0060 Section 8.5 - Purge All Node Items](http://xmpp.org/extensions/xep-0060.html#owner-purge)
|
8
|
+
#
|
9
|
+
# @handler :pubsub_purge
|
5
10
|
class Purge < PubSubOwner
|
6
|
-
|
7
11
|
register :pubsub_purge, :purge, self.registered_ns
|
8
12
|
|
13
|
+
# Create a new purge stanza
|
14
|
+
#
|
15
|
+
# @param [Blather::Stanza::Iq::VALID_TYPES] type the IQ stanza type
|
16
|
+
# @param [String] host the host to send the request to
|
17
|
+
# @param [String] node the name of the node to purge
|
9
18
|
def self.new(type = :set, host = nil, node = nil)
|
10
19
|
new_node = super(type, host)
|
11
20
|
new_node.node = node
|
12
21
|
new_node
|
13
22
|
end
|
14
23
|
|
24
|
+
# Get the name of the node to delete
|
25
|
+
#
|
26
|
+
# @return [String]
|
15
27
|
def node
|
16
28
|
purge_node[:node]
|
17
29
|
end
|
18
30
|
|
31
|
+
# Set the name of the node to delete
|
32
|
+
#
|
33
|
+
# @param [String] node
|
19
34
|
def node=(node)
|
20
35
|
purge_node[:node] = node
|
21
36
|
end
|
22
37
|
|
38
|
+
# Get or create the actual purge node on the stanza
|
39
|
+
#
|
40
|
+
# @return [Blather::XMPPNode]
|
23
41
|
def purge_node
|
24
42
|
unless purge_node = pubsub.find_first('ns:purge', :ns => self.class.registered_ns)
|
25
43
|
self.pubsub << (purge_node = XMPPNode.new('purge', self.document))
|
@@ -27,8 +45,8 @@ class PubSubOwner
|
|
27
45
|
end
|
28
46
|
purge_node
|
29
47
|
end
|
30
|
-
end
|
48
|
+
end # Retract
|
31
49
|
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
50
|
+
end # PubSub
|
51
|
+
end # Stanza
|
52
|
+
end # Blather
|
data/lib/blather/stream.rb
CHANGED
@@ -1,5 +1,52 @@
|
|
1
1
|
module Blather
|
2
2
|
|
3
|
+
# # A pure XMPP stream.
|
4
|
+
#
|
5
|
+
# Blather::Stream can be used to build your own handler system if Blather's
|
6
|
+
# doesn't suit your needs. It will take care of the entire connection
|
7
|
+
# process then start sending Stanza objects back to the registered client.
|
8
|
+
#
|
9
|
+
# The client you register with Blather::Stream needs to implement the following
|
10
|
+
# methods:
|
11
|
+
# * #post_init(stream, jid = nil)
|
12
|
+
# Called after the stream has been initiated.
|
13
|
+
# @param [Blather::Stream] stream is the connected stream object
|
14
|
+
# @param [Blather::JID, nil] jid is the full JID as recognized by the server
|
15
|
+
#
|
16
|
+
# * #receive_data(stanza)
|
17
|
+
# Called every time the stream receives a new stanza
|
18
|
+
# @param [Blather::Stanza] stanza a stanza object from the server
|
19
|
+
#
|
20
|
+
# * #unbind
|
21
|
+
# Called when the stream is shutdown. This will be called regardless of which
|
22
|
+
# side shut the stream down.
|
23
|
+
#
|
24
|
+
# @example Create a new stream and handle it with our own class
|
25
|
+
# class MyClient
|
26
|
+
# attr :jid
|
27
|
+
#
|
28
|
+
# def post_init(stream, jid = nil)
|
29
|
+
# @stream = stream
|
30
|
+
# self.jid = jid
|
31
|
+
# p "Stream Started"
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# # Pretty print the stream
|
35
|
+
# def receive_data(stanza)
|
36
|
+
# pp stanza
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# def unbind
|
40
|
+
# p "Stream Ended"
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# def write(what)
|
44
|
+
# @stream.write what
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# client = Blather::Stream.start MyClient.new, "jid@domain/res", "pass"
|
49
|
+
# client.write "[pure xml over the wire]"
|
3
50
|
class Stream < EventMachine::Connection
|
4
51
|
class NoConnection < RuntimeError; end
|
5
52
|
|
@@ -7,13 +54,16 @@ module Blather
|
|
7
54
|
attr_accessor :password
|
8
55
|
attr_reader :jid
|
9
56
|
|
10
|
-
##
|
11
57
|
# Start the stream between client and server
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
58
|
+
#
|
59
|
+
# @param [Object] client an object that will respond to #post_init,
|
60
|
+
# #unbind #receive_data
|
61
|
+
# @param [Blather::JID, #to_s] jid the jid to authenticate with
|
62
|
+
# @param [String] pass the password to authenticate with
|
63
|
+
# @param [String, nil] host the hostname or IP to connect to. Default is
|
64
|
+
# to use the domain on the JID
|
65
|
+
# @param [Fixnum, nil] port the port to connect on. Default is the XMPP
|
66
|
+
# default of 5222
|
17
67
|
def self.start(client, jid, pass, host = nil, port = 5222)
|
18
68
|
jid = JID.new jid
|
19
69
|
if host
|
@@ -21,20 +71,32 @@ module Blather
|
|
21
71
|
else
|
22
72
|
require 'resolv'
|
23
73
|
srv = []
|
24
|
-
Resolv::DNS.open
|
74
|
+
Resolv::DNS.open do |dns|
|
75
|
+
srv = dns.getresources(
|
76
|
+
"_xmpp-client._tcp.#{jid.domain}",
|
77
|
+
Resolv::DNS::Resource::IN::SRV
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
25
81
|
if srv.empty?
|
26
82
|
connect jid.domain, port, self, client, jid, pass
|
27
83
|
else
|
28
|
-
srv.sort!
|
29
|
-
|
84
|
+
srv.sort! do |a,b|
|
85
|
+
(a.priority != b.priority) ? (a.priority <=> b.priority) :
|
86
|
+
(b.weight <=> a.weight)
|
87
|
+
end
|
88
|
+
|
89
|
+
srv.detect do |r|
|
90
|
+
not connect(r.target.to_s, r.port, self, client, jid, pass) === false
|
91
|
+
end
|
30
92
|
end
|
31
93
|
end
|
32
94
|
end
|
33
95
|
|
34
|
-
##
|
35
96
|
# Attempt a connection
|
36
97
|
# Stream will raise +NoConnection+ if it receives #unbind before #post_init
|
37
98
|
# this catches that and returns false prompting for another attempt
|
99
|
+
# @private
|
38
100
|
def self.connect(host, port, conn, client, jid, pass)
|
39
101
|
EM.connect host, port, conn, client, jid, pass
|
40
102
|
rescue NoConnection
|
@@ -45,19 +107,19 @@ module Blather
|
|
45
107
|
define_method("#{state}?") { @state == state }
|
46
108
|
end
|
47
109
|
|
48
|
-
##
|
49
110
|
# Send data over the wire
|
50
|
-
#
|
51
|
-
#
|
111
|
+
#
|
112
|
+
# @todo Queue if not ready
|
113
|
+
#
|
114
|
+
# @param [#to_xml, #to_s] stanza the stanza to send over the wire
|
52
115
|
def send(stanza)
|
53
|
-
#TODO Queue if not ready
|
54
116
|
Blather.logger.debug "SENDING: (#{caller[1]}) #{stanza}"
|
55
117
|
send_data stanza.respond_to?(:to_xml) ? stanza.to_xml : stanza.to_s
|
56
118
|
end
|
57
119
|
|
58
|
-
##
|
59
120
|
# Called by EM.connect to initialize stream variables
|
60
|
-
|
121
|
+
# @private
|
122
|
+
def initialize(client, jid, pass)
|
61
123
|
super()
|
62
124
|
|
63
125
|
@error = nil
|
@@ -68,17 +130,17 @@ module Blather
|
|
68
130
|
@password = pass
|
69
131
|
end
|
70
132
|
|
71
|
-
##
|
72
133
|
# Called when EM completes the connection to the server
|
73
134
|
# this kicks off the starttls/authorize/bind process
|
74
|
-
|
135
|
+
# @private
|
136
|
+
def connection_completed
|
75
137
|
# @keepalive = EM::PeriodicTimer.new(60) { send_data ' ' }
|
76
138
|
start
|
77
139
|
end
|
78
140
|
|
79
|
-
##
|
80
141
|
# Called by EM with data from the wire
|
81
|
-
|
142
|
+
# @private
|
143
|
+
def receive_data(data)
|
82
144
|
Blather.logger.debug "\n#{'-'*30}\n"
|
83
145
|
Blather.logger.debug "STREAM IN: #{data}"
|
84
146
|
@parser << data
|
@@ -89,13 +151,15 @@ module Blather
|
|
89
151
|
stop
|
90
152
|
end
|
91
153
|
|
154
|
+
# Called by EM after the connection has started
|
155
|
+
# @private
|
92
156
|
def post_init
|
93
157
|
@connected = true
|
94
158
|
end
|
95
159
|
|
96
|
-
##
|
97
160
|
# Called by EM when the connection is closed
|
98
|
-
|
161
|
+
# @private
|
162
|
+
def unbind
|
99
163
|
raise NoConnection unless @connected
|
100
164
|
|
101
165
|
# @keepalive.cancel
|
@@ -104,9 +168,9 @@ module Blather
|
|
104
168
|
@client.unbind
|
105
169
|
end
|
106
170
|
|
107
|
-
##
|
108
171
|
# Called by the parser with parsed nodes
|
109
|
-
|
172
|
+
# @private
|
173
|
+
def receive(node)
|
110
174
|
Blather.logger.debug "RECEIVING (#{node.element_name}) #{node}"
|
111
175
|
@node = node
|
112
176
|
|
@@ -133,16 +197,16 @@ module Blather
|
|
133
197
|
@receiver.receive_data @node.to_stanza
|
134
198
|
end
|
135
199
|
|
136
|
-
##
|
137
200
|
# Ensure the JID gets attached to the client
|
138
|
-
|
201
|
+
# @private
|
202
|
+
def jid=(new_jid)
|
139
203
|
Blather.logger.debug "NEW JID: #{new_jid}"
|
140
204
|
@jid = JID.new new_jid
|
141
205
|
end
|
142
206
|
|
143
207
|
protected
|
144
|
-
##
|
145
208
|
# Stop the stream
|
209
|
+
# @private
|
146
210
|
def stop
|
147
211
|
unless @state == :stopped
|
148
212
|
@state = :stopped
|
@@ -150,15 +214,18 @@ module Blather
|
|
150
214
|
end
|
151
215
|
end
|
152
216
|
|
217
|
+
# @private
|
153
218
|
def handle_stream_error
|
154
219
|
@error = StreamError.import(@node)
|
155
220
|
stop
|
156
221
|
end
|
157
222
|
|
223
|
+
# @private
|
158
224
|
def ready!
|
159
225
|
@state = :started
|
160
226
|
@receiver = @client
|
161
227
|
@client.post_init self, @jid
|
162
228
|
end
|
163
|
-
end
|
164
|
-
|
229
|
+
end # Stream
|
230
|
+
|
231
|
+
end # Blather
|