hswidgetmodel/src/hswidgetfactory.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 23 Jun 2010 18:33:40 +0300
changeset 103 b99b84bcd2d1
parent 60 f62f87b200ec
permissions -rw-r--r--
Revision: 201023 Kit: 2010125

/*
* 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:  HsWidget factory.
*
*/


#include <QStringList>
#include <QDir>
#include <QPluginLoader>

#include "hswidgetfactory.h"
#include "hswidgetfactory_p.h"
#include "hswidget.h"
#include "hswidgetprovidermanifest.h"
#include "hstest_global.h"



/*DEPRECATED
    \class HsPluginUnloader
    \ingroup group_hswidgetmodel
    \brief Unloads plugin and deletes plugin loader.

    Holds plugin loader instance and unloads and destroys plugin
    on it's destructor. 
 
*/


/*!
    \fn HsPluginUnloader::HsPluginUnloader(QPluginLoader *pluginLoader,QObject *parent)

    Constructs plugin unloader object. When this object is destroyed it 
    unloads it's pointed \a pluginLoader instance.
*/
HsPluginUnloader::HsPluginUnloader(QPluginLoader *pluginLoader,QObject *parent)
    :QObject(parent),mPluginLoader(pluginLoader)
{
}

/*!
    \fn HsPluginUnloader::~HsPluginUnloader()

    Unloads it's plugin loader instance.
*/
HsPluginUnloader::~HsPluginUnloader()
{
    if(mPluginLoader) {
        mPluginLoader->unload();
        delete mPluginLoader; 
    }
}

/*DEPRECATED
    \class HsWidgetFactory 
    \ingroup group_hswidgetmodel
    \brief Finds and creates home screen widgets.

    HsWidget factory creates an instance of
    a widget base on a widget token that is given to it.
 
*/


HsWidgetFactoryPrivate::HsWidgetFactoryPrivate(HsWidgetFactory *factory):
    mPublic(factory)
{

}


HsWidgetFactoryPrivate::~HsWidgetFactoryPrivate()
{

}



HsWidget* HsWidgetFactoryPrivate::createWidget(const HsWidgetToken &token)
{
   QPluginLoader* loader = new QPluginLoader(token.mLibrary);
   QObject* plugin = loader->instance();
   IHsWidgetProvider* provider = qobject_cast<IHsWidgetProvider*>(plugin);
   HsWidget* widget(0);
   
   if (provider) {
       widget = provider->createWidget(token);
       
       if (!widget) {
          HSDEBUG("Widget creation failed.")
          loader->unload();
          delete loader;
       }
       else {
           HsPluginUnloader* p = new HsPluginUnloader(loader);
           p->connect(widget,SIGNAL(destroyed()),SLOT(deleteLater()));
       }
    }

   else {
        HSDEBUG("Widget creation failed - No provider.")
        loader->unload();
        delete loader;
   }

   
    return widget;
}

/*!
    Constructor
*/
HsWidgetFactory::HsWidgetFactory(QObject *parent)
    : QObject(parent),mD(new HsWidgetFactoryPrivate(this))
{
}
/*!
    Destructor
*/
HsWidgetFactory::~HsWidgetFactory()
{
    delete mD;
}


/*!
    Creates and returns a widget based on given \a token
*/
HsWidget* HsWidgetFactory::createWidget(const HsWidgetToken &token)
{
    return mD->createWidget(token);
}