diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrguicommon/src/resmrstatic.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrguicommon/src/resmrstatic.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2007-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: Static Tls data storage +* +*/ + + +#include "resmrstatic.h" + +#include "cesmrcontactmenuhandler.h" +#include "cesmrcontactmanagerhandler.h" + +// DEBUG +#include "emailtrace.h" + +/** + * Storage stuct for RESMRStatic. + */ +struct TESMRStaticData + { + TInt iInstanceCount; + TInt iContactManagerHandlerCount; + CESMRContactManagerHandler* iContactManagerHandler; + TInt iContactMenuHandlerCount; + CESMRContactMenuHandler* iContactMenuHandler; + + TInt iPbkxContactListingServiceCount; + TInt iCurrentFieldIndex; + }; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// RESMRStatic::RESMRStatic +// --------------------------------------------------------------------------- +// +EXPORT_C RESMRStatic::RESMRStatic( ) + { + FUNC_LOG; + //do nothing + } + +// --------------------------------------------------------------------------- +// RESMRStatic::~RESMRStatic +// --------------------------------------------------------------------------- +// +EXPORT_C RESMRStatic::~RESMRStatic( ) + { + FUNC_LOG; + if ( iStaticData ) + { + delete iStaticData->iContactMenuHandler; + iStaticData->iContactMenuHandler = NULL; + + delete iStaticData->iContactManagerHandler; + iStaticData->iContactManagerHandler = NULL; + } + } + +// --------------------------------------------------------------------------- +// RESMRStatic::ConnectL +// --------------------------------------------------------------------------- +// +EXPORT_C void RESMRStatic::ConnectL( ) + { + FUNC_LOG; + if (iStaticData ) + { + // already connected + return; + } + + // Retrieve Tls pointer + iStaticData = (TESMRStaticData*) Dll::Tls(); + + // If Tls pointer was not set, create new static stuct + // with NULL values + if ( !iStaticData ) + { + iStaticData = new (ELeave) TESMRStaticData(); + memset ( iStaticData, 0, sizeof( TESMRStaticData) ); + Dll::SetTls ( iStaticData ); + } + ++iStaticData->iInstanceCount; + } + +// --------------------------------------------------------------------------- +// RESMRStatic::Close +// --------------------------------------------------------------------------- +// +EXPORT_C void RESMRStatic::Close( ) + { + FUNC_LOG; + if (iStaticData ) + { + if (iUsedTypes & EContactMenuHandler ) + { + --iStaticData->iContactMenuHandlerCount; + if (iStaticData->iContactMenuHandlerCount == 0 ) + { + if ( iStaticData->iContactManagerHandlerCount == 0 ) + { + // Delete both Handlers when both are ready to delete + // and Contact Manager Handler should be deleted last + // because the Menu Handler has dependency to it. + delete iStaticData->iContactMenuHandler; + iStaticData->iContactMenuHandler = NULL; + + delete iStaticData->iContactManagerHandler; + iStaticData->iContactManagerHandler = NULL; + } + } + } + + // If ContactManagerHandlerL was used + if (iUsedTypes & EContactManagerHandler ) + { + // Decrease counter + --iStaticData->iContactManagerHandlerCount; + + // If this was last instance using pointer + if ( iStaticData->iContactManagerHandlerCount == 0 ) + { + if ( iStaticData->iContactMenuHandlerCount == 0 ) + { + delete iStaticData->iContactMenuHandler; + iStaticData->iContactMenuHandler = NULL; + // Delete instance + delete iStaticData->iContactManagerHandler; + iStaticData->iContactManagerHandler = NULL; + } + } + } + + // Decrease instance counter + --iStaticData->iInstanceCount; + + // If this was last instance using pointer + if (iStaticData->iInstanceCount == 0 ) + { + delete iStaticData; + Dll::FreeTls ( ); + } + iStaticData = NULL; + } + } + +// --------------------------------------------------------------------------- +// RESMRStatic::ContactManagerHandlerL +// --------------------------------------------------------------------------- +// +EXPORT_C CESMRContactManagerHandler& RESMRStatic::ContactManagerHandlerL( ) + { + FUNC_LOG; + if ( !iStaticData->iContactManagerHandler ) + { + iStaticData->iContactManagerHandler = + CESMRContactManagerHandler::NewL(); + } + + if (!(iUsedTypes & EContactManagerHandler) ) + { + ++iStaticData->iContactManagerHandlerCount; + iUsedTypes |= EContactManagerHandler; + } + return *iStaticData->iContactManagerHandler; + } + +// --------------------------------------------------------------------------- +// RESMRStatic::ContactMenuHandlerL +// --------------------------------------------------------------------------- +// +EXPORT_C CESMRContactMenuHandler& RESMRStatic::ContactMenuHandlerL( ) + { + FUNC_LOG; + if ( !iStaticData->iContactMenuHandler ) + { + iStaticData->iContactMenuHandler = + CESMRContactMenuHandler::NewL( ContactManagerHandlerL() ); + } + + if (!(iUsedTypes & EContactMenuHandler) ) + { + ++iStaticData->iContactMenuHandlerCount; + iUsedTypes |= EContactMenuHandler; + } + + return *iStaticData->iContactMenuHandler; + } + +// --------------------------------------------------------------------------- +// RESMRStatic::CurrentFieldIndex +// --------------------------------------------------------------------------- +// +EXPORT_C TInt RESMRStatic::CurrentFieldIndex() + { + FUNC_LOG; + return iStaticData->iCurrentFieldIndex; + } + +// --------------------------------------------------------------------------- +// RESMRStatic::SetCurrentFieldIndex +// --------------------------------------------------------------------------- +// +EXPORT_C void RESMRStatic::SetCurrentFieldIndex(TInt aFieldIndex) + { + FUNC_LOG; + iStaticData->iCurrentFieldIndex = aFieldIndex; + } + +// EOF +