/*
    This file is part of the KContacts framework.
    Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

#ifndef KCONTACTS_KEY_H
#define KCONTACTS_KEY_H

#include "kcontacts_export.h"

#include <QDataStream>
#include <QSharedDataPointer>

namespace KContacts {
/**
 * @short A class to store an encryption key.
 */
class KCONTACTS_EXPORT Key
{
    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Key &);
    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Key &);

public:
    /**
      List of keys.
    */
    typedef QVector<Key> List;

    /**
      Key types
    */
    enum Type {
        X509,   /**< X509 key */
        PGP,    /**< Pretty Good Privacy key */
        Custom  /**< Custom or IANA conform key */
    };

    /**
      List of key types.
    */
    typedef QList<Type> TypeList;

    /**
      Creates a new key.

      @param text  The text data.
      @param type  The key type, see Types.
    */
    explicit Key(const QString &text = QString(), Type type = PGP);

    /**
      Copy constructor.
    */
    Key(const Key &other);

    /**
      Destroys the key.
    */
    ~Key();

    /**
      Equality operator.
    */
    Q_REQUIRED_RESULT bool operator==(const Key &other) const;

    /**
      Not-equal operator.
    */
    Q_REQUIRED_RESULT bool operator!=(const Key &other) const;

    /**
      Assignment operator.

      @param other The Key instance to assign to @c this
    */
    Key &operator=(const Key &other);

    /**
      Sets the unique @p identifier.
    */
    void setId(const QString &identifier);

    /**
      Returns the unique identifier.
    */
    Q_REQUIRED_RESULT QString id() const;

    /**
      Sets binary @p data.
    */
    void setBinaryData(const QByteArray &data);

    /**
      Returns the binary data.
    */
    Q_REQUIRED_RESULT QByteArray binaryData() const;

    /**
      Sets text @p data.
    */
    void setTextData(const QString &data);

    /**
      Returns the text data.
    */
    Q_REQUIRED_RESULT QString textData() const;

    /**
      Returns whether the key contains binary or text data.
    */
    Q_REQUIRED_RESULT bool isBinary() const;

    /**
      Sets the @p type.

      @param type The type of the key

      @see Type
    */
    void setType(Type type);

    /**
      Sets custom @p type string.
    */
    void setCustomTypeString(const QString &type);

    /**
      Returns the type, see Type.
    */
    Q_REQUIRED_RESULT Type type() const;

    /**
      Returns the custom type string.
    */
    Q_REQUIRED_RESULT QString customTypeString() const;

    /**
      Returns a string representation of the key.
    */
    Q_REQUIRED_RESULT QString toString() const;

    /**
      Returns a list of all available key types.
    */
    Q_REQUIRED_RESULT static TypeList typeList();

    /**
      Returns a translated label for a given key @p type.
    */
    Q_REQUIRED_RESULT static QString typeLabel(Type type);

private:
    class Private;
    QSharedDataPointer<Private> d;
};

/**
  Serializes the @p key object into the @p stream.
*/
KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Key &key);

/**
  Initializes the @p key object from the @p stream.
*/
KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Key &key);
}
Q_DECLARE_TYPEINFO(KContacts::Key, Q_MOVABLE_TYPE);
#endif
