/*
 * libjingle
 * Copyright 2004--2005, Google Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *  3. The name of the author may not be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef TALK_XMPP_CONSTANTS_H_
#define TALK_XMPP_CONSTANTS_H_

#include <string>
#include "talk/xmllite/qname.h"
#include "talk/xmpp/jid.h"


#define NS_CLIENT Constants::ns_client()
#define NS_SERVER Constants::ns_server()
#define NS_STREAM Constants::ns_stream()
#define NS_XSTREAM Constants::ns_xstream()
#define NS_TLS Constants::ns_tls()
#define NS_SASL Constants::ns_sasl()
#define NS_BIND Constants::ns_bind()
#define NS_DIALBACK Constants::ns_dialback()
#define NS_SESSION Constants::ns_session()
#define NS_STANZA Constants::ns_stanza()
#define NS_PRIVACY Constants::ns_privacy()
#define NS_ROSTER Constants::ns_roster()
#define NS_VCARD Constants::ns_vcard()
#define NS_AVATAR_HASH Constants::ns_avatar_hash()
#define NS_VCARD_UPDATE Constants::ns_vcard_update()
#define STR_CLIENT Constants::str_client()
#define STR_SERVER Constants::str_server()
#define STR_STREAM Constants::str_stream()


namespace buzz {

extern const Jid JID_EMPTY;

class Constants {
 public:
  static const std::string & ns_client();
  static const std::string & ns_server();
  static const std::string & ns_stream();
  static const std::string & ns_xstream();
  static const std::string & ns_tls();
  static const std::string & ns_sasl();
  static const std::string & ns_bind();
  static const std::string & ns_dialback();
  static const std::string & ns_session();
  static const std::string & ns_stanza();
  static const std::string & ns_privacy();
  static const std::string & ns_roster();
  static const std::string & ns_vcard();
  static const std::string & ns_avatar_hash();
  static const std::string & ns_vcard_update();

  static const std::string & str_client();
  static const std::string & str_server();
  static const std::string & str_stream();
};

extern const std::string STR_GET;
extern const std::string STR_SET;
extern const std::string STR_RESULT;
extern const std::string STR_ERROR;


extern const std::string STR_FROM;
extern const std::string STR_TO;
extern const std::string STR_BOTH;
extern const std::string STR_REMOVE;

extern const std::string STR_MESSAGE;
extern const std::string STR_BODY;
extern const std::string STR_PRESENCE;
extern const std::string STR_STATUS;
extern const std::string STR_SHOW;
extern const std::string STR_PRIOIRTY;
extern const std::string STR_IQ;

extern const std::string STR_TYPE;
extern const std::string STR_NAME;
extern const std::string STR_ID;
extern const std::string STR_JID;
extern const std::string STR_SUBSCRIPTION;
extern const std::string STR_ASK;
extern const std::string STR_X;
extern const std::string STR_GOOGLE_COM;
extern const std::string STR_GMAIL_COM;
extern const std::string STR_GOOGLEMAIL_COM;
extern const std::string STR_DEFAULT_DOMAIN;
extern const std::string STR_TALK_GOOGLE_COM;
extern const std::string STR_TALKX_L_GOOGLE_COM;

#ifdef FEATURE_ENABLE_VOICEMAIL
extern const std::string STR_VOICEMAIL;
extern const std::string STR_OUTGOINGVOICEMAIL;
#endif

extern const std::string STR_UNAVAILABLE;

extern const QName QN_STREAM_STREAM;
extern const QName QN_STREAM_FEATURES;
extern const QName QN_STREAM_ERROR;

extern const QName QN_XSTREAM_BAD_FORMAT;
extern const QName QN_XSTREAM_BAD_NAMESPACE_PREFIX;
extern const QName QN_XSTREAM_CONFLICT;
extern const QName QN_XSTREAM_CONNECTION_TIMEOUT;
extern const QName QN_XSTREAM_HOST_GONE;
extern const QName QN_XSTREAM_HOST_UNKNOWN;
extern const QName QN_XSTREAM_IMPROPER_ADDRESSIING;
extern const QName QN_XSTREAM_INTERNAL_SERVER_ERROR;
extern const QName QN_XSTREAM_INVALID_FROM;
extern const QName QN_XSTREAM_INVALID_ID;
extern const QName QN_XSTREAM_INVALID_NAMESPACE;
extern const QName QN_XSTREAM_INVALID_XML;
extern const QName QN_XSTREAM_NOT_AUTHORIZED;
extern const QName QN_XSTREAM_POLICY_VIOLATION;
extern const QName QN_XSTREAM_REMOTE_CONNECTION_FAILED;
extern const QName QN_XSTREAM_RESOURCE_CONSTRAINT;
extern const QName QN_XSTREAM_RESTRICTED_XML;
extern const QName QN_XSTREAM_SEE_OTHER_HOST;
extern const QName QN_XSTREAM_SYSTEM_SHUTDOWN;
extern const QName QN_XSTREAM_UNDEFINED_CONDITION;
extern const QName QN_XSTREAM_UNSUPPORTED_ENCODING;
extern const QName QN_XSTREAM_UNSUPPORTED_STANZA_TYPE;
extern const QName QN_XSTREAM_UNSUPPORTED_VERSION;
extern const QName QN_XSTREAM_XML_NOT_WELL_FORMED;
extern const QName QN_XSTREAM_TEXT;

extern const QName QN_TLS_STARTTLS;
extern const QName QN_TLS_REQUIRED;
extern const QName QN_TLS_PROCEED;
extern const QName QN_TLS_FAILURE;

extern const QName QN_SASL_MECHANISMS;
extern const QName QN_SASL_MECHANISM;
extern const QName QN_SASL_AUTH;
extern const QName QN_SASL_CHALLENGE;
extern const QName QN_SASL_RESPONSE;
extern const QName QN_SASL_ABORT;
extern const QName QN_SASL_SUCCESS;
extern const QName QN_SASL_FAILURE;
extern const QName QN_SASL_ABORTED;
extern const QName QN_SASL_INCORRECT_ENCODING;
extern const QName QN_SASL_INVALID_AUTHZID;
extern const QName QN_SASL_INVALID_MECHANISM;
extern const QName QN_SASL_MECHANISM_TOO_WEAK;
extern const QName QN_SASL_NOT_AUTHORIZED;
extern const QName QN_SASL_TEMPORARY_AUTH_FAILURE;

extern const QName QN_DIALBACK_RESULT;
extern const QName QN_DIALBACK_VERIFY;

extern const QName QN_STANZA_BAD_REQUEST;
extern const QName QN_STANZA_CONFLICT;
extern const QName QN_STANZA_FEATURE_NOT_IMPLEMENTED;
extern const QName QN_STANZA_FORBIDDEN;
extern const QName QN_STANZA_GONE;
extern const QName QN_STANZA_INTERNAL_SERVER_ERROR;
extern const QName QN_STANZA_ITEM_NOT_FOUND;
extern const QName QN_STANZA_JID_MALFORMED;
extern const QName QN_STANZA_NOT_ACCEPTABLE;
extern const QName QN_STANZA_NOT_ALLOWED;
extern const QName QN_STANZA_PAYMENT_REQUIRED;
extern const QName QN_STANZA_RECIPIENT_UNAVAILABLE;
extern const QName QN_STANZA_REDIRECT;
extern const QName QN_STANZA_REGISTRATION_REQUIRED;
extern const QName QN_STANZA_REMOTE_SERVER_NOT_FOUND;
extern const QName QN_STANZA_REMOTE_SERVER_TIMEOUT;
extern const QName QN_STANZA_RESOURCE_CONSTRAINT;
extern const QName QN_STANZA_SERVICE_UNAVAILABLE;
extern const QName QN_STANZA_SUBSCRIPTION_REQUIRED;
extern const QName QN_STANZA_UNDEFINED_CONDITION;
extern const QName QN_STANZA_UNEXPECTED_REQUEST;
extern const QName QN_STANZA_TEXT;

extern const QName QN_BIND_BIND;
extern const QName QN_BIND_RESOURCE;
extern const QName QN_BIND_JID;

extern const QName QN_MESSAGE;
extern const QName QN_BODY;
extern const QName QN_SUBJECT;
extern const QName QN_THREAD;
extern const QName QN_PRESENCE;
extern const QName QN_SHOW;
extern const QName QN_STATUS;
extern const QName QN_LANG;
extern const QName QN_PRIORITY;
extern const QName QN_IQ;
extern const QName QN_ERROR;

extern const QName QN_SERVER_MESSAGE;
extern const QName QN_SERVER_BODY;
extern const QName QN_SERVER_SUBJECT;
extern const QName QN_SERVER_THREAD;
extern const QName QN_SERVER_PRESENCE;
extern const QName QN_SERVER_SHOW;
extern const QName QN_SERVER_STATUS;
extern const QName QN_SERVER_LANG;
extern const QName QN_SERVER_PRIORITY;
extern const QName QN_SERVER_IQ;
extern const QName QN_SERVER_ERROR;

extern const QName QN_SESSION_SESSION;

extern const QName QN_PRIVACY_QUERY;
extern const QName QN_PRIVACY_ACTIVE;
extern const QName QN_PRIVACY_DEFAULT;
extern const QName QN_PRIVACY_LIST;
extern const QName QN_PRIVACY_ITEM;
extern const QName QN_PRIVACY_IQ;
extern const QName QN_PRIVACY_MESSAGE;
extern const QName QN_PRIVACY_PRESENCE_IN;
extern const QName QN_PRIVACY_PRESENCE_OUT;

extern const QName QN_ROSTER_QUERY;
extern const QName QN_ROSTER_ITEM;
extern const QName QN_ROSTER_GROUP;

extern const QName QN_VCARD;
extern const QName QN_VCARD_FN;
extern const QName QN_VCARD_PHOTO;
extern const QName QN_VCARD_PHOTO_BINVAL;
extern const QName QN_VCARD_AVATAR_HASH;
extern const QName QN_VCARD_AVATAR_HASH_MODIFIED;

#if defined(FEATURE_ENABLE_PSTN)
extern const QName QN_VCARD_TEL;
extern const QName QN_VCARD_VOICE;
extern const QName QN_VCARD_HOME;
extern const QName QN_VCARD_WORK;
extern const QName QN_VCARD_CELL;
extern const QName QN_VCARD_NUMBER;
#endif

#if defined(FEATURE_ENABLE_RICHPROFILES)
extern const QName QN_USER_PROFILE_QUERY;
extern const QName QN_USER_PROFILE_URL;

extern const QName QN_ATOM_FEED;
extern const QName QN_ATOM_ENTRY;
extern const QName QN_ATOM_TITLE;
extern const QName QN_ATOM_ID;
extern const QName QN_ATOM_MODIFIED;
extern const QName QN_ATOM_IMAGE;
extern const QName QN_ATOM_LINK;
extern const QName QN_ATOM_HREF;
#endif

extern const QName QN_XML_LANG;

extern const QName QN_ENCODING;
extern const QName QN_VERSION;
extern const QName QN_TO;
extern const QName QN_FROM;
extern const QName QN_TYPE;
extern const QName QN_ID;
extern const QName QN_CODE;
extern const QName QN_NAME;
extern const QName QN_VALUE;
extern const QName QN_ACTION;
extern const QName QN_ORDER;
extern const QName QN_MECHANISM;
extern const QName QN_ASK;
extern const QName QN_JID;
extern const QName QN_SUBSCRIPTION;
extern const QName QN_TITLE1;
extern const QName QN_TITLE2;
extern const QName QN_AFFILIATION;
extern const QName QN_ROLE;


extern const QName QN_XMLNS_CLIENT;
extern const QName QN_XMLNS_SERVER;
extern const QName QN_XMLNS_STREAM;

// Presence
extern const std::string STR_SHOW_AWAY;
extern const std::string STR_SHOW_CHAT;
extern const std::string STR_SHOW_DND;
extern const std::string STR_SHOW_XA;
extern const std::string STR_SHOW_OFFLINE;

// Subscription
extern const std::string STR_SUBSCRIBE;
extern const std::string STR_SUBSCRIBED;
extern const std::string STR_UNSUBSCRIBE;
extern const std::string STR_UNSUBSCRIBED;

// Google Invite
extern const std::string NS_GOOGLE_SUBSCRIBE;
extern const QName QN_INVITATION;
extern const QName QN_INVITE_NAME;
extern const QName QN_INVITE_SUBJECT;
extern const QName QN_INVITE_MESSAGE;


// JEP 0030
extern const QName QN_NODE;
extern const QName QN_CATEGORY;
extern const QName QN_VAR;
extern const std::string NS_DISCO_INFO;
extern const std::string NS_DISCO_ITEMS;

extern const QName QN_DISCO_INFO_QUERY;
extern const QName QN_DISCO_IDENTITY;
extern const QName QN_DISCO_FEATURE;

extern const QName QN_DISCO_ITEMS_QUERY;
extern const QName QN_DISCO_ITEM;


// JEP 0045
extern const std::string NS_MUC;
extern const QName QN_MUC_X;
extern const QName QN_MUC_ITEM;
extern const QName QN_MUC_AFFILIATION;
extern const QName QN_MUC_ROLE;
extern const std::string STR_AFFILIATION_NONE;
extern const std::string STR_ROLE_PARTICIPANT;
extern const std::string NS_MUC_USER;
extern const QName QN_MUC_USER_CONTINUE;
extern const QName QN_MUC_USER_X;
extern const QName QN_MUC_USER_ITEM;
extern const QName QN_MUC_USER_STATUS;


// JEP 0115
extern const std::string NS_CAPS;
extern const QName QN_CAPS_C;
extern const QName QN_VER;
extern const QName QN_EXT;


// Avatar - JEP 0153
extern const std::string kNSVCard;
extern const QName kQnVCardX;
extern const QName kQnVCardPhoto;

// JEP 0172 User Nickname
extern const std::string kNSNickname;
extern const QName kQnNickname;


// JEP 0085 chat state
extern const std::string NS_CHATSTATE;
extern const QName QN_CS_ACTIVE;
extern const QName QN_CS_COMPOSING;
extern const QName QN_CS_PAUSED;
extern const QName QN_CS_INACTIVE;
extern const QName QN_CS_GONE;

// JEP 0091 Delayed Delivery
extern const std::string kNSDelay;
extern const QName kQnDelayX;
extern const QName kQnStamp;

// Google time stamping (higher resolution)
extern const std::string kNSTimestamp;
extern const QName kQnTime;
extern const QName kQnMilliseconds;


extern const std::string NS_JINGLE_INFO;
extern const QName QN_JINGLE_INFO_QUERY;
extern const QName QN_JINGLE_INFO_STUN;
extern const QName QN_JINGLE_INFO_RELAY;
extern const QName QN_JINGLE_INFO_SERVER;
extern const QName QN_JINGLE_INFO_TOKEN;
extern const QName QN_JINGLE_INFO_HOST;
extern const QName QN_JINGLE_INFO_TCP;
extern const QName QN_JINGLE_INFO_UDP;
extern const QName QN_JINGLE_INFO_TCPSSL;

extern const std::string NS_GOOGLE_CALLPERF_STATS;
extern const QName QN_CALLPERF_STATS;
extern const QName QN_CALLPERF_SESSIONID;
extern const QName QN_CALLPERF_LOCALUSER;
extern const QName QN_CALLPERF_REMOTEUSER;
extern const QName QN_CALLPERF_STARTTIME;
extern const QName QN_CALLPERF_CALL_LENGTH;
extern const QName QN_CALLPERF_DATAPOINT;
extern const QName QN_CALLPERF_DATAPOINT_TIME;
extern const QName QN_CALLPERF_DATAPOINT_FRACTION_LOST;
extern const QName QN_CALLPERF_DATAPOINT_CUM_LOST;
extern const QName QN_CALLPERF_DATAPOINT_EXT_MAX;
extern const QName QN_CALLPERF_DATAPOINT_JITTER;
extern const QName QN_CALLPERF_DATAPOINT_RTT;
extern const QName QN_CALLPERF_DATAPOINT_BYTES_R;
extern const QName QN_CALLPERF_DATAPOINT_PACKETS_R;
extern const QName QN_CALLPERF_DATAPOINT_BYTES_S;
extern const QName QN_CALLPERF_DATAPOINT_PACKETS_S;
extern const QName QN_CALLPERF_CONNECTION;
extern const QName QN_CALLPERF_CONNECTION_LOCAL_ADDRESS;
extern const QName QN_CALLPERF_CONNECTION_REMOTE_ADDRESS;

// Muc invites.
extern const QName QN_MUC_USER_INVITE;

// Multiway audio/video.
extern const std::string NS_GOOGLE_MUC_USER;
extern const QName QN_GOOGLE_MUC_USER_AVAILABLE_MEDIA;
extern const QName QN_GOOGLE_MUC_USER_ENTRY;
extern const QName QN_GOOGLE_MUC_USER_MEDIA;
extern const QName QN_GOOGLE_MUC_USER_TYPE;
extern const QName QN_GOOGLE_MUC_USER_SRC_ID;
extern const QName QN_GOOGLE_MUC_USER_STATUS;
extern const QName QN_LABEL;

}  // namespace buzz

#endif  // TALK_XMPP_CONSTANTS_H_