diff -r 000000000000 -r 5e5d6b214f4f uiservicetab/vimpstengine/src/cvimpstengineimsubservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpstengine/src/cvimpstengineimsubservice.cpp Tue Feb 02 10:12:18 2010 +0200 @@ -0,0 +1,661 @@ +/* +* Copyright (c) 2008 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: Class that capsulates single service data members +* +*/ + + +// INCLUDES +#include "cvimpstengineimsubservice.h" + +#include "cvimpstenginecchhandler.h" +#include "cvimpstengineservicetablefetcher.h" +#include "mvimpstengineimsubserviceeventobserver.h" +#include "mvimpstengineserviceconnectioneventobserver.h" + +#include +#include +#include +#include +#include + +#include "tvimpstconsts.h" + +// imcache related headers +#include "cimcachefactory.h" +#include "mimcacheaccessor.h" + +#include "vimpstdebugtrace.h" + +//system includes +#include + +// ================= MEMBER FUNCTIONS ======================= +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::NewL +// +// --------------------------------------------------------- +CVIMPSTEngineIMSubService* CVIMPSTEngineIMSubService::NewL( + TUint aServiceId, + CVIMPSTEngineCchHandler& aCchHandler, + CVIMPSTEngineServiceTableFetcher& aTableFetcher, + MVIMPSTEngineServiceConnectionEventObserver& aObserver + ) + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::NewL start")); + TRACE( T_LIT("NewL() ServiceId: %d"), aServiceId ); + + CVIMPSTEngineIMSubService* self = CVIMPSTEngineIMSubService::NewLC( + aServiceId, + aCchHandler, + aTableFetcher, + aObserver ); + CleanupStack::Pop( self ); + + TRACE( T_LIT("CVIMPSTEngineIMSubService::NewL end")); + return self; + } + + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::NewLC +// +// --------------------------------------------------------- + +CVIMPSTEngineIMSubService* CVIMPSTEngineIMSubService::NewLC( + TUint aServiceId, + CVIMPSTEngineCchHandler& aCchHandler, + CVIMPSTEngineServiceTableFetcher& aTableFetcher, + MVIMPSTEngineServiceConnectionEventObserver& aObserver + ) + { + + TRACE( T_LIT("CVIMPSTEngineIMSubService::NewLC start")); + TRACE( T_LIT("NewLC() ServiceId: %d"), aServiceId ); + + CVIMPSTEngineIMSubService* self = new (ELeave) CVIMPSTEngineIMSubService(aServiceId, + aCchHandler, aTableFetcher, + aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + + TRACE( T_LIT("CVIMPSTEngineIMSubService::NewLC end")); + return self; + } + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService +// +// --------------------------------------------------------- + +CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService() + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService start")); + + iChatObserver.Reset(); + iChatObserver.Close(); + + iCchHandler.UnRegisterCchObserver(ECCHIMSub); + + ReleaseIMCacheAccessor(); + + TRACE( T_LIT("CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService end")); + } + + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::ConstructL +// +// --------------------------------------------------------- + +void CVIMPSTEngineIMSubService::ConstructL() + { + + TRACE( T_LIT("CVIMPSTEngineIMSubService::ConstructL start")); + TCCHSubserviceState serviceState = ECCHUninitialized; + TInt error = iCchHandler.GetServiceState( + iServiceId, ECCHIMSub, serviceState ); + + iServiceState = ResolveServiceStateL(serviceState, error); + + iCchHandler.RegisterCchObserverL(this,ECCHIMSub); + + TRACE( T_LIT("ConstructL() ResolveServiceStateL returned ServiceState: %d"), + iServiceState ); + + TRACE( T_LIT("CVIMPSTEngineIMSubService::ConstructL end")); + + } + + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::CVIMPSTEngine +// +// --------------------------------------------------------- + +CVIMPSTEngineIMSubService::CVIMPSTEngineIMSubService( TUint aServiceId, + CVIMPSTEngineCchHandler& aCchHandler, + CVIMPSTEngineServiceTableFetcher& aTableFetcher, + MVIMPSTEngineServiceConnectionEventObserver& aObserver) : + iServiceId(aServiceId), + iCchHandler(aCchHandler), + iTableFetcher(aTableFetcher), + iObserver(aObserver), + iType (TVIMPSTEnums::EIM) + { + } + + + + + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::RegisterChatObserver +// +// --------------------------------------------------------- + +void CVIMPSTEngineIMSubService::RegisterChatObserver(MVIMPSTEngineIMSubServiceEventObserver* aObserver) + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::RegisterChatObserver start")); + if (aObserver) + { + TInt index = iChatObserver.Find(aObserver); + if( index == KErrNotFound ) + { + iChatObserver.Append( aObserver ); + } + } + TRACE( T_LIT("CVIMPSTEngineIMSubService::RegisterChatObserver end")); + + } + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::UnRegisterChatObserver +// +// --------------------------------------------------------- + +void CVIMPSTEngineIMSubService::UnRegisterChatObserver(MVIMPSTEngineIMSubServiceEventObserver* aObserver) + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::UnRegisterChatObserver start")); + + if (aObserver) + { + + TInt index = iChatObserver.Find(aObserver); + + if( index >=0 ) + { + iChatObserver.Remove( index ); + iChatObserver.Compress(); + } + + + } + TRACE( T_LIT("CVIMPSTEngineIMSubService::UnRegisterChatObserver end")); + + } +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::HandleIMCacheEventL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- + +void CVIMPSTEngineIMSubService::HandleIMCacheEventL(TIMCacheEventType aEventType, TAny* aChatMessage ) + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::HandleIMCacheEventL start")); + TRACE( T_LIT("HandleIMCacheEventL() TIMCacheEventType: %d"), aEventType ); + + switch( aEventType ) + { + case EIMCacheUnreadMessage : + { + if (!aChatMessage) + { + return; + } + SIMCacheMessageData* chatData = static_cast( aChatMessage ) ; + // check that buddy id exists + if ( chatData->iBuddyId ) + { + TPtrC buddyId = chatData->iBuddyId->Des(); + TRACE( T_LIT("HandleIMCacheEventL() EIMCacheUnreadMessage for %S"), + &buddyId ); + + NotifyObserversL(TVIMPSTEnums::EIMUnreadMessage,buddyId); + } + break; + } + case EIMCacheUnreadChange : + { + TRACE( T_LIT("HandleIMCacheEventL() EIMCacheUnreadChange") ); + if (!aChatMessage) + { + return; + } + SIMCacheChatItem* chatItem = static_cast( aChatMessage ) ; + if( iServiceId != chatItem->iServiceId ) + { + return; + } + TPtrC buddyId = chatItem->iBuddyId->Des(); + TRACE( T_LIT("HandleIMCacheEventL() EIMCacheChatClosed for %S"), + &buddyId ); + NotifyObserversL(TVIMPSTEnums::EIMUnreadChange, buddyId ); // ETrue for Closed conversation + break; + } + case EIMCacheChatStarted : + { + if (!aChatMessage) + { + return; + } + SIMCacheChatItem* chatItem = static_cast( aChatMessage ) ; + if( iServiceId != chatItem->iServiceId ) + { + return; + } + TPtrC buddyId = chatItem->iBuddyId->Des(); + TRACE( T_LIT("HandleIMCacheEventL() EIMCacheChatClosed for %S"), + &buddyId ); + NotifyObserversL(TVIMPSTEnums::EIMChatStarted, buddyId ); // ETrue for Closed conversation + break; + } + case EIMCacheChatClosed: + { + if (!aChatMessage) + { + return; + } + SIMCacheChatItem* chatItem = static_cast( aChatMessage ) ; + if( iServiceId != chatItem->iServiceId ) + { + return; + } + TPtrC buddyId = chatItem->iBuddyId->Des(); + TRACE( T_LIT("HandleIMCacheEventL() EIMCacheChatClosed for %S"), + &buddyId ); + NotifyObserversL(TVIMPSTEnums::EIMChatClosed, buddyId ); + break; + } + case EIMCacheAllChatClosed: + { + NotifyObserversL(TVIMPSTEnums::EIMAllChatClosed, KNullDesC ); + break; + } + case EIMCacheRequestCompleted: + { + NotifyObserversL(TVIMPSTEnums::EIMRequestCompleted, KNullDesC ); + break; + } + default: + { + break; + } + } + + TRACE( T_LIT("CVIMPSTEngineIMSubService::HandleIMCacheEventL end")); + + } + +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::GetUnreadCountL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TInt CVIMPSTEngineIMSubService::GetUnreadCountL(const TDesC& aBuddyId ) + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::GetUnreadCountL start")); + TRACE( T_LIT("GetUnreadCountL() ServiceId: %d BuddyId: %S"), + iServiceId, &aBuddyId ); + + TInt count = 0; + if( iIMCacheAccessor ) + { + count = iIMCacheAccessor->GetUnreadMessageCountL(aBuddyId); + TRACE( T_LIT("GetUnreadCountL() iIMCacheAccessor returns with %d"), count ); + } + + TRACE( T_LIT("CVIMPSTEngineIMSubService::GetUnreadCountL end")); + return count; + } + + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::SubServiceState +// --------------------------------------------------------------------------- +// +TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTEngineIMSubService::SubServiceState() const + { + TRACE( T_LIT("SubServiceState() ServiceId: %d ServiceState: %d"), + iServiceId, iServiceState ); + return iServiceState; + } + + + +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::IsConversationExistL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TBool CVIMPSTEngineIMSubService::IsConversationExistL(const TDesC& aBuddyId) const + { + + TRACE( T_LIT("CVIMPSTEngineIMSubService::IsConversationExistL start")); + TRACE( T_LIT("IsConversationExistL() Buddy Id : %S"), &aBuddyId ); + + TInt exist = EFalse; + + if( iIMCacheAccessor ) + { + exist = iIMCacheAccessor->IsConversationExistL( aBuddyId ); + TRACE( T_LIT("IsConversationExistL() iIMCacheAccessor returns with %d"), exist ); + } + + TRACE( T_LIT("IsConversationExistL() Exist: %d"), exist ); + TRACE( T_LIT("CVIMPSTEngineIMSubService::IsConversationExistL end")); + return exist; + } + +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::CloseConversationL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CVIMPSTEngineIMSubService::CloseConversationL( const TDesC& aContactId ) + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::CloseConversationL start")); + TRACE( T_LIT("CloseConversationL() Buddy Id : %S"), &aContactId ); + + if( IsConversationExistL(aContactId) ) + { + TRACE( T_LIT("CloseConversationL() iIMCacheAccessor CloseConversationL to be called") ); + iIMCacheAccessor->CloseConversationL( aContactId ); + TRACE( T_LIT("CloseConversationL() iIMCacheAccessor CloseConversationL Done") ); + } + + TRACE( T_LIT("CVIMPSTEngineIMSubService::CloseConversationL end")); + } +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::GetOpenChatListL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +RArray CVIMPSTEngineIMSubService::GetOpenChatListL() + { + TRACE( T_LIT("CloseConversationL() iIMCacheAccessor GetOpenChatListL called") ); + RArray item; + if(iIMCacheAccessor) + { + item = iIMCacheAccessor->GetChatListL( iServiceId ); + } + return item; + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::ResolveServiceStateL +// --------------------------------------------------------------------------- +// +TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTEngineIMSubService::ResolveServiceStateL( + TCCHSubserviceState aState, + TInt aServiceError ) + { + + TRACE( T_LIT("CVIMPSTEngineIMSubService::ResolveServiceStateL start")); + + TVIMPSTEnums::TVIMPSTRegistrationState state = TVIMPSTEnums::ESVCENotRegistered; + + TRACE( T_LIT("ResolveServiceStateL() iServiceId: %d, ServiceState: %d"), + iServiceId, aState ); + + TBool handleServiceStates = ETrue; + if ( aServiceError && ECCHDisabled != aState ) + { + //Only if the Service supports ALR, the state can goto WaitingForNetwork + //Still API from CCH is required to know whether ALR is supported or not + if ( (KCCHErrorInvalidSettings != aServiceError) && (ECCHConnecting == aState) ) + { + TRACE( T_LIT("ResolveServiceStateL() ESVCEWaitingForNetwork") ); + handleServiceStates = EFalse; + state = TVIMPSTEnums::ESVCEWaitingForNetwork; + } + } + + if ( handleServiceStates ) + { + switch ( aState ) + { + case ECCHEnabled: + { + TRACE( T_LIT("ResolveServiceStateL() ESVCERegistered") ); + CreateIMCacheAccessorL(); + state = TVIMPSTEnums::ESVCERegistered; + } + break; + + case ECCHDisconnecting: + { + TRACE( T_LIT("ResolveServiceStateL() ESVCENetworkDisConnecting") ); + state = TVIMPSTEnums::ESVCENetworkDisConnecting; + } + break; + + case ECCHUninitialized: + case ECCHDisabled: + { + TRACE( T_LIT("ResolveServiceStateL() ESVCENotRegistered") ); + ReleaseIMCacheAccessor(); + state = TVIMPSTEnums::ESVCENotRegistered; + } + break; + + case ECCHConnecting: + { + TRACE( T_LIT("ResolveServiceStateL() ESVCENetworkConnecting") ); + state = TVIMPSTEnums::ESVCENetworkConnecting; + } + break; + + default: + break; + } + } + + TRACE( T_LIT("CVIMPSTEngineIMSubService::ResolveServiceStateL end")); + + return state; + + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::Type +// --------------------------------------------------------------------------- +// +TVIMPSTEnums::SubServiceType CVIMPSTEngineIMSubService::Type() const + { + TRACE( T_LIT("SubServiceType() Type : %d"), iType ); + TRACE( T_LIT("CVIMPSTEngineIMSubService: [0x%x]"), this ); + return iType; + } + + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::CchEventOccuredL +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::CchEventOccuredL( + TUint /*aServiceId*/, + TCCHSubserviceState aState, + TInt aServiceError ) + { + + TRACE( T_LIT("CVIMPSTEngineIMSubService::CchEventOccuredL start")); + TRACE( T_LIT("CchEventOccuredL() TCCHSubserviceState : %d, ServiceErr: %d"), + aState, aServiceError ); + + if ( aServiceError && ECCHDisabled != aState ) + { + //we might even end up in waiting for connection state for all + //those service which are ALR enabled + //So better check here if you get any CCH errors + iServiceState = ResolveServiceStateL( aState, aServiceError ); + iObserver.HandleServceConnectionEventL(); + DoHandleCchErrorL( aServiceError ); + } + else + { + iServiceState = ResolveServiceStateL( aState, aServiceError ); + iObserver.HandleServceConnectionEventL(); + } + + TRACE( T_LIT("CVIMPSTEngineIMSubService::CchEventOccuredL end")); + + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::DoHandleCchErrorL() +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::DoHandleCchErrorL( + TInt aServiceError ) + { + + TRACE( T_LIT("CVIMPSTEngineIMSubService::DoHandleCchErrorL start")); + TRACE( T_LIT("DoHandleCchErrorL() ServiceErr: %d"), + aServiceError ); + + switch ( aServiceError ) + { + case KCCHErrorNetworkLost: + case KCCHErrorBandwidthInsufficient: + case KCCHErrorInvalidIap: + { + //Should be fwded to CCHUI to show the appropriate Notes + //TBD + } + break; + + case KCCHErrorAuthenticationFailed: + { + //Should be fwded to CCHUI to show the appropriate Notes + //TBD + } + break; + + case KCCHErrorLoginFailed: + case KCCHErrorServiceNotResponding: + { + //Should be fwded to CCHUI to show the appropriate Notes + //TBD + } + break; + + case KCCHErrorInvalidSettings: + { + //Should be fwded to CCHUI to show the appropriate Notes + //TBD + } + break; + + case KCCHErrorAccessPointNotDefined: + { + //Should be fwded to CCHUI to show the appropriate Notes + //TBD + } + break; + + default: + { + //Should be fwded to CCHUI to show the appropriate Notes + //TBD + } + break; + } + + TRACE( T_LIT("CVIMPSTEngineIMSubService::DoHandleCchErrorL end")); + + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::CreateIMCacheAccessorL() +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::CreateIMCacheAccessorL() + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::CreateIMCacheAccessorL start")); + + if (!iIMCacheFactory) + { + HBufC* ownData = iCchHandler.GetConParametersL(ECchUsername);// + CleanupStack::PushL(ownData); + TPtr ownDataPtr = ownData->Des(); + TRACE( T_LIT("DoHandleCchErrorL() ServiceErr: %S"), + &ownDataPtr ); + // im cache factory + iIMCacheFactory = CIMCacheFactory::InstanceL(); + + // im cache update interface + if (!iIMCacheAccessor) + { + iIMCacheAccessor = iIMCacheFactory->CreateAccessorL(iServiceId, *ownData ); + + iIMCacheAccessor->RegisterObserverL(*this); + } + + CleanupStack::PopAndDestroy(ownData); + } + TRACE( T_LIT("CVIMPSTEngineIMSubService::CreateIMCacheAccessorL end")); + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor() +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor() + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor start")); + + if( iIMCacheAccessor ) + { + iIMCacheAccessor->UnRegisterObserver(*this); + } + + if( iIMCacheFactory ) + { + CIMCacheFactory::Release(); + iIMCacheAccessor = NULL; + iIMCacheFactory = NULL; + } + + TRACE( T_LIT("CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor end")); + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::NotifyObserversL() +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::NotifyObserversL( TVIMPSTEnums::TIMEventType aEventType ,const TDesC& aBuddyId ) + { + TRACE( T_LIT("CVIMPSTEngineIMSubService::NotifyObserversL start")); + TInt count = iChatObserver.Count(); + for (TInt index=0; indexHandleChatMessageEventL(aEventType ,aBuddyId ); + } + TRACE( T_LIT("CVIMPSTEngineIMSubService::NotifyObserversL end")); + } + +// End of File +