File: client.rb

package info (click to toggle)
ruby-xmpp4r 0.5.6-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 1,384 kB
  • sloc: ruby: 17,382; xml: 74; sh: 12; makefile: 4
file content (123 lines) | stat: -rw-r--r-- 2,758 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
require 'xmlrpc/server'
require 'xmlrpc/parser'
require 'xmlrpc/create'
require 'xmlrpc/config'
require 'xmlrpc/utils'         # ParserWriterChooseMixin

require 'xmpp4r/dataforms/x/data'
require 'xmpp4r/rpc/iq/rpc'
require 'xmpp4r/rpc/helper/xmlrpcaddons'

module Jabber
  module RPC

    ##
    # XMLRPC Client
    class Client

      include XMLRPC::ParserWriterChooseMixin
      include XMLRPC::ParseContentType

      attr_accessor :my_jid

      ##
      # xmppstream
      # stream:: [Stream]
      # jid where you want to send the rpc requests to
      # jid:: [JID] rpcserver@jabberserver/ressource
      def initialize(stream,jid)
        @jid    = JID.new(jid)
        @my_jid = stream.jid
        @stream =  stream
        @parser = nil
        @create = XMLRPC::Create.new
      end

      ##
      # automatically trys to find a method
      # thanx to eric cestari  :)
      def method_missing(methodname, *args)
        send("call", methodname,*args)
      end


      def call(method, *args)
        ok, param = call2(method, *args)
        if ok
          param
        else
          raise param
        end
      end

      def call2(method, *args)
        request = @create.methodCall(method, *args)
        data = do_rpc(request)
        parser().parseMethodResponse(data)
      end

      ##
      # adds multi rpcalls to the query
      # methods:: [Array]
      def multicall(*methods)
        ok, params = multicall2(*methods)
        if ok
          params
        else
          raise params
        end
      end

      ##
      # generate a multicall
      # methods:: [Array]
      def multicall2(*methods)
        gen_multicall(methods)
      end

      def do_rpc(xmlrpc)
        iq = Iq.new(:set, @jid)
        iq.from = @my_jid
        iq.id = IdGenerator::generate_id
        rpcquery = iq.add(IqQueryRPC.new)
        rpcquery.typed_add(xmlrpc)

        result = nil
        @stream.send_with_id(iq) do |iqreply|
          if iqreply.query.kind_of?(IqQueryRPC)
            result = iqreply.query.to_s
          end
        end

        result
      end

      private

      def gen_multicall(methods=[])
        ok, params = call2("system.multicall",
          methods.collect { |m|
            {
              'methodName' => m[0],
              'params' => m[1..-1]
            }
          }
        )

        if ok
          params = params.collect{ |param|
            if param.is_a? Array
              param[0]
            elsif param.is_a? Hash
              XMLRPC::FaultException.new(param["faultCode"], param["faultString"])
            else
              raise "Wrong multicall return value"
            end
          }
        end

        return ok, params
      end
    end
  end  # Helpers
end   # Jabber