blather 0.4.7 → 0.4.8
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.
- data/README.md +162 -0
 - data/examples/{print_heirarchy.rb → print_hierarchy.rb} +5 -5
 - data/examples/stream_only.rb +27 -0
 - data/lib/blather.rb +4 -0
 - data/lib/blather/client/client.rb +91 -73
 - data/lib/blather/client/dsl.rb +156 -32
 - data/lib/blather/client/dsl/pubsub.rb +86 -54
 - data/lib/blather/core_ext/active_support.rb +9 -9
 - data/lib/blather/core_ext/active_support/inheritable_attributes.rb +2 -2
 - data/lib/blather/core_ext/nokogiri.rb +12 -7
 - data/lib/blather/errors.rb +25 -14
 - data/lib/blather/errors/sasl_error.rb +21 -3
 - data/lib/blather/errors/stanza_error.rb +37 -21
 - data/lib/blather/errors/stream_error.rb +27 -17
 - data/lib/blather/jid.rb +79 -24
 - data/lib/blather/roster.rb +39 -21
 - data/lib/blather/roster_item.rb +43 -21
 - data/lib/blather/stanza.rb +88 -40
 - data/lib/blather/stanza/disco.rb +12 -2
 - data/lib/blather/stanza/disco/disco_info.rb +112 -20
 - data/lib/blather/stanza/disco/disco_items.rb +81 -12
 - data/lib/blather/stanza/iq.rb +94 -38
 - data/lib/blather/stanza/iq/query.rb +16 -22
 - data/lib/blather/stanza/iq/roster.rb +98 -20
 - data/lib/blather/stanza/message.rb +266 -111
 - data/lib/blather/stanza/presence.rb +118 -42
 - data/lib/blather/stanza/presence/status.rb +140 -60
 - data/lib/blather/stanza/presence/subscription.rb +44 -10
 - data/lib/blather/stanza/pubsub.rb +70 -15
 - data/lib/blather/stanza/pubsub/affiliations.rb +36 -7
 - data/lib/blather/stanza/pubsub/create.rb +26 -4
 - data/lib/blather/stanza/pubsub/errors.rb +13 -4
 - data/lib/blather/stanza/pubsub/event.rb +56 -10
 - data/lib/blather/stanza/pubsub/items.rb +46 -6
 - data/lib/blather/stanza/pubsub/publish.rb +52 -7
 - data/lib/blather/stanza/pubsub/retract.rb +45 -6
 - data/lib/blather/stanza/pubsub/subscribe.rb +30 -4
 - data/lib/blather/stanza/pubsub/subscription.rb +74 -6
 - data/lib/blather/stanza/pubsub/subscriptions.rb +35 -9
 - data/lib/blather/stanza/pubsub/unsubscribe.rb +30 -4
 - data/lib/blather/stanza/pubsub_owner.rb +17 -7
 - data/lib/blather/stanza/pubsub_owner/delete.rb +23 -5
 - data/lib/blather/stanza/pubsub_owner/purge.rb +23 -5
 - data/lib/blather/stream.rb +96 -29
 - data/lib/blather/stream/parser.rb +6 -9
 - data/lib/blather/xmpp_node.rb +101 -153
 - data/spec/blather/client/client_spec.rb +1 -1
 - data/spec/blather/errors_spec.rb +5 -5
 - data/spec/blather/stanza/message_spec.rb +56 -0
 - data/spec/blather/stanza/presence/status_spec.rb +1 -1
 - data/spec/blather/stanza_spec.rb +3 -3
 - data/spec/blather/xmpp_node_spec.rb +19 -74
 - metadata +6 -10
 - data/README.rdoc +0 -185
 - data/examples/drb_client.rb +0 -5
 - data/examples/ping.rb +0 -11
 - data/examples/pong.rb +0 -6
 - data/examples/pubsub/cli.rb +0 -64
 - data/examples/pubsub/ping_pong.rb +0 -18
 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,162 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Blather
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            XMPP DSL (and more) for Ruby written on EventMachine and Nokogiri.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            ## Features
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            * evented architecture
         
     | 
| 
      
 8 
     | 
    
         
            +
            * uses Nokogiri
         
     | 
| 
      
 9 
     | 
    
         
            +
            * simplified starting point
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            ## Project Pages
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            * [Docs](http://blather.squishtech.com)
         
     | 
| 
      
 14 
     | 
    
         
            +
            * [GitHub](https://github.com/sprsquish/blather)
         
     | 
| 
      
 15 
     | 
    
         
            +
            * [Gemcutter](http://gemcutter.org/gems/blather)
         
     | 
| 
      
 16 
     | 
    
         
            +
            * [Google Group](http://groups.google.com/group/xmpp-blather)
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            # Usage
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            ## Installation
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                sudo gem install blather
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            ## Example
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            See the examples directory for more advanced examples.
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            This will auto-accept any subscription requests and echo back any chat messages.
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                require 'rubygems'
         
     | 
| 
      
 31 
     | 
    
         
            +
                require 'blather/client'
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                setup 'echo@jabber.local', 'echo'
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                # Auto approve subscription requests
         
     | 
| 
      
 36 
     | 
    
         
            +
                subscription :request? do |s|
         
     | 
| 
      
 37 
     | 
    
         
            +
                  write_to_stream s.approve!
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                # Echo back what was said
         
     | 
| 
      
 41 
     | 
    
         
            +
                message :chat?, :body do |m|
         
     | 
| 
      
 42 
     | 
    
         
            +
                  write_to_stream m.reply
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            ## Handlers
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            Setup handlers by calling their names as methods.
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                # Will only be called for messages where #chat? responds positively
         
     | 
| 
      
 50 
     | 
    
         
            +
                # and #body == 'exit'
         
     | 
| 
      
 51 
     | 
    
         
            +
                message :chat?, :body => 'exit'
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            ### Non-Stanza Handlers
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            So far there are two non-stanza related handlers.
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                # Called after the connection has been connected. It's good for initializing
         
     | 
| 
      
 58 
     | 
    
         
            +
                # your system.
         
     | 
| 
      
 59 
     | 
    
         
            +
                # DSL:
         
     | 
| 
      
 60 
     | 
    
         
            +
                when_ready {}
         
     | 
| 
      
 61 
     | 
    
         
            +
                # Client:
         
     | 
| 
      
 62 
     | 
    
         
            +
                client.register_handler(:ready) {}
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                # Called after the connection has been terminated. Good for teardown or
         
     | 
| 
      
 65 
     | 
    
         
            +
                # automatic reconnection.
         
     | 
| 
      
 66 
     | 
    
         
            +
                # DSL:
         
     | 
| 
      
 67 
     | 
    
         
            +
                disconnected {}
         
     | 
| 
      
 68 
     | 
    
         
            +
                # Client
         
     | 
| 
      
 69 
     | 
    
         
            +
                client.register_handler(:disconnected) {}
         
     | 
| 
      
 70 
     | 
    
         
            +
                # The following will reconnect every time the connection is lost:
         
     | 
| 
      
 71 
     | 
    
         
            +
                disconnected { client.connect }
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            ### Handler Guards
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
            Guards act like AND statements. Each condition must be met if the handler is to
         
     | 
| 
      
 76 
     | 
    
         
            +
            be used.
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                # Equivalent to saying (stanza.chat? && stanza.body)
         
     | 
| 
      
 79 
     | 
    
         
            +
                message :chat?, :body
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            The different types of guards are:
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                # Symbol
         
     | 
| 
      
 84 
     | 
    
         
            +
                #   Checks for a non-false reply to calling the symbol on the stanza
         
     | 
| 
      
 85 
     | 
    
         
            +
                #   Equivalent to stanza.chat?
         
     | 
| 
      
 86 
     | 
    
         
            +
                message :chat?
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                # Hash with any value (:body => 'exit')
         
     | 
| 
      
 89 
     | 
    
         
            +
                #   Calls the key on the stanza and checks for equality
         
     | 
| 
      
 90 
     | 
    
         
            +
                #   Equivalent to stanza.body == 'exit'
         
     | 
| 
      
 91 
     | 
    
         
            +
                message :body => 'exit'
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                # Hash with regular expression (:body => /exit/)
         
     | 
| 
      
 94 
     | 
    
         
            +
                #   Calls the key on the stanza and checks for a match
         
     | 
| 
      
 95 
     | 
    
         
            +
                #   Equivalent to stanza.body.match /exit/
         
     | 
| 
      
 96 
     | 
    
         
            +
                message :body => /exit/
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                # Hash with array (:name => [:gone, :forbidden])
         
     | 
| 
      
 99 
     | 
    
         
            +
                #   Calls the key on the stanza and check for inclusion in the array
         
     | 
| 
      
 100 
     | 
    
         
            +
                #   Equivalent to [:gone, :forbidden].include?(stanza.name)
         
     | 
| 
      
 101 
     | 
    
         
            +
                stanza_error :name => [:gone, :fobidden]
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                # Proc
         
     | 
| 
      
 104 
     | 
    
         
            +
                #   Calls the proc passing in the stanza
         
     | 
| 
      
 105 
     | 
    
         
            +
                #   Checks that the ID is modulo 3
         
     | 
| 
      
 106 
     | 
    
         
            +
                message proc { |m| m.id % 3 == 0 }
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
                # Array
         
     | 
| 
      
 109 
     | 
    
         
            +
                #   Use arrays with the previous types effectively turns the guard into
         
     | 
| 
      
 110 
     | 
    
         
            +
                #   an OR statement.
         
     | 
| 
      
 111 
     | 
    
         
            +
                #   Equivalent to stanza.body == 'foo' || stanza.body == 'baz'
         
     | 
| 
      
 112 
     | 
    
         
            +
                message [{:body => 'foo'}, {:body => 'baz'}]
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
                # XPath
         
     | 
| 
      
 115 
     | 
    
         
            +
                #   Runs the xpath query on the stanza and checks for results
         
     | 
| 
      
 116 
     | 
    
         
            +
                #   This guard type cannot be combined with other guards
         
     | 
| 
      
 117 
     | 
    
         
            +
                #   Equivalent to !stanza.find('/iq/ns:pubsub', :ns => 'pubsub:namespace').empty?
         
     | 
| 
      
 118 
     | 
    
         
            +
                iq '/iq/ns:pubsub', :ns => 'pubsub:namespace'
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
            ### Filters
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
            Blather provides before and after filters that work much the way regular
         
     | 
| 
      
 123 
     | 
    
         
            +
            handlers work. Filters come in a before and after flavor. They're called in
         
     | 
| 
      
 124 
     | 
    
         
            +
            order of definition and can be guarded like handlers.
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
                before { |s| "I'm run before any handler" }
         
     | 
| 
      
 127 
     | 
    
         
            +
                before { |s| "I'm run next" }
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                before(:message) { |s| "I'm only run in front of message stanzas" }
         
     | 
| 
      
 130 
     | 
    
         
            +
                before(nil, :id => 1) { |s| "I'll only be run when the stanza's ID == 1" }
         
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
      
 132 
     | 
    
         
            +
                # ... handlers
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
      
 134 
     | 
    
         
            +
                after { |s| "I'm run after everything" }
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
            ## On the Command Line:
         
     | 
| 
      
 137 
     | 
    
         
            +
             
     | 
| 
      
 138 
     | 
    
         
            +
            Default usage is:
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
                [blather_script] [options] node@domain.com/resource password [host] [port]
         
     | 
| 
      
 141 
     | 
    
         
            +
             
     | 
| 
      
 142 
     | 
    
         
            +
            Command line options:
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
                -D, --debug       Run in debug mode (you will see all XMPP communication)
         
     | 
| 
      
 145 
     | 
    
         
            +
                -d, --daemonize   Daemonize the process
         
     | 
| 
      
 146 
     | 
    
         
            +
                    --pid=[PID]   Write the PID to this file
         
     | 
| 
      
 147 
     | 
    
         
            +
                    --log=[LOG]   Write to the [LOG] file instead of stdout/stderr
         
     | 
| 
      
 148 
     | 
    
         
            +
                -h, --help        Show this message
         
     | 
| 
      
 149 
     | 
    
         
            +
                -v, --version     Show version
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
      
 152 
     | 
    
         
            +
            # Author
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
            [Jeff Smick](http://github.com/sprsquish)
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
            ### Contributors
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
            [Nolan Darilek](http://github.com/thewordnerd)
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
            # Copyright
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
            Copyright (c) 2009 Jeff Smick. See LICENSE for details.
         
     | 
| 
         @@ -8,7 +8,7 @@ class Object 
     | 
|
| 
       8 
8 
     | 
    
         
             
                # We check defined? in case we find a removed class that has yet to be
         
     | 
| 
       9 
9 
     | 
    
         
             
                # garbage collected. This also fails for anonymous classes -- please
         
     | 
| 
       10 
10 
     | 
    
         
             
                # submit a patch if you have a workaround.
         
     | 
| 
       11 
     | 
    
         
            -
                def subclasses_of(*superclasses) 
     | 
| 
      
 11 
     | 
    
         
            +
                def subclasses_of(*superclasses)
         
     | 
| 
       12 
12 
     | 
    
         
             
                  subclasses = []
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                  superclasses.each do |sup|
         
     | 
| 
         @@ -24,7 +24,7 @@ class Object 
     | 
|
| 
       24 
24 
     | 
    
         
             
              rescue RuntimeError
         
     | 
| 
       25 
25 
     | 
    
         
             
                # JRuby and any implementations which cannot handle the objectspace traversal
         
     | 
| 
       26 
26 
     | 
    
         
             
                # above fall back to this implementation
         
     | 
| 
       27 
     | 
    
         
            -
                def subclasses_of(*superclasses) 
     | 
| 
      
 27 
     | 
    
         
            +
                def subclasses_of(*superclasses)
         
     | 
| 
       28 
28 
     | 
    
         
             
                  subclasses = []
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
30 
     | 
    
         
             
                  superclasses.each do |sup|
         
     | 
| 
         @@ -52,7 +52,7 @@ end 
     | 
|
| 
       52 
52 
     | 
    
         | 
| 
       53 
53 
     | 
    
         
             
            handlers = {}
         
     | 
| 
       54 
54 
     | 
    
         
             
            (Object.subclasses_of(Blather::Stanza) + Object.subclasses_of(Blather::BlatherError)).each do |klass|
         
     | 
| 
       55 
     | 
    
         
            -
              handlers = handlers.deep_merge klass. 
     | 
| 
      
 55 
     | 
    
         
            +
              handlers = handlers.deep_merge klass.handler_hierarchy.inject('klass' => klass.to_s.gsub('Blather::', '')) { |h,k| {k.to_s => h} }
         
     | 
| 
       56 
56 
     | 
    
         
             
            end
         
     | 
| 
       57 
57 
     | 
    
         | 
| 
       58 
58 
     | 
    
         
             
            level = 0
         
     | 
| 
         @@ -61,8 +61,8 @@ runner = proc do |k,v| 
     | 
|
| 
       61 
61 
     | 
    
         | 
| 
       62 
62 
     | 
    
         
             
              str = ''
         
     | 
| 
       63 
63 
     | 
    
         
             
              if level > 0
         
     | 
| 
       64 
     | 
    
         
            -
                (level - 1).times { str << '| 
     | 
| 
       65 
     | 
    
         
            -
                str << ' 
     | 
| 
      
 64 
     | 
    
         
            +
                (level - 1).times { str << '|  ' }
         
     | 
| 
      
 65 
     | 
    
         
            +
                str << '|- '
         
     | 
| 
       66 
66 
     | 
    
         
             
              end
         
     | 
| 
       67 
67 
     | 
    
         | 
| 
       68 
68 
     | 
    
         
             
              puts str+k
         
     | 
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'blather'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            trap(:INT) { EM.stop }
         
     | 
| 
      
 6 
     | 
    
         
            +
            trap(:TERM) { EM.stop }
         
     | 
| 
      
 7 
     | 
    
         
            +
            EM.run do
         
     | 
| 
      
 8 
     | 
    
         
            +
              Blather::Stream::Client.start(Class.new {
         
     | 
| 
      
 9 
     | 
    
         
            +
                attr_accessor :jid
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def post_init(stream, jid = nil)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @stream = stream
         
     | 
| 
      
 13 
     | 
    
         
            +
                  self.jid = jid
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  @stream.send_data Blather::Stanza::Presence::Status.new
         
     | 
| 
      
 16 
     | 
    
         
            +
                  puts "Stream started!"
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def receive_data(stanza)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @stream.send_data stanza.reply!
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def unbind
         
     | 
| 
      
 24 
     | 
    
         
            +
                  puts "Stream ended!"
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
              }.new, 'echo@jabber.local', 'echo')
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/blather.rb
    CHANGED
    
    | 
         @@ -58,7 +58,10 @@ 
     | 
|
| 
       58 
58 
     | 
    
         
             
            ].each { |r| require r }
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
60 
     | 
    
         
             
            module Blather
         
     | 
| 
      
 61 
     | 
    
         
            +
              # @private
         
     | 
| 
       61 
62 
     | 
    
         
             
              @@logger = nil
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
              # Get or create an instance of Logger
         
     | 
| 
       62 
65 
     | 
    
         
             
              def self.logger
         
     | 
| 
       63 
66 
     | 
    
         
             
                unless @@logger
         
     | 
| 
       64 
67 
     | 
    
         
             
                  self.logger = Logger.new($stdout)
         
     | 
| 
         @@ -67,6 +70,7 @@ module Blather 
     | 
|
| 
       67 
70 
     | 
    
         
             
                @@logger
         
     | 
| 
       68 
71 
     | 
    
         
             
              end
         
     | 
| 
       69 
72 
     | 
    
         | 
| 
      
 73 
     | 
    
         
            +
              # Set the Logger
         
     | 
| 
       70 
74 
     | 
    
         
             
              def self.logger=(logger)
         
     | 
| 
       71 
75 
     | 
    
         
             
                @@logger = logger
         
     | 
| 
       72 
76 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,48 +1,54 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require File.join(File.dirname(__FILE__), *%w[.. .. blather])
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            module Blather 
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
              # = Blather Client
         
     | 
| 
      
 3 
     | 
    
         
            +
            module Blather
         
     | 
| 
      
 4 
     | 
    
         
            +
              # # Blather Client
         
     | 
| 
       6 
5 
     | 
    
         
             
              #
         
     | 
| 
       7 
     | 
    
         
            -
              # Blather's Client class provides a set of helpers for working with common 
     | 
| 
       8 
     | 
    
         
            -
              #  
     | 
| 
      
 6 
     | 
    
         
            +
              # Blather's Client class provides a set of helpers for working with common
         
     | 
| 
      
 7 
     | 
    
         
            +
              # XMPP tasks such as setting up and starting the connection, settings
         
     | 
| 
      
 8 
     | 
    
         
            +
              # status, registering and dispatching filters and handlers and roster
         
     | 
| 
      
 9 
     | 
    
         
            +
              # management.
         
     | 
| 
       9 
10 
     | 
    
         
             
              #
         
     | 
| 
       10 
     | 
    
         
            -
              # Client can be used separately from the DSL if you'd like to implement your 
     | 
| 
       11 
     | 
    
         
            -
              # Here's the echo example using the client without the DSL:
         
     | 
| 
      
 11 
     | 
    
         
            +
              # Client can be used separately from the DSL if you'd like to implement your
         
     | 
| 
      
 12 
     | 
    
         
            +
              # own DSL Here's the echo example using the client without the DSL:
         
     | 
| 
       12 
13 
     | 
    
         
             
              #
         
     | 
| 
       13 
     | 
    
         
            -
              # 
     | 
| 
       14 
     | 
    
         
            -
              # 
     | 
| 
      
 14 
     | 
    
         
            +
              #     require 'blather/client/client'
         
     | 
| 
      
 15 
     | 
    
         
            +
              #     client = Client.setup 'echo@jabber.local', 'echo'
         
     | 
| 
       15 
16 
     | 
    
         
             
              #
         
     | 
| 
       16 
     | 
    
         
            -
              # 
     | 
| 
      
 17 
     | 
    
         
            +
              #     client.register_handler(:ready) do
         
     | 
| 
      
 18 
     | 
    
         
            +
              #       puts "Connected ! send messages to #{client.jid.stripped}."
         
     | 
| 
      
 19 
     | 
    
         
            +
              #     end
         
     | 
| 
       17 
20 
     | 
    
         
             
              #
         
     | 
| 
       18 
     | 
    
         
            -
              # 
     | 
| 
       19 
     | 
    
         
            -
              # 
     | 
| 
       20 
     | 
    
         
            -
              # 
     | 
| 
      
 21 
     | 
    
         
            +
              #     client.register_handler :subscription, :request? do |s|
         
     | 
| 
      
 22 
     | 
    
         
            +
              #       client.write s.approve!
         
     | 
| 
      
 23 
     | 
    
         
            +
              #     end
         
     | 
| 
       21 
24 
     | 
    
         
             
              #
         
     | 
| 
       22 
     | 
    
         
            -
              # 
     | 
| 
       23 
     | 
    
         
            -
              # 
     | 
| 
       24 
     | 
    
         
            -
              # 
     | 
| 
       25 
     | 
    
         
            -
              # 
     | 
| 
      
 25 
     | 
    
         
            +
              #     client.register_handler :message, :chat?, :body => 'exit' do |m|
         
     | 
| 
      
 26 
     | 
    
         
            +
              #       client.write Blather::Stanza::Message.new(m.from, 'Exiting...')
         
     | 
| 
      
 27 
     | 
    
         
            +
              #       client.close
         
     | 
| 
      
 28 
     | 
    
         
            +
              #     end
         
     | 
| 
       26 
29 
     | 
    
         
             
              #
         
     | 
| 
       27 
     | 
    
         
            -
              # 
     | 
| 
       28 
     | 
    
         
            -
              # 
     | 
| 
       29 
     | 
    
         
            -
              # 
     | 
| 
      
 30 
     | 
    
         
            +
              #     client.register_handler :message, :chat?, :body do |m|
         
     | 
| 
      
 31 
     | 
    
         
            +
              #       client.write Blather::Stanza::Message.new(m.from, "You sent: #{m.body}")
         
     | 
| 
      
 32 
     | 
    
         
            +
              #     end
         
     | 
| 
       30 
33 
     | 
    
         
             
              #
         
     | 
| 
       31 
34 
     | 
    
         
             
              class Client
         
     | 
| 
       32 
35 
     | 
    
         
             
                attr_reader :jid,
         
     | 
| 
       33 
36 
     | 
    
         
             
                            :roster
         
     | 
| 
       34 
37 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
                 
     | 
| 
       36 
     | 
    
         
            -
                # 
     | 
| 
       37 
     | 
    
         
            -
                #  
     | 
| 
       38 
     | 
    
         
            -
                #  
     | 
| 
       39 
     | 
    
         
            -
                #  
     | 
| 
       40 
     | 
    
         
            -
                #  
     | 
| 
      
 38 
     | 
    
         
            +
                # Create a new client and set it up
         
     | 
| 
      
 39 
     | 
    
         
            +
                #
         
     | 
| 
      
 40 
     | 
    
         
            +
                # @param [Blather::JID, #to_s] jid the JID to authorize with
         
     | 
| 
      
 41 
     | 
    
         
            +
                # @param [String] password the password to authorize with
         
     | 
| 
      
 42 
     | 
    
         
            +
                # @param [String] host if this isn't set it'll be resolved off the JID's
         
     | 
| 
      
 43 
     | 
    
         
            +
                # domain
         
     | 
| 
      
 44 
     | 
    
         
            +
                # @param [Fixnum, String] port the port to connect to.
         
     | 
| 
      
 45 
     | 
    
         
            +
                #
         
     | 
| 
      
 46 
     | 
    
         
            +
                # @return [Blather::Client]
         
     | 
| 
       41 
47 
     | 
    
         
             
                def self.setup(jid, password, host = nil, port = nil)
         
     | 
| 
       42 
48 
     | 
    
         
             
                  self.new.setup(jid, password, host, port)
         
     | 
| 
       43 
49 
     | 
    
         
             
                end
         
     | 
| 
       44 
50 
     | 
    
         | 
| 
       45 
     | 
    
         
            -
                def initialize 
     | 
| 
      
 51 
     | 
    
         
            +
                def initialize  # @private
         
     | 
| 
       46 
52 
     | 
    
         
             
                  @state = :initializing
         
     | 
| 
       47 
53 
     | 
    
         | 
| 
       48 
54 
     | 
    
         
             
                  @status = Stanza::Presence::Status.new
         
     | 
| 
         @@ -54,14 +60,14 @@ module Blather #:nodoc: 
     | 
|
| 
       54 
60 
     | 
    
         
             
                  setup_initial_handlers
         
     | 
| 
       55 
61 
     | 
    
         
             
                end
         
     | 
| 
       56 
62 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                 
     | 
| 
       58 
     | 
    
         
            -
                # Get the current status. Taken from the +state+ attribute of Status
         
     | 
| 
      
 63 
     | 
    
         
            +
                # Get the current status. Taken from the `state` attribute of Status
         
     | 
| 
       59 
64 
     | 
    
         
             
                def status
         
     | 
| 
       60 
65 
     | 
    
         
             
                  @status.state
         
     | 
| 
       61 
66 
     | 
    
         
             
                end
         
     | 
| 
       62 
67 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
                 
     | 
| 
       64 
     | 
    
         
            -
                #  
     | 
| 
      
 68 
     | 
    
         
            +
                # Set the status. Status can be set with either a single value or an array
         
     | 
| 
      
 69 
     | 
    
         
            +
                # containing
         
     | 
| 
      
 70 
     | 
    
         
            +
                #
         
     | 
| 
       65 
71 
     | 
    
         
             
                # [state, message, to].
         
     | 
| 
       66 
72 
     | 
    
         
             
                def status=(state)
         
     | 
| 
       67 
73 
     | 
    
         
             
                  state, msg, to = state
         
     | 
| 
         @@ -73,8 +79,10 @@ module Blather #:nodoc: 
     | 
|
| 
       73 
79 
     | 
    
         
             
                  write status
         
     | 
| 
       74 
80 
     | 
    
         
             
                end
         
     | 
| 
       75 
81 
     | 
    
         | 
| 
       76 
     | 
    
         
            -
                ##
         
     | 
| 
       77 
82 
     | 
    
         
             
                # Start the connection.
         
     | 
| 
      
 83 
     | 
    
         
            +
                #
         
     | 
| 
      
 84 
     | 
    
         
            +
                # The stream type used is based on the JID. If a node exists it uses
         
     | 
| 
      
 85 
     | 
    
         
            +
                # Blather::Stream::Client otherwise Blather::Stream::Component
         
     | 
| 
       78 
86 
     | 
    
         
             
                def run
         
     | 
| 
       79 
87 
     | 
    
         
             
                  raise 'not setup!' unless setup?
         
     | 
| 
       80 
88 
     | 
    
         
             
                  klass = @setup[0].node ? Blather::Stream::Client : Blather::Stream::Component
         
     | 
| 
         @@ -82,70 +90,79 @@ module Blather #:nodoc: 
     | 
|
| 
       82 
90 
     | 
    
         
             
                end
         
     | 
| 
       83 
91 
     | 
    
         
             
                alias_method :connect, :run
         
     | 
| 
       84 
92 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
                ##
         
     | 
| 
       86 
93 
     | 
    
         
             
                # Register a filter to be run before or after the handler chain is run.
         
     | 
| 
       87 
     | 
    
         
            -
                # 
     | 
| 
       88 
     | 
    
         
            -
                #  
     | 
| 
      
 94 
     | 
    
         
            +
                #
         
     | 
| 
      
 95 
     | 
    
         
            +
                # @param [<:before, :after>] type the filter type
         
     | 
| 
      
 96 
     | 
    
         
            +
                # @param [Symbol, nil] handler set the filter on a specific handler
         
     | 
| 
      
 97 
     | 
    
         
            +
                # @param [guards] guards take a look at the guards documentation
         
     | 
| 
      
 98 
     | 
    
         
            +
                # @yield [Blather::Stanza] stanza the incomming stanza
         
     | 
| 
       89 
99 
     | 
    
         
             
                def register_filter(type, handler = nil, *guards, &filter)
         
     | 
| 
       90 
     | 
    
         
            -
                   
     | 
| 
      
 100 
     | 
    
         
            +
                  unless [:before, :after].include?(type)
         
     | 
| 
      
 101 
     | 
    
         
            +
                    raise "Invalid filter: #{type}. Must be :before or :after"
         
     | 
| 
      
 102 
     | 
    
         
            +
                  end
         
     | 
| 
       91 
103 
     | 
    
         
             
                  @filters[type] << [guards, handler, filter]
         
     | 
| 
       92 
104 
     | 
    
         
             
                end
         
     | 
| 
       93 
105 
     | 
    
         | 
| 
       94 
     | 
    
         
            -
                 
     | 
| 
       95 
     | 
    
         
            -
                #  
     | 
| 
       96 
     | 
    
         
            -
                # 
     | 
| 
       97 
     | 
    
         
            -
                #  
     | 
| 
      
 106 
     | 
    
         
            +
                # Register a temporary handler. Temporary handlers are based on the ID of
         
     | 
| 
      
 107 
     | 
    
         
            +
                # the JID and live only until a stanza with said ID is received.
         
     | 
| 
      
 108 
     | 
    
         
            +
                #
         
     | 
| 
      
 109 
     | 
    
         
            +
                # @param [#to_s] id the ID of the stanza that should be handled
         
     | 
| 
      
 110 
     | 
    
         
            +
                # @yield [Blather::Stanza] stanza the incomming stanza
         
     | 
| 
       98 
111 
     | 
    
         
             
                def register_tmp_handler(id, &handler)
         
     | 
| 
       99 
     | 
    
         
            -
                  @tmp_handlers[id] = handler
         
     | 
| 
      
 112 
     | 
    
         
            +
                  @tmp_handlers[id.to_s] = handler
         
     | 
| 
       100 
113 
     | 
    
         
             
                end
         
     | 
| 
       101 
114 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
                ##
         
     | 
| 
       103 
115 
     | 
    
         
             
                # Register a handler
         
     | 
| 
       104 
     | 
    
         
            -
                # 
     | 
| 
       105 
     | 
    
         
            -
                #  
     | 
| 
      
 116 
     | 
    
         
            +
                #
         
     | 
| 
      
 117 
     | 
    
         
            +
                # @param [Symbol, nil] handler set the filter on a specific handler
         
     | 
| 
      
 118 
     | 
    
         
            +
                # @param [guards] guards take a look at the guards documentation
         
     | 
| 
      
 119 
     | 
    
         
            +
                # @yield [Blather::Stanza] stanza the incomming stanza
         
     | 
| 
       106 
120 
     | 
    
         
             
                def register_handler(type, *guards, &handler)
         
     | 
| 
       107 
121 
     | 
    
         
             
                  check_handler type, guards
         
     | 
| 
       108 
122 
     | 
    
         
             
                  @handlers[type] ||= []
         
     | 
| 
       109 
123 
     | 
    
         
             
                  @handlers[type] << [guards, handler]
         
     | 
| 
       110 
124 
     | 
    
         
             
                end
         
     | 
| 
       111 
125 
     | 
    
         | 
| 
       112 
     | 
    
         
            -
                ##
         
     | 
| 
       113 
126 
     | 
    
         
             
                # Write data to the stream
         
     | 
| 
      
 127 
     | 
    
         
            +
                #
         
     | 
| 
      
 128 
     | 
    
         
            +
                # @param [#to_xml, #to_s] stanza the content to send down the wire
         
     | 
| 
       114 
129 
     | 
    
         
             
                def write(stanza)
         
     | 
| 
       115 
130 
     | 
    
         
             
                  self.stream.send(stanza)
         
     | 
| 
       116 
131 
     | 
    
         
             
                end
         
     | 
| 
       117 
132 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
                 
     | 
| 
       119 
     | 
    
         
            -
                #  
     | 
| 
      
 133 
     | 
    
         
            +
                # Helper that will create a temporary handler for the stanza being sent
         
     | 
| 
      
 134 
     | 
    
         
            +
                # before writing it to the stream.
         
     | 
| 
       120 
135 
     | 
    
         
             
                #
         
     | 
| 
       121 
     | 
    
         
            -
                # 
     | 
| 
      
 136 
     | 
    
         
            +
                #     client.write_with_handler(stanza) { |s| "handle stanza here" }
         
     | 
| 
       122 
137 
     | 
    
         
             
                #
         
     | 
| 
       123 
138 
     | 
    
         
             
                # is equivalent to:
         
     | 
| 
       124 
139 
     | 
    
         
             
                #
         
     | 
| 
       125 
     | 
    
         
            -
                # 
     | 
| 
       126 
     | 
    
         
            -
                # 
     | 
| 
      
 140 
     | 
    
         
            +
                #     client.register_tmp_handler(stanza.id) { |s| "handle stanza here" }
         
     | 
| 
      
 141 
     | 
    
         
            +
                #     client.write stanza
         
     | 
| 
      
 142 
     | 
    
         
            +
                #
         
     | 
| 
      
 143 
     | 
    
         
            +
                # @param [Blather::Stanza] stanza the stanza to send down the wire
         
     | 
| 
      
 144 
     | 
    
         
            +
                # @yield [Blather::Stanza] stanza the reply stanza
         
     | 
| 
       127 
145 
     | 
    
         
             
                def write_with_handler(stanza, &handler)
         
     | 
| 
       128 
146 
     | 
    
         
             
                  register_tmp_handler stanza.id, &handler
         
     | 
| 
       129 
147 
     | 
    
         
             
                  write stanza
         
     | 
| 
       130 
148 
     | 
    
         
             
                end
         
     | 
| 
       131 
149 
     | 
    
         | 
| 
       132 
     | 
    
         
            -
                ##
         
     | 
| 
       133 
150 
     | 
    
         
             
                # Close the connection
         
     | 
| 
       134 
151 
     | 
    
         
             
                def close
         
     | 
| 
       135 
152 
     | 
    
         
             
                  self.stream.close_connection_after_writing
         
     | 
| 
       136 
153 
     | 
    
         
             
                end
         
     | 
| 
       137 
154 
     | 
    
         | 
| 
       138 
     | 
    
         
            -
                def post_init(stream, jid = nil) 
     | 
| 
      
 155 
     | 
    
         
            +
                def post_init(stream, jid = nil)  # @private
         
     | 
| 
       139 
156 
     | 
    
         
             
                  @stream = stream
         
     | 
| 
       140 
157 
     | 
    
         
             
                  @jid = JID.new(jid) if jid
         
     | 
| 
       141 
158 
     | 
    
         
             
                  self.jid.node ? client_post_init : ready!
         
     | 
| 
       142 
159 
     | 
    
         
             
                end
         
     | 
| 
       143 
160 
     | 
    
         | 
| 
       144 
     | 
    
         
            -
                def unbind 
     | 
| 
      
 161 
     | 
    
         
            +
                def unbind  # @private
         
     | 
| 
       145 
162 
     | 
    
         
             
                  call_handler_for(:disconnected, nil) || (EM.reactor_running? && EM.stop)
         
     | 
| 
       146 
163 
     | 
    
         
             
                end
         
     | 
| 
       147 
164 
     | 
    
         | 
| 
       148 
     | 
    
         
            -
                def receive_data(stanza) 
     | 
| 
      
 165 
     | 
    
         
            +
                def receive_data(stanza)  # @private
         
     | 
| 
       149 
166 
     | 
    
         
             
                  catch(:halt) do
         
     | 
| 
       150 
167 
     | 
    
         
             
                    run_filters :before, stanza
         
     | 
| 
       151 
168 
     | 
    
         
             
                    handle_stanza stanza
         
     | 
| 
         @@ -153,11 +170,11 @@ module Blather #:nodoc: 
     | 
|
| 
       153 
170 
     | 
    
         
             
                  end
         
     | 
| 
       154 
171 
     | 
    
         
             
                end
         
     | 
| 
       155 
172 
     | 
    
         | 
| 
       156 
     | 
    
         
            -
                def setup? 
     | 
| 
      
 173 
     | 
    
         
            +
                def setup?  # @private
         
     | 
| 
       157 
174 
     | 
    
         
             
                  @setup.is_a? Array
         
     | 
| 
       158 
175 
     | 
    
         
             
                end
         
     | 
| 
       159 
176 
     | 
    
         | 
| 
       160 
     | 
    
         
            -
                def setup(jid, password, host = nil, port = nil) 
     | 
| 
      
 177 
     | 
    
         
            +
                def setup(jid, password, host = nil, port = nil)  # @private
         
     | 
| 
       161 
178 
     | 
    
         
             
                  @jid = JID.new(jid)
         
     | 
| 
       162 
179 
     | 
    
         
             
                  @setup = [@jid, password]
         
     | 
| 
       163 
180 
     | 
    
         
             
                  @setup << host if host
         
     | 
| 
         @@ -166,20 +183,20 @@ module Blather #:nodoc: 
     | 
|
| 
       166 
183 
     | 
    
         
             
                end
         
     | 
| 
       167 
184 
     | 
    
         | 
| 
       168 
185 
     | 
    
         
             
              protected
         
     | 
| 
       169 
     | 
    
         
            -
                def stream
         
     | 
| 
      
 186 
     | 
    
         
            +
                def stream  # @private
         
     | 
| 
       170 
187 
     | 
    
         
             
                  @stream || raise('Stream not ready!')
         
     | 
| 
       171 
188 
     | 
    
         
             
                end
         
     | 
| 
       172 
189 
     | 
    
         | 
| 
       173 
     | 
    
         
            -
                def check_handler(type, guards)
         
     | 
| 
      
 190 
     | 
    
         
            +
                def check_handler(type, guards)  # @private
         
     | 
| 
       174 
191 
     | 
    
         
             
                  Blather.logger.warn "Handler for type \"#{type}\" will never be called as it's not a registered type" unless current_handlers.include?(type)
         
     | 
| 
       175 
192 
     | 
    
         
             
                  check_guards guards
         
     | 
| 
       176 
193 
     | 
    
         
             
                end
         
     | 
| 
       177 
194 
     | 
    
         | 
| 
       178 
     | 
    
         
            -
                def current_handlers
         
     | 
| 
      
 195 
     | 
    
         
            +
                def current_handlers  # @private
         
     | 
| 
       179 
196 
     | 
    
         
             
                  [:ready, :disconnected] + Stanza.handler_list + BlatherError.handler_list
         
     | 
| 
       180 
197 
     | 
    
         
             
                end
         
     | 
| 
       181 
198 
     | 
    
         | 
| 
       182 
     | 
    
         
            -
                def setup_initial_handlers 
     | 
| 
      
 199 
     | 
    
         
            +
                def setup_initial_handlers  # @private
         
     | 
| 
       183 
200 
     | 
    
         
             
                  register_handler :error do |err|
         
     | 
| 
       184 
201 
     | 
    
         
             
                    raise err
         
     | 
| 
       185 
202 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -198,12 +215,12 @@ module Blather #:nodoc: 
     | 
|
| 
       198 
215 
     | 
    
         
             
                  end
         
     | 
| 
       199 
216 
     | 
    
         
             
                end
         
     | 
| 
       200 
217 
     | 
    
         | 
| 
       201 
     | 
    
         
            -
                def ready! 
     | 
| 
      
 218 
     | 
    
         
            +
                def ready!  # @private
         
     | 
| 
       202 
219 
     | 
    
         
             
                  @state = :ready
         
     | 
| 
       203 
220 
     | 
    
         
             
                  call_handler_for :ready, nil
         
     | 
| 
       204 
221 
     | 
    
         
             
                end
         
     | 
| 
       205 
222 
     | 
    
         | 
| 
       206 
     | 
    
         
            -
                def client_post_init 
     | 
| 
      
 223 
     | 
    
         
            +
                def client_post_init  # @private
         
     | 
| 
       207 
224 
     | 
    
         
             
                  write_with_handler Stanza::Iq::Roster.new do |node|
         
     | 
| 
       208 
225 
     | 
    
         
             
                    roster.process node
         
     | 
| 
       209 
226 
     | 
    
         
             
                    write @status
         
     | 
| 
         @@ -211,31 +228,31 @@ module Blather #:nodoc: 
     | 
|
| 
       211 
228 
     | 
    
         
             
                  end
         
     | 
| 
       212 
229 
     | 
    
         
             
                end
         
     | 
| 
       213 
230 
     | 
    
         | 
| 
       214 
     | 
    
         
            -
                def run_filters(type, stanza) 
     | 
| 
      
 231 
     | 
    
         
            +
                def run_filters(type, stanza)  # @private
         
     | 
| 
       215 
232 
     | 
    
         
             
                  @filters[type].each do |guards, handler, filter|
         
     | 
| 
       216 
     | 
    
         
            -
                    next if handler && !stanza. 
     | 
| 
      
 233 
     | 
    
         
            +
                    next if handler && !stanza.handler_hierarchy.include?(handler)
         
     | 
| 
       217 
234 
     | 
    
         
             
                    catch(:pass) { call_handler filter, guards, stanza }
         
     | 
| 
       218 
235 
     | 
    
         
             
                  end
         
     | 
| 
       219 
236 
     | 
    
         
             
                end
         
     | 
| 
       220 
237 
     | 
    
         | 
| 
       221 
     | 
    
         
            -
                def handle_stanza(stanza) 
     | 
| 
      
 238 
     | 
    
         
            +
                def handle_stanza(stanza)  # @private
         
     | 
| 
       222 
239 
     | 
    
         
             
                  if handler = @tmp_handlers.delete(stanza.id)
         
     | 
| 
       223 
240 
     | 
    
         
             
                    handler.call stanza
         
     | 
| 
       224 
241 
     | 
    
         
             
                  else
         
     | 
| 
       225 
     | 
    
         
            -
                    stanza. 
     | 
| 
      
 242 
     | 
    
         
            +
                    stanza.handler_hierarchy.each do |type|
         
     | 
| 
       226 
243 
     | 
    
         
             
                      break if call_handler_for(type, stanza)
         
     | 
| 
       227 
244 
     | 
    
         
             
                    end
         
     | 
| 
       228 
245 
     | 
    
         
             
                  end
         
     | 
| 
       229 
246 
     | 
    
         
             
                end
         
     | 
| 
       230 
247 
     | 
    
         | 
| 
       231 
     | 
    
         
            -
                def call_handler_for(type, stanza) 
     | 
| 
      
 248 
     | 
    
         
            +
                def call_handler_for(type, stanza)  # @private
         
     | 
| 
       232 
249 
     | 
    
         
             
                  return unless handler = @handlers[type]
         
     | 
| 
       233 
250 
     | 
    
         
             
                  handler.find do |guards, handler|
         
     | 
| 
       234 
251 
     | 
    
         
             
                    catch(:pass) { call_handler handler, guards, stanza }
         
     | 
| 
       235 
252 
     | 
    
         
             
                  end
         
     | 
| 
       236 
253 
     | 
    
         
             
                end
         
     | 
| 
       237 
254 
     | 
    
         | 
| 
       238 
     | 
    
         
            -
                def call_handler(handler, guards, stanza) 
     | 
| 
      
 255 
     | 
    
         
            +
                def call_handler(handler, guards, stanza)  # @private
         
     | 
| 
       239 
256 
     | 
    
         
             
                  if guards.first.respond_to?(:to_str)
         
     | 
| 
       240 
257 
     | 
    
         
             
                    result = stanza.find(*guards)
         
     | 
| 
       241 
258 
     | 
    
         
             
                    handler.call(stanza, result) unless result.empty?
         
     | 
| 
         @@ -244,11 +261,12 @@ module Blather #:nodoc: 
     | 
|
| 
       244 
261 
     | 
    
         
             
                  end
         
     | 
| 
       245 
262 
     | 
    
         
             
                end
         
     | 
| 
       246 
263 
     | 
    
         | 
| 
       247 
     | 
    
         
            -
                ##
         
     | 
| 
       248 
264 
     | 
    
         
             
                # If any of the guards returns FALSE this returns true
         
     | 
| 
       249 
265 
     | 
    
         
             
                # the logic is reversed to allow short circuiting
         
     | 
| 
       250 
266 
     | 
    
         
             
                # (why would anyone want to loop over more values than necessary?)
         
     | 
| 
       251 
     | 
    
         
            -
                 
     | 
| 
      
 267 
     | 
    
         
            +
                #
         
     | 
| 
      
 268 
     | 
    
         
            +
                # @private
         
     | 
| 
      
 269 
     | 
    
         
            +
                def guarded?(guards, stanza)
         
     | 
| 
       252 
270 
     | 
    
         
             
                  guards.find do |guard|
         
     | 
| 
       253 
271 
     | 
    
         
             
                    case guard
         
     | 
| 
       254 
272 
     | 
    
         
             
                    when Symbol
         
     | 
| 
         @@ -275,7 +293,7 @@ module Blather #:nodoc: 
     | 
|
| 
       275 
293 
     | 
    
         
             
                  end
         
     | 
| 
       276 
294 
     | 
    
         
             
                end
         
     | 
| 
       277 
295 
     | 
    
         | 
| 
       278 
     | 
    
         
            -
                def check_guards(guards) 
     | 
| 
      
 296 
     | 
    
         
            +
                def check_guards(guards)  # @private
         
     | 
| 
       279 
297 
     | 
    
         
             
                  guards.each do |guard|
         
     | 
| 
       280 
298 
     | 
    
         
             
                    case guard
         
     | 
| 
       281 
299 
     | 
    
         
             
                    when Array
         
     | 
| 
         @@ -287,6 +305,6 @@ module Blather #:nodoc: 
     | 
|
| 
       287 
305 
     | 
    
         
             
                    end
         
     | 
| 
       288 
306 
     | 
    
         
             
                  end
         
     | 
| 
       289 
307 
     | 
    
         
             
                end
         
     | 
| 
      
 308 
     | 
    
         
            +
              end  # Client
         
     | 
| 
       290 
309 
     | 
    
         | 
| 
       291 
     | 
    
         
            -
               
     | 
| 
       292 
     | 
    
         
            -
            end #Blather
         
     | 
| 
      
 310 
     | 
    
         
            +
            end  # Blather
         
     |