tp-blather 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +13 -0
- data/.gemtest +0 -0
- data/.gitignore +19 -0
- data/.rspec +3 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +249 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/LICENSE +22 -0
- data/README.md +413 -0
- data/Rakefile +20 -0
- data/TODO.md +2 -0
- data/blather.gemspec +51 -0
- data/examples/certs/README +20 -0
- data/examples/certs/ca-bundle.crt +3987 -0
- data/examples/echo.rb +19 -0
- data/examples/execute.rb +17 -0
- data/examples/ping_pong.rb +38 -0
- data/examples/print_hierarchy.rb +77 -0
- data/examples/rosterprint.rb +15 -0
- data/examples/stream_only.rb +28 -0
- data/examples/trusted_echo.rb +21 -0
- data/examples/xmpp4r/echo.rb +36 -0
- data/lib/blather.rb +112 -0
- data/lib/blather/cert_store.rb +53 -0
- data/lib/blather/client.rb +95 -0
- data/lib/blather/client/client.rb +345 -0
- data/lib/blather/client/dsl.rb +320 -0
- data/lib/blather/client/dsl/pubsub.rb +174 -0
- data/lib/blather/core_ext/eventmachine.rb +125 -0
- data/lib/blather/core_ext/ipaddr.rb +20 -0
- data/lib/blather/errors.rb +69 -0
- data/lib/blather/errors/sasl_error.rb +44 -0
- data/lib/blather/errors/stanza_error.rb +110 -0
- data/lib/blather/errors/stream_error.rb +84 -0
- data/lib/blather/file_transfer.rb +107 -0
- data/lib/blather/file_transfer/ibb.rb +68 -0
- data/lib/blather/file_transfer/s5b.rb +114 -0
- data/lib/blather/jid.rb +141 -0
- data/lib/blather/roster.rb +118 -0
- data/lib/blather/roster_item.rb +146 -0
- data/lib/blather/stanza.rb +167 -0
- data/lib/blather/stanza/disco.rb +32 -0
- data/lib/blather/stanza/disco/capabilities.rb +161 -0
- data/lib/blather/stanza/disco/disco_info.rb +205 -0
- data/lib/blather/stanza/disco/disco_items.rb +134 -0
- data/lib/blather/stanza/iq.rb +144 -0
- data/lib/blather/stanza/iq/command.rb +339 -0
- data/lib/blather/stanza/iq/ibb.rb +86 -0
- data/lib/blather/stanza/iq/ping.rb +50 -0
- data/lib/blather/stanza/iq/query.rb +53 -0
- data/lib/blather/stanza/iq/roster.rb +185 -0
- data/lib/blather/stanza/iq/s5b.rb +208 -0
- data/lib/blather/stanza/iq/si.rb +415 -0
- data/lib/blather/stanza/iq/vcard.rb +149 -0
- data/lib/blather/stanza/message.rb +428 -0
- data/lib/blather/stanza/message/muc_user.rb +119 -0
- data/lib/blather/stanza/muc/muc_user_base.rb +54 -0
- data/lib/blather/stanza/presence.rb +172 -0
- data/lib/blather/stanza/presence/c.rb +100 -0
- data/lib/blather/stanza/presence/muc.rb +35 -0
- data/lib/blather/stanza/presence/muc_user.rb +147 -0
- data/lib/blather/stanza/presence/status.rb +218 -0
- data/lib/blather/stanza/presence/subscription.rb +100 -0
- data/lib/blather/stanza/pubsub.rb +119 -0
- data/lib/blather/stanza/pubsub/affiliations.rb +79 -0
- data/lib/blather/stanza/pubsub/create.rb +65 -0
- data/lib/blather/stanza/pubsub/errors.rb +18 -0
- data/lib/blather/stanza/pubsub/event.rb +139 -0
- data/lib/blather/stanza/pubsub/items.rb +103 -0
- data/lib/blather/stanza/pubsub/publish.rb +103 -0
- data/lib/blather/stanza/pubsub/retract.rb +92 -0
- data/lib/blather/stanza/pubsub/subscribe.rb +68 -0
- data/lib/blather/stanza/pubsub/subscription.rb +135 -0
- data/lib/blather/stanza/pubsub/subscriptions.rb +83 -0
- data/lib/blather/stanza/pubsub/unsubscribe.rb +84 -0
- data/lib/blather/stanza/pubsub_owner.rb +51 -0
- data/lib/blather/stanza/pubsub_owner/delete.rb +52 -0
- data/lib/blather/stanza/pubsub_owner/purge.rb +52 -0
- data/lib/blather/stanza/x.rb +416 -0
- data/lib/blather/stream.rb +266 -0
- data/lib/blather/stream/client.rb +32 -0
- data/lib/blather/stream/component.rb +39 -0
- data/lib/blather/stream/features.rb +70 -0
- data/lib/blather/stream/features/register.rb +38 -0
- data/lib/blather/stream/features/resource.rb +63 -0
- data/lib/blather/stream/features/sasl.rb +190 -0
- data/lib/blather/stream/features/session.rb +45 -0
- data/lib/blather/stream/features/tls.rb +29 -0
- data/lib/blather/stream/parser.rb +102 -0
- data/lib/blather/version.rb +3 -0
- data/lib/blather/xmpp_node.rb +94 -0
- data/spec/blather/client/client_spec.rb +687 -0
- data/spec/blather/client/dsl/pubsub_spec.rb +492 -0
- data/spec/blather/client/dsl_spec.rb +266 -0
- data/spec/blather/errors/sasl_error_spec.rb +33 -0
- data/spec/blather/errors/stanza_error_spec.rb +129 -0
- data/spec/blather/errors/stream_error_spec.rb +108 -0
- data/spec/blather/errors_spec.rb +33 -0
- data/spec/blather/file_transfer_spec.rb +135 -0
- data/spec/blather/jid_spec.rb +87 -0
- data/spec/blather/roster_item_spec.rb +134 -0
- data/spec/blather/roster_spec.rb +107 -0
- data/spec/blather/stanza/discos/disco_info_spec.rb +247 -0
- data/spec/blather/stanza/discos/disco_items_spec.rb +154 -0
- data/spec/blather/stanza/iq/command_spec.rb +206 -0
- data/spec/blather/stanza/iq/ibb_spec.rb +124 -0
- data/spec/blather/stanza/iq/ping_spec.rb +45 -0
- data/spec/blather/stanza/iq/query_spec.rb +64 -0
- data/spec/blather/stanza/iq/roster_spec.rb +139 -0
- data/spec/blather/stanza/iq/s5b_spec.rb +57 -0
- data/spec/blather/stanza/iq/si_spec.rb +98 -0
- data/spec/blather/stanza/iq/vcard_spec.rb +93 -0
- data/spec/blather/stanza/iq_spec.rb +61 -0
- data/spec/blather/stanza/message/muc_user_spec.rb +152 -0
- data/spec/blather/stanza/message_spec.rb +282 -0
- data/spec/blather/stanza/presence/c_spec.rb +56 -0
- data/spec/blather/stanza/presence/muc_spec.rb +37 -0
- data/spec/blather/stanza/presence/muc_user_spec.rb +83 -0
- data/spec/blather/stanza/presence/status_spec.rb +144 -0
- data/spec/blather/stanza/presence/subscription_spec.rb +102 -0
- data/spec/blather/stanza/presence_spec.rb +125 -0
- data/spec/blather/stanza/pubsub/affiliations_spec.rb +57 -0
- data/spec/blather/stanza/pubsub/create_spec.rb +56 -0
- data/spec/blather/stanza/pubsub/event_spec.rb +98 -0
- data/spec/blather/stanza/pubsub/items_spec.rb +79 -0
- data/spec/blather/stanza/pubsub/publish_spec.rb +83 -0
- data/spec/blather/stanza/pubsub/retract_spec.rb +75 -0
- data/spec/blather/stanza/pubsub/subscribe_spec.rb +61 -0
- data/spec/blather/stanza/pubsub/subscription_spec.rb +97 -0
- data/spec/blather/stanza/pubsub/subscriptions_spec.rb +59 -0
- data/spec/blather/stanza/pubsub/unsubscribe_spec.rb +74 -0
- data/spec/blather/stanza/pubsub_owner/delete_spec.rb +50 -0
- data/spec/blather/stanza/pubsub_owner/purge_spec.rb +50 -0
- data/spec/blather/stanza/pubsub_owner_spec.rb +27 -0
- data/spec/blather/stanza/pubsub_spec.rb +68 -0
- data/spec/blather/stanza/x_spec.rb +231 -0
- data/spec/blather/stanza_spec.rb +134 -0
- data/spec/blather/stream/client_spec.rb +1090 -0
- data/spec/blather/stream/component_spec.rb +108 -0
- data/spec/blather/stream/parser_spec.rb +152 -0
- data/spec/blather/stream/ssl_spec.rb +32 -0
- data/spec/blather/xmpp_node_spec.rb +47 -0
- data/spec/blather_spec.rb +34 -0
- data/spec/fixtures/pubsub.rb +311 -0
- data/spec/spec_helper.rb +17 -0
- data/yard/templates/default/class/html/handlers.erb +18 -0
- data/yard/templates/default/class/setup.rb +10 -0
- data/yard/templates/default/class/text/handlers.erb +1 -0
- metadata +459 -0
@@ -0,0 +1,68 @@
|
|
1
|
+
module Blather
|
2
|
+
class Stanza
|
3
|
+
class PubSub
|
4
|
+
|
5
|
+
# # PubSub Subscribe Stanza
|
6
|
+
#
|
7
|
+
# [XEP-0060 Section 6.1 - Subscribe to a Node](http://xmpp.org/extensions/xep-0060.html#subscriber-subscribe)
|
8
|
+
#
|
9
|
+
# @handler :pubsub_subscribe
|
10
|
+
class Subscribe < PubSub
|
11
|
+
register :pubsub_subscribe, :subscribe, self.registered_ns
|
12
|
+
|
13
|
+
# Create a new subscription node
|
14
|
+
#
|
15
|
+
# @param [Blather::Stanza::Iq::VALID_TYPES] type the IQ stanza type
|
16
|
+
# @param [String] host the host name to send the request to
|
17
|
+
# @param [String] node the node to subscribe to
|
18
|
+
# @param [Blather::JID, #to_s] jid see {#jid=}
|
19
|
+
def self.new(type = :set, host = nil, node = nil, jid = nil)
|
20
|
+
new_node = super(type, host)
|
21
|
+
new_node.node = node
|
22
|
+
new_node.jid = jid
|
23
|
+
new_node
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get the JID of the entity to subscribe
|
27
|
+
#
|
28
|
+
# @return [Blather::JID]
|
29
|
+
def jid
|
30
|
+
JID.new(subscribe[:jid])
|
31
|
+
end
|
32
|
+
|
33
|
+
# Set the JID of the entity to subscribe
|
34
|
+
#
|
35
|
+
# @param [Blather::JID, #to_s] jid
|
36
|
+
def jid=(jid)
|
37
|
+
subscribe[:jid] = jid
|
38
|
+
end
|
39
|
+
|
40
|
+
# Get the name of the node to subscribe to
|
41
|
+
#
|
42
|
+
# @return [String]
|
43
|
+
def node
|
44
|
+
subscribe[:node]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Set the name of the node to subscribe to
|
48
|
+
#
|
49
|
+
# @param [String] node
|
50
|
+
def node=(node)
|
51
|
+
subscribe[:node] = node
|
52
|
+
end
|
53
|
+
|
54
|
+
# Get or create the actual subscribe node on the stanza
|
55
|
+
#
|
56
|
+
# @return [Blather::XMPPNode]
|
57
|
+
def subscribe
|
58
|
+
unless subscribe = pubsub.find_first('ns:subscribe', :ns => self.class.registered_ns)
|
59
|
+
self.pubsub << (subscribe = XMPPNode.new('subscribe', self.document))
|
60
|
+
subscribe.namespace = self.pubsub.namespace
|
61
|
+
end
|
62
|
+
subscribe
|
63
|
+
end
|
64
|
+
end # Subscribe
|
65
|
+
|
66
|
+
end # PubSub
|
67
|
+
end # Stanza
|
68
|
+
end # Blather
|
@@ -0,0 +1,135 @@
|
|
1
|
+
module Blather
|
2
|
+
class Stanza
|
3
|
+
class PubSub
|
4
|
+
|
5
|
+
# # PubSub Subscription Stanza
|
6
|
+
#
|
7
|
+
# [XEP-0060 Section 8.8 Manage Subscriptions](http://xmpp.org/extensions/xep-0060.html#owner-subscriptions)
|
8
|
+
#
|
9
|
+
# @handler :pubsub_subscription
|
10
|
+
class Subscription < PubSub
|
11
|
+
# @private
|
12
|
+
VALID_TYPES = [:none, :pending, :subscribed, :unconfigured]
|
13
|
+
|
14
|
+
register :pubsub_subscription, :subscription, self.registered_ns
|
15
|
+
|
16
|
+
# Create a new subscription request node
|
17
|
+
#
|
18
|
+
# @param [Blather::Stanza::Iq::VALID_TYPES] type the IQ type
|
19
|
+
# @param [String] host the host to send the request to
|
20
|
+
# @param [String] node the node to look for requests on
|
21
|
+
# @param [Blather::JID, #to_s] jid the JID of the subscriber
|
22
|
+
# @param [String] subid the subscription ID
|
23
|
+
# @param [VALID_TYPES] subscription the subscription type
|
24
|
+
def self.new(type = :result, host = nil, node = nil, jid = nil, subid = nil, subscription = nil)
|
25
|
+
new_node = super(type, host)
|
26
|
+
new_node.node = node
|
27
|
+
new_node.jid = jid
|
28
|
+
new_node.subid = subid
|
29
|
+
new_node.subscription = subscription
|
30
|
+
new_node
|
31
|
+
end
|
32
|
+
|
33
|
+
# Check if the type is none
|
34
|
+
#
|
35
|
+
# @return [Boolean]
|
36
|
+
def none?
|
37
|
+
self.subscription == :none
|
38
|
+
end
|
39
|
+
|
40
|
+
# Check if the type is pending
|
41
|
+
#
|
42
|
+
# @return [Boolean]
|
43
|
+
def pending?
|
44
|
+
self.subscription == :pending
|
45
|
+
end
|
46
|
+
|
47
|
+
# Check if the type is subscribed
|
48
|
+
#
|
49
|
+
# @return [Boolean]
|
50
|
+
def subscribed?
|
51
|
+
self.subscription == :subscribed
|
52
|
+
end
|
53
|
+
|
54
|
+
# Check if the type is unconfigured
|
55
|
+
#
|
56
|
+
# @return [Boolean]
|
57
|
+
def unconfigured?
|
58
|
+
self.subscription == :unconfigured
|
59
|
+
end
|
60
|
+
|
61
|
+
# Get the JID of the subscriber
|
62
|
+
#
|
63
|
+
# @return [Blather::JID]
|
64
|
+
def jid
|
65
|
+
JID.new(subscription_node[:jid])
|
66
|
+
end
|
67
|
+
|
68
|
+
# Set the JID of the subscriber
|
69
|
+
#
|
70
|
+
# @param [Blather::JID, #to_s] jid
|
71
|
+
def jid=(jid)
|
72
|
+
subscription_node[:jid] = jid
|
73
|
+
end
|
74
|
+
|
75
|
+
# Get the name of the subscription node
|
76
|
+
#
|
77
|
+
# @return [String]
|
78
|
+
def node
|
79
|
+
subscription_node[:node]
|
80
|
+
end
|
81
|
+
|
82
|
+
# Set the name of the subscription node
|
83
|
+
#
|
84
|
+
# @param [String] node
|
85
|
+
def node=(node)
|
86
|
+
subscription_node[:node] = node
|
87
|
+
end
|
88
|
+
|
89
|
+
# Get the ID of the subscription
|
90
|
+
#
|
91
|
+
# @return [String]
|
92
|
+
def subid
|
93
|
+
subscription_node[:subid]
|
94
|
+
end
|
95
|
+
|
96
|
+
# Set the ID of the subscription
|
97
|
+
#
|
98
|
+
# @param [String] subid
|
99
|
+
def subid=(subid)
|
100
|
+
subscription_node[:subid] = subid
|
101
|
+
end
|
102
|
+
|
103
|
+
# Get the subscription type
|
104
|
+
#
|
105
|
+
# @return [VALID_TYPES, nil]
|
106
|
+
def subscription
|
107
|
+
s = subscription_node[:subscription]
|
108
|
+
s.to_sym if s
|
109
|
+
end
|
110
|
+
|
111
|
+
# Set the subscription type
|
112
|
+
#
|
113
|
+
# @param [VALID_TYPES, nil] subscription
|
114
|
+
def subscription=(subscription)
|
115
|
+
if subscription && !VALID_TYPES.include?(subscription.to_sym)
|
116
|
+
raise ArgumentError, "Invalid Type (#{type}), use: #{VALID_TYPES*' '}"
|
117
|
+
end
|
118
|
+
subscription_node[:subscription] = subscription
|
119
|
+
end
|
120
|
+
|
121
|
+
# Get or create the actual subscription node
|
122
|
+
#
|
123
|
+
# @return [Blather::XMPPNode]
|
124
|
+
def subscription_node
|
125
|
+
unless subscription = pubsub.find_first('ns:subscription', :ns => self.class.registered_ns)
|
126
|
+
self.pubsub << (subscription = XMPPNode.new('subscription', self.document))
|
127
|
+
subscription.namespace = self.pubsub.namespace
|
128
|
+
end
|
129
|
+
subscription
|
130
|
+
end
|
131
|
+
end # Subscribe
|
132
|
+
|
133
|
+
end # PubSub
|
134
|
+
end # Stanza
|
135
|
+
end # Blather
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Blather
|
2
|
+
class Stanza
|
3
|
+
class PubSub
|
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
|
10
|
+
class Subscriptions < PubSub
|
11
|
+
register :pubsub_subscriptions, :subscriptions, self.registered_ns
|
12
|
+
|
13
|
+
include Enumerable
|
14
|
+
alias_method :find, :xpath
|
15
|
+
|
16
|
+
# Overrides the parent to ensure a subscriptions node is created
|
17
|
+
# @private
|
18
|
+
def self.new(type = nil, host = nil)
|
19
|
+
new_node = super type
|
20
|
+
new_node.to = host
|
21
|
+
new_node.subscriptions
|
22
|
+
new_node
|
23
|
+
end
|
24
|
+
|
25
|
+
# Overrides the parent to ensure the subscriptions node is destroyed
|
26
|
+
# @private
|
27
|
+
def inherit(node)
|
28
|
+
subscriptions.remove
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
# Get or create the actual subscriptions node
|
33
|
+
#
|
34
|
+
# @return [Blather::XMPPNode]
|
35
|
+
def subscriptions
|
36
|
+
aff = pubsub.find_first('subscriptions', self.class.registered_ns)
|
37
|
+
unless aff
|
38
|
+
(self.pubsub << (aff = XMPPNode.new('subscriptions', self.document)))
|
39
|
+
end
|
40
|
+
aff
|
41
|
+
end
|
42
|
+
|
43
|
+
# Iterate over the list of subscriptions
|
44
|
+
#
|
45
|
+
# @yieldparam [Hash] subscription
|
46
|
+
# @see {#list}
|
47
|
+
def each(&block)
|
48
|
+
list.each &block
|
49
|
+
end
|
50
|
+
|
51
|
+
# Get the size of the subscriptions list
|
52
|
+
#
|
53
|
+
# @return [Fixnum]
|
54
|
+
def size
|
55
|
+
list.size
|
56
|
+
end
|
57
|
+
|
58
|
+
# Get a hash of subscriptions
|
59
|
+
#
|
60
|
+
# @example
|
61
|
+
# { :subscribed => [{:node => 'node1', :jid => 'francisco@denmark.lit', :subid => 'fd8237yr872h3f289j2'}, {:node => 'node2', :jid => 'francisco@denmark.lit', :subid => 'h8394hf8923ju'}],
|
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]
|
67
|
+
def list
|
68
|
+
subscriptions.find('//ns:subscription', :ns => self.class.registered_ns).inject({}) do |hash, item|
|
69
|
+
hash[item[:subscription].to_sym] ||= []
|
70
|
+
sub = {
|
71
|
+
:node => item[:node],
|
72
|
+
:jid => item[:jid]
|
73
|
+
}
|
74
|
+
sub[:subid] = item[:subid] if item[:subid]
|
75
|
+
hash[item[:subscription].to_sym] << sub
|
76
|
+
hash
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end # Subscriptions
|
80
|
+
|
81
|
+
end # PubSub
|
82
|
+
end # Stanza
|
83
|
+
end # Blather
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Blather
|
2
|
+
class Stanza
|
3
|
+
class PubSub
|
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
|
10
|
+
class Unsubscribe < PubSub
|
11
|
+
register :pubsub_unsubscribe, :unsubscribe, self.registered_ns
|
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
|
19
|
+
# @param [String] subid the subscription ID of the unsubscription
|
20
|
+
def self.new(type = :set, host = nil, node = nil, jid = nil, subid = nil)
|
21
|
+
new_node = super(type, host)
|
22
|
+
new_node.node = node
|
23
|
+
new_node.jid = jid
|
24
|
+
new_node.subid = subid
|
25
|
+
new_node
|
26
|
+
end
|
27
|
+
|
28
|
+
# Get the JID of the unsubscription
|
29
|
+
#
|
30
|
+
# @return [Blather::JID]
|
31
|
+
def jid
|
32
|
+
JID.new(unsubscribe[:jid])
|
33
|
+
end
|
34
|
+
|
35
|
+
# Set the JID of the unsubscription
|
36
|
+
#
|
37
|
+
# @param [Blather::JID, #to_s] jid
|
38
|
+
def jid=(jid)
|
39
|
+
unsubscribe[:jid] = jid
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get the name of the node to unsubscribe from
|
43
|
+
#
|
44
|
+
# @return [String]
|
45
|
+
def node
|
46
|
+
unsubscribe[:node]
|
47
|
+
end
|
48
|
+
|
49
|
+
# Set the name of the node to unsubscribe from
|
50
|
+
#
|
51
|
+
# @param [String] node
|
52
|
+
def node=(node)
|
53
|
+
unsubscribe[:node] = node
|
54
|
+
end
|
55
|
+
|
56
|
+
# Get the subscription ID to unsubscribe from
|
57
|
+
#
|
58
|
+
# @return [String]
|
59
|
+
def subid
|
60
|
+
unsubscribe[:subid]
|
61
|
+
end
|
62
|
+
|
63
|
+
# Set the subscription ID to unsubscribe from
|
64
|
+
#
|
65
|
+
# @param [String] node
|
66
|
+
def subid=(subid)
|
67
|
+
unsubscribe[:subid] = subid
|
68
|
+
end
|
69
|
+
|
70
|
+
# Get or create the actual unsubscribe node
|
71
|
+
#
|
72
|
+
# @return [Blather::XMPPNode]
|
73
|
+
def unsubscribe
|
74
|
+
unless unsubscribe = pubsub.find_first('ns:unsubscribe', :ns => self.class.registered_ns)
|
75
|
+
self.pubsub << (unsubscribe = XMPPNode.new('unsubscribe', self.document))
|
76
|
+
unsubscribe.namespace = self.pubsub.namespace
|
77
|
+
end
|
78
|
+
unsubscribe
|
79
|
+
end
|
80
|
+
end # Unsubscribe
|
81
|
+
|
82
|
+
end # PubSub
|
83
|
+
end # Stanza
|
84
|
+
end # Blather
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Blather
|
2
|
+
class Stanza
|
3
|
+
|
4
|
+
# # PubSubOwner Base Class
|
5
|
+
#
|
6
|
+
# [XEP-0060 - Publish-Subscribe](http://xmpp.org/extensions/xep-0060.html)
|
7
|
+
#
|
8
|
+
# @handler :pubsub_owner
|
9
|
+
class PubSubOwner < Iq
|
10
|
+
register :pubsub_owner, :pubsub, 'http://jabber.org/protocol/pubsub#owner'
|
11
|
+
|
12
|
+
# Creates the proper class from the stana's child
|
13
|
+
# @private
|
14
|
+
def self.import(node)
|
15
|
+
klass = nil
|
16
|
+
if pubsub = node.document.find_first('//ns:pubsub', :ns => self.registered_ns)
|
17
|
+
pubsub.children.each { |e| break if klass = class_from_registration(e.element_name, (e.namespace.href if e.namespace)) }
|
18
|
+
end
|
19
|
+
(klass || self).new(node[:type]).inherit(node)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Overrides the parent to ensure a pubsub node is created
|
23
|
+
# @private
|
24
|
+
def self.new(type = nil, host = nil)
|
25
|
+
new_node = super type
|
26
|
+
new_node.to = host
|
27
|
+
new_node.pubsub
|
28
|
+
new_node
|
29
|
+
end
|
30
|
+
|
31
|
+
# Overrides the parent to ensure the pubsub node is destroyed
|
32
|
+
# @private
|
33
|
+
def inherit(node)
|
34
|
+
remove_children :pubsub
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
38
|
+
# Get or create the pubsub node on the stanza
|
39
|
+
#
|
40
|
+
# @return [Blather::XMPPNode]
|
41
|
+
def pubsub
|
42
|
+
unless p = find_first('ns:pubsub', :ns => self.class.registered_ns)
|
43
|
+
self << (p = XMPPNode.new('pubsub', self.document))
|
44
|
+
p.namespace = self.class.registered_ns
|
45
|
+
end
|
46
|
+
p
|
47
|
+
end
|
48
|
+
end # PubSubOwner
|
49
|
+
|
50
|
+
end # Stanza
|
51
|
+
end # Blather
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Blather
|
2
|
+
class Stanza
|
3
|
+
class PubSubOwner
|
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
|
10
|
+
class Delete < PubSubOwner
|
11
|
+
register :pubsub_delete, :delete, self.registered_ns
|
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
|
18
|
+
def self.new(type = :set, host = nil, node = nil)
|
19
|
+
new_node = super(type, host)
|
20
|
+
new_node.node = node
|
21
|
+
new_node
|
22
|
+
end
|
23
|
+
|
24
|
+
# Get the name of the node to delete
|
25
|
+
#
|
26
|
+
# @return [String]
|
27
|
+
def node
|
28
|
+
delete_node[:node]
|
29
|
+
end
|
30
|
+
|
31
|
+
# Set the name of the node to delete
|
32
|
+
#
|
33
|
+
# @param [String] node
|
34
|
+
def node=(node)
|
35
|
+
delete_node[:node] = node
|
36
|
+
end
|
37
|
+
|
38
|
+
# Get or create the actual delete node on the stanza
|
39
|
+
#
|
40
|
+
# @return [Blather::XMPPNode]
|
41
|
+
def delete_node
|
42
|
+
unless delete_node = pubsub.find_first('ns:delete', :ns => self.class.registered_ns)
|
43
|
+
self.pubsub << (delete_node = XMPPNode.new('delete', self.document))
|
44
|
+
delete_node.namespace = self.pubsub.namespace
|
45
|
+
end
|
46
|
+
delete_node
|
47
|
+
end
|
48
|
+
end # Retract
|
49
|
+
|
50
|
+
end # PubSub
|
51
|
+
end # Stanza
|
52
|
+
end # Blather
|