亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? voipcall.cpp

?? 一個WinCE6。0下的IP phone的源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
#include "VoIPCall.hpp"
#include "CommonFunctions.hpp"
#include <auto_xxx.hxx>         //for auto_bstr etc.
#include <rtcerr.h>             //for RTC error codes
#include "DialEngine.hpp"
#include "Debug.hpp"
#include "VoIPApp.hpp"
#include "SettingsApi.hpp"

bool
IsValidTime(
    const SYSTEMTIME* pTime 
    )
{
    if (pTime == NULL)
    {
        return false; 
    }

    FILETIME FileTime = {0}; 

    if (!SystemTimeToFileTime(pTime, &FileTime))
    {
        return false; 
    }

    if (FileTime.dwHighDateTime == 0 && FileTime.dwLowDateTime == 0)
    {
        return false; 
    }

    return true; 
}

/*------------------------------------------------------------------------------
    GetULLAsSystemTime

    Utility function that gets the current system time as an unsigned long long
------------------------------------------------------------------------------*/
HRESULT 
GetULLAsSystemTime(
    ULONGLONG           ull, 
    __out SYSTEMTIME*   pSystemTime
    )
{
    if (pSystemTime == NULL)
    {
        return E_INVALIDARG;
    }

    ull /= 10000; // convert to ms -- 1 ns is 10^6 ms so 100 ns is 10^4 ms
    
    pSystemTime->wMilliseconds = (WORD)(ull % 1000);
    ull /= 1000;

    pSystemTime->wSecond       = (WORD)(ull % 60);
    ull /= 60;

    pSystemTime->wMinute       = (WORD)(ull % 60);
    ull /= 60;

    pSystemTime->wHour         = (WORD)(ull % 24);
    ull /= 24;

    pSystemTime->wDay          = (WORD)ull;

    pSystemTime->wYear         = 0; 
    pSystemTime->wDayOfWeek    = 0; 
    pSystemTime->wMonth        = 0;
    
    return S_OK;        
}
/*------------------------------------------------------------------------------
    GetSystemTimeAsULL

    Utility function that gets the current system time as an unsigned long long
------------------------------------------------------------------------------*/
HRESULT 
GetSystemTimeAsULL(
    const SYSTEMTIME*   pSystemTime, 
    __out ULONGLONG*    pDest
    )
{
    if (pDest == NULL || pSystemTime == NULL)
    {
        ASSERT(FALSE);
        return E_POINTER;
    }

    FILETIME   FileTime = {0};

    if (! SystemTimeToFileTime(pSystemTime, &FileTime))
    {
        ASSERT(FALSE);
        return CommonUtilities_t::GetErrorFromWin32();
    }

    //shift the high time over to the upper 32 bits and OR in the lower bits
   *pDest = (static_cast<ULONGLONG>(FileTime.dwHighDateTime) << 32) | FileTime.dwLowDateTime;
    return S_OK;
}

const UINT VoIPCall_t::sc_RingbackStartTimeout  = 150;
const UINT VoIPCall_t::sc_TransferDoneTimeout   = 10 * 1000; 

/*------------------------------------------------------------------------------
    VoIPCall_t::CreateNewCall

    Static method used for creating and initializing a new call object

    Parameters:
        IsOutgoingCall: Is this an outgoing call?
        pFriendlyNumber: (optional) Friendly number string if it is already known before we create the call. e.g outgoing call 
        pFriendlyName: (optional) Friendly name string if it is already known before we create the call. e.g. PHMakePhoneCall is called
        pRTCSession: pointer to a valid RTC Session object
        ppCall:  OUT - the returned call

    Returns (HRESULT): indicating success or failure
------------------------------------------------------------------------------*/
/* static */ HRESULT VoIPCall_t::CreateNewCall(
    bool            IsOutgoingCall, 
    const WCHAR*    pFriendlyNumber, 
    const WCHAR*    pFriendlyName, 
    IRTCSession*    pRTCSession,
    Call_t**        ppCall
    )
{
    //validate parameters
    if (ppCall == NULL || pRTCSession == NULL)
    {
        ASSERT(FALSE);
        return E_POINTER;
    }


    VoIPCall_t* pOutCall = new VoIPCall_t();
    if (! pOutCall)
    {
        return E_OUTOFMEMORY;
    }

    HRESULT hr = pOutCall->Initialize(
                            IsOutgoingCall, 
                            pFriendlyNumber, 
                            pFriendlyName, 
                            pRTCSession
                            );
    if (FAILED(hr))
    {
        PHONEAPP_DEBUGMSG(ZONE_PHONEAPP_ERROR, (L"Failed to initialize the call - error: 0x%x", hr));

        //cleanup
        //
        pOutCall->Release();
       *ppCall = NULL;

        return hr;
    }

    *ppCall = static_cast<Call_t*>(pOutCall);
    return S_OK;
}


/*------------------------------------------------------------------------------
    VoIPCall_t::VoIPCall_t

    Ctor
------------------------------------------------------------------------------*/
VoIPCall_t::VoIPCall_t()
{
    TRACE(ZONE_PHONEAPP_CTOR);
    m_CouldBeMissed             = true;
    m_IsLogged                  = false; 
    
    m_PlayingRingbackTone       = false;
    m_StartRingbackTimerId      = 0;

    m_cpRTCParticipant          = NULL;
    m_cpRTCSession              = NULL;
    m_cpRTCSessionReferredEvent = NULL; 
    m_cpReferringCall           = NULL; 

}

/*------------------------------------------------------------------------------
    VoIPCall_t::~VoIPCall_t

    Dtor
------------------------------------------------------------------------------*/
VoIPCall_t::~VoIPCall_t()
{
    TRACE(ZONE_PHONEAPP_CTOR);

    //terminate the session once this object is to be destroyed
    //since we are not tracking it
    if ((m_cpRTCSession) && (GetCallStatus() != RTCSS_DISCONNECTED))
    {
        m_cpRTCSession->Terminate(RTCTR_SHUTDOWN);
    }

    StopRingbackTone();

    m_cpRTCParticipant          = NULL;
    m_cpRTCSession              = NULL;
    m_cpRTCSessionReferredEvent = NULL; 
    m_cpReferringCall           = NULL; 
    
}

/*------------------------------------------------------------------------------
    VoIPCall_t::Initialize

    Initializes this object from an existing IRTCSession

    Parameters:
        IsOutgoingCall: Is this an outgoing call?
        pFriendlyNumber: (optional) Friendly number string if it is already known before we create the call. e.g outgoing call 
        pFriendlyName: (optional) Friendly name string if it is already known before we create the call. e.g. PHMakePhoneCall is called
        pRTCSession: pointer to a valid RTC Session object

    Returns (HRESULT): indicating success or failure
------------------------------------------------------------------------------*/
HRESULT VoIPCall_t::Initialize(
    bool            IsOutgoingCall,
    const WCHAR*    pFriendlyNumber, 
    const WCHAR*    pFriendlyName, 
    IRTCSession*    pRTCSession
    )
{
    if (pRTCSession == NULL)
    {
        return E_INVALIDARG; 
    }
    
    m_CallType = IsOutgoingCall ? e_vctOutgoing : e_vctIncoming;

    //set the new session variable
    m_cpRTCSession  = pRTCSession;

    CComPtr<IRTCEnumParticipants> cpEnumParticipants;
    HRESULT hr = m_cpRTCSession->EnumerateParticipants(
                                    &cpEnumParticipants
                                    );
    if (FAILED(hr))
    {
        PHONEAPP_DEBUGMSG(ZONE_PHONEAPP_ERROR, (L"Failed to get participant list from the session - hr = 0x%x", hr));
        return hr;
    }

    CComPtr<IRTCParticipant>    cpParticipant;
    hr = cpEnumParticipants->Next(1, &m_cpRTCParticipant, NULL);
    if (hr != S_OK)
    {
        PHONEAPP_DEBUGMSG(hr != S_FALSE && ZONE_PHONEAPP_ERROR, (L"Failed to get the next participant from the session - hr = 0x%x", hr));
        return hr;
    }

    hr = m_cpRTCParticipant->get_UserURI(&m_bstrURI); 
    if (FAILED(hr))
    {
        PHONEAPP_DEBUGMSG(ZONE_PHONEAPP_ERROR, (L"Failed at getting the remove URI, hr = 0x%x", hr));     
        return hr; 
    }

    //use the specified friendly number first if it exists
    if (pFriendlyNumber != NULL &&
        pFriendlyNumber[0] != L'\0')
    {
        m_bstrFriendlyNumber = SysAllocString(pFriendlyNumber); 
        if (m_bstrFriendlyNumber == NULL)
        {
            return E_OUTOFMEMORY; 
        }
    }
    else
    {
        //otherwise, get it by converting from URI
        hr = GetApp()->GetDialEngine().GetPhoneNumberToDisplay(
                                            m_bstrURI, 
                                            -1, 
                                            NULL,                   //use active profile
                                            &m_bstrFriendlyNumber
                                            ); 
    }
    
    if (FAILED(hr))
    {
        PHONEAPP_DEBUGMSG(ZONE_PHONEAPP_ERROR, (L"Failed at formating the remote URI, hr = 0x%x", hr)); 
        return hr; 
    }

    hr = m_cpRTCParticipant->get_Name(&m_bstrName); 
    if (FAILED(hr))
    {
        PHONEAPP_DEBUGMSG(ZONE_PHONEAPP_ERROR, (L"Failed at gettting name from network, hr = 0x%x", hr)); 
    }

    //use the specified friendly name first if it exists
    if (pFriendlyName != NULL &&
        pFriendlyName[0] != L'\0')
    {
        m_bstrFriendlyName = SysAllocString(pFriendlyName); 
        if (m_bstrFriendlyName == NULL)
        {
            return E_OUTOFMEMORY; 
        }

    }

    //get the caller information from database
    hr = GetApp()->GetDatabase().GetCallerInfo(
                                    m_bstrFriendlyNumber, 
                                    (m_bstrFriendlyName != NULL && m_bstrFriendlyName[0] != L'\0') ? NULL : &m_bstrFriendlyName, 
                                    &m_bstrRingTonePath, 
                                    &m_IsBlocked
                                    ); 
    if (FAILED(hr))
    {
        PHONEAPP_DEBUGMSG(ZONE_PHONEAPP_ERROR, (L"Failed at gettting information from database, hr = 0x%x", hr));         
    }


    //if we still don't have a good caller id, try the POOM
    if (m_bstrFriendlyName == NULL ||
        m_bstrFriendlyName[0] == L'\0')
    {

        hr = GetApp()->GetPoom().GetCallerName(
                                    m_bstrFriendlyNumber, 
                                    &m_bstrFriendlyName
                                    ); 
        if (FAILED(hr))
        {
            PHONEAPP_DEBUGMSG(ZONE_PHONEAPP_ERROR, (L"Failed at getting caller id from Poom, hr = 0x%x", hr)); 
        }
    }

    return S_OK;

}


/*------------------------------------------------------------------------------
    VoIPCall_t::ForceDestroy
    
    Delete this object and null out RTC pointers
------------------------------------------------------------------------------*/
void 
VoIPCall_t::ForceDestroy(
    void
    )
{
    PhoneAppUtilities_t::NullOutCOMPtr<IRTCParticipant>(&m_cpRTCParticipant);
    PhoneAppUtilities_t::NullOutCOMPtr<IRTCSession>(&m_cpRTCSession);
    delete this;
    return;
}

/*------------------------------------------------------------------------------
    VoIPCall_t::DoPhoneVerb

    Perform an action for the phone application.
------------------------------------------------------------------------------*/
HRESULT 
VoIPCall_t::DoPhoneVerb(
    PH_VERB Verb,
    VPARAM  Parameter
    )
{
    HRESULT hr = S_OK;

    switch (Verb)
    {
    case PH_VERB_HOLD:
    case PH_VERB_UNHOLD:
        hr = DoVerbHoldUnhold(Verb);
        break;

    case PH_VERB_ACCEPT_INCOMING:
    case PH_VERB_REJECT_INCOMING:
        hr = DoVerbAcceptRejectIncomingCall(Verb);
        break;

    case PH_VERB_TALK:
        hr = DoVerbTalk();
        break;

    case PH_VERB_END:
        hr = DoVerbEnd();
        break;

    case PH_VERB_TRANSFER:
        hr = DoVerbTransfer(Parameter); 
        break;

    default:
        hr = E_NOTIMPL;
        break;
    }

    return hr;
}

/*------------------------------------------------------------------------------
    VoIPCall_t::Contains

    Overloaded Comparison operator - compares internal participant to specified
    participant
------------------------------------------------------------------------------*/
bool 
VoIPCall_t::Contains(
    IRTCParticipant* pParticipant
    )
{
    return PhoneAppUtilities_t::AreCOMPointersEqual<IRTCParticipant>(
        static_cast<IRTCParticipant*>(m_cpRTCParticipant),
        pParticipant
        );
}

/*------------------------------------------------------------------------------
    VoIPCall_t::operator==

    Overloaded comparison operator - compares internal session to specified
    session
------------------------------------------------------------------------------*/
bool 
VoIPCall_t::Contains(
    IRTCSession* pSession
    )
{
    return PhoneAppUtilities_t::AreCOMPointersEqual<IRTCSession>(
        static_cast<IRTCSession*>(m_cpRTCSession),
        pSession
        );
}

/*------------------------------------------------------------------------------
    VoIPCall_t::UpdateDisconnectReason

    When the call disconnects, this retreives the reason why the call disconnects
    to help determine if the call was terminated for strange reasons (e.g. busy etc)
------------------------------------------------------------------------------*/
HRESULT 
VoIPCall_t::UpdateDisconnectReason(

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清免费成人av| 久久99精品国产| 色哟哟国产精品| 亚洲妇女屁股眼交7| 91精品国产色综合久久| 激情综合五月天| 国产精品久久久久久久久图文区 | 欧亚一区二区三区| 性欧美疯狂xxxxbbbb| 欧美一级二级三级蜜桃| 国产麻豆午夜三级精品| 亚洲视频一区二区免费在线观看| 欧美性受极品xxxx喷水| 青青草原综合久久大伊人精品| 久久久亚洲精品一区二区三区 | 国产在线视频不卡二| 欧美激情在线看| 欧美视频一区二区三区四区| 麻豆精品一区二区综合av| 国产亚洲婷婷免费| 91九色最新地址| 毛片基地黄久久久久久天堂| 国产欧美精品区一区二区三区| 日本韩国一区二区三区视频| 久久97超碰色| 亚洲精品视频免费观看| 精品三级av在线| 色综合视频在线观看| 蜜桃精品在线观看| 亚洲三级久久久| 精品久久久久久久久久久久久久久| 99久久精品免费观看| 麻豆精品蜜桃视频网站| 1024成人网色www| 精品国产乱码久久久久久影片| 成人激情动漫在线观看| 免费亚洲电影在线| 亚洲色图制服诱惑| 久久久久久久久99精品| 欧美久久免费观看| 99久久久国产精品| 国产美女主播视频一区| 五月天国产精品| 亚洲视频香蕉人妖| 久久久久久99久久久精品网站| 欧美性感一区二区三区| 国产成人午夜精品影院观看视频| 香蕉加勒比综合久久| 亚洲欧美视频在线观看| 国产欧美日韩综合精品一区二区| 欧美精品第1页| 欧美在线不卡一区| eeuss影院一区二区三区| 精久久久久久久久久久| 三级不卡在线观看| 洋洋av久久久久久久一区| 日本一区二区免费在线| 欧美精品一区二区三区久久久| 欧美无乱码久久久免费午夜一区| 成人在线一区二区三区| 国产成人小视频| 国产一区二区调教| 国内精品免费**视频| 美女免费视频一区二区| 美日韩黄色大片| 奇米777欧美一区二区| 香蕉影视欧美成人| 午夜不卡在线视频| 亚洲成av人在线观看| 亚洲精品一二三| 一区二区三区四区不卡在线| 国产精品二三区| 中文字幕一区二区三区四区不卡 | 国产一区欧美二区| 国产九色sp调教91| 国产成人超碰人人澡人人澡| 国产福利视频一区二区三区| 国产成人激情av| caoporen国产精品视频| av一区二区久久| 色综合天天性综合| 欧美性猛交xxxx黑人交| 欧美高清一级片在线| 91麻豆精品国产91久久久久久| 51精品视频一区二区三区| 91精品一区二区三区久久久久久 | 亚洲高清免费一级二级三级| 日韩黄色一级片| 久久精品国内一区二区三区| 国内久久婷婷综合| 成人午夜视频福利| 色综合久久中文字幕综合网 | 懂色av中文字幕一区二区三区| 国产91精品欧美| 91免费国产在线观看| 欧美性猛片xxxx免费看久爱| 欧美一卡二卡在线观看| 久久综合精品国产一区二区三区| 国产欧美日韩久久| 一区二区三区四区不卡在线| 日本三级亚洲精品| 国产成人亚洲精品青草天美| 色综合久久久久综合99| 51精品视频一区二区三区| 久久久久9999亚洲精品| 自拍偷拍国产亚洲| 日本视频一区二区三区| 国产成人h网站| 欧美日韩高清一区| 26uuu精品一区二区在线观看| 中文字幕一区二区不卡| 日日欢夜夜爽一区| 国产在线精品视频| 欧美性生活久久| 国产三级精品三级在线专区| 亚洲精品乱码久久久久| 激情五月激情综合网| 色综合天天视频在线观看| 日韩欧美123| 亚洲久本草在线中文字幕| 精品一区二区影视| 日本韩国欧美在线| 国产日韩欧美综合在线| 亚洲成在人线免费| 成人精品国产一区二区4080| 欧美日韩国产一区二区三区地区| 久久免费美女视频| 日韩经典一区二区| 91免费观看视频在线| 26uuu国产电影一区二区| 亚洲网友自拍偷拍| 97精品久久久午夜一区二区三区 | 欧美一a一片一级一片| 久久精品人人做人人综合 | 精品综合免费视频观看| 91福利区一区二区三区| 国产人成一区二区三区影院| 日韩国产欧美三级| 91成人在线观看喷潮| 国产精品久久久久久久久搜平片 | 91精品免费在线| 一区二区三区免费网站| 懂色av一区二区三区免费看| 精品捆绑美女sm三区| 日韩高清不卡一区| 欧美性色黄大片| 亚洲久草在线视频| 色综合一个色综合| 亚洲欧洲国产日本综合| 成人国产电影网| 欧美激情一区不卡| 国产高清成人在线| 久久网站热最新地址| 蜜臀久久99精品久久久久久9 | 国产最新精品免费| 日韩欧美国产精品| 蜜芽一区二区三区| 日韩欧美亚洲国产另类| 免费欧美日韩国产三级电影| 欧美色电影在线| 污片在线观看一区二区| 欧美日韩aaa| 日韩精品成人一区二区在线| 制服丝袜激情欧洲亚洲| 视频一区视频二区中文| 91精品国产91久久久久久一区二区| 亚洲一卡二卡三卡四卡五卡| 在线观看国产91| 亚洲国产va精品久久久不卡综合| 欧美午夜精品免费| 亚洲国产精品久久人人爱| 欧美三级在线看| 婷婷开心激情综合| 日韩欧美中文字幕公布| 韩国女主播成人在线| 久久久国产精华| 不卡影院免费观看| 亚洲一区二区三区国产| 在线播放中文一区| 久久99精品国产麻豆婷婷| 久久综合久久综合九色| 成人理论电影网| 亚洲欧美成人一区二区三区| 欧美视频一区二| 理论片日本一区| 久久精品网站免费观看| 91性感美女视频| 午夜精品福利在线| www精品美女久久久tv| 国产91在线看| 夜夜精品视频一区二区 | 日韩欧美区一区二| 懂色av一区二区三区免费观看| 亚洲免费观看高清完整版在线观看| 欧美日韩国产精选| 激情综合色丁香一区二区| 国产精品久久久久久久岛一牛影视 | 天堂va蜜桃一区二区三区 | 欧美一级日韩不卡播放免费| 国产精品66部|