diff -r 000000000000 -r 8466d47a6819 meetingrequest/mrgui/src/resmrstatic.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/src/resmrstatic.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,329 @@ +/* +* 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 "emailtrace.h" +#include "resmrstatic.h" + +#include "cesmrcontactmenuhandler.h" +#include "cesmrcontactmanagerhandler.h" +#include "CFSMailClient.h" +#include "CFSMailBox.h" +// Removed profiling + +/** + * Storage stuct for RESMRStatic. + */ +struct TESMRStaticData + { + TInt iInstanceCount; + TInt iContactManagerHandlerCount; + CESMRContactManagerHandler* iContactManagerHandler; + TInt iContactMenuHandlerCount; + CESMRContactMenuHandler* iContactMenuHandler; + CFSMailClient* iFSMailClient; + CFSMailBox* iFSMailBox; + + TInt iPbkxContactListingServiceCount; + TInt iCurrentFieldIndex; + TInt iFSMailBoxCount; + }; + +// --------------------------------------------------------------------------- +// Cleanup operation for RPointerArray. +// @param aArray Pointer to RPointerArray. +// --------------------------------------------------------------------------- +// +void MailboxPointerArrayCleanup( TAny* aArray ) + { + // just to avoid warnings when MR not supported + RPointerArray* entryArray = + static_cast*>( aArray ); + + entryArray->ResetAndDestroy(); + entryArray->Close(); + } + +// ======== 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; + } + } + } + + // If FSMailClientL or FSMailBox was used + if (iUsedTypes & EMailBoxHandler ) + { + // Decrease counter + --iStaticData->iFSMailBoxCount; + + // If this was last instance using pointer + if (iStaticData->iFSMailBoxCount == 0 ) + { + // Owned by CFSMailClient + delete iStaticData->iFSMailBox; + iStaticData->iFSMailBox = NULL; + + // Delete instance + if ( iStaticData->iFSMailClient ) + { + iStaticData->iFSMailClient->Close(); + iStaticData->iFSMailClient = 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; + } + +// --------------------------------------------------------------------------- +// RESMRStatic::MailBoxL +// --------------------------------------------------------------------------- +// +EXPORT_C CFSMailBox& RESMRStatic::MailBoxL( const TDesC& aAddress ) + { + FUNC_LOG; + if ( !iStaticData->iFSMailBox ) + { + CFSMailClient& fsMailClient = FSMailClientL(); + + // Loop throug all mailboxes in this plug-in + RPointerArray mailboxes; // codescanner::resourcenotoncleanupstack + CleanupStack::PushL( + TCleanupItem( + MailboxPointerArrayCleanup, + &mailboxes ) ); + + // With null uid we get all mailboxes + TFSMailMsgId msgId; + fsMailClient.ListMailBoxes( + msgId, mailboxes ); + + TInt mailboxCount( mailboxes.Count() ); + for ( TInt j(0); + j < mailboxCount && !iStaticData->iFSMailBox; + ++j ) + { + TPtrC mailboxOwnerAddName( + mailboxes[j]->OwnMailAddress().GetEmailAddress() ); + if ( mailboxOwnerAddName.Compare( aAddress ) == 0 ) + { + // Correct mailbox is found + iStaticData->iFSMailBox = mailboxes[j]; + mailboxes.Remove(j); + } + } + CleanupStack::PopAndDestroy(); // mailboxes + + if ( !iStaticData->iFSMailBox ) + { + User::Leave( KErrAbort ); + } + } + + iUsedTypes |= EMailBoxHandler; + ++iStaticData->iFSMailBoxCount; + return *iStaticData->iFSMailBox; + } + +// --------------------------------------------------------------------------- +// RESMRStatic::FSMailClientL +// --------------------------------------------------------------------------- +// +CFSMailClient& RESMRStatic::FSMailClientL( ) + { + FUNC_LOG; + if (!iStaticData->iFSMailClient) + { + iStaticData->iFSMailClient = CFSMailClient::NewL ( ); + } + + return *iStaticData->iFSMailClient; + } + +// EOF +