instantmessagesalert/src/cimalertmanager.cpp
branchRCL_3
changeset 29 9a48e301e94b
parent 0 5e5d6b214f4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/instantmessagesalert/src/cimalertmanager.cpp	Wed Sep 01 12:33:36 2010 +0100
@@ -0,0 +1,920 @@
+/*
+* 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:  This class gives interface to play IM message alert.
+*
+*/
+
+// INCLUDE FILES
+#include    "cimalertmanager.h"
+#include    "imalertdebugprint.h"      
+#include    "mimalertmanagerobserver.h"
+#include    "mimalertnotifierinterface.h"
+#include    "imalertnotifierfactory.h"
+
+#include    <MProfileEngine.h>
+#include	<pathinfo.h>
+#include    <mda/common/resource.h>
+#include    <AudioPreference.h>
+#include    <bautils.h>
+#include    <hwrmvibrasdkcrkeys.h>
+#include    <coreapplicationuisdomainpskeys.h>
+#include    <ProfileEngineSDKCRKeys.h>
+#include    <MProfileTones.h>
+#include    <TProfileToneSettings.h>
+#include    <MProfile.h>
+#include    <hwrmvibra.h>
+
+//to get message tone file
+#include <cvimpstsettingsstore.h>
+
+
+// CONSTANTS
+const TInt KMinVolumeLevel( 1 );
+const TInt KMaxVolumeLevel( 10 );
+const TInt KToneInterval( 1000000 ); // 1 second pause between tones
+
+_LIT( KChatRngMimeType, "application/vnd.nokia.ringing-tone" );
+_LIT( KBeepOnceSound, "beep.rng" );
+_LIT( KProfileSilentTone, "No_Sound.wav" ); 
+
+    
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CIMAlertManager::CIMAlertManager
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CIMAlertManager::CIMAlertManager()
+    :   iAudioPlayerStatus( EAudioPlayerNotCreated ),
+		iTonePlayerStatus( EAudioPlayerNotCreated ),
+        iIsPlayingDefaultIMSound( EFalse )
+    {
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::ConstructL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+
+void CIMAlertManager::ConstructL()
+    {
+    CHAT_DP_FUNC_ENTER("ConstructL");    
+    iProfileApi = CreateProfileEngineL();
+        
+    User::LeaveIfError( iFs.Connect() );
+
+    CHAT_DP_TXT("CMdaAudioPlayerUtility::NewL()" );
+
+	iAudioPlayer = CMdaAudioPlayerUtility::NewL( *this );
+	iAudioPlayerStatus = EAudioPlayerReady;
+
+    CHAT_DP_TXT("CMdaAudioToneUtility::NewL()" );
+	iTonePlayer = CMdaAudioToneUtility::NewL( *this );
+	iTonePlayerStatus = EAudioPlayerReady;
+ 
+    iProfilesRepository = CRepository::NewL( KCRUidProfileEngine );
+    iVibraRepository = CRepository::NewL( KCRUidVibraCtrl );
+ 
+    // Get initial settings from active profile
+    iRingingVolumeNotifyHandler = CCenRepNotifyHandler::NewL( *this, 
+                                              *iProfilesRepository,
+                                              CCenRepNotifyHandler::EIntKey,
+                                              KProEngActiveRingingVolume );
+    iRingingVolumeNotifyHandler->StartListeningL();
+    
+    
+    iRingingTypeNotifyHandler = CCenRepNotifyHandler::NewL( *this, 
+                                              *iProfilesRepository,
+                                              CCenRepNotifyHandler::EIntKey,
+                                              KProEngActiveRingingType );
+    iRingingTypeNotifyHandler->StartListeningL();
+    
+    
+    iVibraNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iVibraRepository,
+                                              CCenRepNotifyHandler::EIntKey,
+                                              KVibraCtrlProfileVibraEnabled );
+    iVibraNotifyHandler->StartListeningL();
+    
+    User::LeaveIfError( iProfilesRepository->Get( KProEngActiveRingingVolume, 
+                                                  iRingingVolume ) );
+                                                 
+    User::LeaveIfError( iVibraRepository->Get( KVibraCtrlProfileVibraEnabled, 
+                                               iVibra ) );
+    
+    User::LeaveIfError( iApaSession.Connect() );
+
+    // register for changes in message Tone quitting
+    iNotifierAPI = IMAlertNotifierFactory::CreateNotifierL( this );
+    iNotifierAPI->ListenKeyChanges( MIMAlertNotifierInterface::EMSGToneQuitKey );
+
+    iToneFileName = HBufC::NewL( KMaxPath );
+
+    // Get path to beep once ringing tone, first check simple sound folder.
+    TFileName beepFile = PathInfo::RomRootPath();
+    beepFile.Append( PathInfo::SimpleSoundsPath() );
+    beepFile.Append( KBeepOnceSound );
+    RFile file;
+    TInt openErr = file.Open( iFs, beepFile, EFileRead );
+    file.Close();
+    
+    if ( openErr == KErrNotFound || openErr == KErrPathNotFound )
+        {
+        // Check digital sounds folder
+        beepFile.Zero();
+        beepFile.Append( PathInfo::RomRootPath() );
+        beepFile.Append( PathInfo::DigitalSoundsPath() );
+        beepFile.Append( KBeepOnceSound );
+        openErr = file.Open( iFs, beepFile, EFileRead );
+        file.Close();
+        }    
+    
+    CHAT_DP( D_PLAIN_LIT( "CIMAlertManager::ConstructL() openErr = %d" ), openErr );
+    
+    if ( openErr == KErrNone )
+        {
+        iBeepRingingTone = beepFile.AllocL();
+        TPtrC ptr = iBeepRingingTone->Des();
+        CHAT_DP( D_PLAIN_LIT( "CIMAlertManager::ConstructL() iBeepRingingTone = %S" ), &ptr );
+        }
+    else
+        {
+        HandleError( openErr );
+        }
+
+    // get active ringing type, change events come to us later...
+    iActiveProfile = iProfileApi->ActiveProfileL();
+    const MProfileTones& profileTones = iActiveProfile->ProfileTones();
+    const TProfileToneSettings& profileSettings = profileTones.ToneSettings();
+    iRingingType = profileSettings.iRingingType;
+    iActiveProfile->Release();
+    iActiveProfile = NULL; // prevent further usage
+    // after this, active ringing type changes are notified via the cenrep
+    // notify handler callback through HandleNotifyInt
+    
+    // TRAP to catch leaves, leaves with KErrNotSupported if vibra
+    // is not supported
+    TRAPD( err, iVibrator = CHWRMVibra::NewL() );
+    if ( err == KErrNotSupported )
+        {
+        // Make sure it's NULL
+        iVibrator = NULL;
+        }
+    else
+        {
+        // Leave with other errors e.g. KErrNoMemory
+        User::LeaveIfError( err );
+        }
+    iSettingsStore = CVIMPSTSettingsStore::NewL();
+    CHAT_DP_FUNC_DONE("ConstructL");
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::NewL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+EXPORT_C CIMAlertManager* CIMAlertManager::NewL()
+    {
+    CIMAlertManager* self = new( ELeave ) CIMAlertManager();
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// CIMAlertManager::~CIMAlertManager
+// (other items were commented in a header).
+// ---------------------------------------------------------
+CIMAlertManager::~CIMAlertManager()
+    {
+    CHAT_DP_FUNC_ENTER("~CIMAlertManager");
+    Stop(); // Stops possible playback
+
+    if ( iActiveProfile )
+        {
+        iActiveProfile->Release();
+        iActiveProfile = NULL; // prevent further usage
+        }
+
+    if ( iProfileApi ) 
+        {
+        iProfileApi->Release();
+        iProfileApi = NULL;
+        }
+
+    if ( iVibraNotifyHandler )
+        {
+        iVibraNotifyHandler->StopListening();
+        delete iVibraNotifyHandler;
+        iVibraNotifyHandler = NULL;
+        }
+    
+    if ( iRingingTypeNotifyHandler )
+        {
+        iRingingTypeNotifyHandler->StopListening();
+        delete iRingingTypeNotifyHandler;
+        iRingingTypeNotifyHandler = NULL;
+        }
+    
+
+    if ( iRingingVolumeNotifyHandler )
+        {
+        iRingingVolumeNotifyHandler->StopListening();
+        delete iRingingVolumeNotifyHandler;
+        iRingingVolumeNotifyHandler = NULL;
+        }
+    if(iProfilesRepository)
+        {
+        delete iProfilesRepository;
+        iProfilesRepository = NULL;
+        }
+    if(iVibraRepository)
+        {
+        delete iVibraRepository;
+        iVibraRepository = NULL;
+        }
+    
+    iApaSession.Close();
+    
+    if(iNotifierAPI)
+        {
+        delete iNotifierAPI;
+        iNotifierAPI = NULL;
+        }
+    
+    if(iAudioPlayer)
+        {
+        CHAT_DP_TXT( "delete CMdaAudioPlayerUtility" );
+        iAudioPlayer->Close();
+        delete iAudioPlayer;
+        iAudioPlayer = NULL;
+        }
+    if(iTonePlayer)
+        {
+        CHAT_DP_TXT( "delete CMdaAudioToneUtility" );
+        delete iTonePlayer;
+        iTonePlayer = NULL;
+        }
+    
+    iObservers.Close();
+
+    if(iToneFileName)
+        {
+        delete iToneFileName;
+        iToneFileName = NULL;
+        }
+
+    if(iVibrator)
+        {
+        delete iVibrator;
+        iVibrator = NULL;
+        }
+
+    if(iBeepRingingTone)
+        {
+        delete iBeepRingingTone;
+        iBeepRingingTone = NULL;
+        }
+
+    iFs.Close();
+    
+    if(iSettingsStore)
+        {
+        delete iSettingsStore;
+        iSettingsStore = NULL;
+        }
+    
+    CHAT_DP_FUNC_DONE("~CIMAlertManager");
+    }
+
+
+// ---------------------------------------------------------
+// CIMAlertManager::Play
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CIMAlertManager::PlayL(TUint32 aServiceId)
+    {
+    CHAT_DP_FUNC_ENTER("Play");
+    TInt emergencyCallOngoing(0);
+    TInt err = RProperty::Get( KPSUidCtsyEmergencyCallInfo, KCTSYEmergencyCallInfo, emergencyCallOngoing );
+
+    if( !emergencyCallOngoing )
+        {
+        Stop();
+        TRAPD( err, DoPlayL(aServiceId) );
+        if( err )
+            {
+            HandleError( err );
+            }
+        }
+    CHAT_DP_FUNC_DONE("Play");
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::DoPlayL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CIMAlertManager::DoPlayL(TUint32 aServiceId)
+    {
+    CHAT_DP_FUNC_ENTER("DoPlayL");
+
+    TBuf<KMaxPath> toneFileName;
+
+    // check if we're silent or not
+    iActiveProfile = iProfileApi->ActiveProfileL();
+    TBool isSilent = iActiveProfile->IsSilent();
+    iActiveProfile->Release();
+    iActiveProfile = NULL; // prevent further usage
+
+    // vibrate, if it's allowed
+    CHWRMVibra::TVibraModeState vibraModeState = iVibrator->VibraSettings();
+    CHWRMVibra::TVibraStatus vibraStatus = iVibrator->VibraStatus();
+   
+    // TODO: Find from Nikhil what the behaviour should be if Vibra is already
+    // on and you get a new message. Aare you supposed to truncate the existing
+    // vibration and start afresh or let the existing vibration continue?
+    if ( vibraModeState == CHWRMVibra::EVibraModeON && 
+         vibraStatus == CHWRMVibra::EVibraStatusStopped )
+        {
+        iVibrator->StartVibraL( KIMVibraDuration );
+        }
+
+    // sound ordering:
+    //  silent: get out.
+    //  beep once: beep, and if ok, exit.
+    //  if beep failed, or not active: try to play sound
+    //  for this server.
+    //  if it failed, play default sound.
+
+    if ( isSilent ) 
+        {
+        // Silent profile, get out.
+        CHAT_DP_TXT( "DoPlayL - Returning" );
+        return;
+        }
+
+    TInt err = KErrNone;
+
+    if ( iRingingType == EProfileRingingTypeBeepOnce && iBeepRingingTone )
+        {
+        // Play beep.rng
+        TRAP( err, ProcessFileL( *iBeepRingingTone ) );
+        }
+    
+    if ( err != KErrNone || iRingingType != EProfileRingingTypeBeepOnce )
+        {
+        err = KErrNone;
+
+        // Beep once not active, or beep once failed.
+        // Try to play the sound set for this server
+        TBuf<KMaxPath> toneFileName;
+		GetToneFileNameL( toneFileName, aServiceId );
+		TParsePtr parsedPtr( toneFileName );
+		
+		CHAT_DP( D_CHAT_LIT(" file = [%S] "),&toneFileName);
+
+		// If alert tone OFF, don't play anything
+        if( parsedPtr.NameAndExt().Compare( KProfileSilentTone ) != 0 )
+            {
+            // Not OFF
+            TRAP( err, ProcessFileL( toneFileName ) );        
+            }
+        }
+
+    // Not ringing once, but left
+    User::LeaveIfError( err );
+
+    CHAT_DP_FUNC_DONE("DoPlayL");
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::Stop
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CIMAlertManager::Stop()
+    {
+    CHAT_DP_FUNC_ENTER("Stop");
+
+    if( iAudioPlayerStatus == EAudioPlayerPlaying )
+        {
+        CHAT_DP_TXT( 
+            "Audio player is playing. CMdaAudioPlayerUtility::Stop()" );
+        iAudioPlayer->Stop();
+        iAudioPlayer->Close();
+        iAudioPlayerStatus = EAudioPlayerReady;
+        }
+    
+    if( iTonePlayerStatus == EAudioPlayerPlaying )
+        {
+        CHAT_DP_TXT( 
+            "Tone player is playing. CMdaAudioToneUtility::CancelPlay()" );
+        iTonePlayer->CancelPlay();
+        iTonePlayerStatus = EAudioPlayerReady;
+        }    
+   
+    CHAT_DP_FUNC_DONE("Stop");
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::SetVolume
+// Set the volume at which the sound is played
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CIMAlertManager::SetVolume( TInt aVolume )
+    {
+    iRingingVolumeNotifyHandler->StopListening();
+    iRingingVolume = aVolume;
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::SetRingingType
+// Sets the ringing type how the sound is played
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CIMAlertManager::SetRingingType( TProfileRingingType aRingingType )
+    {
+    if(iRingingTypeNotifyHandler)
+        {
+        iRingingTypeNotifyHandler->StopListening();
+        iRingingType = aRingingType;
+        }
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::SetVibra
+// Sets the vibrating alert on or off
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CIMAlertManager::SetVibra( TBool aVibra )
+    {
+    if(iVibraNotifyHandler)
+        {
+        iVibraNotifyHandler->StopListening();
+        iVibra = aVibra;
+        }
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::AddObserverL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CIMAlertManager::AddObserverL( const MIMAlertManagerObserver* aObserver )
+	{
+    // make sure that aObserver does not get appended in release mode also.
+	if( aObserver )  
+		{
+   		User::LeaveIfError( iObservers.Append( aObserver ) );
+		}
+	}
+
+// ---------------------------------------------------------
+// CIMAlertManager::RemoveObserver
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CIMAlertManager::RemoveObserver( const MIMAlertManagerObserver* aObserver )
+	{
+	TInt index( iObservers.Find( aObserver ) );
+
+	if( index != KErrNotFound )
+		{
+		iObservers.Remove( index );
+		}
+	}
+
+// ---------------------------------------------------------
+// CIMAlertManager::ProcessFileL
+// If filename is defined, prepare the audioplayer.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMAlertManager::ProcessFileL( const TDesC& aFileName )
+    {
+    CHAT_DP_FUNC_ENTER("ProcessFileL");
+
+    TFileName *fileName = new (ELeave) TFileName();
+    CleanupStack::PushL( fileName );
+
+    // if filename is empty, use default sound
+    if ( aFileName.Length() == 0 )
+        {
+        return;
+        }
+    else
+        {
+        *fileName = aFileName;
+        }
+
+    TPtr filePtr( NULL, 0 );
+    if( !BaflUtils::FileExists( iFs, *fileName ) )
+        {
+        CHAT_DP( D_CHAT_LIT( "File does not exist ( %S )" ), &(*fileName) );
+        User::Leave( KErrNotFound );
+        }
+
+    Stop(); // Stops possible playback 
+
+    TUid dummyUid( KNullUid );
+	TDataType dataType;
+	
+    User::LeaveIfError( iApaSession.AppForDocument( *fileName, dummyUid, 
+                                                    dataType ) );
+
+    if( dataType.Des().CompareF( KChatRngMimeType ) == 0 ) 
+        {
+        // making sure that another initializing is not already ongoing
+        if( iTonePlayerStatus == EAudioPlayerReady )
+            {
+            CHAT_DP( D_CHAT_LIT( 
+                "CMdaAudioToneUtility::PrepareToPlayFileSequence( %S )" ), 
+                &(*fileName));
+            iTonePlayerStatus = EAudioPlayerInitializing;
+            iTonePlayer->PrepareToPlayFileSequence( *fileName );
+            }
+        }
+    else
+        {
+        // making sure that another initializing is not already ongoing
+        if( iAudioPlayerStatus == EAudioPlayerReady )
+            {
+            CHAT_DP( D_CHAT_LIT(
+                "FileList - CMdaAudioPlayerUtility::OpenFileL( %S )" ), 
+                &(*fileName));
+            iAudioPlayerStatus = EAudioPlayerInitializing;
+            TRAPD( err, iAudioPlayer->OpenFileL( *fileName ) );
+            CHAT_DP( D_CHAT_LIT(
+                "FileList - CMdaAudioPlayerUtility::OpenFileL err = %d" ), 
+                err );
+            if( err )
+                {              
+                iAudioPlayerStatus = EAudioPlayerReady;
+                User::Leave( err );
+                }
+            }
+        }    
+
+    CleanupStack::PopAndDestroy( fileName );
+    CHAT_DP_FUNC_DONE("ProcessFileL");
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::DoSetRingingType
+// When audioplayer is ready, set its ringing type
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+
+void CIMAlertManager::DoSetRingingType( TInt aRingingType )
+    {
+    if( iAudioPlayerStatus == EAudioPlayerInitialized )
+        {
+        switch( aRingingType )
+            {
+			// Fall through
+            case EProfileRingingTypeRingingOnce:
+                {
+                iAudioPlayer->SetRepeats( 0, 
+                        TTimeIntervalMicroSeconds( KToneInterval ) );
+                break;
+                }
+            case EProfileRingingTypeBeepOnce:
+                {
+                iAudioPlayer->SetRepeats( 0, 
+                        TTimeIntervalMicroSeconds( KToneInterval ) );
+                break;
+                }
+            default:
+                {
+                break;
+                }
+            }
+        }
+    else if( iTonePlayerStatus == EAudioPlayerInitialized )
+        {
+        switch( aRingingType )
+            {
+			// Fall through
+            case EProfileRingingTypeRingingOnce:
+                {
+                iTonePlayer->SetRepeats( 0, 
+                        TTimeIntervalMicroSeconds( KToneInterval ) );
+                break;
+                }
+            case EProfileRingingTypeBeepOnce:
+                {
+                iTonePlayer->SetRepeats( 0, 
+                        TTimeIntervalMicroSeconds( KToneInterval ) );
+                break;
+                }
+            default:
+                {
+                break;
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::ConvertVolume
+// Convert volume to the scale used by hardware.
+// E.g. Profiles lets user select volume 1-10, but hw's scale is normally 1-9.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CIMAlertManager::ConvertVolume( TInt aVolume )
+    {
+    TInt result( 0 );
+    // if ringing type is "silent" then volume
+    // is zero
+    if( iRingingType != EProfileRingingTypeSilent )
+        {
+        if ( iAudioPlayerStatus == EAudioPlayerInitialized ||
+            iAudioPlayerStatus == EAudioPlayerPlaying )
+            {
+            result = iAudioPlayer->MaxVolume() * aVolume / KMaxVolumeLevel;
+            if ( aVolume == KMinVolumeLevel && result == 0 )
+                {
+                result = 1;
+                }
+            }
+        else if( iTonePlayerStatus == EAudioPlayerInitialized ||
+            iTonePlayerStatus == EAudioPlayerPlaying )
+            {
+            result = iTonePlayer->MaxVolume() * aVolume / KMaxVolumeLevel;
+            if ( aVolume == KMinVolumeLevel && result == 0 )
+                {
+                result = 1;
+                }
+            }
+        }
+    return result;
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::HandleError
+// Notifies all observers that playing is completed
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMAlertManager::HandleError( TInt aError )
+    {
+    if ( ( aError == KErrNoMemory ) || 
+         ( aError == KErrDiskFull ) ) 
+		{
+		CActiveScheduler::Current()->Error( aError );
+		}
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::GetToneFileNameL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMAlertManager::GetToneFileNameL( TDes& aToneFileName ,TUint32 aServiceId)
+	{
+    RBuf buffer;
+    buffer.CreateL( RProperty::KMaxPropertySize ); 
+    CleanupClosePushL( buffer );
+    iSettingsStore->GetL(aServiceId, EServiceToneFileName, buffer); 
+    aToneFileName.Copy( buffer );
+    CleanupStack::PopAndDestroy();  //buffer
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::MapcInitComplete
+// This method is called when the audioplayer initialisation is ready.
+// If file format is supported, start playing the sound file.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMAlertManager::MapcInitComplete(
+    TInt aError, const TTimeIntervalMicroSeconds& /* aDuration */ )
+    {
+    CHAT_DP( D_CHAT_LIT(
+        "MMdaAudioPlayerCallback::MapcInitComplete() callback, error == %d" ), 
+        aError);
+
+    if ( !aError && iAudioPlayerStatus == EAudioPlayerInitializing )
+        {
+        iAudioPlayerStatus = EAudioPlayerInitialized;
+        // currently IM messages supports only this ringing type
+        // ringing once
+        DoSetRingingType( EProfileRingingTypeRingingOnce );
+        CHAT_DP( D_CHAT_LIT("CMdaAudioPlayerUtility::SetVolume( %d )" ), 
+                 iRingingVolume);
+        
+        iAudioPlayer->SetVolume( ConvertVolume( iRingingVolume ) );
+        
+        // TODO: please check the value KAudioPrefNewSpecialMessage.
+        // WHy does it have this particular value? What is the rationale.
+        //
+        CHAT_DP( D_CHAT_LIT("CMdaAudioPlayerUtility::SetPriority( %d, %d )" ),
+            KAudioPriorityRecvMsg, 
+            TMdaPriorityPreference( KAudioPrefNewSpecialMessage ) );
+            
+        iAudioPlayer->SetPriority( KAudioPriorityRecvMsg,
+            TMdaPriorityPreference( KAudioPrefNewSpecialMessage ) );
+            
+        CHAT_DP_TXT("CMdaAudioPlayerUtility::Play()" );
+        iAudioPlayer->Play();
+        iAudioPlayerStatus = EAudioPlayerPlaying;
+        iNotifierAPI->SetInt( MIMAlertNotifierInterface::EMSGToneQuitKey, 
+                              ECoreAppUIsTonePlaying );
+        }
+    else
+        {
+        Stop();
+        iAudioPlayerStatus = EAudioPlayerReady;
+        if( ( ( aError == KErrNotSupported ) || ( aError == KErrCorrupt ) ))
+            {
+            return;
+            }
+        else
+            {
+            HandleError( aError );
+            iIsPlayingDefaultIMSound = EFalse;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::MapcPlayComplete
+// This method is called when the audioplayer has finished playing a sound
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMAlertManager::MapcPlayComplete( TInt aError )
+    {
+    CHAT_DP( D_CHAT_LIT(
+        "MMdaAudioPlayerCallback::MapcPlayComplete() callback, error == %d" ), 
+        aError);
+    iNotifierAPI->SetInt( MIMAlertNotifierInterface::EMSGToneQuitKey, ECoreAppUIsTonePlayingUninitialized );
+    iAudioPlayer->Close();
+    iAudioPlayerStatus = EAudioPlayerReady;
+    
+    if( ( ( aError == KErrNotSupported ) || ( aError == KErrCorrupt ) ) )
+        {
+        return;
+        }
+    else
+        {
+        HandleError( aError );
+        iIsPlayingDefaultIMSound = EFalse;
+        }
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::HandleKeyChange
+// This method receives notifications from the shared data server
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMAlertManager::HandleKeyChange( TUpdatedKey& aUpdatedValues )
+    {
+    CHAT_DP_FUNC_ENTER("HandleKeyChange");
+    
+    // If we have an event which changes the key value to 
+    // ECoreAppUIsStopTonePlaying -> stop playing. 
+    if( aUpdatedValues.iValue == ECoreAppUIsStopTonePlaying )
+        {
+        // Message tone should be stopped
+        CHAT_DP_TXT( "**stop playing!**" );
+        Stop();
+        }
+    
+    CHAT_DP_FUNC_DONE("HandleKeyChange");
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::HandleNotifyInt
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CIMAlertManager::HandleNotifyInt( TUint32 aId, TInt aNewValue )
+	{
+    CHAT_DP_FUNC_ENTER("HandleNotifyL");
+    CHAT_DP( D_CHAT_LIT("aKey == %d" ), aId);
+    CHAT_DP( D_CHAT_LIT("aValue == %d" ), aNewValue);
+    
+
+    if ( aId == KProEngActiveRingingVolume  )  // Ringing volume has changed
+        {
+        iRingingVolume = aNewValue;
+        }
+    else if ( aId == KProEngActiveRingingType )  // Ringing type has changed
+        {
+        iRingingType = aNewValue;
+        }
+
+    if ( aId == KVibraCtrlProfileVibraEnabled )  // Vibra setting has changed
+        {
+        iVibra = aNewValue;
+        }
+        
+    CHAT_DP_FUNC_DONE("HandleNotifyL");
+	}
+
+// ---------------------------------------------------------
+// CIMAlertManager::MatoPrepareComplete
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMAlertManager::MatoPrepareComplete( TInt aError )
+    {
+    CHAT_DP( D_CHAT_LIT(
+        "MMdaAudioToneObserver::MatoPrepareComplete() callback, error == %d" ), 
+        aError);
+    
+    if ( !aError && iTonePlayerStatus == EAudioPlayerInitializing )
+        {
+        iTonePlayerStatus = EAudioPlayerInitialized;
+        // TODO: confirm with UI spec/Nikhil if only this ringing type is
+        // supported. If not in writing, get an entry into the UI spec done.
+        // TODO: where is this requirement specified?
+        
+        // currently IM messages supports only this ringing type
+        // ringing once
+        DoSetRingingType( EProfileRingingTypeRingingOnce );
+        CHAT_DP( D_CHAT_LIT("CMdaAudioToneUtility::SetVolume( %d )" ), 
+                ConvertVolume( iRingingVolume ));
+        iTonePlayer->SetVolume( ConvertVolume( iRingingVolume ) );
+
+
+        CHAT_DP( D_CHAT_LIT("CMdaAudioToneUtility::SetPriority( %d, %d )" ),
+                KAudioPriorityRecvMsg, 
+                TMdaPriorityPreference( KAudioPrefNewSpecialMessage ) );
+                
+        iTonePlayer->SetPriority( KAudioPriorityRecvMsg,
+            TMdaPriorityPreference( KAudioPrefNewSpecialMessage ) );
+            
+        CHAT_DP_TXT("CMdaAudioToneUtility::Play()" );
+        iTonePlayer->Play();
+        iTonePlayerStatus = EAudioPlayerPlaying;
+        iNotifierAPI->SetInt( MIMAlertNotifierInterface::EMSGToneQuitKey, 
+                              ECoreAppUIsTonePlaying );
+        }
+    else
+        {
+        Stop();
+        iTonePlayerStatus = EAudioPlayerReady;
+        
+        if( ( ( aError == KErrNotSupported ) || ( aError == KErrCorrupt ) ) )
+            {
+            return;
+            }
+        else
+            {
+            HandleError( aError );
+            iIsPlayingDefaultIMSound = EFalse;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CIMAlertManager::MatoPlayComplete
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMAlertManager::MatoPlayComplete( TInt aError )
+    {
+    CHAT_DP( D_CHAT_LIT(
+        "MMdaAudioToneObserver::MatoPlayComplete() callback, error == %d" ), 
+        aError);
+    iNotifierAPI->SetInt( MIMAlertNotifierInterface::EMSGToneQuitKey, ECoreAppUIsTonePlayingUninitialized );
+    iTonePlayerStatus = EAudioPlayerReady;
+    
+    if( ( ( aError == KErrNotSupported ) || ( aError == KErrCorrupt ) ) )
+        {
+        return ;
+        }
+    else
+        {
+        HandleError( aError );
+        iIsPlayingDefaultIMSound = EFalse;
+        }
+    }
+        
+//  End of File