

#ifndef CONVERTPLUGINLOADER_H
#define CONVERTPLUGINLOADER_H

#include "pluginloaderbase.h"


/**
 * @short The complete data, how to use the backend
 * @author Daniel Faust <hessijames@gmail.com>
 * @version 0.3
 */
class ConvertPlugin
{
public:
    /**
     * Constructor
     */
    ConvertPlugin();

    /**
     * Destructor
     */
    virtual ~ConvertPlugin();

    TQString filePathName; // the file name of th plugin (needed to detect write permissions)

    struct Info
    {
        int version;    // the version of our plugin (v0.2.1 = 201, v11.3 = 110300)
        TQString name;   // the name of our plugin
        TQString author; // the author of the plugin
        TQString about;  // a short information aboue the plugin
    } info;

    struct Enc
    {
        bool enabled;
        int rank;
        TQString bin;
        TQString param;
        TQString silent_param;
        TQStringList mime_types;
        TQString in_out_files;
        TQString overwrite;

        struct Strength {
            bool enabled;
            TQString param;
            float range_min;
            float range_max;
            float step;
            TQChar separator;
            TQStringList profiles;
            float default_value;
        } strength;

        struct Lossy {
            bool enabled;

            struct Quality {
                bool enabled;
                TQString param;
                float range_min;
                float range_max;
                float step;
                TQChar separator;
                TQString help;
                TQString output;
                TQStringList profiles; // NOTE when using profiles, step must be 1 and range_min 0
            } quality;

            struct Bitrate {
                struct Abr
                {
                    bool enabled;
                    TQString param;
                    TQString output;

                    struct BitrateRange {
                        bool enabled;
                        TQString param_min;
                        TQString param_max;
                    } bitrate_range;

                } abr;

                struct Cbr {
                    bool enabled;
                    TQString param;
                    TQString output;
                } cbr;

            } bitrate;

            struct Samplingrate {
                bool enabled;
                TQString param;
                PluginLoaderBase::Unit unit;
            } samplingrate;

            struct Channels {
                bool stereo_enabled;
                TQString stereo_param;
                bool joint_stereo_enabled;
                TQString joint_stereo_param;
                bool forced_joint_stereo_enabled;
                TQString forced_joint_stereo_param;
                bool dual_channels_enabled;
                TQString dual_channels_param;
                bool mono_enabled;
                TQString mono_param;
            } channels;
        } lossy;

        struct Lossless {
            bool enabled;
            TQString param;
            TQString output;
        } lossless;

        struct Hybrid {
            bool enabled;
            TQString param;
            TQString output;
            TQString correction_file_mime_type;
        } hybrid;

        struct ReplayGain {
            bool enabled;
            TQString use;
            TQString avoid;
            int rank;
        } replaygain;

        struct Tag {
            bool enabled;
            TQString param;
            TQString artist;
            TQString composer;
            TQString album;
            TQString disc;
            TQString title;
            TQString genre;
            TQString comment;
            TQString track;
            TQString year;
        } tag;
    } enc;

    struct Dec {
        bool enabled;
        int rank;
        TQString bin;
        TQString param;
        TQString silent_param;
        TQStringList mime_types;
        TQString output;
        TQString in_out_files;
        TQString overwrite;
    } dec;
};

/**
 * @short The plugin loader for the converter plugins
 * @author Daniel Faust <hessijames@gmail.com>
 * @version 0.3
 */
class ConvertPluginLoader : public PluginLoaderBase
{
    TQ_OBJECT
  
public:
    /**
     * Constructor
     */
    ConvertPluginLoader();

    /**
     * Destructor
     */
    virtual ~ConvertPluginLoader();

    /** is this file a converter plugin and loadable? */
    int verifyFile( TQString );
    /** load a given file */
    ConvertPlugin* loadFile( TQString );
};

#endif // CONVERTPLUGINLOADER_H
