diff -r 000000000000 -r 8466d47a6819 emailservices/emailserver/cmailhandlerplugin/src/emailsoundhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailserver/cmailhandlerplugin/src/emailsoundhandler.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,373 @@ +/* +* Copyright (c) 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: Class to handle email sound playing. +* +*/ + +#include "emailtrace.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "emailsoundhandler.h" +#include "emailsoundstates.h" +#include "cmailhandlerpluginpanic.h" + +_LIT( KDefaultEmailTone, "z:\\data\\sounds\\digital\\Message 1.aac"); +_LIT8( KEmailBeepSequence, "\x2\x4a\x3a\x51\x9\x95\x95\xc0\x4\x0\xb\x1c\x41\x8d\x51\xa8\x0\x0" ); + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::DriveStateChangedL( TBool /*aState*/ ) + { + //causes a reload of soundpayer + iState->ProfileChanged(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CFSMailSoundHandler* CFSMailSoundHandler::NewL( + MFSNotificationHandlerMgr& aOwner ) + { + FUNC_LOG; + CFSMailSoundHandler* self = + new( ELeave ) CFSMailSoundHandler( aOwner ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::ConstructL() + { + FUNC_LOG; + + SetObserving( ETrue ); + + iProfileEngine = CreateProfileEngineL(); + iHandler = CProfileChangeNotifyHandler::NewL( this ); + iMsgToneSubscriber = CPSSubscriber::NewL( + *this, KPSUidCoreApplicationUIs, KCoreAppUIsMessageToneQuit ); + iDriveObserver = CDriveObserver::NewL( *this ); + + // After sound state initialization iState is valid pointer until + // CEmailSoundState::Uninitialize is called in the destructor. + CEmailSoundState::InitializeL( this ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CFSMailSoundHandler::CFSMailSoundHandler( + MFSNotificationHandlerMgr& aOwner ) : + CFSNotificationHandlerBase( aOwner ) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CFSMailSoundHandler::~CFSMailSoundHandler() + { + FUNC_LOG; + if ( iProfileEngine ) + { + iProfileEngine->Release(); + iProfileEngine = NULL; + } + delete iHandler; + ReleaseAudioPlayer(); + delete iDriveObserver; + delete iMsgToneSubscriber; + CEmailSoundState::Uninitialize( iState ); + } + +// --------------------------------------------------------------------------- +// HandleEvent is implemented also here because we need to check the +// Home Screen status. +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::HandleEventL( + TFSMailEvent aEvent, + TFSMailMsgId aMailbox, + TAny* aParam1, + TAny* aParam2, + TAny* aParam3 ) + { + FUNC_LOG; + // assumption: base class handles event only if it is TFSEventNewMail + CFSNotificationHandlerBase::HandleEventL( aEvent, + aMailbox, + aParam1, + aParam2, + aParam3 ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::SetState( CEmailSoundState* aNewState ) + { + FUNC_LOG; + INFO_1( "email sound state => %d", (TInt) aNewState ) + iState = aNewState; +#ifdef __HANDLER_TEST + // for module testing + if ( iTesterReqStatus ) { + TRequestStatus*& status = iTesterReqStatus; + User::RequestComplete( status, KErrNone ); + iTesterReqStatus = NULL; + } +#endif + } + +// --------------------------------------------------------------------------- +// Returns audio player utility +// --------------------------------------------------------------------------- +// +CMdaAudioPlayerUtility* CFSMailSoundHandler::AudioPlayer() + { + return iAudioPlayer; + } + +// --------------------------------------------------------------------------- +// CFSMailSoundHandler::HandleActiveProfileChangeL - Callback from end of +// play from Audio player. +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::HandleActiveProfileEventL( TProfileEvent /*aPE*/, TInt /*aId*/ ) + { + FUNC_LOG; + // iState should never be null + __ASSERT_ALWAYS( iState, Panic ( ECmailHandlerPluginPanicNullState ) ); + iState->ProfileChanged(); + } + +// --------------------------------------------------------------------------- +// CFSMailSoundHandler::MapcInitComplete - Callback from audio player +// initialization. +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::MapcInitComplete( + TInt aError, + const TTimeIntervalMicroSeconds& /*aInterval*/) + { + FUNC_LOG; + // iState should never be null + __ASSERT_ALWAYS( iState, Panic ( ECmailHandlerPluginPanicNullState ) ); + if ( aError ) + { + delete iAudioPlayer; + iAudioPlayer = NULL; + iState->AudioInitFailed(); + } + else + { + iState->AudioInitCompleted(); + } + } + +// --------------------------------------------------------------------------- +// CFSMailSoundHandler::MapcPlayComplete - Callback from end of play from +// Audio player. +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::MapcPlayComplete( TInt /*aError*/ ) + { + FUNC_LOG; + // iState should never be null + __ASSERT_ALWAYS( iState, Panic ( ECmailHandlerPluginPanicNullState ) ); + // error is ignored because there's no corrective action, next play + // request triggers re-initialization of tone. + iState->AudioPlayCompleted(); + iMsgToneSubscriber->Cancel(); + } + +// --------------------------------------------------------------------------- +// CFSMailSoundHandler::RecreateAudioPlayerL +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::RecreateAudioPlayerL() + { + FUNC_LOG; + delete iAudioPlayer; + iAudioPlayer = NULL; + + MProfile* profile = iProfileEngine->ActiveProfileL(); + CleanupReleasePushL( *profile ); + + if ( IsBeepOnceSetL( *profile ) ) + { + // create audio player based on hard coded sequence + // (Platform does not offer any "play platform-wide beep" service) + iAudioPlayer = CMdaAudioPlayerUtility::NewDesPlayerReadOnlyL( + KEmailBeepSequence(), + *this, + KAudioPriorityRecvMsg, + static_cast( KAudioPrefNewSMS ) ); + } + else + { + // Otherwise loading tone from file + TFileName fileToPlay = profile->ProfileExtraTones().EmailAlertTone(); + + RFs fs; + TInt err = fs.Connect(); + + if ( err == KErrNone ) + { + TChar chr = fileToPlay[0]; + TInt drive; + fs.CharToDrive( chr, drive ); + + //we'll observe any drive where the tone is just because + //the drive letter of the memory card can + //vary from product to product. + iDriveObserver->SetDriveL( (TDriveNumber)drive ); + + iDriveObserver->WaitForChange(); + + //test does the file exist + if ( !BaflUtils::FileExists( fs, fileToPlay ) ) + { + //if the file set in profile does not exist, we use default + fileToPlay.Zero(); + fileToPlay.Append( KDefaultEmailTone ); + } + + fs.Close(); + } + + iAudioPlayer = CMdaAudioPlayerUtility::NewFilePlayerL( + fileToPlay, + *this, + KAudioPriorityRecvMsg, + static_cast( KAudioPrefNewSMS ) ); + } + CleanupStack::PopAndDestroy( profile ); // profile + } + +// --------------------------------------------------------------------------- +// Deletes audio player utility +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::ReleaseAudioPlayer() + { + FUNC_LOG; + delete iAudioPlayer; + iAudioPlayer = NULL; + } + +// --------------------------------------------------------------------------- +// Returns profile engine +// --------------------------------------------------------------------------- +// +MProfileEngine& CFSMailSoundHandler::ProfileEngine() const + { + return *iProfileEngine; + } + +// --------------------------------------------------------------------------- +// Playes 'new email' tone +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::TurnNotificationOn() + { + FUNC_LOG; + // iState should never be null + __ASSERT_ALWAYS( iState, Panic ( ECmailHandlerPluginPanicNullState ) ); + iMsgToneSubscriber->Subscribe(); + iState->PlayTone(); + } + +// --------------------------------------------------------------------------- +// Stops playback +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::TurnNotificationOff() + { + FUNC_LOG; + // iState should never be null + __ASSERT_ALWAYS( iState, Panic ( ECmailHandlerPluginPanicNullState ) ); + iState->StopTone(); + } + +// --------------------------------------------------------------------------- +// IsBeepOnceSetL +// --------------------------------------------------------------------------- +// +TBool CFSMailSoundHandler::IsBeepOnceSetL( const MProfile& aProfile ) const + { + FUNC_LOG; + // default to false + TBool ret = EFalse; + + // get tone settings + const TProfileToneSettings& toneSettings = aProfile.ProfileTones().ToneSettings(); + + // if beep-once is set, set return value to ETrue + if( toneSettings.iRingingType == EProfileRingingTypeBeepOnce ) + { + ret = ETrue; + } + + return ret; + } + +// --------------------------------------------------------------------------- +// HandlePropertyChangedL +// --------------------------------------------------------------------------- +// +void CFSMailSoundHandler::HandlePropertyChangedL( const TUid& aCategory, TInt aKey ) + { + FUNC_LOG; + TInt state( 0 ); + + // + // Handling the event of user pressing a key while "msg received" -tone is playing + // + if ( aCategory == KPSUidCoreApplicationUIs && aKey == KCoreAppUIsMessageToneQuit ) + { + RProperty::Get( KPSUidCoreApplicationUIs, KCoreAppUIsMessageToneQuit, state ); + INFO_1("KCoreAppUIsMessageToneQuit == %d" , state ); + if ( state == ECoreAppUIsStopTonePlaying ) + { + iState->StopTone(); + iMsgToneSubscriber->Cancel(); + } + } + + // + // Handling the event of + // + }