diff -r 2b7283837edb -r 3104fc151679 imstutils/imconversationview/imcvuiengine/src/cimcvenginefactory.cpp --- a/imstutils/imconversationview/imcvuiengine/src/cimcvenginefactory.cpp Thu Aug 19 09:41:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,755 +0,0 @@ -/* -* Copyright (c) 2008-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: service engine factory implementation -* -*/ - -// INCLUDE FILES -#include "cimcvenginefactory.h" - -#include "mimcvenginefactory.h" -#include "cimcvengine.h" -#include "imcvuiliterals.h" -#include -#include -#include -#include -#include -#include "mimcvenginemessagecreator.h" -#include -#include "cimcvenginemessagecreator.h" -#include -#include "mimcvngineservicechangeobserver.h" -#include -#include -#include "imcvuiparams.h" -#include "mimcvenginemessagehandler.h" -#include "mimcvenginechatinterface.h" - -// ================= MEMBER FUNCTIONS ======================= - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory::InstanceL -// Create an instance of the ximp manager -// behaving as singleton object already created then return same instance. -// ----------------------------------------------------------------------------- -// -EXPORT_C MIMCVEngineFactory* CIMCVEngineFactory::InstanceL() - { - CIMCVEngineFactory* singleton; - singleton = static_cast (Dll::Tls()); - if( !singleton ) - { - singleton = CIMCVEngineFactory::NewLC(); - User::LeaveIfError( Dll::SetTls( static_cast (singleton ) )); - CleanupStack::Pop(singleton); - } - return (MIMCVEngineFactory*)singleton; - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory::Release -// Release the singelton -// ----------------------------------------------------------------------------- -// -EXPORT_C void CIMCVEngineFactory::Release() - { - CIMCVEngineFactory* singleton; - singleton = static_cast(Dll::Tls()); - if( singleton ) - { - delete singleton; - Dll::SetTls( NULL ) ; - } - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory::NewLC -// Object creation using two phase construction -// ----------------------------------------------------------------------------- -// -CIMCVEngineFactory* CIMCVEngineFactory::NewLC() - { - CIMCVEngineFactory* self = new (ELeave) CIMCVEngineFactory(); - CleanupStack::PushL( self ); - self->ConstructL(); - return self; - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory::ConstructL -// Symbian OS default constructor can leave. -// ----------------------------------------------------------------------------- -// -void CIMCVEngineFactory::ConstructL() - { - iMessageCreator = CIMCVEngineMessageCreator::NewL(); - iBrandingFactory = CBSFactory::NewL( KDefaultBrandIdForBrand, KAppIdForBrand ); - __ASSERT_ALWAYS((iBrandingFactory != NULL),User::Leave(KErrArgument)); - ReadAndCreateAllValidServiceL(); - //register for service table notifications - RArray serviceIds; - CleanupClosePushL( serviceIds ); - iSpNotifyChange = CSPNotifyChange::NewL( *this ); - iSpNotifyChange->NotifyChangeL( serviceIds ); - CleanupStack::PopAndDestroy( &serviceIds ) ; - } - -// --------------------------------------------------------- -// CIMCVEngineFactory::CIMCVEngineFactory -// --------------------------------------------------------- -CIMCVEngineFactory::CIMCVEngineFactory(): - iActiveChatIndex( KErrNotFound ) - { - - } - -// --------------------------------------------------------- -// CIMCVEngineFactory::~CIMCVEngineFactory -// --------------------------------------------------------- -CIMCVEngineFactory::~CIMCVEngineFactory() - { - delete iSpNotifyChange; - //delete all the create engine instances - //delete iBrandingFactory; - iServiceEngines.ResetAndDestroy(); - iServiceEngines.Close(); - delete iMessageCreator; - delete iBrandingFactory; - } -// --------------------------------------------------------- -// CIMCVEngineFactory::ReadAndCreateAllValidServiceL -// --------------------------------------------------------- -void CIMCVEngineFactory::ReadAndCreateAllValidServiceL() - { - CSPSettings* settings = CSPSettings::NewLC(); - - RArray services; - CleanupClosePushL( services ); - settings->FindServiceIdsL( services ); - const TInt serviceCount = services.Count(); - - for ( TInt i( 0 ); i < serviceCount; i++ ) - { - TInt serviceId = services[ i ]; - TUint32 refContactUid = ContactViewUidL(*settings , serviceId ); - if ( TUid::Uid( refContactUid ) == - TUid::Uid( 0x20012423 ) - || TUid::Uid( refContactUid ) == - TUid::Uid( 0x20007B6D ) - || TUid::Uid( refContactUid ) == - TUid::Uid( 0x2002B334 ) ) - { - if( CheckValidIMServiceL(*settings , serviceId ) ) - { - CreateServiceEngineL( serviceId ); - } - } - } - CleanupStack::PopAndDestroy( &services ); - CleanupStack::PopAndDestroy( settings ); - } - -// --------------------------------------------------------------------------- -// CIMCVEngineFactory::ContactViewUidL() -// --------------------------------------------------------------------------- -// -TUint32 CIMCVEngineFactory::ContactViewUidL(CSPSettings& aSettings, TUint32 aServiceId ) - { - TInt contactViewUid = KErrNotFound; - CSPProperty* property = CSPProperty::NewLC(); - TInt err = aSettings.FindPropertyL( aServiceId, - EPropertyContactViewPluginId, - *property ); - if ( KErrNone == err ) - { - property->GetValue( contactViewUid ); - } - CleanupStack::PopAndDestroy( property ); - return contactViewUid; - } -//----------------------------------------------------------------------------- -// CIMCVEngineFactory::CheckValidIMServiceL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -TBool CIMCVEngineFactory::CheckValidIMServiceL(CSPSettings& aSettings , TInt aServiceId) - { - //check whether it has IMSubservice - TBool ret = ETrue; - CSPProperty* property = CSPProperty::NewLC(); - TInt err = aSettings.FindPropertyL( aServiceId, - ESubPropertyIMEnabled, - *property ); - if ( err ) - { - ret = EFalse; - } - CleanupStack::PopAndDestroy( property ); - return ret; - } - -// --------------------------------------------------------------------------- -// CIMCVEngineFactory::CreateServiceEngineL() -// --------------------------------------------------------------------------- -// -void CIMCVEngineFactory::CreateServiceEngineL( TInt aServiceId ) - { - TInt count = iServiceEngines.Count(); - CIMCVEngine* engine = NULL; - for(int i=0 ; iGetServiceId() == aServiceId) - { - engine = iServiceEngines[i]; - break; - } - } - if( !engine ) - { - engine = CIMCVEngine::NewL( aServiceId , *iMessageCreator, *iBrandingFactory ); - CleanupStack::PushL(engine); - iServiceEngines.AppendL(engine); - CleanupStack::Pop(engine); - } - } -// --------------------------------------------------------------------------- -// CIMCVEngineFactory::GetServiceEngine() -// --------------------------------------------------------------------------- -// -CIMCVEngine& CIMCVEngineFactory::GetServiceEngineL( TInt aServiceId ) - { - TInt count = iServiceEngines.Count(); - CIMCVEngine* engine = NULL; - for(int i=0 ; iGetServiceId() == aServiceId) - { - engine = iServiceEngines[i]; - break; - } - } - if( !engine ) - { - engine = CIMCVEngine::NewL( aServiceId , *iMessageCreator, *iBrandingFactory ); - CleanupStack::PushL(engine); - iServiceEngines.AppendL(engine); - CleanupStack::Pop(engine); - engine->OpenChats().RegisterObserver( this ); - engine->MessageHandler().SetObserver( this ); - engine->ChatInterface().RegisterChatListObserver( this ); - } - return *engine; - } -// --------------------------------------------------------------------------- -// CIMCVEngineFactory::ReleaseServiceEngine() -// --------------------------------------------------------------------------- -// -void CIMCVEngineFactory::ReleaseServiceEngine( TInt aServiceId ) - { - TInt count = iServiceEngines.Count(); - for(int i=0 ; iGetServiceId() == aServiceId ) - { - CIMCVEngine* engine = iServiceEngines[i]; - iServiceEngines.Remove( i ); - delete engine; - engine = NULL; - iServiceEngines.Compress(); - break; - } - } - } -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: GetDisplayNameL -// ----------------------------------------------------------------------------- -// -TPtrC CIMCVEngineFactory::GetDisplayNameL(TInt aIndex) const - { - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats(); - TInt openChatCount = openChat.Count(); - if( aIndex < openChatCount ) - { - return openChat.GetDisplayNameL( aIndex ); - } - else - { - aIndex = aIndex - openChatCount; - } - } - return KNullDesC(); - } - - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: GetTargetIdL -// ----------------------------------------------------------------------------- -// -const TDesC& CIMCVEngineFactory::GetTargetIdL(TInt aIndex) const - { - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats(); - TInt openChatCount = openChat.Count(); - if( aIndex < openChatCount ) - { - return openChat.GetTargetIdL( aIndex ); - } - else - { - aIndex = aIndex - openChatCount; - } - } - return KNullDesC; - } - - - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: FindIndexL -// ----------------------------------------------------------------------------- -// -TInt CIMCVEngineFactory::FindIndexL(const TDesC& aItem ) - { - TInt index = KErrNotFound; - TInt validIndex = 0; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats(); - TInt openChatCount = openChat.Count(); - index = openChat.FindIndexL( aItem ) ; - if( index != KErrNotFound ) - { - validIndex = validIndex + index; - break; - } - else - { - validIndex = openChatCount; - } - } - return validIndex; - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: Count -// ----------------------------------------------------------------------------- -// -TInt CIMCVEngineFactory::Count() const - { - TInt chatCount = 0; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats(); - chatCount = chatCount + openChat.Count(); - } - return chatCount; - } - - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: SetActiveItemL -// ----------------------------------------------------------------------------- -// -void CIMCVEngineFactory::SetActiveItemL( const TInt aIndex ) - { - iActiveChatIndex = aIndex; - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: GetActiveItem -// ----------------------------------------------------------------------------- -// -const TDesC& CIMCVEngineFactory::GetActiveItemL() const - { - TInt index = iActiveChatIndex ; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats(); - TInt openChatCount = openChat.Count(); - if( index < openChatCount ) - { - return openChat.GetTargetIdL( index ); - } - else - { - index = index - openChatCount; - } - } - return KNullDesC; - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: GetServiceEngines -// ----------------------------------------------------------------------------- -// -RPointerArray& CIMCVEngineFactory::GetServiceEngines() - { - return iServiceEngines; - } -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: GetActiveServiceId -// ----------------------------------------------------------------------------- -// -TInt CIMCVEngineFactory::GetActiveServiceId() - { - TInt index = iActiveChatIndex; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats(); - TInt openChatCount = openChat.Count(); - if( index < openChatCount ) - { - return iServiceEngines[i]->GetServiceId(); - } - else - { - index = index - openChatCount; - } - } - return KErrNotFound; - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: IsMsgPendingL -// ----------------------------------------------------------------------------- -// -TBool CIMCVEngineFactory::IsMsgPendingL( const TInt aIndex ) const - { - TInt index = aIndex; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats(); - TInt openChatCount = openChat.Count(); - if( index < openChatCount ) - { - openChat.IsMsgPendingL( index ); - } - else - { - index = index - openChatCount; - } - } - return EFalse; - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: ResetL -// ----------------------------------------------------------------------------- -// -void CIMCVEngineFactory::ResetL() - { - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats().ResetL(); - } - iActiveServiceId = KErrNotFound; - } -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: RegisterOpenChatObserver -// ----------------------------------------------------------------------------- -// -void CIMCVEngineFactory::RegisterOpenChatObserver(MIMCVEngineOpenChatsObserver* aChatObserver) - { - iChatObserver = aChatObserver; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats().RegisterObserver( this ); - } - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: UnRegisterOpenChatObserver -// ----------------------------------------------------------------------------- -// -void CIMCVEngineFactory::UnRegisterOpenChatObserver() - { - iChatObserver = NULL; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iOpenChats().UnRegisterObserver(); - } - } - - -// --------------------------------------------------------- -// CIMCVEngineFactory::HandleChangeL -// (other items were commented in a header). -// --------------------------------------------------------- -// -void CIMCVEngineFactory::HandleChangeL(TInt aServiceId, TInt aIndex, TOpenChatsEventType aChangeType) - { - if( iChatObserver ) - { - TInt validIndex = KErrNotFound; - MIMCVEngineOpenChats& openChat = GetServiceEngineL( aServiceId ).OpenChats(); - TInt chatCount = openChat.Count(); - if( aIndex < chatCount && aIndex>=0 ) - { - validIndex = FindIndexL( openChat.GetTargetIdL( aIndex ) ); - } - if(validIndex >=0 ) - { - iChatObserver->HandleChangeL( aServiceId, validIndex, aChangeType ); - } - } - } - -// --------------------------------------------------------- -// CIMCVEngineFactory::SetStatusMsgL() -// (other items were commented in a header). -// --------------------------------------------------------- -// -void CIMCVEngineFactory::SetStatusMsgL(TInt aServiceId, TInt aIndex,const TDesC & aMsg) - { - if( iChatObserver ) - { - TInt validIndex = KErrNotFound; - MIMCVEngineOpenChats& openChat = GetServiceEngineL( aServiceId ).OpenChats(); - TInt chatCount = openChat.Count(); - if( aIndex < chatCount && aIndex>=0 ) - { - validIndex = FindIndexL( openChat.GetTargetIdL( aIndex ) ); - } - if( validIndex >= 0 ) - { - iChatObserver->SetStatusMsgL( aServiceId, validIndex, aMsg ); - } - } - } -// --------------------------------------------------------------------------- -// CIMCVEngineFactory::RegisterServiceObserver() -// --------------------------------------------------------------------------- -// -void CIMCVEngineFactory::RegisterServiceObserver(MIMCVEngineServiceChangeObserver* aServiceObserver) - { - iServiceChangeObserver = aServiceObserver; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iChatInterface().RegisterChatListObserver( this ); - iServiceEngines[i]->MessageHandler().SetObserver( this ); - } - } -// --------------------------------------------------------------------------- -// CIMCVEngineFactory::UnRegisterServiceObserver() -// --------------------------------------------------------------------------- -// -void CIMCVEngineFactory::UnRegisterServiceObserver() - { - iServiceChangeObserver = NULL; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iChatInterface().UnregisterChatListObserver( this ); - iServiceEngines[i]->MessageHandler().RemoveObserver(); - } - } - -////////////////////////////////////////////////////////////// -// --------------------------------------------------------------------------- -// CIMCVEngineFactory::HandleNotifyChange() -// --------------------------------------------------------------------------- -// -void CIMCVEngineFactory::HandleNotifyChange( - TServiceId aServiceId ) - { - TRAP_IGNORE( DoHandleServiceChangeL(aServiceId ) ); - } - -// --------------------------------------------------------------------------- -// CIMCVEngineFactory::DoHandleServiceChangeL() -// --------------------------------------------------------------------------- -// -void CIMCVEngineFactory::DoHandleServiceChangeL( TInt aServiceId ) - { - // check service Id exist intable - CSPSettings* settings = CSPSettings::NewLC(); - RArray services; - CleanupClosePushL( services ); - settings->FindServiceIdsL( services ); - const TInt serviceCount = services.Count(); - TBool serviceExist = EFalse; - for ( TInt i( 0 ); i < serviceCount; i++ ) - { - TInt serviceId = services[ i ]; - TUint32 refContactUid = ContactViewUidL(*settings , serviceId ); - if ( TUid::Uid( refContactUid ) == - TUid::Uid( 0x20012423 ) - || TUid::Uid( refContactUid ) == - TUid::Uid( 0x20007B6D ) - || TUid::Uid( refContactUid ) == - TUid::Uid( 0x2002B334 ) ) - { - if( aServiceId == serviceId ) - { - serviceExist = ETrue; - } - } - } - CleanupStack::PopAndDestroy( &services ); - - // if service does not exist delete the engine if created - if( !serviceExist ) - { - // delete if already created - TInt count = iServiceEngines.Count(); - for( TInt i=0; iGetServiceId() == aServiceId ) - { - if( iServiceChangeObserver ) - { - // this will delete the new branding icosn for smile etc. - iServiceChangeObserver->HandleServiceDeletedL( aServiceId ); - } - CIMCVEngine* engine = iServiceEngines[i]; - engine->OpenChats().UnRegisterObserver(); - engine->MessageHandler().RemoveObserver(); - engine->ChatInterface().UnregisterChatListObserver( this ); - - iServiceEngines.Remove(i); - delete engine; - engine = NULL; - iServiceEngines.Compress(); - break; - } - } - if( !iServiceEngines.Count() ) - { - ShutDownConversationviewL(); - } - } - else - { - // service exist check whether we have service engine or not - // create if we dont have - TBool newService = ETrue; - TInt count = iServiceEngines.Count(); - for( TInt i=0; iGetServiceId() == aServiceId ) - { - newService = EFalse; - break; - } - } - if ( newService && CheckValidIMServiceL( *settings, aServiceId ) ) - { - // create if NULL and return - GetServiceEngineL( aServiceId ); - if( iServiceChangeObserver ) - { - // this will create the new branding icosn for smile etc. - iServiceChangeObserver->HandleNewServiceL( aServiceId ); - } - } - } - CleanupStack::PopAndDestroy( settings ); - } - -// --------------------------------------------------------------------------- -// CIMCVEngineFactory::HandleError() -// --------------------------------------------------------------------------- -// -void CIMCVEngineFactory::HandleError( TInt /*aError*/ ) - { - } - // --------------------------------------------------------------------------- -// CIMCVEngineFactory::ShutDownConversationviewL() -// --------------------------------------------------------------------------- -// -void CIMCVEngineFactory::ShutDownConversationviewL() - { - // Kills cv if running - RWsSession ws; - User::LeaveIfError( ws.Connect() ); - CleanupClosePushL( ws ); - TApaTaskList list( ws ); - TApaTask task( list.FindApp( KConversationViewAppUid ) ); - if ( task.Exists() ) - { - task.EndTask(); - } - CleanupStack::PopAndDestroy( &ws ); // ws - } -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory::HandlePresenceChangedL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CIMCVEngineFactory::HandlePresenceChangedL(TInt aServiceId, const TDesC& aBuddyId ) - { - if( iServiceChangeObserver ) - { - // this will create the new branding icosn for smile etc. - iServiceChangeObserver->HandlePresenceChangedL( aServiceId , aBuddyId ); - } - } -// --------------------------------------------------------- -// CIMCVEngineFactory::HandleOperationCompletdL -// Handles operation completion -// --------------------------------------------------------- -// -void CIMCVEngineFactory::HandleOperationCompletdL(TInt aServiceId , MIMCVEngineMessage::TMessagerType aType , TInt aResult ) - { - if( iServiceChangeObserver ) - { - // this will create the new branding icosn for smile etc. - iServiceChangeObserver->HandleOperationCompletdL( aServiceId , aType, aResult ); - } - } - - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory::HandleConnectionTerminatedL -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CIMCVEngineFactory::HandleConnectionEventL( TInt aServiceId, TIMCVConnectionState aState, TInt aReason ) - { - if( iServiceChangeObserver ) - { - // this will create the new branding icosn for smile etc. - iServiceChangeObserver->HandleConnectionEventL( aServiceId , aState, aReason ); - } - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineFactory: HandleChatListEvent -// ----------------------------------------------------------------------------- -// -void CIMCVEngineFactory::HandleChatListEvent(TInt aServiceId, TChatListEventType aEvent, - MIMCVEngineMessageReadInterface* aContainerInfo - ) - { - if( iServiceChangeObserver ) - { - // this will create the new branding icosn for smile etc. - iServiceChangeObserver->HandleChatListEvent( aServiceId , aEvent, aContainerInfo ); - } - } -// End of File