mmserv/voipaudioservices/VoIPIntfc/src/VoIPQueueHandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:08:46 +0200
changeset 0 71ca22bcf22a
child 3 4f62049db6ac
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* 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 <voipaudiocommon.h>
#include <voipuplinkstream.h>
#include <voipdownlinkstream.h>
#include <voipdtmftoneplayer.h>
#include <voipringtoneplayer.h>
#include "debugtracemacros.h"
#include "VoIPSharedData.h"
#include "VoIPDataBufferImpl.h"
#include "VoIPQueueHandler.h"


// ----------------------------------------------------------------------------
// CQueueHandler::NewL
// Symbian constructor
// ----------------------------------------------------------------------------
//
CQueueHandler* CQueueHandler::NewL(MQueueHandlerObserver* aObserver,
                                   RMsgQueue<TVoIPMsgBuf>* 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<TVoIPMsgBuf>* 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