sl@0: /* sl@0: * Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: Implementation of the RoomLevel effect message handler class. sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: // INCLUDE FILES sl@0: #include "RoomLevelMessageHandler.h" sl@0: #include "RoomLevelMessageTypes.h" sl@0: #include sl@0: #include "EffectDataQueItem.h" sl@0: #include sl@0: #ifdef _DEBUG sl@0: #include sl@0: #endif sl@0: sl@0: // ================= MEMBER FUNCTIONS ======================= sl@0: sl@0: // C++ default constructor can NOT contain any code, that sl@0: // might leave. sl@0: // sl@0: CRoomLevelMessageHandler::CRoomLevelMessageHandler( sl@0: CRoomLevel* aRoomLevel ) sl@0: : CMMFObject(KUidRoomLevelEffect), sl@0: iRoomLevel(NULL), sl@0: iMessage(NULL), sl@0: iRegistered(EFalse), sl@0: iEffectDataQue(NULL) sl@0: { sl@0: iRoomLevel = aRoomLevel; sl@0: } sl@0: sl@0: sl@0: EXPORT_C CRoomLevelMessageHandler* CRoomLevelMessageHandler::NewL( sl@0: TAny* aCustomInterface ) sl@0: { sl@0: CRoomLevel* roomLevel = (CRoomLevel*)aCustomInterface; sl@0: CRoomLevelMessageHandler* self = new (ELeave) CRoomLevelMessageHandler(roomLevel); sl@0: self->ConstructL(); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelMessageHandler::ConstructL sl@0: // Symbian 2nd phase constructor can leave. sl@0: // Create and initializes the effect data queue. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CRoomLevelMessageHandler::ConstructL() sl@0: { sl@0: iEffectDataQue = new(ELeave) TSglQue(_FOFF(CEffectDataQueItem, iLink)); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CRoomLevelMessageHandler::~CRoomLevelMessageHandler sl@0: // Before going away, unregister with the CI RoomLevel object. sl@0: // The observation message must be completed if outstanding. sl@0: // The effect data queue must be emptied and destroyed. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CRoomLevelMessageHandler::~CRoomLevelMessageHandler() sl@0: { sl@0: sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelMessageHandler::~CRoomLevelMessageHandler")); sl@0: #endif sl@0: if(iRoomLevel) sl@0: iRoomLevel->UnRegisterObserver(*this); sl@0: iRegistered = EFalse; sl@0: sl@0: if(iMessage) sl@0: { sl@0: if ( !iMessage->IsCompleted() ) sl@0: { sl@0: iMessage->Complete(KErrCancel); sl@0: delete iMessage; sl@0: } sl@0: } sl@0: sl@0: if ( iEffectDataQue ) sl@0: { sl@0: CEffectDataQueItem* queItem; sl@0: while ( !iEffectDataQue->IsEmpty() ) sl@0: { sl@0: queItem = iEffectDataQue->First(); sl@0: iEffectDataQue->Remove(*queItem); sl@0: delete queItem; sl@0: } sl@0: sl@0: delete iEffectDataQue; sl@0: } sl@0: sl@0: delete iRoomLevel; sl@0: sl@0: } sl@0: sl@0: sl@0: // --------------------------------------------------------- sl@0: // CRoomLevelMessageHandler::HandleRequest sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CRoomLevelMessageHandler::HandleRequest( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: ASSERT(aMessage.Destination().InterfaceId() == KUidRoomLevelEffect); sl@0: TRAPD(error,DoHandleRequestL(aMessage)); sl@0: if ( error ) sl@0: { sl@0: aMessage.Complete(error); sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CRoomLevelMessageHandler::DoHandleRequestL sl@0: // Dispatches the message to the appropriate handler. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CRoomLevelMessageHandler::DoHandleRequestL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: switch( aMessage.Function() ) sl@0: { sl@0: case ERoomInitialize: sl@0: { sl@0: DoInitializeL(aMessage); sl@0: break; sl@0: } sl@0: case ERoomApply: sl@0: { sl@0: DoApplyL(aMessage); sl@0: break; sl@0: } sl@0: case ERoomObserve: sl@0: { sl@0: DoObserveL(aMessage); sl@0: break; sl@0: } sl@0: default: sl@0: { sl@0: aMessage.Complete(KErrNotSupported); sl@0: } sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CRoomLevelMessageHandler::DoInitializeL sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CRoomLevelMessageHandler::DoInitializeL(TMMFMessage& aMessage) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelMessageHandler::DoInitializeL")); sl@0: #endif sl@0: aMessage.WriteDataToClient(iRoomLevel->DoEffectData()); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CRoomLevelMessageHandler::DoApplyL sl@0: // Extracts the data from the message. The client RoomLevel sl@0: // data is applied to the CI RoomLevel object. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CRoomLevelMessageHandler::DoApplyL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelMessageHandler::DoApplyL")); sl@0: #endif sl@0: TEfRoomLevelDataPckg RoomLevelPckgFromClient; sl@0: aMessage.ReadData1FromClient(RoomLevelPckgFromClient); sl@0: iRoomLevel->SetEffectData(RoomLevelPckgFromClient); sl@0: iRoomLevel->ApplyL(); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CRoomLevelMessageHandler::DoObserveL sl@0: // Receives the observation request message and depending sl@0: // on the status of the effect data queue, the message is sl@0: // completed immediately or saved for later completion. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CRoomLevelMessageHandler::DoObserveL( sl@0: TMMFMessage& aMessage ) sl@0: { sl@0: sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelMessageHandler::DoObserveL")); sl@0: #endif sl@0: sl@0: if ( !iRegistered ) sl@0: { sl@0: iRoomLevel->RegisterObserverL(*this); sl@0: iRegistered = ETrue; sl@0: } sl@0: sl@0: if ( iEffectDataQue->IsEmpty() ) sl@0: { sl@0: //iMessage = &aMessage; sl@0: iMessage = new(ELeave) TMMFMessage(aMessage); sl@0: } sl@0: else sl@0: { sl@0: TEfRoomLevelDataPckg dataPckg; sl@0: CEffectDataQueItem* item = iEffectDataQue->First(); sl@0: dataPckg.Copy(item->EffectData()); sl@0: aMessage.WriteDataToClient(dataPckg); sl@0: aMessage.Complete(KErrNone); sl@0: iEffectDataQue->Remove(*item); sl@0: delete item; sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CRoomLevelMessageHandler::EffectChanged sl@0: // The CI RoomLevel object has changed state. sl@0: // The observation message is completed if no data has been sl@0: // queued up. Otherwise, the CI RoomLevel object's data is sl@0: // packaged and queued. sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CRoomLevelMessageHandler::EffectChanged( sl@0: const CAudioEffect* aAudioEffect, sl@0: TUint8 /*aEvent*/ ) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelMessageHandler::EffectChanged")); sl@0: #endif sl@0: sl@0: if ( iMessage && !iMessage->IsCompleted() && iEffectDataQue->IsEmpty() ) sl@0: { sl@0: iMessage->WriteDataToClient(((CRoomLevel*)aAudioEffect)->DoEffectData()); sl@0: iMessage->Complete(KErrNone); sl@0: delete iMessage; sl@0: iMessage = NULL; sl@0: } sl@0: else sl@0: { sl@0: // Saves the data and complete an observation message next time around. sl@0: HBufC8* data = NULL; sl@0: TRAPD(err1,data = ((CRoomLevel*)aAudioEffect)->DoEffectData().AllocL()); sl@0: if(!err1) sl@0: { sl@0: //CleanupStack::PushL(data); sl@0: CEffectDataQueItem* item = NULL; sl@0: TRAPD(err2,item = CEffectDataQueItem::NewL(data)); sl@0: if(!err2) sl@0: { sl@0: iEffectDataQue->AddLast(*item); sl@0: } sl@0: else sl@0: { sl@0: delete data; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CRoomLevelMessageHandler::EffectChanged Error Allocating Memory %d"),err1); sl@0: #endif sl@0: } sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: // ========================== OTHER EXPORTED FUNCTIONS ========================= sl@0: sl@0: sl@0: // End of File