1269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org/*
2269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *
4269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org */
10269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
11269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef WEBRTC_LIBJINGLE_XMPP_JID_H_
12269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#define WEBRTC_LIBJINGLE_XMPP_JID_H_
13269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
14269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include <string>
15269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/libjingle/xmllite/xmlconstants.h"
16269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/basictypes.h"
17269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
18269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace buzz {
19269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
20269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// The Jid class encapsulates and provides parsing help for Jids. A Jid
21269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// consists of three parts: the node, the domain and the resource, e.g.:
22269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//
23269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// node@domain/resource
24269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org//
25269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// The node and resource are both optional. A valid jid is defined to have
26269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// a domain. A bare jid is defined to not have a resource and a full jid
27269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// *does* have a resource.
28269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass Jid {
29269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgpublic:
30269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  explicit Jid();
31269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  explicit Jid(const std::string& jid_string);
32269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  explicit Jid(const std::string& node_name,
33269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org               const std::string& domain_name,
34269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org               const std::string& resource_name);
35269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  ~Jid();
36269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
37269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  const std::string & node() const { return node_name_; }
38269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  const std::string & domain() const { return domain_name_;  }
39269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  const std::string & resource() const { return resource_name_; }
40269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
41269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  std::string Str() const;
42269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  Jid BareJid() const;
43269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
44269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool IsEmpty() const;
45269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool IsValid() const;
46269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool IsBare() const;
47269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool IsFull() const;
48269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
49269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool BareEquals(const Jid& other) const;
50269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void CopyFrom(const Jid& jid);
51269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool operator==(const Jid& other) const;
52269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool operator!=(const Jid& other) const { return !operator==(other); }
53269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
54269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool operator<(const Jid& other) const { return Compare(other) < 0; };
55269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  bool operator>(const Jid& other) const { return Compare(other) > 0; };
56269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
57269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  int Compare(const Jid & other) const;
58269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
59269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgprivate:
60269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void ValidateOrReset();
61269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
62269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  static std::string PrepNode(const std::string& node, bool* valid);
63269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  static char PrepNodeAscii(char ch, bool* valid);
64269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  static std::string PrepResource(const std::string& start, bool* valid);
65269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  static char PrepResourceAscii(char ch, bool* valid);
66269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  static std::string PrepDomain(const std::string& domain, bool* valid);
67269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  static void PrepDomain(const std::string& domain,
68269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                         std::string* buf, bool* valid);
69269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  static void PrepDomainLabel(
70269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      std::string::const_iterator start, std::string::const_iterator end,
71269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      std::string* buf, bool* valid);
72269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  static char PrepDomainLabelAscii(char ch, bool *valid);
73269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
74269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  std::string node_name_;
75269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  std::string domain_name_;
76269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  std::string resource_name_;
77269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org};
78269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
79269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org}
80269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
81269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif  // WEBRTC_LIBJINGLE_XMPP_JID_H_
82