/*************************************************************************** * Copyright (C) 2004-2006 by Mark Kretschmann * * 2005 by Seb Ruiz * * * * 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 #include //baseclass #include class MetaBundle; class ScriptManagerBase; class TQListViewItem; class KArchiveDirectory; class TDEProcess; class KProcIO; /** * @class ScriptManager * @short Script management widget and backend * @author Mark Kretschmann * * 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 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( TDEProcess*, char*, int ); void slotReceivedStderr( TDEProcess*, char*, int ); void scriptFinished( TDEProcess* 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 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 */