diff -r 773be20e0a25 -r 993ab30e92fc searchui/onlinehandler/src/onlinehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/searchui/onlinehandler/src/onlinehandler.cpp Tue Jul 06 14:17:22 2010 +0300 @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Online Handler. + * + */ +#include "onlinehandler.h" +#include "searchutility.h" +#include "onlinesearchplugin.h" // after export should be included as systeminc +#include "onlinesearchpluginfactory.h" // after export should be included as systeminc +#include +#include +#ifdef Q_OS_SYMBIAN +#include +#else +#include +#endif +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +#define PLUGINFILE_SUFFIX "dll" +#else +#define PLUGINFILE_SUFFIX "qtplugin" +#endif + +// --------------------------------------------------------------------------- +// OnlineHandler::OnlineHandler +// --------------------------------------------------------------------------- +// +OnlineHandler::OnlineHandler(QObject* parent) : + QObject(parent), mOnlinePlugin(NULL), mEng(NULL), mCurrentProvider(NULL) + { + } +// --------------------------------------------------------------------------- +// OnlineHandler::~OnlineHandler +// --------------------------------------------------------------------------- +// +OnlineHandler::~OnlineHandler() + { + if (mOnlinePlugin) + delete mOnlinePlugin; + if (mEng) + delete mEng; + if (mCurrentProvider) + delete mCurrentProvider; + } +void OnlineHandler::setDefaultProvider(const int id) + { + if (mEng) + mEng->SetSelectedProvider(id); + } +// --------------------------------------------------------------------------- +// OnlineHandler::readSettings +// --------------------------------------------------------------------------- +// +void OnlineHandler::readSettings() + { + if (!mEng) + mEng = new IsEngine(); + mAvailableProviders.clear(); + mEng->Providers(mAvailableProviders); + for (int i = 0; i < mAvailableProviders.count(); i++) + { + emit providerDetails(mAvailableProviders.at(i).Name(), + mAvailableProviders.at(i).Icon(), + mAvailableProviders.at(i).Id()); + } + mCurrentProvider = mEng->SelectedProvider(); // default provider + if (mCurrentProvider) + { + mDefaultPluginName = mCurrentProvider->Name(); + emit defaultProvider(mCurrentProvider->Id()); + } + else + { + mDefaultPluginName = QString(); + } + } +// --------------------------------------------------------------------------- +// OnlineHandler::writeSettings +// --------------------------------------------------------------------------- +// +void OnlineHandler::writeSettings(const int providerId) + { + if (mEng && mEng->SetSelectedProvider(providerId) && mCurrentProvider) + { + mCurrentProvider = mEng->SelectedProvider(); // default provider + emit defaultProvider(mCurrentProvider->Id()); + } + return; + } +// --------------------------------------------------------------------------- +// OnlineHandler::initializePlugin +// --------------------------------------------------------------------------- +// +void OnlineHandler::initializePlugin() + { + /* Below assumes, only default plugins are handled now. If user selects different plugin some more logic needed here. */ + + if (mOnlinePlugin) + { + delete mOnlinePlugin; + mOnlinePlugin = NULL; + } + mOnlinePlugin = loadSearchPlugin(mDefaultPluginName); + if (mOnlinePlugin) + { + connect(mOnlinePlugin, SIGNAL(pluginInitialized(bool)), this, + SLOT(isPluginIntialized(bool))); + + connect(mOnlinePlugin, SIGNAL(shutdownCompleted(bool)), this, + SLOT(isShutdownCompleted(bool))); + + connect(mOnlinePlugin, SIGNAL(handleBackEvent()), this, + SLOT(backEvent())); + + mOnlinePlugin->initializePlugin(); + } + } +void OnlineHandler::loadISPlugin(int id, QString query) + { + if (!mEng) + mEng = new IsEngine(); + mLoadSuggestion = true; + mLoadSuggestionLink = query; + QList iAvailableProviders; + mEng->Providers(iAvailableProviders); + for (int i = 0; i < iAvailableProviders.count(); i++) + { + if (iAvailableProviders.at(i).Id() == id) + { + mDefaultPluginName = iAvailableProviders.at(i).Name(); + break; + } + } + initializePlugin(); + } +// --------------------------------------------------------------------------- +// OnlineHandler::isPluginIntialized +// --------------------------------------------------------------------------- +// +void OnlineHandler::isPluginIntialized(bool success) + { + if (mLoadSuggestion) + { + activatePlugin(mLoadSuggestionLink); + mLoadSuggestion = false; + } + else + { + emit pluginIntialized(success); + } + } +// --------------------------------------------------------------------------- +// OnlineHandler::isShutdownCompleted +// --------------------------------------------------------------------------- +// +void OnlineHandler::isShutdownCompleted(bool success) + { + mOnlinePlugin->deleteLater(); + emit pluginShutdown(success); + } +// --------------------------------------------------------------------------- +// OnlineHandler::backEvent +// --------------------------------------------------------------------------- +// +void OnlineHandler::backEvent() + { + emit backEventTriggered(); + } +// --------------------------------------------------------------------------- +// OnlineHandler::activatePlugin +// --------------------------------------------------------------------------- +// +bool OnlineHandler::activatePlugin() + { + if (mOnlinePlugin) + mOnlinePlugin->activatePlugin(); + return true; + } +// --------------------------------------------------------------------------- +// OnlineHandler::activatePlugin +// --------------------------------------------------------------------------- +// +bool OnlineHandler::activatePlugin(const QString &str) + { + if (mOnlinePlugin) + mOnlinePlugin->activatePlugin(str); + return true; + } +// --------------------------------------------------------------------------- +// OnlineHandler::unloadPlugin +// --------------------------------------------------------------------------- +// +void OnlineHandler::unloadPlugin() + { + if (mOnlinePlugin) + { + disconnect(mOnlinePlugin, SIGNAL(pluginInitialized(bool)), this, + SLOT(isPluginIntialized(bool))); + + disconnect(mOnlinePlugin, SIGNAL(shutdownCompleted(bool)), this, + SLOT(isShutdownCompleted(bool))); + + disconnect(mOnlinePlugin, SIGNAL(handleBackEvent()), this, + SLOT(backEvent())); + + mOnlinePlugin->deactivatePlugin(); + } + } +// --------------------------------------------------------------------------- +// OnlineHandler::unloadPluginandExit +// --------------------------------------------------------------------------- +// +void OnlineHandler::unloadPluginandExit() + { + if (mOnlinePlugin) + { + disconnect(mOnlinePlugin, SIGNAL(pluginInitialized(bool)), this, + SLOT(isPluginIntialized(bool))); + + disconnect(mOnlinePlugin, SIGNAL(shutdownCompleted(bool)), this, + SLOT(isShutdownCompleted(bool))); + + disconnect(mOnlinePlugin, SIGNAL(handleBackEvent()), this, + SLOT(backEvent())); + + mOnlinePlugin->deactivatePlugin(); + mOnlinePlugin->shutdownPlugin(); + } + } +// --------------------------------------------------------------------------- +// OnlineHandler::loadSearchPlugin +// --------------------------------------------------------------------------- +// +OnlineSearchPlugin *OnlineHandler::loadSearchPlugin(const QString &pluginFile) + { + // CpLogger logger; + // logger << "loading plugin:" << pluginFile << "\r\n"; + + QFileInfo fileInfo(pluginFile); + + if (!fileInfo.isAbsolute()) + { + QString fileName = fileInfo.fileName(); + if (fileInfo.suffix().compare(PLUGINFILE_SUFFIX, Qt::CaseInsensitive)) + { + fileName = fileInfo.baseName() + '.' + PLUGINFILE_SUFFIX; + } + + QStringList pluginDirs = SearchUtility::pluginDirs(); + foreach(const QString &pluginDir,pluginDirs) + { + fileInfo.setFile(pluginDir + fileName); + if (fileInfo.exists() && QLibrary::isLibrary( + fileInfo.absoluteFilePath())) + { + break; + } + } + } + + QPluginLoader loader(fileInfo.absoluteFilePath()); + OnlineSearchPluginFactory *pluginFactory = qobject_cast< + OnlineSearchPluginFactory*> (loader.instance()); + OnlineSearchPlugin *plugin = pluginFactory->createPlugin(); + /* + * why unload? + if (!plugin) { + loader.unload(); + } + */ + // logger << (plugin ? "load plugin succeed." : "load plugin failed.") << "\r\n"; + return plugin; + } +