confirm port is an integer
[github-services.git] / vendor / xmpp4r-0.3.2 / lib / xmpp4r / jid.rb
blob809cd40eeae6559b02eed8c152db8c0374f0d4ad
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/
5 module Jabber
6   ##
7   # The JID class represents a Jabber Identifier as described by 
8   # RFC3920 section 3.1.
9   #
10   # Note that you can use JIDs also for Sorting, Hash keys, ...
11   class JID
12     include Comparable
14     PATTERN = /^(?:([^@]*)@)??([^@\/]*)(?:\/(.*?))?$/
16     begin
17       require 'idn'
18       USE_STRINGPREP = true
19     rescue LoadError
20       USE_STRINGPREP = false
21     end
23     ##
24     # Create a new JID. If called as new('a@b/c'), parse the string and
25     # split (node, domain, resource)
26     def initialize(node = "", domain = nil, resource = nil)
27       @resource = resource
28       @domain = domain
29       @node = node
30       if @domain.nil? and @resource.nil? and @node
31         @node, @domain, @resource = @node.to_s.scan(PATTERN).first
32       end
34       if USE_STRINGPREP
35         @node = IDN::Stringprep.nodeprep(@node) if @node
36         @domain = IDN::Stringprep.nameprep(@domain) if @domain
37         @resource = IDN::Stringprep.resourceprep(@resource) if @resource
38       else
39         @node.downcase! if @node
40         @domain.downcase! if @domain
41       end
43       raise ArgumentError, 'Node too long' if (@node || '').length > 1023
44       raise ArgumentError, 'Domain too long' if (@domain || '').length > 1023
45       raise ArgumentError, 'Resource too long' if (@resource || '').length > 1023
46     end
48     ##
49     # Returns a string representation of the JID
50     # * ""
51     # * "domain"
52     # * "node@domain"
53     # * "domain/resource"
54     # * "node@domain/resource"
55     def to_s
56       s = @domain
57       s = "#{@node}@#{s}" if @node
58       s += "/#{@resource}" if @resource
59       return s
60     end
62     ##
63     # Returns a new JID with resource removed.
64     # return:: [JID]
65     def strip
66       JID::new(@node, @domain)
67     end
68     alias_method :bare, :strip
70     ##
71     # Removes the resource (sets it to nil)
72     # return:: [JID] self
73     def strip!
74       @resource = nil
75       self
76     end
77     alias_method :bare!, :strip!
79     ##
80     # Returns a hash value of the String representation
81     # (see JID#to_s)
82     def hash
83       return to_s.hash
84     end
86     ##
87     # Ccompare to another JID
88     #
89     # String representations are compared, see JID#to_s
90     def eql?(o)
91       to_s.eql?(o.to_s)
92     end
94     ##
95     # Ccompare to another JID
96     #
97     # String representations are compared, see JID#to_s
98     def ==(o)
99       to_s == o.to_s
100     end
102     ##
103     # Compare two JIDs,
104     # helpful for sorting etc.
105     #
106     # String representations are compared, see JID#to_s
107     def <=>(o)
108       to_s <=> o.to_s
109     end
111     # Get the JID's node
112     def node
113       @node
114     end
116     # Set the JID's node
117     def node=(v)
118       @node = v.to_s
119       if USE_STRINGPREP
120         @node = IDN::Stringprep.nodeprep(@node) if @node
121       end
122     end
124     # Get the JID's domain
125     def domain
126       return nil if @domain.empty?
127       @domain
128     end
130     # Set the JID's domain
131     def domain=(v)
132       @domain = v.to_s
133       if USE_STRINGPREP
134         @domain = IDN::Stringprep.nodeprep(@domain)
135       end
136     end
138     # Get the JID's resource
139     def resource
140       @resource
141     end
143     # Set the JID's resource
144     def resource=(v)
145       @resource = v.to_s
146       if USE_STRINGPREP
147         @resource = IDN::Stringprep.nodeprep(@resource)
148       end
149     end
151     # Escape JID
152     def JID::escape(jid)
153       return jid.to_s.gsub('@', '%')
154     end
156     # Test if jid is empty
157     def empty?
158       to_s.empty?
159     end
161     # Test id jid is strepped
162     def stripped?
163       @resource.nil?
164     end
165     alias_method :bared?, :stripped?
166   end