xmpp4r-observable 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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