# =XMPP4R - XMPP Library for Ruby
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
# Website::http://xmpp4r.github.io

require 'xmpp4r/callbacks'
require 'xmpp4r/version/iq/version'

module Jabber
  module Version
    ##
    # A class to answer version requests using IqQueryVersion
    #
    # If you don't need the flexibility of dynamic responses with
    # the callback you can register with add_version_callback,
    # take a look at SimpleResponder
    class Responder
      ##
      # Initialize a new version responder
      #
      # Registers it's callback (prio = 180, ref = self)
      # stream:: [Stream] Where to register callback handlers
      def initialize(stream)
        @stream = stream
        @versioncbs = CallbackList.new

        stream.add_iq_callback(180, self) { |iq|
          iq_callback(iq)
        }
      end

      ##
      # Add a callback for Iq stanzas with IqQueryVersion
      #
      # First argument passed to block is the Iq stanza,
      # second argument is a block, which can be called with
      # software name, version and os
      #
      # Example:
      #   my_version_helper.add_version_callback { |iq,block|
      #     block.call('Cool client', '6.0', 'Cool OS')
      #   }
      def add_version_callback(priority = 0, ref = nil, &block)
        @versioncbs.add(priority, ref, block)
      end

      ##
      # <iq/> callback handler to answer Software Version queries
      # (registered by constructor and used internally only)
      #
      # Used internally
      def iq_callback(iq)
        if iq.type == :get
          if iq.query.kind_of?(IqQueryVersion)
            replyblock = lambda { |name,version,os|
              answer = iq.answer
              answer.type = :result
              answer.query.set_iname(name).set_version(version).set_os(os)

              @stream.send(answer)
              true
            }
            @versioncbs.process(iq, replyblock)
          else
            false
          end
        else
          false
        end
      end
    end
  end
end
