diff -r 826cea16efd9 -r 13a33d82ad98 dvrengine/CommonRecordingEngineClient/src/CCRMsgQueueObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dvrengine/CommonRecordingEngineClient/src/CCRMsgQueueObserver.cpp Wed Sep 01 12:20:37 2010 +0100 @@ -0,0 +1,365 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Offers interface to RMsgQueue in civilized manner.* +*/ + + + + +// INCLUDE FILES +#include "CCRMsgQueueObserver.h" +#include +#include +#include "videoserviceutilsLogger.h" + +// CONSTANTS +// None + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCRMsgQueueObserver::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCRMsgQueueObserver* CCRMsgQueueObserver::NewL() + { + CCRMsgQueueObserver* self = new( ELeave ) CCRMsgQueueObserver(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCRMsgQueueObserver::CCRMsgQueueObserver() +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CCRMsgQueueObserver::CCRMsgQueueObserver() : CActive( EPriorityAbsoluteHigh ) + { + // Note! CActive's priority must be absolute high for ensure that + // the messages are arrived in right order to VIA. + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CCRMsgQueueObserver::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CCRMsgQueueObserver::ConstructL() + { + LOG( "CCRMsgQueueObserver::ConstructL() in" ); + + RProcess process; + TInt handleId( process.Handle() ); + TBuf queueName; + queueName.Format(KCRMsgQueueName, handleId); + queueName.Trim(); + TInt err( iQueue.CreateGlobal( queueName, + sizeof( SCRQueueEntry ) ) ); + LOG2( "CCRMsgQueueObserver createglobal %S = %d", &queueName, err ); + err = iQueue.OpenGlobal( queueName ) ; + LOG1( "CCRMsgQueueObserver openglobal = %d", err ); + User::LeaveIfError( err ); + iQueue.NotifyDataAvailable( iStatus ); + LOG1( "CCRMsgQueueObserver queue message size is %d", iQueue.MessageSize() ); + SetActive(); + + LOG( "CCRMsgQueueObserver::ConstructL() out" ); + } + +// ----------------------------------------------------------------------------- +// CCRMsgQueueObserver::~CCRMsgQueueObserver() +// Destructor. +// ----------------------------------------------------------------------------- +// +CCRMsgQueueObserver::~CCRMsgQueueObserver() + { + LOG( "CCRMsgQueueObserver::~CCRMsgQueueObserver() in" ); + + Cancel(); + iQueue.Close(); + iObservers.Reset(); + iObservers.Close(); + + LOG( "CCRMsgQueueObserver::~CCRMsgQueueObserver() out" ); + } + + +// ----------------------------------------------------------------------------- +// CCRMsgQueueObserver::RunL() +// From CActive +// ----------------------------------------------------------------------------- +// +void CCRMsgQueueObserver::RunL() + { + LOG1( "CCRMsgQueueObserver::RunL() in, iStatus: %d", iStatus.Int() ); + + if ( iStatus.Int() == KErrNone ) + { + TInt i( 0 ); + if ( iQueue.Receive( iReceivedMessage ) == KErrNone ) + { + if ( !iReceivedMessage.iSessionId || // or our id has not been set yet + iReceivedMessage.iSessionId == iSessionId ) // if the id matches + { + switch ( iReceivedMessage.iMsg ) + { + case ECRMsgQueueAuthenticationNeeded: + LOG( "CCRMsgQueueObserver EAuthenticationFailed" ); + SCRObserverMsg authNotify; + authNotify.iMsg = ECRAuthenticationNeeded; + authNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( authNotify ) ); + } + + break; + + case ECRMsgQueueAttachCompleted: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueAttachCompleted" ); + SCRObserverMsg iapNotify; + iapNotify.iMsg = ECRAttachCompleted; + iapNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) ); + } + } + break; + + case ECRMsgQueueConnectionError: + { + LOG1( "CCRMsgQueueObserver ECRMsgQueueConnectionError, iReceivedMessage.iErr: %d", + iReceivedMessage.iErr ); + SCRObserverMsg iapNotify; + iapNotify.iMsg = ECRConnectionError; + iapNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) ); + } + } + break; + + case ECRMsgQueueNotEnoughBandwidth: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueNotEnoughBandwidth" ); + SCRObserverMsg iapNotify; + iapNotify.iMsg = ECRNotEnoughBandwidth; + iapNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) ); + } + } + break; + + case ECRMsgQueueSwitchingToTcp: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueSwitchingToTcp" ); + SCRObserverMsg iapNotify; + iapNotify.iMsg = ECRSwitchingToTcp; + iapNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) ); + } + } + break; + + case ECRMsgQueueNormalEndOfStream: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueNormalEndOfStream" ); + SCRObserverMsg iapNotify; + iapNotify.iMsg = ECRNormalEndOfStream; + iapNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) ); + } + } + break; + + case ECRMsgQueueStreamIsLiveStream: + { + LOG( "CCRMsgQueueObserver ECRMsgStreamIsLiveStream" ); + SCRObserverMsg liveStreamNotify; + liveStreamNotify.iMsg = ECRStreamIsLiveStream; + liveStreamNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( liveStreamNotify ) ); + } + } + break; + + case ECRMsgQueueStreamIsRealMedia: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueStreamIsRealMedia" ); + SCRObserverMsg realStreamNotify; + realStreamNotify.iMsg = ECRRealNetworksStream; + realStreamNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( realStreamNotify ) ); + } + } + break; + + case ECRMsgQueueTestSinkData: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueTestSinkData" ); + SCRObserverMsg testSinkDataNotify; + testSinkDataNotify.iMsg = ECRTestSinkData; + testSinkDataNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( testSinkDataNotify ) ); + } + } + break; + + case ECRMsgQueueSdpAvailable: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueSdpAvailable" ); + SCRObserverMsg sdpAvailableNotify; + sdpAvailableNotify.iMsg = ECRSdpAvailable; + sdpAvailableNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( sdpAvailableNotify ) ); + } + } + break; + + case ECRMsgQueueReadyToSeek: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueReadyToSeek" ); + SCRObserverMsg readyToSeekNotify; + readyToSeekNotify.iMsg = ECRReadyToSeek; + readyToSeekNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( readyToSeekNotify ) ); + } + } + break; + + case ECRMsgQueueRecordingStarted: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueRecordingStarted" ); + SCRObserverMsg realStreamNotify; + realStreamNotify.iMsg = ECRRecordingStarted; + realStreamNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( realStreamNotify ) ); + } + } + break; + + case ECRMsgQueueRecordingPaused: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueRecordingState" ); + SCRObserverMsg realStreamNotify; + realStreamNotify.iMsg = ECRRecordingPaused; + realStreamNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( realStreamNotify ) ); + } + } + break; + + case ECRMsgQueueRecordingEnded: + { + LOG( "CCRMsgQueueObserver ECRMsgQueueRecordingState" ); + SCRObserverMsg realStreamNotify; + realStreamNotify.iMsg = ECRRecordingEnded; + realStreamNotify.iErr = iReceivedMessage.iErr; + for ( i = 0; i < iObservers.Count(); i ++ ) + { + TRAP_IGNORE( iObservers[i]->NotifyL( realStreamNotify ) ); + } + } + break; + + default: + { + LOG1( "Unknown message: %d", iReceivedMessage.iMsg ); + } + break; + } + } + else // message belongs to different session + { + LOG2( "Ignoring message: msg.sessionId=%d, iSessionId=%d", + iReceivedMessage.iSessionId, iSessionId ); + } + } + } + + iQueue.NotifyDataAvailable( iStatus ); + SetActive(); + LOG( "CCRMsgQueueObserver::RunL() out" ); + } + +// ----------------------------------------------------------------------------- +// CCRMsgQueueObserver::RunError() +// From CActive +// ----------------------------------------------------------------------------- +// +TInt CCRMsgQueueObserver::RunError( TInt aError ) + { + LOG1( "CCRMsgQueueObserver::RunError(), aError: %d", aError ); + return aError; + } + +// ----------------------------------------------------------------------------- +// CCRMsgQueueObserver::DoCancel() +// From CActive +// ----------------------------------------------------------------------------- +// +void CCRMsgQueueObserver::DoCancel() + { + LOG( "CCRMsgQueueObserver::DoCancel()" ); + iQueue.CancelDataAvailable(); + } + +// ----------------------------------------------------------------------------- +// CCRMsgQueueObserver::AddMsgQueueObserverL() +// Addes object to observer array +// ----------------------------------------------------------------------------- +// +void CCRMsgQueueObserver::AddMsgQueueObserverL( MCREngineObserver* aObserver ) + { + User::LeaveIfError( iObservers.Append( aObserver ) ); + } + +// ----------------------------------------------------------------------------- +// CCRMsgQueueObserver::SetSessionId() +// Sets session id to listen to +// ----------------------------------------------------------------------------- +// +void CCRMsgQueueObserver::SetSessionId( TInt aSessionId ) + { + iSessionId = aSessionId; + } + +// End of File