diff -r 000000000000 -r 71ca22bcf22a mmserv/tms/tmsproxy/src/tmsqueuehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/tms/tmsproxy/src/tmsqueuehandler.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,218 @@ +/* + * 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: Telephony Multimedia Service + * + */ + +#include +#include +#include "tmsutility.h" +#include "tmsshared.h" +#include "tmsqueuehandler.h" +#include "tmsmembuffer.h" +#include "tmsglobalcontext.h" +#include "tmscallproxy.h" + +using namespace TMS; + +// ---------------------------------------------------------------------------- +// CQueueHandler::NewL +// Symbian constructor +// ---------------------------------------------------------------------------- +// +CQueueHandler* CQueueHandler::NewL(RMsgQueue* aMsgQueue, + TMSGlobalContext* glblCtx) + { + CQueueHandler* self = new (ELeave) CQueueHandler(aMsgQueue, glblCtx); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::ConstructL +// Second phase constructor. +// ---------------------------------------------------------------------------- +// +void CQueueHandler::ConstructL() + { + iObserver = NULL; + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::~CQueueHandler +// Destructor. +// ---------------------------------------------------------------------------- +// +CQueueHandler::~CQueueHandler() + { + Cancel(); + if (iMsgQueue->Handle() > 0) + { + iMsgQueue->Close(); + } + iObserversList.Reset(); + iClientList.Reset(); + iChunk.Close(); + delete iBuffer; + iObserver = NULL; + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::CQueueHandler +// Constructor. +// ---------------------------------------------------------------------------- +// +CQueueHandler::CQueueHandler(RMsgQueue* aMsgQueue, + TMSGlobalContext* glblCtx) : + CActive(CActive::EPriorityStandard), + iMsgQueue(aMsgQueue), + iChunkDataPtr(0, 0, 0) + { + CActiveScheduler::Add(this); + iTMSGlobalContext = glblCtx; + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::Start +// Start listening for events on queue 0. +// ---------------------------------------------------------------------------- +// +void CQueueHandler::Start() + { + if (!IsActive()) + { + iMsgQueue->NotifyDataAvailable(iStatus); + SetActive(); + } + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::AddObserver +// +// ---------------------------------------------------------------------------- +// +TInt CQueueHandler::AddObserver(MQueueHandlerObserver& aObserver, + TInt /*aClientId*/) + { + TInt status = KErrNone; + + if (iObserver == NULL) + { + iObserver = &aObserver; + } + else + { + status = KErrAlreadyExists; + } + return status; + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::AddObserver +// Marks observer as inactive in the list +// ---------------------------------------------------------------------------- +// +TInt CQueueHandler::RemoveObserver(MQueueHandlerObserver& /*aObserver*/) + { + iObserver = NULL; + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::DoCancel +// Cancel outstanding request +// ---------------------------------------------------------------------------- +// +void CQueueHandler::DoCancel() + { + iMsgQueue->CancelDataAvailable(); + } + +// ---------------------------------------------------------------------------- +// CQueueHandler::RunL +// Process requests. +// ---------------------------------------------------------------------------- +// +void CQueueHandler::RunL() + { + TmsMsgBuf msgBuf; + TInt err = iMsgQueue->Receive(msgBuf); + + // Start monitoring for more events before calling the observer in case + // client decides to destroy us before this RunL completes executing. + Start(); + + if (iObserver == NULL) + { + return; + } + + if (err == KErrNone) + { + switch (msgBuf.iRequest) + { + case ECmdGlobalEffectChange: + iObserver->QueueEvent(msgBuf.iInt, msgBuf.iStatus, NULL); + break; + case ECmdRingToneOpenComplete: + iObserver->QueueEvent(TMS_EVENT_RINGTONE_OPEN_COMPLETE, + msgBuf.iStatus, &msgBuf.iInt64); + break; + case ECmdRingTonePlayComplete: + iObserver->QueueEvent(TMS_EVENT_RINGTONE_PLAY_COMPLETE, + msgBuf.iStatus, NULL); + break; + case ECmdGlobalRoutingChange: + iObserver->QueueEvent(msgBuf.iInt, msgBuf.iStatus, + &msgBuf.iUint); + break; + case ECmdDTMFOpenDnlinkComplete: + case ECmdDTMFOpenUplinkComplete: + iObserver->QueueEvent(TMS_EVENT_DTMF_TONE_STARTED, + msgBuf.iStatus, NULL); + break; + case ECmdDTMFTonePlayFinished: + iObserver->QueueEvent(TMS_EVENT_DTMF_TONE_STOPPED, + msgBuf.iStatus, NULL); + break; + default: + break; + } + } + } + +// ---------------------------------------------------------------------------- +// 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