alfwidgetutils/src/alffactorypluginloaderimpl.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:18 +0100
branchRCL_3
changeset 26 0e9bb658ef58
parent 0 e83bab7cf002
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007 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:  Encapsulates factory plugin loading mechanism
*
*/



#include <ecom/ecom.h>
//#include <alf/alfecompluginfactoryuid.rh>
#include <alf/ialffactoryplugin.h>
#include <string.h>
#include <memory>
#include <osn/osnnew.h>
#include <stdexcept>

#include "alf/alfecompluginfactoryuid.rh"
#include "alffactorypluginloaderimpl.h"

using namespace std;

namespace Alf
    {



class AlfFactoryPluginMap
    {
public:
    AlfFactoryPluginMap();
    ~AlfFactoryPluginMap();

    /**
     * Owned factory plugin.
     */
    IAlfFactoryPlugin*  mFactoryPlugin;
    /**
     * ECom destructor handle.
     */
    int    mDtorKey;
    };

static bool loadPluginIntoMap(
    AlfFactoryPluginMap*& aMap,
    const char* aProduct)
    {
    TEComResolverParams resolverParams;
    resolverParams.SetDataType(TPtrC8((TUint8*)aProduct));
    resolverParams.SetWildcardMatch(ETrue);

    TAny* plugin = NULL;
    TUid tmpDtor;

    TRAPD(err,plugin = REComSession::CreateImplementationL(
                           TUid::Uid(KFactoryPluginUid),
                           tmpDtor,resolverParams))


    if (!err)
        {
        aMap->mDtorKey = tmpDtor.iUid;
        aMap->mFactoryPlugin = reinterpret_cast<IAlfFactoryPlugin*>(
                                                            plugin);
        return true;
        }

    return false;
    }

AlfFactoryPluginMap::AlfFactoryPluginMap()
        :mFactoryPlugin(0),mDtorKey(0)
    {

    }

AlfFactoryPluginMap::~AlfFactoryPluginMap()
    {
    if (mFactoryPlugin)
        {
        REComSession::DestroyedImplementation(TUid::Uid(mDtorKey));
        delete mFactoryPlugin;
        }
    }

AlfFactoryPluginLoaderImpl::AlfFactoryPluginLoaderImpl()
    {

    }

AlfFactoryPluginLoaderImpl::~AlfFactoryPluginLoaderImpl()
    {
    mFactoryPluginList.clear();

    }

IAlfFactoryPlugin* AlfFactoryPluginLoaderImpl::load(
    const char*  aLoadId)
    {
    IAlfFactoryPlugin* ret(0);
    IAlfFactoryPlugin* tmp(0);
    // Do we have it already?
    unsigned int itemCount(mFactoryPluginList.count());

    for (int i=0;i<itemCount && !ret;i++)
        {
        tmp = mFactoryPluginList.at(i)->mFactoryPlugin;
        int productCount = tmp->productCount();
        for (int j=0;j<productCount && !ret;j++)
            {
            if (!strcmp(tmp->productInfo(j),aLoadId ))
                {
                ret = tmp;
                }
            }
        }
    if (!ret)
        {
        auto_ptr<AlfFactoryPluginMap> mapPtr(new(EMM)AlfFactoryPluginMap());
        AlfFactoryPluginMap* map = mapPtr.get();

        if (loadPluginIntoMap(map,aLoadId))
            {
            ret = mapPtr->mFactoryPlugin;
            mFactoryPluginList.resize(itemCount+1);
            mFactoryPluginList.insert(itemCount,map);

            mapPtr.release();

            }

        }

    return ret;

    }
    
    }

// End of File