outcallwatcher.cpp

来自「symbian 2rd下可以获取并显示来电号码」· C++ 代码 · 共 132 行

CPP
132
字号
#include "OutCallWatcher.h"

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

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

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

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

// Method for CActive
void COutCallWatcher::RunL()
    {
    if(iState == EDialling && iStatus.Int() == KErrGeneral)
        {
        Stop();
        iObserver.HandleOutCallHungUpL();
        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.HandleOutCallHungUpL();
                }
            else
                {
                StartL();
                }
            break;
            }
            
        default:
            break;
        }
    }

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

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

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

    SetActive();
    }

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

        default:
            break;
        }
    iState = ENoState;
    }

⌨️ 快捷键说明

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