diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/PbkExt/src/CPbkExtGlobals.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook/PbkExt/src/CPbkExtGlobals.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,137 @@ +/* +* Copyright (c) 2002 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: +* PbkExt.dll global variables. A singleton class. +* +*/ + + +// INCLUDE FILES +#include "CPbkExtGlobals.h" +#include "CPbkMultiExtensionFactory.h" +#include "CPbkExtensionLoader.h" + +// Debugging headers +#include +#include "PbkProfiling.h" + +#include + +// Unnamed namespace for local definitions +namespace { + +const TInt KExtensionGranularity = 1; + +/** + * Returns global instance of CPbkExtGlobals + */ +inline CPbkExtGlobals* Instance() + { + return static_cast(Dll::Tls()); + } + +} // namespace + + +// ==================== MEMBER FUNCTIONS ==================== +CPbkExtGlobals::CPbkExtGlobals() : + iExtensions(KExtensionGranularity) + { + } + +CPbkExtGlobals::~CPbkExtGlobals() + { + delete iMultiFactory; + iExtensions.ResetAndDestroy(); + + // Cleanup ECom session + REComSession::FinalClose(); + } + +CPbkExtGlobals* CPbkExtGlobals::NewLC() + { + CPbkExtGlobals* self = new (ELeave) CPbkExtGlobals; + CleanupStack::PushL( self ); + + return self; + } + +void CPbkExtGlobals::IncRef() + { + ++iRefCount; + } + +TInt CPbkExtGlobals::DecRef() + { + return --iRefCount; + } + +EXPORT_C CPbkExtGlobals* CPbkExtGlobals::InstanceL() + { + CPbkExtGlobals* instance = Instance(); + + if (!instance) + { + instance = CPbkExtGlobals::NewLC(); + User::LeaveIfError(Dll::SetTls(instance)); + CleanupStack::Pop(instance); + } + + instance->IncRef(); + + return instance; + } + +EXPORT_C MPbkExtensionFactory& CPbkExtGlobals::FactoryL() + { + if (!iMultiFactory) + { + __PBK_PROFILE_START(PbkProfiling::EPbkExtGlobalsScannerConstruct); + // Make sure that there are no extensions when scanning + iExtensions.ResetAndDestroy(); + // If scanning fails we leave here so that iMultiFactory + // doesn't get created. So when calling this function + // again scanning is tried again. + CPbkExtensionScanner* scanner = + CPbkExtensionScanner::NewLC(iExtensions); + __PBK_PROFILE_END(PbkProfiling::EPbkExtGlobalsScannerConstruct); + __PBK_PROFILE_START(PbkProfiling::EExtensionScan); + scanner->ScanL(); + CleanupStack::PopAndDestroy(scanner); + __PBK_PROFILE_END(PbkProfiling::EExtensionScan); + + __PBK_PROFILE_START(PbkProfiling::EMultiFactoryConstruct); + iMultiFactory = CPbkMultiExtensionFactory::NewL(); + + const TInt count = iExtensions.Count(); + for (TInt i=0; iAppendL(iExtensions.At(i)->ExtensionFactory()); + } + __PBK_PROFILE_END(PbkProfiling::EMultiFactoryConstruct); + } + + return *iMultiFactory; + } + +void CPbkExtGlobals::DoRelease() + { + if (DecRef() == 0) + { + Dll::SetTls(NULL); + delete this; + } + } + +// End of File