Class Jabber::CallbackList
In: lib/xmpp4r/callbacks.rb
Parent: Object
XMPPElement ErrorResponse XMPPStanza X IqQuery Message Presence Iq JabberError ComponentAuthenticationFailure ArgumentError SOCKS5Error ServerError NoNameXmlnsRegistered ClientAuthenticationFailure Connection Client Component Client Singleton IdGenerator Comparable JID StandardError REXML::Element Stream IqQuery IqQueryRoster IqQueryBytestreams IqQueryVersion IqQueryRPC IqQueryMUCOwner IqQueryMUCAdmin IqQueryDiscoItems IqQueryDiscoInfo XRosterItem RosterXItem XMPPElement RosterItem StreamHost IqSiFile IqSiFileRange IqSi StreamHostUsed IqFeature C Body HTML UserItem XMUCUserInvite Configuration Items Item IqPubSub Publish Event IqPubSubOwner Subscription Unsubscribe Tune XDataField XDataReported XDataTitle XDataInstructions Feature Item Identity IqVcard XRoster RosterX X XMUC XMUCUser XDelay XData Iq IqCommand SOCKS5Bytestreams SOCKS5BytestreamsTarget SOCKS5BytestreamsInitiator SOCKS5BytestreamsServerStreamHost TCPSocket SOCKS5Socket IBB IBBTarget IBBInitiator Responder SimpleResponder XMLRPC::ParserWriterChooseMixin Client Server XMLRPC::ParseContentType XMLRPC::BasicServer MUCClient SimpleMUCClient MUC::UserItem XMUCUserItem IqQueryMUCAdminItem XParent SubscriptionConfig NodeConfig OwnerNodeConfig EventItems EventItem ServiceHelper NodeHelper Base Anonymous DigestMD5 Plain PubSub::ServiceHelper Helper FileSource Base Bot CallbackList Callback StreamParser Semaphore Helper Responder SOCKS5BytestreamsPeer SOCKS5BytestreamsServer IBBQueueItem Helper MUCBrowser NodeBrowser Helper Responder Helper lib/xmpp4r/message.rb lib/xmpp4r/connection.rb lib/xmpp4r/xmppstanza.rb lib/xmpp4r/iq.rb lib/xmpp4r/callbacks.rb lib/xmpp4r/idgenerator.rb lib/xmpp4r/stream.rb lib/xmpp4r/client.rb lib/xmpp4r/jid.rb lib/xmpp4r/x.rb lib/xmpp4r/streamparser.rb lib/xmpp4r/semaphore.rb lib/xmpp4r/errors.rb lib/xmpp4r/component.rb lib/xmpp4r/presence.rb lib/xmpp4r/xmppelement.rb lib/xmpp4r/query.rb lib/xmpp4r/roster/x/roster.rb lib/xmpp4r/roster/helper/roster.rb lib/xmpp4r/roster/iq/roster.rb Roster lib/xmpp4r/command/iq/command.rb lib/xmpp4r/command/helper/responder.rb Command XParent lib/xmpp4r/bytestreams/iq/si.rb lib/xmpp4r/bytestreams/helper/ibb/initiator.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb lib/xmpp4r/bytestreams/iq/bytestreams.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb lib/xmpp4r/bytestreams/helper/ibb/target.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb lib/xmpp4r/bytestreams/helper/ibb/base.rb Bytestreams lib/xmpp4r/version/helper/responder.rb lib/xmpp4r/version/helper/simpleresponder.rb lib/xmpp4r/version/iq/version.rb Version lib/xmpp4r/feature_negotiation/iq/feature.rb FeatureNegotiation lib/xmpp4r/caps/helper/helper.rb lib/xmpp4r/caps/c.rb Caps lib/xmpp4r/rpc/helper/server.rb lib/xmpp4r/rpc/helper/client.rb lib/xmpp4r/rpc/iq/rpc.rb RPC lib/xmpp4r/xhtml/html.rb XHTML lib/xmpp4r/muc/iq/mucadminitem.rb lib/xmpp4r/muc/x/muc.rb lib/xmpp4r/muc/item.rb lib/xmpp4r/muc/helper/simplemucclient.rb lib/xmpp4r/muc/iq/mucadmin.rb lib/xmpp4r/muc/helper/mucbrowser.rb lib/xmpp4r/muc/x/mucuseritem.rb lib/xmpp4r/muc/x/mucuserinvite.rb lib/xmpp4r/muc/iq/mucowner.rb lib/xmpp4r/muc/helper/mucclient.rb MUC lib/xmpp4r/delay/x/delay.rb Delay lib/xmpp4r/pubsub/children/item.rb lib/xmpp4r/pubsub/children/configuration.rb lib/xmpp4r/pubsub/children/subscription.rb lib/xmpp4r/pubsub/helper/servicehelper.rb lib/xmpp4r/pubsub/children/unsubscribe.rb lib/xmpp4r/pubsub/children/publish.rb lib/xmpp4r/pubsub/children/event.rb lib/xmpp4r/pubsub/iq/pubsub.rb lib/xmpp4r/pubsub/helper/nodebrowser.rb lib/xmpp4r/pubsub/helper/nodehelper.rb lib/xmpp4r/pubsub/children/items.rb lib/xmpp4r/pubsub/children/subscription_config.rb lib/xmpp4r/pubsub/children/node_config.rb PubSub lib/xmpp4r/sasl.rb SASL lib/xmpp4r/httpbinding/client.rb HTTPBinding lib/xmpp4r/tune/helper/helper.rb lib/xmpp4r/tune/tune.rb UserTune lib/xmpp4r/dataforms/x/data.rb Dataforms lib/xmpp4r/bytestreams/helper/filetransfer.rb TransferSource FileTransfer lib/xmpp4r/discovery/iq/discoinfo.rb lib/xmpp4r/discovery/helper/responder.rb lib/xmpp4r/discovery/iq/discoitems.rb Discovery lib/xmpp4r/framework/base.rb lib/xmpp4r/framework/bot.rb Framework lib/xmpp4r/vcard/helper/vcard.rb lib/xmpp4r/vcard/iq/vcard.rb Vcard Jabber dot/m_99_0.png

This class manages a list of callbacks.

Callbacks management and priority

Callbacks are managed by the class CallbackList. When they are added, a priority (just a number or anything Comparable with other priorities) is specified. The biggest the priority is, the earliest the callback will be considered.

Callbacks are processed for a given set of objects as long as they return false. If you want to stop processing, you must return true. Example :

 cbl = CallbackList.new
 c1 = false
 c2 = false
 c3 = false
 cbl.add(10) { c1 = true; 1 }
 cbl.add(5) { c2 = true; true }
 cbl.add(0) { c3 = true }
 cbl.process('aa')
 puts "#{c1} #{c2} #{c3}"

This example would display "true true false" as callbacks processing was stopped after the second callback returned true.

In XMPP4R, callbacks’ priorities are quite normalized since we want to be able to "cascade" callbacks in a clean way. Here are values your code should take into account :

>= 200:logging & debugging callbacks. Those callbacks should not consume elements.
100-199:Where Helpers register their callbacks. The normal value is 100, and Helpers shouldn‘t register something else unless there‘s a very good reason to.
< 100:all those numbers are normally available for your application. That‘s enough, don‘t you think ?

Methods

add   delete   length   new   process  

Public Class methods

Create a new list of callbacks

[Source]

    # File lib/xmpp4r/callbacks.rb, line 44
44:     def initialize
45:       @list = []
46:     end

Public Instance methods

Add a callback to the list

List will be sorted afterwards

prio:[Integer] the callback‘s priority, the higher, the sooner.
ref:[String] the callback‘s reference
block:[Block] a block to execute
return:[Jabber::CallbackList] The list, for chaining

[Source]

    # File lib/xmpp4r/callbacks.rb, line 57
57:     def add(prio = 0, ref = nil, proc = nil, &block)
58:       block = proc if proc
59:       @list.push(Callback.new(prio, ref, block))
60:       @list.sort! { |a, b| b.priority <=> a.priority }
61:       self
62:     end

Delete a callback by reference

ref:[String] the reference of the callback to delete
return:[CallBackList] The list, for chaining

[Source]

    # File lib/xmpp4r/callbacks.rb, line 68
68:     def delete(ref)
69:       @list.delete_if { |item| item.ref == ref }
70:       self
71:     end

Number of elements in the list

return:[Integer] The number of elements

[Source]

    # File lib/xmpp4r/callbacks.rb, line 76
76:     def length
77:       @list.length
78:     end

Process an element through all my callbacks. returns e.consumed?

e:[Object] The elements to pass to the callback. You can pass

several, but of course, you block must know how to handle them.

return:[Boolean] true if the element has been consumed

[Source]

    # File lib/xmpp4r/callbacks.rb, line 85
85:     def process(*e)
86:       # If somebody adds a new callback the list will get modified
87:       # and sorted(!) while still iterating through it. So we use a
88:       # local copy of @list. Any freshly added callback will receive
89:       # the next stanzas, not the current.
90:       list = @list.dup
91: 
92:       # process through callbacks
93:       list.each do |item|
94:         return true if item.block.call(*e) == true
95:       end
96:       false
97:     end

[Validate]