diff -r 000000000000 -r 71ca22bcf22a mmserv/voipaudioservices/VoIPIntfc/src/VoIPQueueHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/voipaudioservices/VoIPIntfc/src/VoIPQueueHandler.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,292 @@ +/* +* Copyright (c) 2007-2008 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: VOIP Audio Services CMsgQueueHandler class implementation. +* +*/ + + +#include +#include +#include +#include +#include +#include "debugtracemacros.h" +#include "VoIPSharedData.h" +#include "VoIPDataBufferImpl.h" +#include "VoIPQueueHandler.h" + + +// ---------------------------------------------------------------------------- +// CQueueHandler::NewL +// Symbian constructor +// ---------------------------------------------------------------------------- +// +CQueueHandler* CQueueHandler::NewL(MQueueHandlerObserver* aObserver, + RMsgQueue* aMsgQueue, + TInt aBufferLen) + { + CQueueHandler* self = new (ELeave) CQueueHandler(aMsgQueue); + CleanupStack::PushL(self); + self->ConstructL(aObserver, aBufferLen); + CleanupStack::Pop(self); + return self; + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::ConstructL +// Second phase constructor. +// ---------------------------------------------------------------------------- +// +void CQueueHandler::ConstructL(MQueueHandlerObserver* aObserver, + TInt aBufferLen) + { + iObserver = aObserver; + + // aBufferLen == 0 for MsgCom queue + if (aBufferLen > 0) + { + iBuffer = CVoIPDataBufferImpl::NewL(aBufferLen); + } + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::~CQueueHandler +// Destructor. +// ---------------------------------------------------------------------------- +// +CQueueHandler::~CQueueHandler() + { + Cancel(); + iChunk.Close(); + delete iBuffer; + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::CQueueHandler +// Constructor. +// ---------------------------------------------------------------------------- +// +CQueueHandler::CQueueHandler(RMsgQueue* aMsgQueue) : + CActive(CActive::EPriorityStandard), +// CActive(CActive::EPriorityHigh), + iMsgQueue(aMsgQueue), + iChunkDataPtr(0,0,0) + { + CActiveScheduler::Add(this); + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::Start +// Start listening for events on queue 0. +// ---------------------------------------------------------------------------- +// +void CQueueHandler::Start() + { + if (!IsActive()) + { + iMsgQueue->NotifyDataAvailable(iStatus); + SetActive(); + } + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::DoCancel +// Cancel outstanding request +// ---------------------------------------------------------------------------- +// +void CQueueHandler::DoCancel() + { + iMsgQueue->CancelDataAvailable(); + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::RunL +// Process requests. +// ---------------------------------------------------------------------------- +// +void CQueueHandler::RunL() + { + TVoIPMsgBuf msgBuf; + TInt err = iMsgQueue->Receive(msgBuf); + + // Start monitoring for more events before calling the observer as client + // may decide to destroy us before this RunL completes executing. + Start(); + + if (err == KErrNone) + { + switch (msgBuf.iRequest) + { + case ECmdDownlinkInitComplete: + { + iObserver->Event(MVoIPDownlinkObserver::KOpenComplete, + msgBuf.iStatus); + break; + } + case ECmdUplinkInitComplete: + { + iObserver->Event(MVoIPUplinkObserver::KOpenComplete, + msgBuf.iStatus); + break; + } + case ECmdFillBuffer: + { + DoFillBuffer(msgBuf.iInt, msgBuf.iStatus); + break; + } + case ECmdEmptyBuffer: + { + DoEmptyBuffer(msgBuf.iInt, msgBuf.iStatus); + break; + } + case ECmdDownlinkThreadClosed: + { + iChunk.Close(); + iObserver->Event(MVoIPDownlinkObserver::KDownlinkClosed, + msgBuf.iStatus); + break; + } + case ECmdUplinkThreadClosed: + { + iChunk.Close(); + iObserver->Event(MVoIPUplinkObserver::KUplinkClosed, + msgBuf.iStatus); + break; + } + case ECmdRingToneOpenComplete: + { + iObserver->Event(MRingToneObserver::KOpenComplete, + msgBuf.iStatus); + break; + } + case ECmdRingTonePlayComplete: + { + iObserver->Event(MRingToneObserver::KPlaybackComplete, + msgBuf.iStatus); + break; + } + case ECmdDnLinkError: + case ECmdDnLinkJBError: + { + iObserver->Event(MVoIPDownlinkObserver::KDownlinkError, + msgBuf.iStatus); + break; + } + case ECmdUpLinkError: + { + iObserver->Event(MVoIPUplinkObserver::KUplinkError, + msgBuf.iStatus); + break; + } + case ECmdDTMFOpenDnlinkComplete: + { + iObserver->Event(MDTMFToneObserver::KOpenCompleteDNL, + msgBuf.iStatus); + break; + } + case ECmdDTMFOpenUplinkComplete: + { + iObserver->Event(MDTMFToneObserver::KOpenCompleteUPL, + msgBuf.iStatus); + break; + } + case ECmdDTMFTonePlayFinished: + { + TRACE_PRN_N1(_L("VoIP->TonePlayFinished [%d]"), msgBuf.iStatus); + break; + } + default: + break; + } + } + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::DoFillBuffer +// +// ---------------------------------------------------------------------------- +// +void CQueueHandler::DoFillBuffer(TInt aBufLen, TInt aStatus) + { + TInt err = KErrNone; + + if (iChunk.Handle() == 0) + { + // aStatus is either RChunk handle or an error + err = iChunk.OpenGlobal(KChunkDNL, EFalse); + } + + if (err == KErrNone) + { + iChunkDataPtr.Set(iChunk.Base(), 0, aBufLen); + iBuffer->SetPayloadPtr(iChunkDataPtr); + iObserver->FillBuffer(iBuffer); + } + else + { + // returned error + iObserver->Event(MVoIPDownlinkObserver::KDownlinkError, aStatus); + } + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::DoEmptyBuffer +// +// ---------------------------------------------------------------------------- +// +void CQueueHandler::DoEmptyBuffer(TInt aBufLen, TInt aStatus) + { + TInt err = KErrNone; + + if (iChunk.Handle() == 0) + { + // aStatus is either RChunk handle or an error + err = iChunk.OpenGlobal(KChunkUPL, EFalse); + } + + if (err == KErrNone) + { + iChunkDataPtr.Set(iChunk.Base(), aBufLen, aBufLen); + iBuffer->SetPayloadPtr(iChunkDataPtr); + iObserver->EmptyBuffer(iBuffer); + } + else + { + iObserver->Event(MVoIPUplinkObserver::KUplinkError, aStatus); + } + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::RunError +// Process requests. +// ---------------------------------------------------------------------------- +// +TInt CQueueHandler::RunError(TInt /*aError*/) + { + // Current implementation of RunL does not leave + return 0; + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::Status +// Return request status. +// ---------------------------------------------------------------------------- +// +TRequestStatus* CQueueHandler::Status() + { + return &iStatus; + } + + +// End of File