interfaces
scriptmanager.cpp
Go to the documentation of this file.00001 #include "scriptmanager.h"
00002 #include <kparts/part.h>
00003 #include <kparts/componentfactory.h>
00004 #include <kapplication.h>
00005 #include <kdesktopfile.h>
00006 #include <kstandarddirs.h>
00007
00008 #include <klocale.h>
00009 #include <kmessagebox.h>
00010 #include <kdebug.h>
00011
00012
00013 class ScriptInfo
00014 {
00015 public:
00016 QString scriptType;
00017 QString scriptFile;
00018 QString scriptMethod;
00019 ScriptInfo();
00020 ~ScriptInfo(){}
00021 };
00022 ScriptInfo::ScriptInfo()
00023 {
00024 scriptType = "";
00025 scriptFile = "";
00026 scriptMethod = "";
00027 }
00028 KScriptManager::KScriptManager(QObject *parent, const char *name) :
00029 QObject(parent,name), KScriptClientInterface()
00030 {
00031
00032 }
00033 KScriptManager::~KScriptManager()
00034 {
00035 m_scripts.setAutoDelete(true);
00036 m_scriptCache.setAutoDelete(true);
00037
00038 }
00039 bool KScriptManager::addScript( const QString &scriptDesktopFile)
00040 {
00041
00042
00043 bool success = false;
00044 QString tmpScriptType = "";
00045 QString tmpScriptFile = "";
00046 QString tmpScriptMethod = "";
00047
00048
00049 if(KDesktopFile::isDesktopFile(scriptDesktopFile))
00050 {
00051 KDesktopFile desktop(scriptDesktopFile, true);
00052 m_scripts.insert(desktop.readName(), new ScriptInfo());
00053 m_scripts[desktop.readName()]->scriptType = desktop.readType();
00054 QString localpath = QString(kapp->name()) + "/scripts/" + desktop.readEntry("X-KDE-ScriptName", "");
00055 m_scripts[desktop.readName()]->scriptFile = locate("data", localpath);
00056
00057 success = true;
00058 }
00059 return success;
00060 }
00061 bool KScriptManager::removeScript( const QString &scriptName )
00062 {
00063 bool result = m_scriptCache.remove(scriptName);
00064 result = m_scripts.remove(scriptName);
00065 return result;
00066 }
00067 QStringList KScriptManager::scripts()
00068 {
00069 QDictIterator<ScriptInfo> it( m_scripts );
00070
00071 QStringList scriptList;
00072 while ( it.current() )
00073 {
00074 scriptList.append(it.currentKey());
00075 ++it;
00076 }
00077 return scriptList;
00078 }
00079 void KScriptManager::clear()
00080 {
00081 m_scriptCache.clear();
00082 m_scripts.clear();
00083 }
00084 void KScriptManager::runScript( const QString &scriptName, QObject *context, const QVariant &arg)
00085 {
00086 ScriptInfo *newScript = m_scripts[scriptName];
00087 if (newScript)
00088 {
00089 QString scriptType = "([X-KDE-Script-Runner] == '" + newScript->scriptType + "')";
00090 kdDebug()<<"running script, type = '"<<scriptType<<"'"<<endl;
00091
00092 if ( !m_scriptCache[scriptName] )
00093 {
00094
00095
00096
00097
00098 KScriptInterface *ksif = KParts::ComponentFactory::createInstanceFromQuery<KScriptInterface>( "KScriptRunner/KScriptRunner", scriptType, this );
00099 if ( ksif )
00100 {
00101 m_scriptCache.insert( scriptName, ksif );
00102
00103 }
00104 else
00105 {
00106 KMessageBox::sorry(0, i18n("Unable to get KScript Runner for type \"%1\".").arg(newScript->scriptType), i18n("KScript Error"));
00107 return;
00108 }
00109 }
00110 m_currentScript = scriptName;
00111
00112 if ( m_scriptCache[m_currentScript] )
00113 {
00114 m_scriptCache[m_currentScript]->ScriptClientInterface = this;
00115 if (!newScript->scriptMethod.isEmpty())
00116 m_scriptCache[m_currentScript]->setScript( newScript->scriptFile, newScript->scriptMethod );
00117 else
00118 m_scriptCache[m_currentScript]->setScript( newScript->scriptFile );
00119 m_scriptCache[m_currentScript]->run(context, arg);
00120 }
00121 else
00122 {
00123
00124
00125 m_scriptCache.remove(m_currentScript);
00126 }
00127 }
00128 else
00129 KMessageBox::sorry(0, i18n("Unable find script \"%1\".").arg(scriptName), i18n("KScript Error"));
00130 }
00131 #include "scriptmanager.moc"
00132 #include "scriptinterface.moc"