gssettingsuis/Gs/GSFramework/src/GSBaseDocument.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:44 +0100
branchRCL_3
changeset 25 7e0eff37aedb
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002-2005 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:  Base Document for the General Settings Application
*
*/

#include "GSBaseDocument.h"

// User includes
#include "GSPluginWrapper.h"
#include "GSPluginAndViewIdCache.h"
#include "GSWatchDog.h"
#include "gsplugininterface.h"
#include "GsLogger.h"

// Constants
const TInt KGSPluginWrapperObjectGranularity = 10;


// ================= MEMBER FUNCTIONS =======================

// ----------------------------------------------------
// CGSBaseDocument::CGSBaseDocument()
// constructor
//
// ----------------------------------------------------
//
EXPORT_C CGSBaseDocument::CGSBaseDocument( CEikApplication& aApp )
:   CAknDocument( aApp ),
    iUnloadWrapperObjects( KGSPluginWrapperObjectGranularity ),
    iWatchDog ( NULL )
    {
    }


// ----------------------------------------------------
// CGSBaseDocument::~CGSBaseDocument()
// destructor
//
// ----------------------------------------------------
//
EXPORT_C CGSBaseDocument::~CGSBaseDocument()
    {
    // This physically unloads the plugin dlls if their ECOM
    // reference count is zero. This must be the last thing to
    // occur to any plugin object (i.e. all of its code must have
    // finished running by the time this next line takes place).
    const TInt count = iUnloadWrapperObjects.Count();
    for( TInt i=count-1; i>=0; i-- )
        {
        CGSPluginWrapper* object = iUnloadWrapperObjects[ i ];
        (void) object;
        delete object;
        }

    iUnloadWrapperObjects.Close();
    delete iPluginViewIdCache;
#ifdef GS_ENABLE_WATCH_DOG
    delete iWatchDog;
#endif

    iImplInfoArray.ResetAndDestroy();// This is needed
    iImplInfoArray.Close();
    }


// ----------------------------------------------------
// CGSBaseDocument::ConstructL()
// Symbian OS second phase constructor
//
// ----------------------------------------------------
//
EXPORT_C void CGSBaseDocument::ConstructL()
    {
#ifdef GS_ENABLE_WATCH_DOG
    iWatchDog = CGSWatchDog::NewL();
#endif

    REComSession::ListImplementationsL(
        KGSPluginInterfaceUid,
        iImplInfoArray );
#ifdef _DEBUG
    PrintImplInfoArray( iImplInfoArray );
#endif //_DEBUG
        
    __GSLOGSTRING1(
        "[CGSBaseDocument::ConstructL] iImplInfoArray count:%d",
        iImplInfoArray.Count() );
    }


// ----------------------------------------------------
// CGSBaseDocument::NewPluginUnloadWrapperLC()
//
//
// ----------------------------------------------------
//
EXPORT_C CGSPluginWrapper* CGSBaseDocument::NewPluginUnloadWrapperLC()
    {
    CGSPluginWrapper* wrapper = new(ELeave) CGSPluginWrapper( *this );
    TCleanupItem wrapperCleanupItem( CleanupPluginWrapperObject, wrapper );
    CleanupStack::PushL( wrapperCleanupItem );
    iUnloadWrapperObjects.AppendL( wrapper );
    //
    return wrapper;
    }


// ----------------------------------------------------
// CGSBaseDocument::PreparePluginCacheL()
//
//
// ----------------------------------------------------
//
EXPORT_C void CGSBaseDocument::PreparePluginCacheL( CEikAppUi& aAppUi )
    {
    iPluginViewIdCache = CGSPluginAndViewIdCache::NewL( aAppUi );
    }


// ----------------------------------------------------
// CGSBaseDocument::PrepareForUIDestruction()
//
//
// ----------------------------------------------------
//
EXPORT_C void CGSBaseDocument::PrepareForUIDestruction()
    {
    if  ( iPluginViewIdCache )
        {
        iPluginViewIdCache->PrepareForUIDestruction();
        }
    }


// ----------------------------------------------------
// CGSBaseDocument::CleanupPluginWrapperObject()
// Cleanup support
//
// ----------------------------------------------------
//
void CGSBaseDocument::CleanupPluginWrapperObject( TAny* aWrapper )
    {
    CGSPluginWrapper* wrapper =
        reinterpret_cast< CGSPluginWrapper* >( aWrapper );
    CGSBaseDocument& document = wrapper->Document();
    document.DoCleanupPluginWrapper( wrapper );
    }


// ----------------------------------------------------
// CGSBaseDocument::DoCleanupPluginWrapper()
// Cleanup support - called when loading a plugin fails
//
// ----------------------------------------------------
//
void CGSBaseDocument::DoCleanupPluginWrapper( CGSPluginWrapper* aWrapper )
    {
    const TInt index = iUnloadWrapperObjects.Find( aWrapper );
    if  ( index >= 0 && index < iUnloadWrapperObjects.Count() )
        {
        iUnloadWrapperObjects.Remove( index );
        delete aWrapper;
        }
    }


// ----------------------------------------------------
// CGSBaseDocument::PluginViewIdCache()
//
//
// ----------------------------------------------------
//
CGSPluginAndViewIdCache& CGSBaseDocument::PluginViewIdCache()
    {
    ASSERT( iPluginViewIdCache );
    return *iPluginViewIdCache;
    }


// ----------------------------------------------------
// CGSBaseDocument::PluginViewIdCache()
//
//
// ----------------------------------------------------
//
const CGSPluginAndViewIdCache& CGSBaseDocument::PluginViewIdCache() const
    {
    ASSERT( iPluginViewIdCache );
    return *iPluginViewIdCache;
    }



// ----------------------------------------------------
// CGSBaseDocument::WatchDog()
//
//
// ----------------------------------------------------
//
EXPORT_C MGSWatchDog* CGSBaseDocument::WatchDog()
    {
    return iWatchDog;
    }

// ----------------------------------------------------
// CGSBaseDocument::GetImplInfos()
//
//
// ----------------------------------------------------
//
EXPORT_C RImplInfoPtrArray CGSBaseDocument::GetImplInfo()
    {
    return iImplInfoArray;
    }

EXPORT_C void CGSBaseDocument::CreateShimmedViewL(const TUid aViewUid)
	{
	ASSERT(iPluginViewIdCache);
	if ( !iPluginViewIdCache->PluginInstance(aViewUid) )
		{
		iPluginViewIdCache->RegisterViewAndImplementationAssociationL(aViewUid, aViewUid, ETrue);
		}
	}

void CGSBaseDocument::PrintImplInfoArray( const RImplInfoPtrArray& aImplInfoArray )
    {
    for( TInt i = 0; i < aImplInfoArray.Count(); i++ )
        {
        PrintImplInfo( *aImplInfoArray[ i ] );
        }
    }


void CGSBaseDocument::PrintImplInfo( const CImplementationInformation& aInfo )
    {
    __GSLOGSTRING1( "[CGSBaseDocument] --Plugin 0x%X info--", &aInfo);
    __GSLOGSTRING1( "[CGSBaseDocument] DisplayName:%S", &aInfo.DisplayName() );
    __GSLOGSTRING1( "[CGSBaseDocument] ImplementationUid:0x%X",
                    aInfo.ImplementationUid() );

    const TInt KMaxEComDataLength = 256;

    HBufC* dataType = HBufC::New( KMaxEComDataLength );
    HBufC* opaqueData = HBufC::New( KMaxEComDataLength );

    dataType->Des().Copy( aInfo.DataType() );
    opaqueData->Des().Copy( aInfo.OpaqueData() );
    __GSLOGSTRING1( "[CGSBaseDocument] DataType:%S", dataType );
    __GSLOGSTRING1( "[CGSBaseDocument] OpaqueData:%S", opaqueData );

    delete opaqueData;
    delete dataType;
    }



// End of File