/tools/Ruby/lib/ruby/1.8/xmlrpc/utils.rb

http://github.com/agross/netopenspace · Ruby · 165 lines · 98 code · 37 blank · 30 comment · 11 complexity · cdd248fb850a2d290ea8aa756ec8cf67 MD5 · raw file

  1. #
  2. # Defines ParserWriterChooseMixin, which makes it possible to choose a
  3. # different XML writer and/or XML parser then the default one.
  4. # The Mixin is used in client.rb (class Client) and server.rb (class
  5. # BasicServer)
  6. #
  7. # Copyright (C) 2001, 2002, 2003 by Michael Neumann (mneumann@ntecs.de)
  8. #
  9. # $Id: utils.rb 13771 2007-10-24 23:04:42Z jeg2 $
  10. #
  11. module XMLRPC
  12. #
  13. # This module enables a user-class to be marshalled
  14. # by XML-RPC for Ruby into a Hash, with one additional
  15. # key/value pair "___class___" => ClassName
  16. #
  17. module Marshallable
  18. end
  19. module ParserWriterChooseMixin
  20. def set_writer(writer)
  21. @create = Create.new(writer)
  22. self
  23. end
  24. def set_parser(parser)
  25. @parser = parser
  26. self
  27. end
  28. private
  29. def create
  30. # if set_writer was not already called then call it now
  31. if @create.nil? then
  32. set_writer(Config::DEFAULT_WRITER.new)
  33. end
  34. @create
  35. end
  36. def parser
  37. # if set_parser was not already called then call it now
  38. if @parser.nil? then
  39. set_parser(Config::DEFAULT_PARSER.new)
  40. end
  41. @parser
  42. end
  43. end # module ParserWriterChooseMixin
  44. module Service
  45. #
  46. # base class for Service Interface definitions, used
  47. # by BasicServer#add_handler
  48. #
  49. class BasicInterface
  50. attr_reader :prefix, :methods
  51. def initialize(prefix)
  52. @prefix = prefix
  53. @methods = []
  54. end
  55. def add_method(sig, help=nil, meth_name=nil)
  56. mname = nil
  57. sig = [sig] if sig.kind_of? String
  58. sig = sig.collect do |s|
  59. name, si = parse_sig(s)
  60. raise "Wrong signatures!" if mname != nil and name != mname
  61. mname = name
  62. si
  63. end
  64. @methods << [mname, meth_name || mname, sig, help]
  65. end
  66. private # ---------------------------------
  67. def parse_sig(sig)
  68. # sig is a String
  69. if sig =~ /^\s*(\w+)\s+([^(]+)(\(([^)]*)\))?\s*$/
  70. params = [$1]
  71. name = $2.strip
  72. $4.split(",").each {|i| params << i.strip} if $4 != nil
  73. return name, params
  74. else
  75. raise "Syntax error in signature"
  76. end
  77. end
  78. end # class BasicInterface
  79. #
  80. # class which wraps a Service Interface definition, used
  81. # by BasicServer#add_handler
  82. #
  83. class Interface < BasicInterface
  84. def initialize(prefix, &p)
  85. raise "No interface specified" if p.nil?
  86. super(prefix)
  87. instance_eval(&p)
  88. end
  89. def get_methods(obj, delim=".")
  90. prefix = @prefix + delim
  91. @methods.collect { |name, meth, sig, help|
  92. [prefix + name, obj.method(meth).to_proc, sig, help]
  93. }
  94. end
  95. private # ---------------------------------
  96. def meth(*a)
  97. add_method(*a)
  98. end
  99. end # class Interface
  100. class PublicInstanceMethodsInterface < BasicInterface
  101. def initialize(prefix)
  102. super(prefix)
  103. end
  104. def get_methods(obj, delim=".")
  105. prefix = @prefix + delim
  106. obj.class.public_instance_methods(false).collect { |name|
  107. [prefix + name, obj.method(name).to_proc, nil, nil]
  108. }
  109. end
  110. end
  111. end # module Service
  112. #
  113. # short-form to create a Service::Interface
  114. #
  115. def self.interface(prefix, &p)
  116. Service::Interface.new(prefix, &p)
  117. end
  118. # short-cut for creating a PublicInstanceMethodsInterface
  119. def self.iPIMethods(prefix)
  120. Service::PublicInstanceMethodsInterface.new(prefix)
  121. end
  122. module ParseContentType
  123. def parse_content_type(str)
  124. a, *b = str.split(";")
  125. return a.strip.downcase, *b
  126. end
  127. end
  128. end # module XMLRPC