Class: Jabber::Error

Inherits:
REXML::Element show all
Defined in:
lib/xmpp4r/error.rb

Overview

A class used to build/parse <error/> elements. Look at JEP 0086 for explanation.

Constant Summary collapse

@@Errors =

Possible XMPP error conditions, types and codes (JEP 0086)

[['bad-request', :modify, 400],
['conflict', :cancel, 409],
['feature-not-implemented', :cancel, 501],
['forbidden', :auth, 403],
['gone', :modify, 302],
['internal-server-error', :wait, 500],
['item-not-found', :cancel, 404],
['jid-malformed', :modify, 400],
['not-acceptable', :modify, 406],
['not-allowed', :cancel, 405],
['not-authorized', :auth, 401],
['payment-required', :auth, 402],
['recipient-unavailable', :wait, 404],
['redirect', :modify, 302],
['registration-required', :auth, 407],
['remote-server-not-found', :cancel, 404],
['remote-server-timeout', :wait, 504],
['resource-constraint', :wait, 500],
['service-unavailable', :cancel, 503],
['subscription-required', :auth, 407],
['undefined-condition', nil, 500],
['unexpected-request', :wait, 400]]

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from REXML::Element

#delete_elements, #first_element, #first_element_text, #import, #replace_element_text, #typed_add

Constructor Details

#initialize(errorcondition = nil, text = nil) ⇒ Error

errorcondition
nil

or [String] of the following:

  • “bad-request”

  • “conflict”

  • “feature-not-implemented”

  • “forbidden”

  • “gone”

  • “internal-server-error”

  • “item-not-found”

  • “jid-malformed”

  • “not-acceptable”

  • “not-allowed”

  • “not-authorized”

  • “payment-required”

  • “recipient-unavailable”

  • “redirect”

  • “registration-required”

  • “remote-server-not-found”

  • “remote-server-timeout”

  • “resource-constraint”

  • “service-unavailable”

  • “subscription-required”

  • “undefined-condition”

  • “unexpected-request”

Will raise an [Exception] if not [nil] and none of the above

Does also set type and code to appropriate values according to errorcondition

text: [nil] or [String] Error text



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
# File 'lib/xmpp4r/error.rb', line 39

def initialize(errorcondition=nil, text=nil)
  if errorcondition.nil?
    super('error')
    set_text(text) unless text.nil?
  else
    errortype = nil
    errorcode = nil
    @@Errors.each { |cond,type,code|
      if errorcondition == cond
        errortype = type
        errorcode = code
      end
    }

    if errortype.nil? || errorcode.nil?
      raise("Unknown error condition when initializing Error")
    end
    
    super("error")
    set_error(errorcondition)
    set_type(errortype)
    set_code(errorcode)
    set_text(text) unless text.nil?
  end
end

Class Method Details

.import(element) ⇒ Object

Create a new <error/> element and import from existing

element
REXML::Element

to import



68
69
70
# File 'lib/xmpp4r/error.rb', line 68

def Error.import(element)
  Error::new.import(element)
end

Instance Method Details

#codeObject

Get the 'Legacy error code' or nil

result
Integer

Error code



75
76
77
78
79
80
81
# File 'lib/xmpp4r/error.rb', line 75

def code
  if attributes['code']
    attributes['code'].to_i
  else
    nil
  end
end

#code=(i) ⇒ Object

Set the 'Legacy error code' or nil

i
Integer

Error code



86
87
88
89
90
91
92
# File 'lib/xmpp4r/error.rb', line 86

def code=(i)
  if i.nil?
    attributes['code'] = nil
  else
    attributes['code'] = i.to_s
  end
end

#errorObject

Get the 'XMPP error condition'

This can be anything that possess the specific namespace, checks don't apply here



106
107
108
109
110
# File 'lib/xmpp4r/error.rb', line 106

def error
  name = nil
  each_element { |e| name = e.name if (e.namespace == 'urn:ietf:params:xml:ns:xmpp-stanzas') && (e.name != 'text') }
  name
end

#error=(s) ⇒ Object

Set the 'XMPP error condition'

One previous element with that namespace will be deleted before

s
String

Name of the element to be added,

namespace will be added automatically, checks don't apply here



119
120
121
122
123
124
125
126
127
# File 'lib/xmpp4r/error.rb', line 119

def error=(s)
  xe = nil
  each_element { |e| xe = e if (e.namespace == 'urn:ietf:params:xml:ns:xmpp-stanzas') && (e.name != 'text') }
  unless xe.nil?
    delete_element(xe)
  end

  add_element(s).add_namespace('urn:ietf:params:xml:ns:xmpp-stanzas')
end

#set_code(i) ⇒ Object

Set the 'Legacy error code' (chaining-friendly)



96
97
98
99
# File 'lib/xmpp4r/error.rb', line 96

def set_code(i)
  self.code = i
  self
end

#set_error(s) ⇒ Object

Set the 'XMPP error condition' (chaining-friendly)



131
132
133
134
# File 'lib/xmpp4r/error.rb', line 131

def set_error(s)
  self.error = s
  self
end

#set_text(s) ⇒ Object

Set the errors <text/> element text (chaining-friendly)



159
160
161
162
# File 'lib/xmpp4r/error.rb', line 159

def set_text(s)
  self.text = s
  self
end

#set_type(t) ⇒ Object

Set the type of error (chaining-friendly)



199
200
201
202
# File 'lib/xmpp4r/error.rb', line 199

def set_type(t)
  self.type = t
  self
end

#textObject

Get the errors <text/> element text

result
String

or nil



139
140
141
# File 'lib/xmpp4r/error.rb', line 139

def text
  first_element_text('text') || super
end

#text=(s) ⇒ Object

Set the errors <text/> element text (Previous <text/> elements will be deleted first)

s
String

<text/> content or [nil] if no <text/> element



147
148
149
150
151
152
153
154
155
# File 'lib/xmpp4r/error.rb', line 147

def text=(s)
  delete_elements('text')

  unless s.nil?
    e = add_element('text')
    e.add_namespace('urn:ietf:params:xml:ns:xmpp-stanzas')
    e.text = s
  end
end

#typeObject

Get the type of error (meaning how to proceed)

result
Symbol

or [nil] as following:

  • :auth

  • :cancel

  • :continue

  • :modify

  • :wait



173
174
175
176
177
178
179
180
181
182
# File 'lib/xmpp4r/error.rb', line 173

def type
  case attributes['type']
    when 'auth' then :auth
    when 'cancel' then :cancel
    when 'continue' then :continue
    when 'modify' then :modify
    when 'wait' then :wait
    else nil
  end
end

#type=(t) ⇒ Object

Set the type of error (see Error#type)



186
187
188
189
190
191
192
193
194
195
# File 'lib/xmpp4r/error.rb', line 186

def type=(t)
  case t
    when :auth then attributes['type'] = 'auth'
    when :cancel then attributes['type'] = 'cancel'
    when :continue then attributes['type'] = 'continue'
    when :modify then attributes['type'] = 'modify'
    when :wait then attributes['type'] = 'wait'
    else attributes['type'] = nil
  end
end