diff -r 3104fc151679 -r 9a48e301e94b imstutils/imconversationview/imcvuiengine/src/cimcvenginefactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imstutils/imconversationview/imcvuiengine/src/cimcvenginefactory.cpp Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,755 @@ +/* +* 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