/***************************************************************************
                          radio.h  -  description
                             -------------------
    begin                : Sat March 29 2003
    copyright            : (C) 2003 by Klas Kalass, Ernst Martin Witte
    email                : klas@kde.org, witte@kawo1.rwth-aachen.de
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef KRADIO_RADIO_H
#define KRADIO_RADIO_H

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif


#include "../../src/include/radio_interfaces.h"
#include "../../src/include/radiodevicepool_interfaces.h"
#include "../../src/include/radiodevice_interfaces.h"
#include "../../src/include/timecontrol_interfaces.h"
#include "../../src/include/soundstreamclient_interfaces.h"
#include "../../src/include/stationlist.h"
#include "../../src/include/plugins.h"

/**
 * The main Radio class, which is used as the interface of the radio functionality
 * to the GUI parts of the application
 * @author Klas Kalass, Ernst Martin Witte
 */

/////////////////////////////////////////////////////////////////////////////

/*  A class, that is able to manage more than one radio device, one of those
    is active at a time. This class behaves represents the active device,
    the active devices can be changed either by selecting a station or by
    explicitly changing the devices.

    At any time a valid active device exists as long as any device is connected.

*/

class Radio : public PluginBase,
              public IRadio,
              public IRadioDevicePool,
              public IRadioDeviceClient,
              public ITimeControlClient,
              public ISoundStreamClient
{
public:
    Radio(const TQString &name);
    ~Radio();


    // PluginBase

public:
    virtual void   saveState (TDEConfig *) const;
    virtual void   restoreState (TDEConfig *);

    virtual TQString pluginClassName() const { return "Radio"; }

    virtual const TQString &name() const { return PluginBase::name(); }
    virtual       TQString &name()       { return PluginBase::name(); }

    virtual ConfigPageInfo  createConfigurationPage();
    virtual AboutPageInfo   createAboutPage();

    virtual void aboutToQuit();

    // IRadio methods

RECEIVERS:
    bool powerOn()        { return sendPowerOn()  > 0; }
    bool powerOff()       { return sendPowerOff() > 0; }
    bool activateStation(const RadioStation &rs);
    bool activateStation(int index);
    bool setStations(const StationList &sl);
    bool setPresetFile(const TQString &presetFile);

ANSWERS:
    bool                   isPowerOn() const { return queryIsPowerOn(); }
    bool                   isPowerOff() const { return queryIsPowerOff(); }
    const RadioStation  &  getCurrentStation() const { return queryCurrentStation(); }
    int                    getStationIdx(const RadioStation &) const;
    int                    getCurrentStationIdx() const;
    const StationList   &  getStations() const { return m_stationList; }
    const TQString       &  getPresetFile() const { return m_presetFile; }

    SoundStreamID          getCurrentSoundStreamID() const;


public:
    bool connectI    (Interface *i);
    bool disconnectI (Interface *i);

    void noticeConnectedI (IRadioDeviceClient::cmplInterface *i, bool pointer_valid);
    void noticeDisconnectI(IRadioDeviceClient::cmplInterface *i, bool pointer_valid);

    // IRadioDevicePool methods

RECEIVERS:
    bool                           setActiveDevice(IRadioDevice *rd, bool keepPower = true);

ANSWERS:
    IRadioDevice                 * getActiveDevice() const;
    const TQPtrList<IRadioDevice> & getDevices() const;
    const TQString                & getDeviceDescription() const;



    // IRadioDeviceClient methods, even sending methods overwritten
    // to provide "1-of-N" functionality

SENDERS:
    IF_SENDER  (  sendPowerOn()                                      )
    IF_SENDER  (  sendPowerOff()                                     )
    IF_SENDER  (  sendActivateStation (const RadioStation &rs)       )

QUERIES:
    IF_QUERY   (  bool                   queryIsPowerOn()            )
    IF_QUERY   (  bool                   queryIsPowerOff()           )
    IF_QUERY   (  const RadioStation  &  queryCurrentStation()       )
    IF_QUERY   (  const TQString       &  queryDescription()          )
    IF_QUERY   (  SoundStreamID          queryCurrentSoundStreamID() )

RECEIVERS:
    virtual bool noticePowerChanged   (bool on, const IRadioDevice *sender = NULL);
    virtual bool noticeStationChanged (const RadioStation &rs, const IRadioDevice *sender = NULL);
    virtual bool noticeDescriptionChanged (const TQString &, const IRadioDevice *sender = NULL);

    virtual bool noticeCurrentSoundStreamIDChanged(SoundStreamID id, const IRadioDevice *sender = NULL);

    // ITimeControlClient

RECEIVERS:
    bool noticeAlarmsChanged(const AlarmVector &)        { return false; } // ignore
    bool noticeAlarm(const Alarm &);
    bool noticeNextAlarmChanged(const Alarm *)           { return false; } // ignore
    bool noticeCountdownStarted(const TQDateTime &/*end*/){ return false; } // ignore
    bool noticeCountdownStopped()                        { return false; } // ignore
    bool noticeCountdownZero();
    bool noticeCountdownSecondsChanged(int /*n*/)        { return false; } // ignore

    // ISoundStreamClient

RECEIVERS:

    // ...

protected:

    TQString        m_presetFile;
    StationList    m_stationList;
    IRadioDevice  *m_activeDevice;
};


#endif