You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
amarok/amarok/src/scriptmanager.h

213 lines
8.1 KiB

/***************************************************************************
* Copyright (C) 2004-2006 by Mark Kretschmann <markey@web.de> *
* 2005 by Seb Ruiz <me@sebruiz.net> *
* *
* 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. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef AMAROK_SCRIPTMANAGER_H
#define AMAROK_SCRIPTMANAGER_H
#include "engineobserver.h" //baseclass
#include "playlistwindow.h"
#include <tqmap.h>
#include <kdialogbase.h> //baseclass
#include <kurl.h>
class MetaBundle;
class ScriptManagerBase;
class TQListViewItem;
class KArchiveDirectory;
class KProcess;
class KProcIO;
/**
* @class ScriptManager
* @short Script management widget and backend
* @author Mark Kretschmann <markey@web.de>
*
* Script notifications, sent to stdin:
* configure
* engineStateChange: {empty|idle|paused|playing}
* trackChange
* volumeChange: newVolume (range: 0-100)
* fetchLyrics: artist title
* fetchLyricsByUrl: url
*
* @see http://amarok.kde.org/amarokwiki/index.php/Script-Writing_HowTo
*/
class ScriptManager : public KDialogBase, public EngineObserver
{
Q_OBJECT
TQ_OBJECT
friend class AmarokScriptNewStuff;
public:
ScriptManager( TQWidget *parent = 0, const char *name = 0 );
virtual ~ScriptManager();
static ScriptManager* instance() { return s_instance ? s_instance : new ScriptManager( PlaylistWindow::self() ); }
/**
* Runs the script with the given name. Used by the DCOP handler.
* @param name The name of the script.
* @return True if successful.
*/
bool runScript( const TQString& name, bool silent = false );
/**
* Stops the script with the given name. Used by the DCOP handler.
* @param name The name of the script.
* @return True if successful.
*/
bool stopScript( const TQString& name );
/** Returns a list of all currently running scripts. Used by the DCOP handler. */
TQStringList listRunningScripts();
/** Custom Menu Click */
void customMenuClicked( const TQString& message );
/** Returns the path of the spec file of the given script */
TQString specForScript( const TQString& name );
/** Return name of the lyrics script currently running, or TQString() if none */
TQString lyricsScriptRunning() const;
/** Returns a list of all lyrics scripts */
TQStringList lyricsScripts() const;
/** Sends a fetchLyrics notification to all scripts */
void notifyFetchLyrics( const TQString& artist, const TQString& title );
/** Sends a fetchLyrics notification to retrieve lyrics from a specific page */
void notifyFetchLyricsByUrl( const TQString& url );
/** Sends a playlistChange notification to all scripts */
void notifyPlaylistChange( const TQString& change );
/** Return name of the transcode script currently running, or TQString() if none */
TQString transcodeScriptRunning() const;
/** Sends a transcode notification to all scripts */
void notifyTranscode( const TQString& srcUrl, const TQString& filetype );
/** Return name of the scoring script currently running, or TQString() if none */
TQString scoreScriptRunning() const;
/** Returns a list of all scoring scripts */
TQStringList scoreScripts() const;
/** Asks the current score script to give a new score based on the parameters. */
void requestNewScore( const TQString &url, double prevscore, int playcount, int length, float percentage, const TQString &reason );
signals:
/** Emitted when the lyrics script changes, so that a lyrics retry can be made */
void lyricsScriptChanged();
private slots:
/** Finds all installed scripts and adds them to the listview */
void findScripts();
/** Enables/disables the buttons */
void slotCurrentChanged( TQListViewItem* );
bool slotInstallScript( const TQString& path = TQString() );
void slotRetrieveScript();
void slotUninstallScript();
bool slotRunScript( bool silent = false );
void slotStopScript();
void slotConfigureScript();
void slotAboutScript();
void slotShowContextMenu( TQListViewItem*, const TQPoint& );
void slotReceivedStdout( KProcess*, char*, int );
void slotReceivedStderr( KProcess*, char*, int );
void scriptFinished( KProcess* process );
private:
/** Returns all scripts of the given \p type */
TQStringList scriptsOfType( const TQString &type ) const;
/** Returns the first running script found of \p type */
TQString scriptRunningOfType( const TQString &type ) const;
TQString ensureScoreScriptRunning();
/** Terminates a process with SIGTERM and deletes the KProcIO object */
void terminateProcess( KProcIO** proc );
/** Sends a string message to all running scripts */
void notifyScripts( const TQString& message );
/** Adds a script to the listview */
void loadScript( const TQString& path );
/** Copies the file permissions from the tarball and loads the script */
void recurseInstall( const KArchiveDirectory* archiveDir, const TQString& destination );
/** EngineObserver reimplementations **/
void engineStateChanged( Engine::State state, Engine::State oldState = Engine::Empty );
void engineNewMetaData( const MetaBundle& /*bundle*/, bool /*trackChanged*/ );
void engineVolumeChanged( int newVolume );
/////////////////////////////////////////////////////////////////////////////////////
// DATA MEMBERS
/////////////////////////////////////////////////////////////////////////////////////
static ScriptManager* s_instance;
ScriptManagerBase* m_gui;
TQListViewItem* m_generalCategory;
TQListViewItem* m_lyricsCategory;
TQListViewItem* m_scoreCategory;
TQListViewItem* m_transcodeCategory;
bool m_installSuccess;
struct ScriptItem {
KURL url;
TQString type;
KProcIO* process;
TQListViewItem* li;
TQString log;
ScriptItem() : process( 0 ), li( 0 ) {}
};
typedef TQMap<TQString, ScriptItem> ScriptMap;
ScriptMap m_scripts;
};
inline TQStringList ScriptManager::lyricsScripts() const { return scriptsOfType( "lyrics" ); }
inline TQString ScriptManager::lyricsScriptRunning() const { return scriptRunningOfType( "lyrics" ); }
inline TQString ScriptManager::transcodeScriptRunning() const { return scriptRunningOfType( "transcode" ); }
inline TQStringList ScriptManager::scoreScripts() const { return scriptsOfType( "score" ); }
inline TQString ScriptManager::scoreScriptRunning() const { return scriptRunningOfType( "score" ); }
#endif /* AMAROK_SCRIPTMANAGER_H */