xmpp4r 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. data/COPYING +340 -0
  2. data/ChangeLog +28 -0
  3. data/LICENSE +59 -0
  4. data/README +20 -0
  5. data/Rakefile +103 -0
  6. data/UPDATING +40 -0
  7. data/data/doc/xmpp4r/examples/advanced/adventure/README +57 -0
  8. data/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
  9. data/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
  10. data/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
  11. data/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
  12. data/data/doc/xmpp4r/examples/advanced/adventure/world.rb +425 -0
  13. data/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
  14. data/data/doc/xmpp4r/examples/advanced/fileserve.rb +344 -0
  15. data/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
  16. data/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
  17. data/data/doc/xmpp4r/examples/advanced/migrate.rb +89 -0
  18. data/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
  19. data/data/doc/xmpp4r/examples/advanced/recvfile.rb +83 -0
  20. data/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +130 -0
  21. data/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
  22. data/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
  23. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
  24. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
  25. data/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
  26. data/data/doc/xmpp4r/examples/advanced/versionpoll.rb +90 -0
  27. data/data/doc/xmpp4r/examples/advanced/xmpping.rb +134 -0
  28. data/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +9 -0
  29. data/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
  30. data/data/doc/xmpp4r/examples/basic/client.rb +68 -0
  31. data/data/doc/xmpp4r/examples/basic/component.rb +11 -0
  32. data/data/doc/xmpp4r/examples/basic/echo_nonthreaded.rb +32 -0
  33. data/data/doc/xmpp4r/examples/basic/echo_threaded.rb +32 -0
  34. data/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
  35. data/data/doc/xmpp4r/examples/basic/mass_sender.rb +67 -0
  36. data/data/doc/xmpp4r/examples/basic/mucinfo.rb +39 -0
  37. data/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +83 -0
  38. data/data/doc/xmpp4r/examples/basic/register.rb +25 -0
  39. data/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
  40. data/data/doc/xmpp4r/examples/basic/roster.rb +42 -0
  41. data/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
  42. data/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
  43. data/data/doc/xmpp4r/examples/basic/rosterwatch.rb +172 -0
  44. data/data/doc/xmpp4r/examples/basic/send_vcard.rb +68 -0
  45. data/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
  46. data/data/doc/xmpp4r/examples/buggy/jabber2jabber/jabber2jabber.rb +18 -0
  47. data/data/doc/xmpp4r/examples/buggy/miniedgarr_cgi.rb +192 -0
  48. data/data/doc/xmpp4r/examples/buggy/miniedgarr_watch.rb +82 -0
  49. data/lib/callbacks.rb +122 -0
  50. data/lib/xmpp4r/authenticationfailure.rb +13 -0
  51. data/lib/xmpp4r/bytestreams/helper/filetransfer.rb +315 -0
  52. data/lib/xmpp4r/bytestreams/helper/ibb/base.rb +256 -0
  53. data/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +30 -0
  54. data/lib/xmpp4r/bytestreams/helper/ibb/target.rb +46 -0
  55. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +151 -0
  56. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +85 -0
  57. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +178 -0
  58. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +56 -0
  59. data/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +61 -0
  60. data/lib/xmpp4r/bytestreams/iq/bytestreams.rb +177 -0
  61. data/lib/xmpp4r/bytestreams/iq/si.rb +221 -0
  62. data/lib/xmpp4r/bytestreams.rb +11 -0
  63. data/lib/xmpp4r/client.rb +249 -0
  64. data/lib/xmpp4r/component.rb +103 -0
  65. data/lib/xmpp4r/connection.rb +166 -0
  66. data/lib/xmpp4r/dataforms/x/data.rb +248 -0
  67. data/lib/xmpp4r/dataforms.rb +1 -0
  68. data/lib/xmpp4r/debuglog.rb +34 -0
  69. data/lib/xmpp4r/delay/x/delay.rb +100 -0
  70. data/lib/xmpp4r/delay.rb +1 -0
  71. data/lib/xmpp4r/discovery/iq/discoinfo.rb +225 -0
  72. data/lib/xmpp4r/discovery/iq/discoitems.rb +162 -0
  73. data/lib/xmpp4r/discovery.rb +2 -0
  74. data/lib/xmpp4r/error.rb +230 -0
  75. data/lib/xmpp4r/errorexception.rb +32 -0
  76. data/lib/xmpp4r/feature_negotiation/iq/feature.rb +42 -0
  77. data/lib/xmpp4r/feature_negotiation.rb +1 -0
  78. data/lib/xmpp4r/idgenerator.rb +37 -0
  79. data/lib/xmpp4r/iq.rb +229 -0
  80. data/lib/xmpp4r/jid.rb +167 -0
  81. data/lib/xmpp4r/message.rb +171 -0
  82. data/lib/xmpp4r/muc/helper/mucbrowser.rb +107 -0
  83. data/lib/xmpp4r/muc/helper/mucclient.rb +382 -0
  84. data/lib/xmpp4r/muc/helper/simplemucclient.rb +222 -0
  85. data/lib/xmpp4r/muc/x/muc.rb +98 -0
  86. data/lib/xmpp4r/muc/x/mucuserinvite.rb +58 -0
  87. data/lib/xmpp4r/muc/x/mucuseritem.rb +148 -0
  88. data/lib/xmpp4r/muc.rb +6 -0
  89. data/lib/xmpp4r/presence.rb +255 -0
  90. data/lib/xmpp4r/query.rb +43 -0
  91. data/lib/xmpp4r/rexmladdons.rb +826 -0
  92. data/lib/xmpp4r/roster/helper/roster.rb +514 -0
  93. data/lib/xmpp4r/roster/iq/roster.rb +244 -0
  94. data/lib/xmpp4r/roster/x/roster.rb +155 -0
  95. data/lib/xmpp4r/roster.rb +4 -0
  96. data/lib/xmpp4r/sasl.rb +167 -0
  97. data/lib/xmpp4r/stream.rb +543 -0
  98. data/lib/xmpp4r/streamparser.rb +77 -0
  99. data/lib/xmpp4r/vcard/helper/vcard.rb +86 -0
  100. data/lib/xmpp4r/vcard/iq/vcard.rb +102 -0
  101. data/lib/xmpp4r/vcard.rb +3 -0
  102. data/lib/xmpp4r/version/helper/responder.rb +71 -0
  103. data/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
  104. data/lib/xmpp4r/version/iq/version.rb +118 -0
  105. data/lib/xmpp4r/version.rb +3 -0
  106. data/lib/xmpp4r/x.rb +43 -0
  107. data/lib/xmpp4r/xmlstanza.rb +174 -0
  108. data/lib/xmpp4r/xmpp4r.rb +16 -0
  109. data/lib/xmpp4r.rb +122 -0
  110. data/setup.rb +1360 -0
  111. data/test/bytestreams/tc_ibb.rb +186 -0
  112. data/test/bytestreams/tc_socks5bytestreams.rb +57 -0
  113. data/test/delay/tc_xdelay.rb +51 -0
  114. data/test/lib/clienttester.rb +110 -0
  115. data/test/muc/tc_muc_mucclient.rb +569 -0
  116. data/test/muc/tc_muc_simplemucclient.rb +72 -0
  117. data/test/roster/.tc_helper.rb.swp +0 -0
  118. data/test/roster/tc_helper.rb +389 -0
  119. data/test/roster/tc_iqqueryroster.rb +140 -0
  120. data/test/roster/tc_xroster.rb +70 -0
  121. data/test/tc_callbacks.rb +128 -0
  122. data/test/tc_class_names.rb +129 -0
  123. data/test/tc_client.rb +30 -0
  124. data/test/tc_error.rb +103 -0
  125. data/test/tc_idgenerator.rb +30 -0
  126. data/test/tc_iq.rb +109 -0
  127. data/test/tc_iqquery.rb +31 -0
  128. data/test/tc_jid.rb +202 -0
  129. data/test/tc_message.rb +114 -0
  130. data/test/tc_presence.rb +148 -0
  131. data/test/tc_stream.rb +182 -0
  132. data/test/tc_streamError.rb +87 -0
  133. data/test/tc_streamSend.rb +59 -0
  134. data/test/tc_streamThreaded.rb +168 -0
  135. data/test/tc_xmlstanza.rb +76 -0
  136. data/test/ts_xmpp4r.rb +34 -0
  137. data/test/vcard/tc_iqvcard.rb +52 -0
  138. data/test/version/tc_helper.rb +46 -0
  139. data/test/version/tc_iqqueryversion.rb +96 -0
  140. data/tools/doctoweb.bash +30 -0
  141. data/tools/gen_requires.bash +10 -0
  142. metadata +232 -0
@@ -0,0 +1,102 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r/iq'
6
+
7
+ module Jabber
8
+ module Vcard
9
+ ##
10
+ # vCard container for User Information
11
+ # (can be specified by users themselves, mostly kept on servers)
12
+ # (JEP 0054)
13
+ class IqVcard < REXML::Element
14
+ ##
15
+ # Initialize a <vCard/> element
16
+ # fields:: [Hash] Initialize with keys as XPath element names and values for element texts
17
+ def initialize(fields=nil)
18
+ super("vCard")
19
+ add_namespace('vcard-temp')
20
+
21
+ unless fields.nil?
22
+ fields.each { |name,value|
23
+ self[name] = value
24
+ }
25
+ end
26
+ end
27
+
28
+ ##
29
+ # element:: [REXML::Element] to import
30
+ # result:: [IqVcard] with all attributes and children copied from element
31
+ def IqVcard.import(element)
32
+ IqVcard::new.import(element)
33
+ end
34
+
35
+ ##
36
+ # Get an elements/fields text
37
+ #
38
+ # vCards have too much possible children, so ask for them here
39
+ # and extract the result with iqvcard.element('...').text
40
+ # name:: [String] XPath
41
+ def [](name)
42
+ text = nil
43
+ each_element(name) { |child| text = child.text }
44
+ text
45
+ end
46
+
47
+ ##
48
+ # Set an elements/fields text
49
+ # name:: [String] XPath
50
+ # text:: [String] Value
51
+ def []=(name, text)
52
+ xe = self
53
+ name.split(/\//).each do |elementname|
54
+ # Does the children already exist?
55
+ newxe = nil
56
+ xe.each_element(elementname) { |child| newxe = child }
57
+
58
+ if newxe.nil?
59
+ # Create a new
60
+ xe = xe.add_element(elementname)
61
+ else
62
+ # Or take existing
63
+ xe = newxe
64
+ end
65
+ end
66
+ xe.text = text
67
+ end
68
+
69
+ ##
70
+ # Get vCard field names
71
+ #
72
+ # Example:
73
+ # ["NICKNAME", "BDAY", "ORG/ORGUNIT", "PHOTO/TYPE", "PHOTO/BINVAL"]
74
+ #
75
+ # result:: [Array] of [String]
76
+ def fields
77
+ element_names(self).uniq
78
+ end
79
+
80
+ ##
81
+ # Recursive helper function,
82
+ # returns all element names in an array, concatenated
83
+ # to their parent's name with a slash
84
+ def element_names(xe, prefix='') # :nodoc:
85
+ res = []
86
+ xe.each_element { |child|
87
+ if child.kind_of?(REXML::Element)
88
+ children = element_names(child, "#{prefix}#{child.name}/")
89
+ if children == []
90
+ res.push("#{prefix}#{child.name}")
91
+ else
92
+ res += children
93
+ end
94
+ end
95
+ }
96
+ res
97
+ end
98
+
99
+ Iq.add_elementclass('vCard', IqVcard)
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,3 @@
1
+ require 'xmpp4r/vcard/helper/vcard.rb'
2
+ require 'xmpp4r/vcard/iq/vcard.rb'
3
+
@@ -0,0 +1,71 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'callbacks'
6
+ require 'xmpp4r/version/iq/version'
7
+
8
+ module Jabber
9
+ module Version
10
+ ##
11
+ # A class to answer version requests using IqQueryVersion
12
+ #
13
+ # If you don't need the flexibility of dynamic responses with
14
+ # the callback you can register with add_version_callback,
15
+ # take a look at SimpleResponder
16
+ class Responder
17
+ ##
18
+ # Initialize a new version responder
19
+ #
20
+ # Registers it's callback (prio = 180, ref = self)
21
+ # stream:: [Stream] Where to register callback handlers
22
+ def initialize(stream)
23
+ @stream = stream
24
+ @versioncbs = CallbackList.new
25
+
26
+ stream.add_iq_callback(180, self) { |iq|
27
+ iq_callback(iq)
28
+ }
29
+ end
30
+
31
+ ##
32
+ # Add a callback for Iq stanzas with IqQueryVersion
33
+ #
34
+ # First argument passed to block is the Iq stanza,
35
+ # second argument is a block, which can be called with
36
+ # software name, version and os
37
+ #
38
+ # Example:
39
+ # my_version_helper.add_version_callback { |iq,block|
40
+ # block.call('Cool client', '6.0', 'Cool OS')
41
+ # }
42
+ def add_version_callback(priority = 0, ref = nil, &block)
43
+ @versioncbs.add(priority, ref, block)
44
+ end
45
+
46
+ ##
47
+ # <iq/> callback handler to answer Software Version queries
48
+ # (registered by constructor and used internally only)
49
+ #
50
+ # Used internally
51
+ def iq_callback(iq)
52
+ if iq.type == :get
53
+ if iq.query.kind_of?(IqQueryVersion)
54
+ replyblock = lambda { |name,version,os|
55
+ answer = iq.answer
56
+ answer.type = :result
57
+ answer.query.set_iname(name).set_version(version).set_os(os)
58
+
59
+ @stream.send(answer)
60
+ }
61
+ @versioncbs.process(iq, replyblock)
62
+ else
63
+ false
64
+ end
65
+ else
66
+ false
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,44 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r/iq'
6
+ require 'xmpp4r/version/helper/responder'
7
+
8
+ module Jabber
9
+ module Version
10
+ ##
11
+ # A class to answer version requests using IqQueryVersion
12
+ #
13
+ # This is simplification as one doesn't need dynamic
14
+ # version answering normally.
15
+ #
16
+ # Example usage:
17
+ # Jabber::Version::SimpleResponder.new(my_client, "My cool XMPP4R script", "1.0", "Younicks")
18
+ class SimpleResponder < Responder
19
+ attr_accessor :name
20
+ attr_accessor :version
21
+ attr_accessor :os
22
+
23
+ ##
24
+ # Initialize a new version responder
25
+ #
26
+ # Registers it's callback (prio = 180, ref = self)
27
+ # stream:: [Stream] Where to register callback handlers
28
+ # name:: [String] Software name for answers
29
+ # version:: [String] Software versio for answers
30
+ # os:: [String] Optional operating system name for answers
31
+ def initialize(stream, name, version, os=nil)
32
+ super stream
33
+
34
+ @name = name
35
+ @version = version
36
+ @os = os
37
+
38
+ add_version_callback(180, self) { |iq,block|
39
+ block.call(@name, @version, @os)
40
+ }
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,118 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r/query'
6
+
7
+ module Jabber
8
+ module Version
9
+ ##
10
+ # Class for handling queries for 'Software Version'
11
+ # (JEP 0092)
12
+ #
13
+ # Notice that according to JEP 0092 only the <os/> element can be omitted,
14
+ # <name/> (iname) and <version/> must be present
15
+ class IqQueryVersion < IqQuery
16
+ ##
17
+ # Create a new <query xmlns='jabber:iq:version'/> element
18
+ def initialize(iname='', version='', os=nil)
19
+ super()
20
+ add_namespace('jabber:iq:version')
21
+ set_iname(iname)
22
+ set_version(version)
23
+ set_os(os)
24
+ end
25
+
26
+ ##
27
+ # Import an element,
28
+ # deletes <name/>, <version/> and <os/> elements first
29
+ # xe:: [REXML::Element]
30
+ def import(xe)
31
+ delete_element('name')
32
+ delete_element('version')
33
+ delete_element('os')
34
+ super
35
+ end
36
+
37
+ ##
38
+ # Get the name of the software
39
+ #
40
+ # This has been renamed to 'iname' here to keep
41
+ # REXML::Element#name accessible
42
+ def iname
43
+ first_element_text('name')
44
+ end
45
+
46
+ ##
47
+ # Set the name of the software
48
+ #
49
+ # The element won't be deleted if text is nil as
50
+ # it must occur in a version query, but its text will
51
+ # be empty.
52
+ def iname=(text)
53
+ replace_element_text('name', text.nil? ? '' : text)
54
+ end
55
+
56
+ ##
57
+ # Set the name of the software (chaining-friendly)
58
+ # result:: [String] or nil
59
+ def set_iname(text)
60
+ self.iname = text
61
+ self
62
+ end
63
+
64
+ ##
65
+ # Get the version of the software
66
+ # result:: [String] or nil
67
+ def version
68
+ first_element_text('version')
69
+ end
70
+
71
+ ##
72
+ # Set the version of the software
73
+ #
74
+ # The element won't be deleted if text is nil as
75
+ # it must occur in a version query
76
+ def version=(text)
77
+ replace_element_text('version', text.nil? ? '' : text)
78
+ end
79
+
80
+ ##
81
+ # Set the version of the software (chaining-friendly)
82
+ # text:: [String]
83
+ def set_version(text)
84
+ self.version = text
85
+ self
86
+ end
87
+
88
+ ##
89
+ # Get the operating system or nil
90
+ # (os is not mandatory for Version Query)
91
+ def os
92
+ first_element_text('os')
93
+ end
94
+
95
+ ##
96
+ # Set the os of the software
97
+ # text:: [String] or nil
98
+ def os=(text)
99
+ if text
100
+ replace_element_text('os', text)
101
+ else
102
+ delete_elements('os')
103
+ end
104
+ end
105
+
106
+ ##
107
+ # Set the os of the software (chaining-friendly)
108
+ # text:: [String] or nil
109
+ def set_os(text)
110
+ self.os = text
111
+ self
112
+ end
113
+ end
114
+
115
+ IqQuery.add_namespaceclass('jabber:iq:version', IqQueryVersion)
116
+ end
117
+ end
118
+
@@ -0,0 +1,3 @@
1
+ require 'xmpp4r/version/helper/responder.rb'
2
+ require 'xmpp4r/version/helper/simpleresponder.rb'
3
+ require 'xmpp4r/version/iq/version.rb'
data/lib/xmpp4r/x.rb ADDED
@@ -0,0 +1,43 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r/rexmladdons'
6
+
7
+ module Jabber
8
+ ##
9
+ # A class used to build/parse <x/> elements
10
+ #
11
+ # These elements may occur as "attachments"
12
+ # in [Message] and [Presence] stanzas
13
+ class X < REXML::Element
14
+ @@namespace_classes = {}
15
+
16
+ ##
17
+ # Initialize a <x/> element
18
+ #
19
+ # Does nothing more than setting the element's name to 'x'
20
+ def initialize
21
+ super("x")
22
+ end
23
+
24
+ ##
25
+ # Create a new [X] from an XML-Element
26
+ # element:: [REXML::Element] to import, will be automatically converted if namespace appropriate
27
+ def X.import(element)
28
+ if @@namespace_classes.has_key?(element.namespace)
29
+ @@namespace_classes[element.namespace]::new.import(element)
30
+ else
31
+ X::new.import(element)
32
+ end
33
+ end
34
+
35
+ ##
36
+ # Add a class by namespace for automatic X conversion (see X.import)
37
+ # ns:: [String] Namespace (e.g. 'jabber:x:delay')
38
+ # xclass:: [X] x class derived from X
39
+ def X.add_namespaceclass(ns, xclass)
40
+ @@namespace_classes[ns] = xclass
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,174 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ require 'xmpp4r/jid'
6
+ require 'xmpp4r/error'
7
+
8
+ module Jabber
9
+ ##
10
+ # root class of all Jabber XML elements
11
+ class XMLStanza < REXML::Element
12
+ ##
13
+ # Compose a response by doing the following:
14
+ # * Create a new XMLStanza of the same subclass
15
+ # with the same element-name
16
+ # * Import xmlstanza if import is true
17
+ # * Swap 'to' and 'from'
18
+ # * Copy 'id'
19
+ # * Does not take care about the type
20
+ #
21
+ # *Attention*: Be careful when answering to stanzas with
22
+ # <tt>type == :error</tt> - answering to an error may generate
23
+ # another error on the other side, which could be leading to a
24
+ # ping-pong effect quickly!
25
+ #
26
+ # xmlstanza:: [XMLStanza] source
27
+ # import:: [true or false] Copy attributes and children of source
28
+ # result:: [XMLStanza] answer stanza
29
+ def XMLStanza.answer(xmlstanza, import=true)
30
+ x = xmlstanza.class::new
31
+ if import
32
+ x.import(xmlstanza)
33
+ end
34
+ x.from = xmlstanza.to
35
+ x.to = xmlstanza.from
36
+ x.id = xmlstanza.id
37
+ x
38
+ end
39
+
40
+ ##
41
+ # Add a sub-element
42
+ #
43
+ # Will be converted to [Error] if named "error"
44
+ # element:: [REXML::Element] to add
45
+ def typed_add(element)
46
+ if element.kind_of?(REXML::Element) && (element.name == 'error')
47
+ super(Error::import(element))
48
+ else
49
+ super(element)
50
+ end
51
+ end
52
+
53
+ ##
54
+ # Return the first <tt><error/></tt> child
55
+ def error
56
+ first_element('error')
57
+ end
58
+
59
+ ##
60
+ # Compose a response of this XMLStanza
61
+ # (see XMLStanza.answer)
62
+ # result:: [XMLStanza] New constructed stanza
63
+ def answer(import=true)
64
+ XMLStanza.answer(self, import)
65
+ end
66
+
67
+ ##
68
+ # Makes some changes to the structure of an XML element to help
69
+ # it respect the specification. For example, in a message, we should
70
+ # have <subject/> < <body/> < { rest of tags }
71
+ def normalize
72
+ end
73
+
74
+ ##
75
+ # get the to attribute
76
+ #
77
+ # return:: [String] the element's to attribute
78
+ def to
79
+ (a = attribute('to')).nil? ? a : JID::new(a.value)
80
+ end
81
+
82
+ ##
83
+ # set the to attribute
84
+ #
85
+ # v:: [String] the value to set
86
+ def to= (v)
87
+ add_attribute('to', v ? v.to_s : nil)
88
+ end
89
+
90
+ ##
91
+ # set the to attribute (chaining-friendly)
92
+ #
93
+ # v:: [String] the value to set
94
+ def set_to(v)
95
+ self.to = v
96
+ self
97
+ end
98
+
99
+ ##
100
+ # get the from attribute
101
+ #
102
+ # return:: [String] the element's from attribute
103
+ def from
104
+ (a = attribute('from')).nil? ? a : JID::new(a.value)
105
+ end
106
+
107
+ ##
108
+ # set the from attribute
109
+ #
110
+ # v:: [String] the value from set
111
+ def from= (v)
112
+ add_attribute('from', v ? v.to_s : nil)
113
+ end
114
+
115
+ ##
116
+ # set the from attribute (chaining-friendly)
117
+ #
118
+ # v:: [String] the value from set
119
+ def set_from(v)
120
+ add_attribute('from', v ? v.to_s : nil)
121
+ self
122
+ end
123
+
124
+ ##
125
+ # get the id attribute
126
+ #
127
+ # return:: [String] the element's id attribute
128
+ def id
129
+ (a = attribute('id')).nil? ? a : a.value
130
+ end
131
+
132
+ ##
133
+ # set the id attribute
134
+ #
135
+ # v:: [String] the value id set
136
+ def id= (v)
137
+ add_attribute('id', v)
138
+ end
139
+
140
+ ##
141
+ # set the id attribute (chaining-friendly)
142
+ #
143
+ # v:: [String] the value id set
144
+ def set_id(v)
145
+ add_attribute('id', v)
146
+ self
147
+ end
148
+
149
+ ##
150
+ # get the type attribute
151
+ #
152
+ # return:: [String] the element's type attribute
153
+ def type
154
+ (a = attribute('type')).nil? ? a : a.value
155
+ end
156
+
157
+ ##
158
+ # set the type attribute
159
+ #
160
+ # v:: [String] the value type set
161
+ def type= (v)
162
+ add_attribute('type', v)
163
+ end
164
+
165
+ ##
166
+ # set the type attribute (chaining-friendly)
167
+ #
168
+ # v:: [String] the value type set
169
+ def set_type(v)
170
+ add_attribute('type', v)
171
+ self
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,16 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+
5
+ ##
6
+ # The Jabber module is the root namespace of the library. You might want
7
+ # to Include it in your script to ease your coding. It provides
8
+ # a simple debug logging support.
9
+ module Jabber
10
+ # XMPP4R Version number
11
+ XMPP4R_VERSION = '0.3'
12
+ end
13
+
14
+ require 'xmpp4r/client'
15
+ require 'xmpp4r/component'
16
+ require 'xmpp4r/debuglog'
data/lib/xmpp4r.rb ADDED
@@ -0,0 +1,122 @@
1
+ # =XMPP4R - XMPP Library for Ruby
2
+ # License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
3
+ # Website::http://home.gna.org/xmpp4r/
4
+ #
5
+ # ==Introduction
6
+ #
7
+ # XMPP4R is a XMPP/Jabber library for Ruby. It can be used to build scripts
8
+ # using Jabber, full-featured Jabber clients, and components. It is written
9
+ # with extensibility in mind.
10
+ #
11
+ # ==XML management
12
+ #
13
+ # All the XML parsing is REXML's, and XML stanzas like <message/> (class
14
+ # <tt>Jabber::Message</tt>) or <iq/> (class <tt>Jabber::Iq</tt>) are indirect
15
+ # derivatives from REXML's Element class. This provide a maximum flexibity:
16
+ # the user can access attributes and childs using either the XMPP4R's helpers
17
+ # or directly using REXML's methods.
18
+ #
19
+ # ===Automatic element casting
20
+ #
21
+ # Because there are special classes derived from REXML::Element to ease
22
+ # development on the protocol level, Elements must be cast to them. This is
23
+ # done via REXML::Element.import. This method is also used in import class
24
+ # methods of some Element classes.
25
+ #
26
+ # The first occurance of this feature is in Jabber::Stream::receive:
27
+ # * <tt><message/></tt> stanzas are cast to Jabber::Message class
28
+ # * <tt><presence/></tt> stanzas are cast to Jabber::Presence class
29
+ # * <tt><iq/></tt> stanzas are cast to Jabber::Iq class
30
+ #
31
+ # This is not only useful for stanzas but all other XML processing, too:
32
+ # * <tt><x/></tt> children elements of <tt><message/></tt> and <tt><presence/></tt> are converted to Jabber::X
33
+ # * <tt><error/></tt> children elements of all three stanzas are converted to Jabber::Error
34
+ # * <tt><query/></tt> children elements of <tt><iq/></tt> are converted to Jabber::IqQuery
35
+ # * <tt><vCard/></tt> children elements of <tt><iq/></tt> are converted to Jabber::IqVcard
36
+ #
37
+ # The following conversion facilities are only executed if the respective
38
+ # library parts are loaded. See below for more details on Non-basic features.
39
+ # * Jabber::IqQuery elements are converted to Jabber::Roster::IqQueryRoster if their
40
+ # namespace is 'jabber:iq:roster'
41
+ # * Jabber::IqQuery elements are converted to Jabber::Version::IqQueryVersion if their
42
+ # namespace is 'jabber:iq:version'
43
+ # * Jabber::IqQuery elements are converted to Jabber::Discovery::IqQueryDiscoInfo if their
44
+ # namespace is 'http://jabber.org/protocol/disco#info'
45
+ # * Jabber::IqQuery elements are converted to Jabber::Discovery::IqQueryDiscoItems if their
46
+ # namespace is 'http://jabber.org/protocol/disco#items'
47
+ # * <tt><item/></tt> children elements of Jabber::Roster::IqQueryRoster are converted
48
+ # to Jabber::Roster::RosterItem
49
+ # * <tt><identity/></tt> children elements of Jabber::IqQueryDiscoInfo are converted
50
+ # to Jabber::Discovery::DiscoIdentity
51
+ # * <tt><feature/></tt> children elements of Jabber::IqQueryDiscoInfo are converted
52
+ # to Jabber::Discovery::DiscoFeature
53
+ # * <tt><item/></tt> children elements of Jabber::IqQueryDiscoItems are converted
54
+ # to Jabber::Discovery::DiscoItem
55
+ #
56
+ # To use this, don't check for:
57
+ # <tt>iq.queryns == 'http://jabber.org/protocol/disco#info'</tt>
58
+ #
59
+ # But instead check for the query's class:
60
+ # <tt>iq.query.kind_of?(Jabber::IqQueryDiscoInfo)</tt>
61
+ #
62
+ # ==Threaded and non-threaded modes
63
+ #
64
+ # From the user's point of view, the library can be used either in threaded mode,
65
+ # or in non-threaded mode, using a call to <tt>Jabber::Stream#process</tt> to
66
+ # receive pending messages.
67
+ #
68
+ # ==Where to begin?
69
+ #
70
+ # Because it is built in an extensible way, it might be hard for newcomers to
71
+ # understand where to look at documentation for a specific method. For example,
72
+ # Client heritates from Connection, which itself heritates from Stream.
73
+ #
74
+ # A newcomer should have a look at the <tt>Jabber::Client</tt> and
75
+ # <tt>Jabber::Component</tt> classes, and their parent classes
76
+ # <tt>Jabber::Connection</tt> and <tt>Jabber::Stream</tt>. The best way to
77
+ # understand how to use them is probably to look at the examples in the
78
+ # <tt>examples/</tt> dir.
79
+ #
80
+ # ==Non-basic features
81
+ #
82
+ # <tt>require 'xmpp4r'</tt> does only include basic functionality as
83
+ # Connections, Authentication, Stream processing, Callbacks, Stanza handling
84
+ # and Debugging to keep the library's footprint small.
85
+ #
86
+ # There is code for features that aren't required by a *basic* client. These
87
+ # must be additionally included to use them.
88
+ #
89
+ # ===Protocol-level features
90
+ #
91
+ # You're highly advised to read the according RFCs and JEPs if you intend to
92
+ # use them. The benefit will be that you'll understand the protocols and be
93
+ # going to be more efficient when programming with them.
94
+ #
95
+ # * Jabber::Bytestreams, Jabber::FileTransfer: <tt>require 'xmpp4r/bytestreams'</tt>
96
+ # * Jabber::Dataforms: <tt>require 'xmpp4r/dataforms'</tt>
97
+ # * Jabber::Delay: <tt>require 'xmpp4r/delay'</tt>
98
+ # * Jabber::Discovery: <tt>require 'xmpp4r/discovery'</tt>
99
+ # * Jabber::FeatureNegotiation: <tt>require 'xmpp4r/feature_negotiation'</tt>
100
+ # * Jabber::MUC: <tt>require 'xmpp4r/muc'</tt>
101
+ # * Jabber::Roster: <tt>require 'xmpp4r/roster'</tt>
102
+ # * Jabber::Vcard: <tt>require 'xmpp4r/vcard'</tt>
103
+ # * Jabber::Version: <tt>require 'xmpp4r/version'</tt>
104
+ #
105
+ # ===Helpers
106
+ #
107
+ # Helpers are intended to give more simplistic interfaces to various tasks
108
+ # of Jabber clients at the cost of flexibility. But you won't need that
109
+ # order of flexibility for the most things.
110
+ #
111
+ # * Jabber::Roster::Helper: <tt>require 'xmpp4r/roster'</tt>
112
+ # * Jabber::MUC::MUCBrowser, Jabber::MUC::MUCClient, Jabber::MUC::SimpleMUCClient: <tt>require 'xmpp4r/muc'</tt>
113
+ # * Jabber::Version::SimpleResponder, Jabber::Version::Responder: <tt>require 'xmpp4r/version'</tt>
114
+ # * Jabber::Vcard::Helper: <tt>require 'xmpp4r/vcard'</tt>
115
+ # * Jabber::FileTransfer::Helper, Jabber::Bytestreams::SOCKS5BytestreamsServer: <tt>require 'xmpp4r/bytestreams'</tt>
116
+ #
117
+ # ==Debugging
118
+ #
119
+ # Dumping your Jabber stream can be enabled this way:
120
+ # Jabber::debug = true
121
+
122
+ require 'xmpp4r/xmpp4r'