public
Description: Tomporary (hopefully) fork of XMPP4R-Simple
Homepage: http://code.google.com/p/xmpp4r-simple/
Clone URL: git://github.com/dysinger/xmpp4r-simple.git
Search Repo:
tests are finnicky, but this [hopefully] greatly reduces memory usage and 
improves status update performance.

git-svn-id: http://xmpp4r-simple.googlecode.com/svn/trunk@20 
1e3c5029-9921-0410-9e82-436f4d538387
romeda (author)
Thu Dec 07 12:44:21 -0800 2006
commit  a05957347580b32271dcbc4e7056282a1ce053e1
tree    93d5dc34ae0cb4b2972ed0dc1e5e85553a07161c
parent  2f06912b19aa4800ab5da9d99b7e7ef360081bd9
...
226
227
228
229
230
 
 
231
232
233
 
 
 
 
 
 
 
 
 
 
 
 
234
235
236
237
...
384
385
386
 
 
387
388
 
 
 
 
 
 
 
 
 
 
 
 
389
390
391
...
226
227
228
 
 
229
230
231
232
 
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
...
395
396
397
398
399
400
 
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
0
@@ -226,11 +226,22 @@
0
     #
0
     # e.g.:
0
     #
0
- # jabber.presence_updates do |friend, old_presence, new_presence|
0
- # puts "Received presence update from #{friend.to_s}: #{new_presence}"
0
+ # jabber.presence_updates do |friend, new_presence|
0
+ # puts "Received presence update from #{friend}: #{new_presence}"
0
     # end
0
     def presence_updates(&block)
0
- dequeue(:presence_updates, &block)
0
+ updates = []
0
+ @presence_mutex.synchronize do
0
+ dequeue(:presence_updates) do |friend|
0
+ presence = @presence_updates[friend]
0
+ next unless presence
0
+ new_update = [friend, presence[0], presence[1]]
0
+ yield new_update if block_given?
0
+ updates << new_update
0
+ @presence_updates.delete(friend)
0
+ end
0
+ end
0
+ return updates
0
     end
0
     
0
     # Returns true if there are unprocessed presence updates waiting in the
0
0
@@ -384,8 +395,21 @@
0
         end
0
       end
0
 
0
+ @presence_updates = {}
0
+ @presence_mutex = Mutex.new
0
       roster.add_presence_callback do |roster_item, old_presence, new_presence|
0
- queue(:presence_updates) << [roster_item, old_presence, new_presence]
0
+ simple_jid = roster_item.jid.strip.to_s
0
+ presence = case new_presence.type
0
+ when nil: new_presence.show || :online
0
+ when :unavailable: :unavailable
0
+ else
0
+ nil
0
+ end
0
+
0
+ if presence && @presence_updates[simple_jid] != presence
0
+ queue(:presence_updates) << simple_jid
0
+ @presence_mutex.synchronize { @presence_updates[simple_jid] = [presence, new_presence.status] }
0
+ end
0
       end
0
     end
0
 
...
145
146
147
 
148
149
150
...
158
159
160
161
162
163
 
 
 
164
165
166
...
145
146
147
148
149
150
151
...
159
160
161
 
 
 
162
163
164
165
166
167
0
@@ -145,6 +145,7 @@
0
   def test_presence_updates_should_be_received
0
 
0
     @client2.add(@client1)
0
+ @client1.add(@client2)
0
 
0
     assert_before(60) { assert @client2.subscribed_to?(@jid1) }
0
     assert_before(60) { assert_equal 0, @client2.presence_updates.size }
0
@@ -158,9 +159,9 @@
0
     end
0
 
0
     new_status = new_statuses.first
0
- assert_equal @jid1, new_status[0].jid.strip.to_s
0
- assert_equal "Doing something else.", new_status[2].status
0
- assert_equal :away, new_status[2].show
0
+ assert_equal @jid1, new_status[0]
0
+ assert_equal "Doing something else.", new_status[2]
0
+ assert_equal :away, new_status[1]
0
   end
0
 
0
   def test_disable_auto_accept_subscription_requests

Comments

    No one has commented yet.