diff -r 3104fc151679 -r 9a48e301e94b uiservicetab/vimpstengine/src/cvimpstengineimsubservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpstengine/src/cvimpstengineimsubservice.cpp Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,630 @@ +/* +* 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 "uiservicetabtracer.h" + +//system includes +#include + +// ================= MEMBER FUNCTIONS ======================= +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::NewL +// +// --------------------------------------------------------- +CVIMPSTEngineIMSubService* CVIMPSTEngineIMSubService::NewL( + TUint aServiceId, + CVIMPSTEngineCchHandler& aCchHandler, + CVIMPSTEngineServiceTableFetcher& aTableFetcher, + MVIMPSTEngineServiceConnectionEventObserver& aObserver + ) + { + TRACER_AUTO; + TRACE( "ServiceId: %d", aServiceId ); + + CVIMPSTEngineIMSubService* self = CVIMPSTEngineIMSubService::NewLC( + aServiceId, + aCchHandler, + aTableFetcher, + aObserver ); + CleanupStack::Pop( self ); + + return self; + } + + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::NewLC +// +// --------------------------------------------------------- + +CVIMPSTEngineIMSubService* CVIMPSTEngineIMSubService::NewLC( + TUint aServiceId, + CVIMPSTEngineCchHandler& aCchHandler, + CVIMPSTEngineServiceTableFetcher& aTableFetcher, + MVIMPSTEngineServiceConnectionEventObserver& aObserver + ) + { + TRACER_AUTO; + TRACE( "ServiceId: %d", aServiceId ); + + CVIMPSTEngineIMSubService* self = new (ELeave) CVIMPSTEngineIMSubService(aServiceId, + aCchHandler, aTableFetcher, + aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService +// +// --------------------------------------------------------- + +CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService() + { + TRACER_AUTO; + + iChatObserver.Reset(); + iChatObserver.Close(); + + iCchHandler.UnRegisterCchObserver(ECCHIMSub); + + ReleaseIMCacheAccessor(); + + } + + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::ConstructL +// +// --------------------------------------------------------- + +void CVIMPSTEngineIMSubService::ConstructL() + { + + TRACER_AUTO; + TCCHSubserviceState serviceState = ECCHUninitialized; + TInt error = iCchHandler.GetServiceState( + iServiceId, ECCHIMSub, serviceState ); + + iServiceState = ResolveServiceStateL(serviceState, error); + + iCchHandler.RegisterCchObserverL(this,ECCHIMSub); + + TRACE( "ResolveServiceStateL returned ServiceState: %d", iServiceState ); + + + } + + +// --------------------------------------------------------- +// 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) + { + TRACER_AUTO; + if (aObserver) + { + TInt index = iChatObserver.Find(aObserver); + if( index == KErrNotFound ) + { + iChatObserver.Append( aObserver ); + } + } + + } + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::UnRegisterChatObserver +// +// --------------------------------------------------------- + +void CVIMPSTEngineIMSubService::UnRegisterChatObserver(MVIMPSTEngineIMSubServiceEventObserver* aObserver) + { + TRACER_AUTO; + + if (aObserver) + { + + TInt index = iChatObserver.Find(aObserver); + + if( index >=0 ) + { + iChatObserver.Remove( index ); + iChatObserver.Compress(); + } + + + } + + } +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::HandleIMCacheEventL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- + +void CVIMPSTEngineIMSubService::HandleIMCacheEventL(TIMCacheEventType aEventType, TAny* aChatMessage ) + { + TRACER_AUTO; + TRACE( "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( "EIMCacheUnreadMessage for %S", &buddyId ); + NotifyObserversL(TVIMPSTEnums::EIMUnreadMessage,buddyId); + } + break; + } + case EIMCacheUnreadChange : + { + TRACE( "EIMCacheUnreadChange"); + if (!aChatMessage) + { + return; + } + SIMCacheChatItem* chatItem = static_cast( aChatMessage ) ; + if( iServiceId != chatItem->iServiceId ) + { + return; + } + TPtrC buddyId = chatItem->iBuddyId->Des(); + TRACE( "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("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( "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; + } + } + + + } + +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::GetUnreadCountL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TInt CVIMPSTEngineIMSubService::GetUnreadCountL(const TDesC& aBuddyId ) + { + TRACER_AUTO; + TRACE( " ServiceId: %d BuddyId: %S", iServiceId, &aBuddyId ); + + TInt count = 0; + if( iIMCacheAccessor ) + { + count = iIMCacheAccessor->GetUnreadMessageCountL(aBuddyId); + TRACE( "iIMCacheAccessor returns with %d", count ); + } + + return count; + } + + +// --------------------------------------------------------- +// CVIMPSTEngineIMSubService::SubServiceState +// --------------------------------------------------------------------------- +// +TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTEngineIMSubService::SubServiceState() const + { + TRACER_AUTO; + TRACE( "ServiceId: %d ServiceState: %d",iServiceId, iServiceState ); + return iServiceState; + } + + + +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::IsConversationExistL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +TBool CVIMPSTEngineIMSubService::IsConversationExistL(const TDesC& aBuddyId) const + { + TRACER_AUTO; + TRACE( "Buddy Id : %S", &aBuddyId ); + + TInt exist = EFalse; + + if( iIMCacheAccessor ) + { + exist = iIMCacheAccessor->IsConversationExistL( aBuddyId ); + TRACE( "iIMCacheAccessor returns with %d", exist ); + } + + TRACE( "Exist: %d", exist ); + return exist; + } + +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::CloseConversationL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +void CVIMPSTEngineIMSubService::CloseConversationL( const TDesC& aContactId ) + { + TRACER_AUTO; + TRACE( "Buddy Id : %S", &aContactId ); + + if( IsConversationExistL(aContactId) ) + { + TRACE( "iIMCacheAccessor CloseConversationL to be called" ); + iIMCacheAccessor->CloseConversationL( aContactId ); + TRACE( "iIMCacheAccessor CloseConversationL Done" ); + } + + } +//----------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::GetOpenChatListL +// ( Other items commented in header ) +//----------------------------------------------------------------------------- +RArray CVIMPSTEngineIMSubService::GetOpenChatListL() + { + TRACER_AUTO; + RArray item; + if(iIMCacheAccessor) + { + item = iIMCacheAccessor->GetChatListL( iServiceId ); + } + return item; + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::ResolveServiceStateL +// --------------------------------------------------------------------------- +// +TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTEngineIMSubService::ResolveServiceStateL( + TCCHSubserviceState aState, + TInt aServiceError ) + { + TRACER_AUTO; + + TVIMPSTEnums::TVIMPSTRegistrationState state = TVIMPSTEnums::ESVCENotRegistered; + + + TRACE( "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("ESVCEWaitingForNetwork" ); + handleServiceStates = EFalse; + state = TVIMPSTEnums::ESVCEWaitingForNetwork; + } + } + + if ( handleServiceStates ) + { + switch ( aState ) + { + case ECCHEnabled: + { + TRACE( "ESVCERegistered" ); + CreateIMCacheAccessorL(); + state = TVIMPSTEnums::ESVCERegistered; + } + break; + + case ECCHDisconnecting: + { + TRACE( "ESVCENetworkDisConnecting" ); + state = TVIMPSTEnums::ESVCENetworkDisConnecting; + } + break; + + case ECCHUninitialized: + case ECCHDisabled: + { + TRACE( "ESVCENotRegistered" ); + ReleaseIMCacheAccessor(); + state = TVIMPSTEnums::ESVCENotRegistered; + } + break; + + case ECCHConnecting: + { + TRACE( "ESVCENetworkConnecting" ); + state = TVIMPSTEnums::ESVCENetworkConnecting; + } + break; + + default: + break; + } + } + + + return state; + + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::Type +// --------------------------------------------------------------------------- +// +TVIMPSTEnums::SubServiceType CVIMPSTEngineIMSubService::Type() const + { + TRACER_AUTO; + TRACE("SubServiceType() Type : %d", iType ); + TRACE("CVIMPSTEngineIMSubService: [0x%x]", this ); + return iType; + } + + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::CchEventOccuredL +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::CchEventOccuredL( + TUint /*aServiceId*/, + TCCHSubserviceState aState, + TInt aServiceError ) + { + TRACER_AUTO; + TRACE( "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(); + } + + + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::DoHandleCchErrorL() +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::DoHandleCchErrorL( + TInt aServiceError ) + { + TRACER_AUTO; + TRACE( "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; + } + + + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::CreateIMCacheAccessorL() +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::CreateIMCacheAccessorL() + { + TRACER_AUTO; + if (!iIMCacheFactory) + { + HBufC* ownData = iCchHandler.GetConParametersL(ECchUsername);// + CleanupStack::PushL(ownData); + TPtr ownDataPtr = ownData->Des(); + TRACE( "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); + } + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor() +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor() + { + TRACER_AUTO; + + if( iIMCacheAccessor ) + { + iIMCacheAccessor->UnRegisterObserver(*this); + } + + if( iIMCacheFactory ) + { + CIMCacheFactory::Release(); + iIMCacheAccessor = NULL; + iIMCacheFactory = NULL; + } + + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineIMSubService::NotifyObserversL() +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineIMSubService::NotifyObserversL( TVIMPSTEnums::TIMEventType aEventType ,const TDesC& aBuddyId ) + { + TRACER_AUTO; + TInt count = iChatObserver.Count(); + for (TInt index=0; indexHandleChatMessageEventL(aEventType ,aBuddyId ); + } + } + +// End of File +