/*
 * xmpp_vcard.h - classes for handling vCards
 * Copyright (C) 2003  Michail Pishchagin
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 *
 */

#ifndef JABBER_VCARD_H
#define JABBER_VCARD_H

#include <QSharedDataPointer>
#include <QString>
#include <QStringList>

#include <QList>
#include <qdom.h>

class QDate;

namespace XMPP
{
	class VCardPrivate;
	class VCard
	{
	public:
		VCard();
		VCard(const VCard &);
		VCard & operator=(const VCard &);
		~VCard();

		QDomElement toXml(QDomDocument *) const;
		static VCard fromXml(const QDomElement &);
		bool isEmpty() const;
		inline bool isNull() const { return !d; }
		inline bool operator!() const { return !d; }
		inline operator bool() const { return !!d; }
		static VCard makeEmpty();

		const QString &version() const;
		void setVersion(const QString &);

		const QString &fullName() const;
		void setFullName(const QString &);


		const QString &familyName() const;
		void setFamilyName(const QString &);

		const QString &givenName() const;
		void setGivenName(const QString &);

		const QString &middleName() const;
		void setMiddleName(const QString &);

		const QString &prefixName() const;
		void setPrefixName(const QString &);

		const QString &suffixName() const;
		void setSuffixName(const QString &);


		const QString &nickName() const;
		void setNickName(const QString &);


		const QByteArray &photo() const;
		void setPhoto(const QByteArray &);

		const QString &photoURI() const;
		void setPhotoURI(const QString &);


		const QDate bday() const;
		void setBday(const QDate &);

		const QString &bdayStr() const;
		void setBdayStr(const QString &);


		class Address {
		public:
			Address();

			bool home;
			bool work;
			bool postal;
			bool parcel;

			bool dom;
			bool intl;

			bool pref;

			QString pobox;
			QString extaddr;
			QString street;
			QString locality;
			QString region;
			QString pcode;
			QString country;
		};
		typedef QList<Address> AddressList;
		const AddressList &addressList() const;
		void setAddressList(const AddressList &);

		class Label {
		public:
			Label();

			bool home;
			bool work;
			bool postal;
			bool parcel;

			bool dom;
			bool intl;

			bool pref;

			QStringList lines;
		};
		typedef QList<Label> LabelList;
		const LabelList &labelList() const;
		void setLabelList(const LabelList &);


		class Phone {
		public:
			Phone();

			bool home;
			bool work;
			bool voice;
			bool fax;
			bool pager;
			bool msg;
			bool cell;
			bool video;
			bool bbs;
			bool modem;
			bool isdn;
			bool pcs;
			bool pref;

			QString number;
		};
		typedef QList<Phone> PhoneList;
		const PhoneList &phoneList() const;
		void setPhoneList(const PhoneList &);


		class Email {
		public:
			Email();

			bool home;
			bool work;
			bool internet;
			bool x400;

			QString userid;
		};
		typedef QList<Email> EmailList;
		const EmailList &emailList() const;
		void setEmailList(const EmailList &);


		const QString &jid() const;
		void setJid(const QString &);

		const QString &mailer() const;
		void setMailer(const QString &);

		const QString &timezone() const;
		void setTimezone(const QString &);


		class Geo {
		public:
			Geo();

			QString lat;
			QString lon;
		};
		const Geo &geo() const;
		void setGeo(const Geo &);


		const QString &title() const;
		void setTitle(const QString &);

		const QString &role() const;
		void setRole(const QString &);


		const QByteArray &logo() const;
		void setLogo(const QByteArray &);

		const QString &logoURI() const;
		void setLogoURI(const QString &);


		VCard agent() const;
		void setAgent(const VCard &);

		const QString agentURI() const;
		void setAgentURI(const QString &);


		class Org {
		public:
			Org();

			QString name;
			QStringList unit;
		};
		const Org &org() const;
		void setOrg(const Org &);


		const QStringList &categories() const;
		void setCategories(const QStringList &);

		const QString &note() const;
		void setNote(const QString &);

		const QString &prodId() const; // it must equal to "Psi" ;-)
		void setProdId(const QString &);

		const QString &rev() const;
		void setRev(const QString &);

		const QString &sortString() const;
		void setSortString(const QString &);


		const QByteArray &sound() const;
		void setSound(const QByteArray &);

		const QString &soundURI() const;
		void setSoundURI(const QString &);

		const QString &soundPhonetic() const;
		void setSoundPhonetic(const QString &);


		const QString &uid() const;
		void setUid(const QString &);

		const QString &url() const;
		void setUrl(const QString &);

		const QString &desc() const;
		void setDesc(const QString &);


		enum PrivacyClass {
			pcNone = 0,
			pcPublic = 1,
			pcPrivate,
			pcConfidential
		};
		const PrivacyClass &privacyClass() const;
		void setPrivacyClass(const PrivacyClass &);


		const QByteArray &key() const;
		void setKey(const QByteArray &);

	private:
		QSharedDataPointer<VCardPrivate> d;
	};
}

QString image2type(const QByteArray &ba);

#endif
