jabber4r-revive 0.9.0 → 0.10.0

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.
Files changed (45) hide show
  1. data/.gitignore +5 -4
  2. data/.rspec +3 -3
  3. data/.travis.yml +7 -7
  4. data/CHANGELOG +11 -1
  5. data/Gemfile +3 -3
  6. data/README.md +29 -29
  7. data/Rakefile +70 -70
  8. data/jabber4r-revive.gemspec +25 -25
  9. data/lib/jabber4r.rb +38 -33
  10. data/lib/jabber4r/bosh.rb +21 -0
  11. data/lib/jabber4r/bosh/authentication.rb +13 -0
  12. data/lib/jabber4r/bosh/authentication/non_sasl.rb +219 -0
  13. data/lib/jabber4r/bosh/authentication/sasl.rb +239 -0
  14. data/lib/jabber4r/bosh/session.rb +144 -0
  15. data/lib/jabber4r/connection.rb +259 -258
  16. data/lib/jabber4r/debugger.rb +60 -60
  17. data/lib/jabber4r/jid.rb +20 -19
  18. data/lib/jabber4r/protocol.rb +249 -257
  19. data/lib/jabber4r/protocol/authentication.rb +14 -0
  20. data/lib/jabber4r/protocol/authentication/non_sasl.rb +138 -0
  21. data/lib/jabber4r/protocol/authentication/sasl.rb +88 -0
  22. data/lib/jabber4r/protocol/iq.rb +259 -259
  23. data/lib/jabber4r/protocol/message.rb +245 -245
  24. data/lib/jabber4r/protocol/parsed_xml_element.rb +207 -207
  25. data/lib/jabber4r/protocol/presence.rb +160 -160
  26. data/lib/jabber4r/protocol/xml_element.rb +143 -143
  27. data/lib/jabber4r/rexml_1.8_patch.rb +15 -15
  28. data/lib/jabber4r/roster.rb +38 -38
  29. data/lib/jabber4r/session.rb +615 -615
  30. data/lib/jabber4r/version.rb +10 -3
  31. data/spec/lib/jabber4r/bosh/authentication/non_sasl_spec.rb +79 -0
  32. data/spec/lib/jabber4r/bosh/authentication/sasl_spec.rb +42 -0
  33. data/spec/lib/jabber4r/bosh/session_spec.rb +406 -0
  34. data/spec/lib/jabber4r/bosh_spec.rb +0 -0
  35. data/spec/lib/jabber4r/connection_spec.rb +174 -174
  36. data/spec/lib/jabber4r/debugger_spec.rb +35 -35
  37. data/spec/lib/jabber4r/jid_spec.rb +197 -197
  38. data/spec/lib/jabber4r/protocol/authentication/non_sasl_spec.rb +79 -0
  39. data/spec/lib/jabber4r/protocol/authentication/sasl_spec.rb +42 -0
  40. data/spec/spec_helper.rb +11 -11
  41. data/spec/support/mocks/tcp_socket_mock.rb +8 -8
  42. metadata +61 -45
  43. data/Gemfile.lock +0 -45
  44. data/lib/jabber4r/bosh_session.rb +0 -224
  45. data/spec/lib/jabber4r/bosh_session_spec.rb +0 -150
@@ -1,208 +1,208 @@
1
- # coding: utf-8
2
-
3
- # License: see LICENSE
4
- # Jabber4R - Jabber Instant Messaging Library for Ruby
5
- # Copyright (C) 2002 Rich Kilmer <rich@infoether.com>
6
-
7
- module Jabber::Protocol
8
- ##
9
- # This class is constructed from XML data elements that are received from
10
- # the Jabber service.
11
- #
12
- class ParsedXMLElement
13
-
14
- ##
15
- # This class is used to return nil element values to prevent errors (and
16
- # reduce the number of checks.
17
- #
18
- class NilParsedXMLElement
19
-
20
- ##
21
- # Override to return nil
22
- #
23
- # return:: [nil]
24
- #
25
- def method_missing(methId, *args)
26
- return nil
27
- end
28
-
29
- ##
30
- # Evaluate as nil
31
- #
32
- # return:: [Boolean] true
33
- #
34
- def nil?
35
- return true
36
- end
37
-
38
- ##
39
- # Return a zero count
40
- #
41
- # return:: [Integer] 0
42
- #
43
- def count
44
- 0
45
- end
46
-
47
- include Singleton
48
- end
49
-
50
- # The <tag> as String
51
- attr_reader :element_tag
52
-
53
- # The parent ParsedXMLElement
54
- attr_reader :element_parent
55
-
56
- # A hash of ParsedXMLElement children
57
- attr_reader :element_children
58
-
59
- # The data <tag>data</tag> for a tag
60
- attr_reader :element_data
61
-
62
- ##
63
- # Construct an instance for the given tag
64
- #
65
- # tag:: [String] The tag
66
- # parent:: [Jabber::Protocol::ParsedXMLElement = nil] The parent element
67
- #
68
- def initialize(tag, parent=nil)
69
- @element_tag = tag
70
- @element_parent = parent
71
- @element_children = {}
72
- @attributes = {}
73
- @element_consumed = false
74
- end
75
-
76
- ##
77
- # Add the attribute to the element
78
- # <tag name="value">data</tag>
79
- #
80
- # name:: [String] The attribute name
81
- # value:: [String] The attribute value
82
- # return:: [Jabber::Protocol::ParsedXMLElement] self for chaining
83
- #
84
- def add_attribute(name, value)
85
- @attributes[name]=value
86
- self
87
- end
88
-
89
- ##
90
- # Factory to build a child element from this element with the given tag
91
- #
92
- # tag:: [String] The tag name
93
- # return:: [Jabber::Protocol::ParsedXMLElement] The newly created child element
94
- #
95
- def add_child(tag)
96
- child = ParsedXMLElement.new(tag, self)
97
- @element_children[tag] = Array.new if not @element_children.has_key? tag
98
- @element_children[tag] << child
99
- return child
100
- end
101
-
102
- ##
103
- # When an xml is received from the Jabber service and a ParsedXMLElement is created,
104
- # it is propogated to all filters and listeners. Any one of those can consume the element
105
- # to prevent its propogation to other filters or listeners. This method marks the element
106
- # as consumed.
107
- #
108
- def consume_element
109
- @element_consumed = true
110
- end
111
-
112
- ##
113
- # Checks if the element is consumed
114
- #
115
- # return:: [Boolean] True if the element is consumed
116
- #
117
- def element_consumed?
118
- @element_consumed
119
- end
120
-
121
- ##
122
- # Appends data to the element
123
- #
124
- # data:: [String] The data to append
125
- # return:: [Jabber::Protocol::ParsedXMLElement] self for chaining
126
- #
127
- def append_data(data)
128
- @element_data = "" unless @element_data
129
- @element_data += data
130
- self
131
- end
132
-
133
- ##
134
- # Calls the parent's element_children (hash) index off of this elements
135
- # tag and gets the supplied index. In this sense it gets its sibling based
136
- # on offset.
137
- #
138
- # number:: [Integer] The number of the sibling to get
139
- # return:: [Jabber::Protocol::ParsedXMLElement] The sibling element
140
- #
141
- def [](number)
142
- return @element_parent.element_children[@element_tag][number] if @element_parent
143
- end
144
-
145
- ##
146
- # Returns the count of siblings with this element's tag
147
- #
148
- # return:: [Integer] The number of sibling elements
149
- #
150
- def count
151
- return @element_parent.element_children[@element_tag].size if @element_parent
152
- return 0
153
- end
154
-
155
- ##
156
- # see _count
157
- #
158
- def size
159
- count
160
- end
161
-
162
- ##
163
- # Overrides to allow for directly accessing child elements
164
- # and attributes. If prefaced by attr_ it looks for an attribute
165
- # that matches or checks for a child with a tag that matches
166
- # the method name. If no match occurs, it returns a
167
- # NilParsedXMLElement (singleton) instance.
168
- #
169
- # Example:: <alpha number="1"><beta number="2">Beta Data</beta></alpha>
170
- #
171
- # element.element_tag #=> alpha
172
- # element.attr_number #=> 1
173
- # element.beta.element_data #=> Beta Data
174
- #
175
- def method_missing(methId, *args)
176
- tag = methId.id2name
177
- if tag[0..4]=="attr_"
178
- return @attributes[tag[5..-1]]
179
- end
180
- list = @element_children[tag]
181
- return list[0] if list
182
- return NilParsedXMLElement.instance
183
- end
184
-
185
- ##
186
- # Returns the valid XML as a string
187
- #
188
- # return:: [String] XML string
189
- def to_s
190
- begin
191
- result = "\n<#{@element_tag}"
192
- @attributes.each {|key, value| result += (' '+key+'="'+value+'"') }
193
- if @element_children.size>0 or @element_data
194
- result += ">"
195
- else
196
- result += "/>"
197
- end
198
- result += @element_data if @element_data
199
- @element_children.each_value {|array| array.each {|je| result += je.to_s} }
200
- result += "\n" if @element_children.size>0
201
- result += "</#{@element_tag}>" if @element_children.size>0 or @element_data
202
- result
203
- rescue => exception
204
- puts exception.to_s
205
- end
206
- end
207
- end
1
+ # coding: utf-8
2
+
3
+ # License: see LICENSE
4
+ # Jabber4R - Jabber Instant Messaging Library for Ruby
5
+ # Copyright (C) 2002 Rich Kilmer <rich@infoether.com>
6
+
7
+ module Jabber::Protocol
8
+ ##
9
+ # This class is constructed from XML data elements that are received from
10
+ # the Jabber service.
11
+ #
12
+ class ParsedXMLElement
13
+
14
+ ##
15
+ # This class is used to return nil element values to prevent errors (and
16
+ # reduce the number of checks.
17
+ #
18
+ class NilParsedXMLElement
19
+
20
+ ##
21
+ # Override to return nil
22
+ #
23
+ # return:: [nil]
24
+ #
25
+ def method_missing(methId, *args)
26
+ return nil
27
+ end
28
+
29
+ ##
30
+ # Evaluate as nil
31
+ #
32
+ # return:: [Boolean] true
33
+ #
34
+ def nil?
35
+ return true
36
+ end
37
+
38
+ ##
39
+ # Return a zero count
40
+ #
41
+ # return:: [Integer] 0
42
+ #
43
+ def count
44
+ 0
45
+ end
46
+
47
+ include Singleton
48
+ end
49
+
50
+ # The <tag> as String
51
+ attr_reader :element_tag
52
+
53
+ # The parent ParsedXMLElement
54
+ attr_reader :element_parent
55
+
56
+ # A hash of ParsedXMLElement children
57
+ attr_reader :element_children
58
+
59
+ # The data <tag>data</tag> for a tag
60
+ attr_reader :element_data
61
+
62
+ ##
63
+ # Construct an instance for the given tag
64
+ #
65
+ # tag:: [String] The tag
66
+ # parent:: [Jabber::Protocol::ParsedXMLElement = nil] The parent element
67
+ #
68
+ def initialize(tag, parent=nil)
69
+ @element_tag = tag
70
+ @element_parent = parent
71
+ @element_children = {}
72
+ @attributes = {}
73
+ @element_consumed = false
74
+ end
75
+
76
+ ##
77
+ # Add the attribute to the element
78
+ # <tag name="value">data</tag>
79
+ #
80
+ # name:: [String] The attribute name
81
+ # value:: [String] The attribute value
82
+ # return:: [Jabber::Protocol::ParsedXMLElement] self for chaining
83
+ #
84
+ def add_attribute(name, value)
85
+ @attributes[name]=value
86
+ self
87
+ end
88
+
89
+ ##
90
+ # Factory to build a child element from this element with the given tag
91
+ #
92
+ # tag:: [String] The tag name
93
+ # return:: [Jabber::Protocol::ParsedXMLElement] The newly created child element
94
+ #
95
+ def add_child(tag)
96
+ child = ParsedXMLElement.new(tag, self)
97
+ @element_children[tag] = Array.new if not @element_children.has_key? tag
98
+ @element_children[tag] << child
99
+ return child
100
+ end
101
+
102
+ ##
103
+ # When an xml is received from the Jabber service and a ParsedXMLElement is created,
104
+ # it is propogated to all filters and listeners. Any one of those can consume the element
105
+ # to prevent its propogation to other filters or listeners. This method marks the element
106
+ # as consumed.
107
+ #
108
+ def consume_element
109
+ @element_consumed = true
110
+ end
111
+
112
+ ##
113
+ # Checks if the element is consumed
114
+ #
115
+ # return:: [Boolean] True if the element is consumed
116
+ #
117
+ def element_consumed?
118
+ @element_consumed
119
+ end
120
+
121
+ ##
122
+ # Appends data to the element
123
+ #
124
+ # data:: [String] The data to append
125
+ # return:: [Jabber::Protocol::ParsedXMLElement] self for chaining
126
+ #
127
+ def append_data(data)
128
+ @element_data = "" unless @element_data
129
+ @element_data += data
130
+ self
131
+ end
132
+
133
+ ##
134
+ # Calls the parent's element_children (hash) index off of this elements
135
+ # tag and gets the supplied index. In this sense it gets its sibling based
136
+ # on offset.
137
+ #
138
+ # number:: [Integer] The number of the sibling to get
139
+ # return:: [Jabber::Protocol::ParsedXMLElement] The sibling element
140
+ #
141
+ def [](number)
142
+ return @element_parent.element_children[@element_tag][number] if @element_parent
143
+ end
144
+
145
+ ##
146
+ # Returns the count of siblings with this element's tag
147
+ #
148
+ # return:: [Integer] The number of sibling elements
149
+ #
150
+ def count
151
+ return @element_parent.element_children[@element_tag].size if @element_parent
152
+ return 0
153
+ end
154
+
155
+ ##
156
+ # see _count
157
+ #
158
+ def size
159
+ count
160
+ end
161
+
162
+ ##
163
+ # Overrides to allow for directly accessing child elements
164
+ # and attributes. If prefaced by attr_ it looks for an attribute
165
+ # that matches or checks for a child with a tag that matches
166
+ # the method name. If no match occurs, it returns a
167
+ # NilParsedXMLElement (singleton) instance.
168
+ #
169
+ # Example:: <alpha number="1"><beta number="2">Beta Data</beta></alpha>
170
+ #
171
+ # element.element_tag #=> alpha
172
+ # element.attr_number #=> 1
173
+ # element.beta.element_data #=> Beta Data
174
+ #
175
+ def method_missing(methId, *args)
176
+ tag = methId.id2name
177
+ if tag[0..4]=="attr_"
178
+ return @attributes[tag[5..-1]]
179
+ end
180
+ list = @element_children[tag]
181
+ return list[0] if list
182
+ return NilParsedXMLElement.instance
183
+ end
184
+
185
+ ##
186
+ # Returns the valid XML as a string
187
+ #
188
+ # return:: [String] XML string
189
+ def to_s
190
+ begin
191
+ result = "\n<#{@element_tag}"
192
+ @attributes.each {|key, value| result += (' '+key+'="'+value+'"') }
193
+ if @element_children.size>0 or @element_data
194
+ result += ">"
195
+ else
196
+ result += "/>"
197
+ end
198
+ result += @element_data if @element_data
199
+ @element_children.each_value {|array| array.each {|je| result += je.to_s} }
200
+ result += "\n" if @element_children.size>0
201
+ result += "</#{@element_tag}>" if @element_children.size>0 or @element_data
202
+ result
203
+ rescue => exception
204
+ puts exception.to_s
205
+ end
206
+ end
207
+ end
208
208
  end
@@ -1,160 +1,160 @@
1
- # coding: utf-8
2
-
3
- # License: see LICENSE
4
- # Jabber4R - Jabber Instant Messaging Library for Ruby
5
- # Copyright (C) 2002 Rich Kilmer <rich@infoether.com>
6
-
7
- module Jabber::Protocol
8
- ##
9
- # The presence class is used to construct presence messages to
10
- # send to the Jabber service.
11
- #
12
- class Presence
13
- attr_accessor :to, :from, :id, :type
14
-
15
- # The state to show (chat, xa, dnd, away)
16
- attr_accessor :show
17
-
18
- # The status message
19
- attr_accessor :status
20
- attr_accessor :priority
21
-
22
- ##
23
- # Constructs a Presence object w/the supplied id
24
- #
25
- # id:: [String] The message ID
26
- # show:: [String] The state to show
27
- # status:: [String] The status message
28
- #
29
- def initialize(id, show=nil, status=nil)
30
- @id = id
31
- @show = show if show
32
- @status = status if status
33
- end
34
-
35
- ##
36
- # Generate a presence object for initial presence notification
37
- #
38
- # id:: [String] The message ID
39
- # show:: [String] The state to show
40
- # status:: [String] The status message
41
- # return:: [Jabber::Protocol::Presence] The newly created Presence object
42
- #
43
- def self.gen_initial(id, show=nil, status=nil)
44
- Presence.new(id, show, status)
45
- end
46
-
47
- ##
48
- # Generate a presence object w/show="normal" (normal availability)
49
- #
50
- # id:: [String] The message ID
51
- # status:: [String=nil] The status message
52
- # return:: [Jabber::Protocol::Presence] The newly created Presence object
53
- #
54
- def self.gen_normal(id, status=nil)
55
- Presence.new(id, "normal", status)
56
- end
57
-
58
- ##
59
- # Generate a presence object w/show="chat" (free for chat)
60
- #
61
- # id:: [String] The message ID
62
- # status:: [String=nil] The status message
63
- # return:: [Jabber::Protocol::Presence] The newly created Presence object
64
- #
65
- def self.gen_chat(id, status=nil)
66
- Presence.new(id, "chat", status)
67
- end
68
-
69
- ##
70
- # Generate a presence object w/show="xa" (extended away)
71
- #
72
- # id:: [String] The message ID
73
- # status:: [String=nil] The status message
74
- # return:: [Jabber::Protocol::Presence] The newly created Presence object
75
- #
76
- def self.gen_xa(id, status=nil)
77
- Presence.new(id, "xa", status)
78
- end
79
-
80
- ##
81
- # Generate a presence object w/show="dnd" (do not disturb)
82
- #
83
- # id:: [String] The message ID
84
- # status:: [String=nil] The status message
85
- # return:: [Jabber::Protocol::Presence] The newly created Presence object
86
- #
87
- def self.gen_dnd(id, status=nil)
88
- Presence.new(id, "dnd", status)
89
- end
90
-
91
- ##
92
- # Generate a presence object w/show="away" (away from resource)
93
- #
94
- # id:: [String] The message ID
95
- # status:: [String=nil] The status message
96
- # return:: [Jabber::Protocol::Presence] The newly created Presence object
97
- #
98
- def self.gen_away(id, status=nil)
99
- Presence.new(id, "away", status)
100
- end
101
-
102
- ##
103
- # Generate a presence object w/show="unavailable" (not free for chat)
104
- #
105
- # id:: [String] The message ID
106
- # status:: [String=nil] The status message
107
- # return:: [Jabber::Protocol::Presence] The newly created Presence object
108
- #
109
- def self.gen_unavailable(id, status=nil)
110
- p = Presence.new(id)
111
- p.type="unavailable"
112
- p
113
- end
114
-
115
- def self.gen_new_subscription(to)
116
- p = Presence.new(Jabber.gen_random_id)
117
- p.type = "subscribe"
118
- p.to = to
119
- p
120
- end
121
-
122
- def self.gen_accept_subscription(id, jid)
123
- p = Presence.new(id)
124
- p.type = "subscribed"
125
- p.to = jid
126
- p
127
- end
128
-
129
- def self.gen_accept_unsubscription(id, jid)
130
- p = Presence.new(id)
131
- p.type = "unsubscribed"
132
- p.to = jid
133
- p
134
- end
135
-
136
- ##
137
- # Generates the xml representation of this Presence object
138
- #
139
- # return:: [String] The presence XML message to send the Jabber service
140
- #
141
- def to_xml
142
- e = XMLElement.new("presence")
143
- e.add_attribute("id", @id) if @id
144
- e.add_attribute("from", @from) if @from
145
- e.add_attribute("to", @to) if @to
146
- e.add_attribute("type", @type) if @type
147
- e.add_child("show").add_data(@show) if @show
148
- e.add_child("status").add_data(@status) if @status
149
- e.add_child("priority") if @priority
150
- e.to_s
151
- end
152
-
153
- ##
154
- # see _to_xml
155
- #
156
- def to_s
157
- to_xml
158
- end
159
- end
160
- end
1
+ # coding: utf-8
2
+
3
+ # License: see LICENSE
4
+ # Jabber4R - Jabber Instant Messaging Library for Ruby
5
+ # Copyright (C) 2002 Rich Kilmer <rich@infoether.com>
6
+
7
+ module Jabber::Protocol
8
+ ##
9
+ # The presence class is used to construct presence messages to
10
+ # send to the Jabber service.
11
+ #
12
+ class Presence
13
+ attr_accessor :to, :from, :id, :type
14
+
15
+ # The state to show (chat, xa, dnd, away)
16
+ attr_accessor :show
17
+
18
+ # The status message
19
+ attr_accessor :status
20
+ attr_accessor :priority
21
+
22
+ ##
23
+ # Constructs a Presence object w/the supplied id
24
+ #
25
+ # id:: [String] The message ID
26
+ # show:: [String] The state to show
27
+ # status:: [String] The status message
28
+ #
29
+ def initialize(id, show=nil, status=nil)
30
+ @id = id
31
+ @show = show if show
32
+ @status = status if status
33
+ end
34
+
35
+ ##
36
+ # Generate a presence object for initial presence notification
37
+ #
38
+ # id:: [String] The message ID
39
+ # show:: [String] The state to show
40
+ # status:: [String] The status message
41
+ # return:: [Jabber::Protocol::Presence] The newly created Presence object
42
+ #
43
+ def self.gen_initial(id, show=nil, status=nil)
44
+ Presence.new(id, show, status)
45
+ end
46
+
47
+ ##
48
+ # Generate a presence object w/show="normal" (normal availability)
49
+ #
50
+ # id:: [String] The message ID
51
+ # status:: [String=nil] The status message
52
+ # return:: [Jabber::Protocol::Presence] The newly created Presence object
53
+ #
54
+ def self.gen_normal(id, status=nil)
55
+ Presence.new(id, "normal", status)
56
+ end
57
+
58
+ ##
59
+ # Generate a presence object w/show="chat" (free for chat)
60
+ #
61
+ # id:: [String] The message ID
62
+ # status:: [String=nil] The status message
63
+ # return:: [Jabber::Protocol::Presence] The newly created Presence object
64
+ #
65
+ def self.gen_chat(id, status=nil)
66
+ Presence.new(id, "chat", status)
67
+ end
68
+
69
+ ##
70
+ # Generate a presence object w/show="xa" (extended away)
71
+ #
72
+ # id:: [String] The message ID
73
+ # status:: [String=nil] The status message
74
+ # return:: [Jabber::Protocol::Presence] The newly created Presence object
75
+ #
76
+ def self.gen_xa(id, status=nil)
77
+ Presence.new(id, "xa", status)
78
+ end
79
+
80
+ ##
81
+ # Generate a presence object w/show="dnd" (do not disturb)
82
+ #
83
+ # id:: [String] The message ID
84
+ # status:: [String=nil] The status message
85
+ # return:: [Jabber::Protocol::Presence] The newly created Presence object
86
+ #
87
+ def self.gen_dnd(id, status=nil)
88
+ Presence.new(id, "dnd", status)
89
+ end
90
+
91
+ ##
92
+ # Generate a presence object w/show="away" (away from resource)
93
+ #
94
+ # id:: [String] The message ID
95
+ # status:: [String=nil] The status message
96
+ # return:: [Jabber::Protocol::Presence] The newly created Presence object
97
+ #
98
+ def self.gen_away(id, status=nil)
99
+ Presence.new(id, "away", status)
100
+ end
101
+
102
+ ##
103
+ # Generate a presence object w/show="unavailable" (not free for chat)
104
+ #
105
+ # id:: [String] The message ID
106
+ # status:: [String=nil] The status message
107
+ # return:: [Jabber::Protocol::Presence] The newly created Presence object
108
+ #
109
+ def self.gen_unavailable(id, status=nil)
110
+ p = Presence.new(id)
111
+ p.type="unavailable"
112
+ p
113
+ end
114
+
115
+ def self.gen_new_subscription(to)
116
+ p = Presence.new(Jabber.gen_random_id)
117
+ p.type = "subscribe"
118
+ p.to = to
119
+ p
120
+ end
121
+
122
+ def self.gen_accept_subscription(id, jid)
123
+ p = Presence.new(id)
124
+ p.type = "subscribed"
125
+ p.to = jid
126
+ p
127
+ end
128
+
129
+ def self.gen_accept_unsubscription(id, jid)
130
+ p = Presence.new(id)
131
+ p.type = "unsubscribed"
132
+ p.to = jid
133
+ p
134
+ end
135
+
136
+ ##
137
+ # Generates the xml representation of this Presence object
138
+ #
139
+ # return:: [String] The presence XML message to send the Jabber service
140
+ #
141
+ def to_xml
142
+ e = XMLElement.new("presence")
143
+ e.add_attribute("id", @id) if @id
144
+ e.add_attribute("from", @from) if @from
145
+ e.add_attribute("to", @to) if @to
146
+ e.add_attribute("type", @type) if @type
147
+ e.add_child("show").add_data(@show) if @show
148
+ e.add_child("status").add_data(@status) if @status
149
+ e.add_child("priority") if @priority
150
+ e.to_s
151
+ end
152
+
153
+ ##
154
+ # see _to_xml
155
+ #
156
+ def to_s
157
+ to_xml
158
+ end
159
+ end
160
+ end