--- /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 <QDebug>
+#include <QPluginLoader>
+#ifdef Q_OS_SYMBIAN
+#include <QLibraryInfo>
+#else
+#include <QCoreApplication>
+#endif
+#include <QDir>
+#include <hbmainwindow.h>
+#include <hbview.h>
+#include <hbinstance.h>
+#include <hbicon.h>
+#include <serviceprovider.h>
+#include <isengine.h>
+
+#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<ServiceProvider> 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;
+ }
+