/*  This file is part of the KDE project
    Copyright (C) 2006-2007 Matthias Kretz <kretz@kde.org>

    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) version 3, or any
    later version accepted by the membership of KDE e.V. (or its
    successor approved by the membership of KDE e.V.), Nokia Corporation 
    (or its successors, if any) and the KDE Free Qt Foundation, which shall
    act as a proxy defined in Section 6 of version 3 of the license.

    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, see <http://www.gnu.org/licenses/>.

*/

#ifndef PHONON_BACKENDINTERFACE_H
#define PHONON_BACKENDINTERFACE_H

#include "phonon_export.h"
#include "objectdescription.h"

#include <QtCore/QtGlobal>
#include <QtCore/QSet>

QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE

class QVariant;

namespace Phonon
{

/** \class BackendInterface backendinterface.h Phonon/BackendInterface
 * \short Main Backend class interface
 *
 * This interface defines the main factory of the backend. The createObject function creates all the
 * objects needed by the frontend.
 *
 * The objectDescriptionIndexes and objectDescriptionProperties functions return information about
 * available devices, effects and codecs.
 *
 * An implementation could look like this:
 * \code
 * QObject *Backend::createObject(BackendInterface::Class c, QObject *parent, const QList<QVariant> &args)
 * {
 *     switch (c) {
 *     case MediaObjectClass:
 *         return new MediaObject(parent);
 *     case VolumeFaderEffectClass:
 *         return new VolumeFaderEffect(parent);
 *     case AudioOutputClass:
 *         return new AudioOutput(parent);
 *     case AudioDataOutputClass:
 *         return new AudioDataOutput(parent);
 *     case VisualizationClass:
 *         return new Visualization(parent);
 *     case VideoDataOutputClass:
 *         return new VideoDataOutput(parent);
 *     case EffectClass:
 *         return new Effect(args[0].toInt(), parent);
 *     case VideoWidgetClass:
 *         return new VideoWidget(qobject_cast<QWidget *>(parent));
 *     }
 *     return 0;
 * }
 *
 * QSet<int> Backend::objectDescriptionIndexes(ObjectDescriptionType type) const
 * {
 *     QSet<int> set;
 *     switch(type)
 *     {
 *     case Phonon::AudioOutputDeviceType:
 *         // use AudioDeviceEnumerator to list ALSA and OSS devices
 *         set << 10000 << 10001;
 *         break;
 *     case Phonon::AudioCaptureDeviceType:
 *         set << 20000 << 20001;
 *         break;
 *     case Phonon::VideoOutputDeviceType:
 *         break;
 *     case Phonon::VideoCaptureDeviceType:
 *         set << 30000 << 30001;
 *         break;
 *     case Phonon::VisualizationType:
 *     case Phonon::AudioCodecType:
 *     case Phonon::VideoCodecType:
 *     case Phonon::ContainerFormatType:
 *         break;
 *     case Phonon::EffectType:
 *         set << 0x7F000001;
 *         break;
 *     }
 *     return set;
 * }
 *
 * QHash<QByteArray, QVariant> Backend::objectDescriptionProperties(ObjectDescriptionType type, int index) const
 * {
 *     QHash<QByteArray, QVariant> ret;
 *     switch (type) {
 *     case Phonon::AudioOutputDeviceType:
 *         switch (index) {
 *         case 10000:
 *             ret.insert("name", QLatin1String("internal Soundcard"));
 *             break;
 *         case 10001:
 *             ret.insert("name", QLatin1String("USB Headset"));
 *             ret.insert("icon", KIcon("usb-headset"));
 *             ret.insert("available", false);
 *             break;
 *         }
 *         break;
 *     case Phonon::AudioCaptureDeviceType:
 *         switch (index) {
 *         case 20000:
 *             ret.insert("name", QLatin1String("Soundcard"));
 *             ret.insert("description", QLatin1String("first description"));
 *             break;
 *         case 20001:
 *             ret.insert("name", QLatin1String("DV"));
 *             ret.insert("description", QLatin1String("second description"));
 *             break;
 *         }
 *         break;
 *     case Phonon::VideoOutputDeviceType:
 *         break;
 *     case Phonon::VideoCaptureDeviceType:
 *         switch (index) {
 *         case 30000:
 *             ret.insert("name", QLatin1String("USB Webcam"));
 *             ret.insert("description", QLatin1String("first description"));
 *             break;
 *         case 30001:
 *             ret.insert("name", QLatin1String("DV"));
 *             ret.insert("description", QLatin1String("second description"));
 *             break;
 *         }
 *         break;
 *     case Phonon::VisualizationType:
 *         break;
 *     case Phonon::AudioCodecType:
 *         break;
 *     case Phonon::VideoCodecType:
 *         break;
 *     case Phonon::ContainerFormatType:
 *         break;
 *     case Phonon::EffectType:
 *         switch (index) {
 *         case 0x7F000001:
 *             ret.insert("name", QLatin1String("Delay"));
 *             ret.insert("description", QLatin1String("Simple delay effect with time, feedback and level controls."));
 *             break;
 *         }
 *         break;
 *     }
 *     return ret;
 * }
 * \endcode
 *
 * \author Matthias Kretz <kretz@kde.org>
 */
class BackendInterface
{
    public:
        /**
         * \internal
         *
         * Silence gcc's warning.
         */
        virtual ~BackendInterface() {}

        /**
         * Classes that the createObject function has to handle.
         */
        enum Class {
            /**
             * Request to return a %MediaObject object.
             */
            MediaObjectClass,
            /**
             * Request to return a %VolumeFaderEffect object.
             */
            VolumeFaderEffectClass,
            /**
             * Request to return a %AudioOutput object.
             */
            AudioOutputClass,
            /**
             * Request to return a %AudioDataOutput object.
             */
            AudioDataOutputClass,
            /**
             * Request to return a %Visualization object.
             */
            VisualizationClass,
            /**
             * Request to return a %VideoDataOutput object.
             */
            VideoDataOutputClass,
            /**
             * Request to return a %Effect object.
             *
             * Takes an additional int that specifies the effect Id.
             */
            EffectClass,
            /**
             * Request to return a %VideoWidget object.
             */
            VideoWidgetClass
        };

        /**
         * Returns a new instance of the requested class.
         *
         * \param c The requested class.
         * \param parent The parent object.
         * \param args Additional arguments (documented in \ref Class).
         */
        virtual QObject *createObject(Class c, QObject *parent, const QList<QVariant> &args = QList<QVariant>()) = 0;

        /**
         * Returns the unique identifiers for the devices/effects/codecs of the given \p type.
         *
         * \param type see \ref ObjectDescriptionType
         */
        virtual QList<int> objectDescriptionIndexes(ObjectDescriptionType type) const = 0;

        /**
         * Given a unique identifier that was returned from objectDescriptionIndexes this function
         * returns a hash mapping property names to values.
         *
         * The property "name" must always be present. All other properties are optional.
         *
         * List of possible properties:
         * \li \c \b name: The name of the device/effect/codec/...
         * \li \c \b description: A text explaining what this device/effect/codec/... is/can do
         * \li \c \b icon: An icon name (using the freedesktop naming scheme) or a QIcon for this
         * device/effect/codec/...
         * \li \c \b available: A bool telling whether the device is present or unplugged.
         *
         * \param type see \ref ObjectDescriptionType
         * \param index The unique identifier that is returned from objectDescriptionIndexes
         */
        virtual QHash<QByteArray, QVariant> objectDescriptionProperties(ObjectDescriptionType type, int index) const = 0;

        /**
         * When this function is called the nodes given in the parameter list should not lose any
         * signal data when connections are changed.
         */
        virtual bool startConnectionChange(QSet<QObject *>) = 0;

        /**
         * Defines a signal connection between the two given nodes.
         */
        virtual bool connectNodes(QObject *, QObject *) = 0;

        /**
         * Cuts a signal connection between the two given nodes.
         */
        virtual bool disconnectNodes(QObject *, QObject *) = 0;

        /**
         * When this function is called the nodes given in the parameter list may lose
         * signal data when a port is not connected.
         */
        virtual bool endConnectionChange(QSet<QObject *>) = 0;

        /**
         * gets all available mime types
         */
        virtual QStringList availableMimeTypes() const = 0;

};
} // namespace Phonon

Q_DECLARE_INTERFACE(Phonon::BackendInterface, "BackendInterface3.phonon.kde.org")

QT_END_NAMESPACE
QT_END_HEADER

#endif // PHONON_BACKENDINTERFACE_H
