diff -r 000000000000 -r 094583676ce7 wvuing/wvuieng/EngSrc/CCAStorageObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuieng/EngSrc/CCAStorageObserver.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2003-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: Observes storage events and reacts according to settings +* +*/ + +// INCLUDE FILES +#include "CCAStorageObserver.h" +#include "PrivateEngineDefinitions.h" +#include "PublicEngineDefinitions.h" +#include "ImpsCSPAllErrors.h" +#include "CAUtils.h" + +#include "MCASettings.h" +#include "MCAStoredContacts.h" +#include "MCAStoredContact.h" +#include "MCASettings.h" +#include "MCABlocking.h" + +#include "ChatDebugPrint.h" + +// ================= MEMBER FUNCTIONS ======================= + +// Two-phased constructor. +CCAStorageObserver* CCAStorageObserver::NewL( MCASettings& aApplicationSettings, + MCAStoredContacts& aContactStorage, + MCAPresence& aPresenceHandler, + MCABlocking& aBlockingManager ) + { + CCAStorageObserver* self = new ( ELeave ) CCAStorageObserver( + aApplicationSettings, + aContactStorage, + aPresenceHandler, + aBlockingManager ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + + +// Destructor +CCAStorageObserver::~CCAStorageObserver() + { + iContactStorage.RemoveObserver( this ); + delete iLastUserId; + } + + +// --------------------------------------------------------- +// CCAStorageObserver::HandleDelete +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::HandleContactDelete( const TDesC& aId ) + { + CHAT_DP_TXT( "CCAStorageObserver::HandleDelete" ); + // find also the "soon-to-be-deleted" contacts + IMHandleDelete( aId ); + } + +// --------------------------------------------------------- +// CCAStorageObserver::HandleAddition +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::HandleAddition( MCAContactList& /*aList*/, MCAStoredContact& aContact ) + { + CHAT_DP_TXT( "CCAStorageObserver::HandleAddition" ); + IMHandleAddition( aContact ); + } + +// --------------------------------------------------------- +// CCAStorageObserver::HandleChange +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::HandleChange( + MCAContactList* /* aList */, + MCAStoredContact* /* aId */, + TStorageManagerGlobals::TCAObserverEventType /*aEventType*/, + TBool /*aUserIdChanged*/ ) + { + // nothing to do + } + +// --------------------------------------------------------- +// CCAStorageObserver::HandleBackupRestoreEvent +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::HandleBackupRestoreEvent( + const TStorageManagerGlobals::TCAObserverEventType /*aEventType*/ ) + { + } + +// Symbian OS default constructor can leave. +void CCAStorageObserver::ConstructL() + { + iContactStorage.AddObserverL( this ); + } + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CCAStorageObserver::CCAStorageObserver( MCASettings& aApplicationSettings, + MCAStoredContacts& aContactStorage, + MCAPresence& aPresenceHandler, + MCABlocking& aBlockingManager ) + : iApplicationSettings( aApplicationSettings ), + iContactStorage( aContactStorage ), + iPresenceHandler( aPresenceHandler ), + iBlockingManager( aBlockingManager ) + { + } + +// --------------------------------------------------------- +// CCAStorageObserver::IMHandleDelete +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::IMHandleDelete( const TDesC& aUserId ) + { + TInt err( KErrNone ); + + if ( iApplicationSettings.Value( MCASettings::EReceiveIMessages ) + == MCASettings::EFriends ) + { + TRAP( err, DoBlockingManagerDeleteL( aUserId ) ); + HandleError( err ); + } + } + +// --------------------------------------------------------- +// CCAStorageObserver::DoBlockingManagerDeleteL +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::DoBlockingManagerDeleteL( const TDesC& aUserId ) + { + // granularity of one because only one item appended to array + CDesCArrayFlat* arr = new ( ELeave ) CDesCArrayFlat( 1 ); + CleanupStack::PushL( arr ); + arr->AppendL( aUserId ); + + // remove from the grant list, according to strategy + TInt err( iBlockingManager.RemoveL( NULL, arr ) ); + if ( err != KErrNone ) + { + HandleError( err ); + } + + CleanupStack::PopAndDestroy( arr ); + } + +// --------------------------------------------------------- +// CCAStorageObserver::IMHandleAddition +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::IMHandleAddition( MCAStoredContact& aContact ) + { + TInt err( KErrNone ); + + if ( iApplicationSettings.Value( MCASettings::EReceiveIMessages ) + == MCASettings::EFriends ) + { + TRAP( err, DoBlockingManagerAdditionL( aContact.UserId() ) ); + HandleError( err ); + } + DoUpdateContactStatus( aContact ); + } + + +// --------------------------------------------------------- +// CCAStorageObserver::DoBlockingManagerAdditionL +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::DoBlockingManagerAdditionL( const TDesC& aUserId ) + { + // granularity of one because only one item appended to array + CDesCArrayFlat* arr = new ( ELeave ) CDesCArrayFlat( 1 ); + CleanupStack::PushL( arr ); + arr->AppendL( aUserId ); + + // insert into the grant list, according to strategy + iBlockingManager.InsertL( NULL, arr ); + CleanupStack::PopAndDestroy( arr ); + + } + +// --------------------------------------------------------- +// CCAStorageObserver::DoUpdateContactStatus +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::DoUpdateContactStatus( MCAStoredContact& aContact ) + { + TPtrC wvid( aContact.UserId() ); + + // update the blocking status.. + TBool blocked( EFalse ); + const CDesCArray* blockList = iBlockingManager.BlockedList(); + if ( blockList ) + { + // do a case-insensitive search + TInt count( blockList->Count() ); + for ( TInt i( 0 ); ( i < count ) && !blocked ; ++i ) + { + // (*blockList)[i].CompareC( wvid, KCollationLevel, NULL ) + if ( CAUtils::NeutralCompare( ( *blockList )[i], wvid ) == 0 ) + { + blocked = ETrue; + } + } + } + aContact.SetBlocked( blocked ); + } + +// --------------------------------------------------------- +// CCAStorageObserver::HandleError +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCAStorageObserver::HandleError( TInt aError ) + { + CHAT_DP( D_CHAT_LIT( "CCAStorageObserver::HandleError, aError = %d" ), + aError ); + if ( ( aError > Imps_ERROR_BASE ) && ( aError < KErrNone ) ) + { + // propagate system errors to current active scheduler, + // it should show a note + CActiveScheduler::Current()->Error( aError ); + } + + // imps errors are ignored at the moment as we don't have any + // notes specified for them + } + + +// End of File