ansphonecallmaker.cpp

来自「series60 应用程序开发的源代码 series60 应用程序开发的源代码」· C++ 代码 · 共 129 行

CPP
129
字号
/**
*
* @brief Definition of CAnsPhoneCallMaker
*
* Copyright (c) EMCC Software Ltd 2003
* @version 1.0
*/

#include "AnsPhoneCallMaker.h"

CAnsPhoneCallMaker::CAnsPhoneCallMaker(MAnsPhoneCallMakerObserver& aObserver, RLine& aLine)
:CActive(EPriorityNormal),
 iObserver(aObserver),
 iLine(aLine),
 iState(ENoState)
{
}

CAnsPhoneCallMaker::~CAnsPhoneCallMaker()
{
    Cancel();
}

CAnsPhoneCallMaker* CAnsPhoneCallMaker::NewL(MAnsPhoneCallMakerObserver& aObserver, RLine& aLine)
{
    CAnsPhoneCallMaker* self = new (ELeave) CAnsPhoneCallMaker(aObserver, aLine);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
}

void CAnsPhoneCallMaker::ConstructL()
{
    CActiveScheduler::Add(this);
}

///////////////////////////////////////////////////////////////////////////////////////////////////////
// CActive
//
///////////////////////////////////////////////////////////////////////////////////////////////////////

void CAnsPhoneCallMaker::RunL()
{
    // if the caller hangs up, then we will get KErrGeneral error here
    if(iState == EDialling && iStatus.Int() == KErrGeneral)
    {
        Stop();
        iObserver.HandleCallHungUpL();
        return;
    }

    if(iStatus.Int() != KErrNone)
        return;

    switch(iState)
    {
        case EDialling:
            iState = EWatching;
            StartL();
            break;

        case EWatching:
            User::LeaveIfError(iCall.GetStatus(iCallStatus));
            if(iCallStatus == RCall::EStatusHangingUp || iCallStatus == RCall::EStatusIdle)
            {
                Stop();
                iObserver.HandleCallHungUpL();
            }
            else
            {
                StartL();
            }
            break;

        default:
            break;
    }
}

void CAnsPhoneCallMaker::DoCancel()
{
    Stop();
}


void CAnsPhoneCallMaker::MakeCallL(const TDesC& aNumber)
{
    iState = EDialling;
    iNumber.Set(aNumber);
    StartL();
}

void CAnsPhoneCallMaker::StartL()
{
    switch(iState)
    {
        case ENoState:
            return;
        case EDialling:
        {
            User::LeaveIfError(iCall.OpenNewCall(iLine));
            iCall.Dial(iStatus, iNumber);
            break;
        }
        case EWatching:
            iCall.NotifyStatusChange(iStatus, iCallStatus);
            break;
    }
    SetActive();
}

void CAnsPhoneCallMaker::Stop()
{
    switch(iState)
    {
        case ENoState:
            break;
        case EDialling:
            iCall.HangUp();
            iCall.Close();
            break;
        case EWatching:
            iCall.NotifyStatusChangeCancel();
            iCall.Close();
            break;
    }
    iState = ENoState;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?