1 /* 2 * libjingle 3 * Copyright 2004--2005, Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #ifndef TALK_XMPP_JID_H_ 29 #define TALK_XMPP_JID_H_ 30 31 #include <string> 32 #include "webrtc/libjingle/xmllite/xmlconstants.h" 33 #include "webrtc/base/basictypes.h" 34 35 namespace buzz { 36 37 // The Jid class encapsulates and provides parsing help for Jids. A Jid 38 // consists of three parts: the node, the domain and the resource, e.g.: 39 // 40 // node@domain/resource 41 // 42 // The node and resource are both optional. A valid jid is defined to have 43 // a domain. A bare jid is defined to not have a resource and a full jid 44 // *does* have a resource. 45 class Jid { 46 public: 47 explicit Jid(); 48 explicit Jid(const std::string& jid_string); 49 explicit Jid(const std::string& node_name, 50 const std::string& domain_name, 51 const std::string& resource_name); 52 ~Jid(); 53 node()54 const std::string & node() const { return node_name_; } domain()55 const std::string & domain() const { return domain_name_; } resource()56 const std::string & resource() const { return resource_name_; } 57 58 std::string Str() const; 59 Jid BareJid() const; 60 61 bool IsEmpty() const; 62 bool IsValid() const; 63 bool IsBare() const; 64 bool IsFull() const; 65 66 bool BareEquals(const Jid& other) const; 67 void CopyFrom(const Jid& jid); 68 bool operator==(const Jid& other) const; 69 bool operator!=(const Jid& other) const { return !operator==(other); } 70 71 bool operator<(const Jid& other) const { return Compare(other) < 0; }; 72 bool operator>(const Jid& other) const { return Compare(other) > 0; }; 73 74 int Compare(const Jid & other) const; 75 76 private: 77 void ValidateOrReset(); 78 79 static std::string PrepNode(const std::string& node, bool* valid); 80 static char PrepNodeAscii(char ch, bool* valid); 81 static std::string PrepResource(const std::string& start, bool* valid); 82 static char PrepResourceAscii(char ch, bool* valid); 83 static std::string PrepDomain(const std::string& domain, bool* valid); 84 static void PrepDomain(const std::string& domain, 85 std::string* buf, bool* valid); 86 static void PrepDomainLabel( 87 std::string::const_iterator start, std::string::const_iterator end, 88 std::string* buf, bool* valid); 89 static char PrepDomainLabelAscii(char ch, bool *valid); 90 91 std::string node_name_; 92 std::string domain_name_; 93 std::string resource_name_; 94 }; 95 96 } 97 98 #endif // TALK_XMPP_JID_H_ 99