xmpp4r-observable 0.5.3 → 0.5.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.
@@ -15,7 +15,7 @@ module ObservableThing
15
15
  unless observer.respond_to? func
16
16
  raise NoMethodError, "observer does not respond to `#{func.to_s}'"
17
17
  end
18
- @things[thing][observer] = func
18
+ @things[thing][observer] = func unless @things[thing].include?(observer)
19
19
  end
20
20
 
21
21
  # Deletes an observer for some "thing".
@@ -101,6 +101,11 @@ module Jabber
101
101
  @observable = observable
102
102
 
103
103
  @helper = @service_jid = nil
104
+ @disco = Jabber::Discovery::Helper.new(@observable.client)
105
+ attach!
106
+ end
107
+
108
+ def attach!
104
109
  begin
105
110
  domain = Jabber::JID.new(@observable.jid).domain
106
111
  @service_jid = "pubsub." + domain
@@ -108,6 +113,7 @@ module Jabber
108
113
  rescue
109
114
  @helper = @service_jid = nil
110
115
  end
116
+ return has_service?
111
117
  end
112
118
 
113
119
  def inspect #:nodoc:
@@ -123,23 +129,27 @@ module Jabber
123
129
  ! @helper.nil?
124
130
  end
125
131
 
126
- # Sets the PubSub service. Just one service is allowed.
132
+ # Sets the PubSub service. Just one service is allowed. If nil, reset.
127
133
  def set_service(service)
128
- raise NotConnected, "You are not connected" if ! @observable.connected?
129
- raise AlreadySet, "You already have a PubSub service (#{@service_jid})." if has_service?
130
- @helper = Jabber::PubSub::ServiceHelper.new(@observable.client, service)
131
- @service_jid = service
132
-
133
- @helper.add_event_callback do |event|
134
- @observable.changed(:event)
135
- @observable.notify_observers(:event, event)
134
+ if service.nil?
135
+ @helper = @service_jid = nil
136
+ else
137
+ raise NotConnected, "You are not connected" if ! @observable.connected?
138
+ raise AlreadySet, "You already have a PubSub service (#{@service_jid})." if has_service?
139
+ @helper = Jabber::PubSub::ServiceHelper.new(@observable.client, service)
140
+ @service_jid = service
141
+
142
+ @helper.add_event_callback do |event|
143
+ @observable.changed(:event)
144
+ @observable.notify_observers(:event, event)
145
+ end
136
146
  end
137
147
  end
138
148
 
139
149
  # Subscribe to a node.
140
150
  def subscribe_to(node)
141
151
  raise_noservice if ! has_service?
142
- @helper.subscribe_to(node)
152
+ @helper.subscribe_to(node) unless is_subscribed_to?(node)
143
153
  end
144
154
 
145
155
  # Unsubscribe from a node.
@@ -190,7 +200,7 @@ module Jabber
190
200
  node
191
201
  end
192
202
 
193
- # Return an array of noes I own
203
+ # Return an array of nodes I own
194
204
  def my_nodes
195
205
  if ! defined? @my_nodes
196
206
  ret = []
@@ -202,6 +212,30 @@ module Jabber
202
212
  return @my_nodes
203
213
  end
204
214
 
215
+ # Return true if a given node exists
216
+ def node_exists?(node)
217
+ ret = []
218
+ if ! defined? @existing_nodes or ! @existing_nodes.include?(node)
219
+ # We'll renew @existing_nodes if we haven't got it the first time
220
+ reply = @disco.get_items_for(@service_jid)
221
+ reply.items.each do |item|
222
+ ret << item.node
223
+ end
224
+ @existing_nodes = ret
225
+ end
226
+ return @existing_nodes.include?(node)
227
+ end
228
+
229
+ # Returns an array of nodes I am subscribed to
230
+ def subscribed_nodes
231
+ ret = []
232
+ subscriptions.each do |sub|
233
+ next if sub.node.nil?
234
+ ret << sub.node if sub.attributes['subscription'] == 'subscribed' and ! my_nodes.include?(sub.node)
235
+ end
236
+ return ret
237
+ end
238
+
205
239
  # Return true if we're subscribed to that node
206
240
  def is_subscribed_to?(node)
207
241
  ret = false
@@ -628,6 +662,12 @@ module Jabber
628
662
  # Post-connect
629
663
  register_default_callbacks
630
664
  status(@presence, @status_message)
665
+ if ! @pubsub.nil?
666
+ @pubsub.attach!
667
+ else
668
+ @pubsub = PubSub.new(self)
669
+ end
670
+
631
671
  @connect_mutex.unlock
632
672
  end
633
673
 
@@ -641,6 +681,7 @@ module Jabber
641
681
  end
642
682
  end
643
683
  client = nil
684
+ @pubsub.set_service(nil)
644
685
  @disconnected = auto_reconnect
645
686
  end
646
687
 
@@ -693,6 +734,7 @@ module Jabber
693
734
  @deferred_delivery_thread = Thread.new {
694
735
  loop {
695
736
  sleep 3 while @deferred_messages.empty?
737
+ sleep 3
696
738
  message = @deferred_messages.deq
697
739
  if @subs.subscribed_to?(message[:to])
698
740
  deliver(message[:to], message[:message], message[:type])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xmpp4r-observable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Lorenzoni
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-10 00:00:00 -03:00
12
+ date: 2009-10-27 00:00:00 -02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -22,7 +22,7 @@ dependencies:
22
22
  - !ruby/object:Gem::Version
23
23
  version: 0.5.0
24
24
  version:
25
- description: " Jabber::Observable builds on the strong foundation of XMPP4R and use\n a customized version of Ruby's builtin Observer pattern to expose\n XMPP observable things (as messages, pubsub events, presence, etc).\n"
25
+ description: Jabber::Observable builds on the strong foundation of XMPP4R and use a customized version of Ruby's builtin Observer pattern to expose XMPP observable things (as messages, pubsub events, presence, etc).
26
26
  email: pablo@propus.com.br
27
27
  executables: []
28
28
 
@@ -43,8 +43,6 @@ files:
43
43
  - test/tc_xmpp4r-observable.rb
44
44
  has_rdoc: true
45
45
  homepage: http://www.nardol.org/
46
- licenses: []
47
-
48
46
  post_install_message:
49
47
  rdoc_options: []
50
48
 
@@ -65,9 +63,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
63
  requirements: []
66
64
 
67
65
  rubyforge_project:
68
- rubygems_version: 1.3.3
66
+ rubygems_version: 1.3.1
69
67
  signing_key:
70
- specification_version: 3
68
+ specification_version: 2
71
69
  summary: An observable Jabber client library.
72
70
  test_files:
73
71
  - test/tc_observable_thing.rb