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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tapiutils.cpp

?? 串口的傳輸串口的傳輸串口的傳輸串口的傳輸
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
            lReturn = 
                ::lineGetDevCaps(m_hLineApp, 
                    dwDeviceID, dwAPIVersion, 0, lpLineDevCaps);

            if (HandleLineErr(lReturn))
                continue;
            else
            {
                OutputDebugString("lineGetDevCaps unhandled error/n");
                LocalFree(lpLineDevCaps);
                return NULL;
            }
        }
        while (lReturn != SUCCESS);

        // If the buffer was big enough, then succeed.
        if ((lpLineDevCaps -> dwNeededSize) <= (lpLineDevCaps -> dwTotalSize))
            return lpLineDevCaps;

        // Buffer wasn't big enough.  Make it bigger and try again.
        sizeofLineDevCaps = lpLineDevCaps -> dwNeededSize;
    }
}

//
//  FUNCTION: LPVOID CheckAndReAllocBuffer(LPVOID, size_t, LPCSTR)
//
//  PURPOSE: Checks and ReAllocates a buffer if necessary.
//
LPVOID CTapiConnection::CheckAndReAllocBuffer(LPVOID lpBuffer, size_t sizeBufferMinimum)
{
    size_t sizeBuffer;

    if (lpBuffer == NULL)  // Allocate the buffer if necessary. 
    {
        sizeBuffer = sizeBufferMinimum;
        lpBuffer = (LPVOID) LocalAlloc (LPTR, sizeBuffer);
            
        if (lpBuffer == NULL)
        {
            OutputDebugString("LocalAlloc failed in CheckAndReAllocBuffer./n");
            return NULL;
        }
    }
    else // If the structure already exists, make sure its good.
    {
        sizeBuffer = LocalSize((HLOCAL) lpBuffer);

        if (sizeBuffer == 0) // Bad pointer?
        {
            OutputDebugString("LocalSize returned 0 in CheckAndReAllocBuffer/n");
            return NULL;
        }

        // Was the buffer big enough for the structure?
        if (sizeBuffer < sizeBufferMinimum)
        {
            OutputDebugString("Reallocating structure\n");
            LocalFree(lpBuffer);
            return CheckAndReAllocBuffer(NULL, sizeBufferMinimum);
        }
    }

    memset(lpBuffer, 0, sizeBuffer);       
    ((LPVARSTRING) lpBuffer ) -> dwTotalSize = (DWORD) sizeBuffer;
    return lpBuffer;
}


//
//  FUNCTION: MylineGetAddressCaps(LPLINEADDRESSCAPS, ..)
//
//  PURPOSE: Return a LINEADDRESSCAPS structure for the specified line.
//
LPLINEADDRESSCAPS CTapiConnection::MylineGetAddressCaps (
    LPLINEADDRESSCAPS lpLineAddressCaps,
    DWORD dwDeviceID, DWORD dwAddressID,
    DWORD dwAPIVersion, DWORD dwExtVersion)
{
    size_t sizeofLineAddressCaps = sizeof(LINEADDRESSCAPS) + 1024;
    long lReturn;
    
    // Continue this loop until the structure is big enough.
    while(TRUE)
    {
        // Make sure the buffer exists, is valid and big enough.
        lpLineAddressCaps = 
            (LPLINEADDRESSCAPS) CheckAndReAllocBuffer(
                (LPVOID) lpLineAddressCaps,
                sizeofLineAddressCaps);

        if (lpLineAddressCaps == NULL)
            return NULL;
            
        // Make the call to fill the structure.
        do
        {
            lReturn = 
                ::lineGetAddressCaps(m_hLineApp,
                    dwDeviceID, dwAddressID, dwAPIVersion, dwExtVersion,
                    lpLineAddressCaps);

            if (HandleLineErr(lReturn))
                continue;
            else
            {
                OutputDebugString("lineGetAddressCaps unhandled error\n");
                LocalFree(lpLineAddressCaps);
                return NULL;
            }
        }
        while (lReturn != SUCCESS);

        // If the buffer was big enough, then succeed.
        if ((lpLineAddressCaps -> dwNeededSize) <= 
            (lpLineAddressCaps -> dwTotalSize))
        {
            return lpLineAddressCaps;
        }

        // Buffer wasn't big enough.  Make it bigger and try again.
        sizeofLineAddressCaps = lpLineAddressCaps -> dwNeededSize;
    }
}

//
//  FUNCTION: MakeTheCall(LPLINEDEVCAPS, LPCSTR)
//
//  PURPOSE: Dials the call
//

BOOL CTapiConnection::MakeTheCall(LPLINEDEVCAPS lpLineDevCaps, LPCTSTR lpszAddress)
{
    LPLINECALLPARAMS  lpCallParams = NULL;
    LPLINEADDRESSCAPS lpAddressCaps = NULL;
    long lReturn;
    BOOL bFirstDial = TRUE;
                               
    // Get the capabilities for the line device we're going to use.
    lpAddressCaps = MylineGetAddressCaps(lpAddressCaps,
        m_dwDeviceID, 0, m_dwAPIVersion, 0);
    if (lpAddressCaps == NULL)
        return FALSE;

    // Setup our CallParams.
    lpCallParams = CreateCallParams (lpCallParams, lpszAddress);
    if (lpCallParams == NULL)
        return FALSE;

    do
    {                   
        if (bFirstDial)
            //lReturn = ::lineMakeCall(m_hLine, &m_hCall, lpszAddress, 0, lpCallParams);
            lReturn = WaitForReply( ::lineMakeCall(m_hLine, &m_hCall, lpszAddress, 
                        0, lpCallParams) );
        else
            lReturn = WaitForReply(::lineDial(m_hCall, lpszAddress, 0));

        if (lReturn == WAITERR_WAITABORTED)
        {
             OutputDebugString("While Dialing, WaitForReply aborted.\n");
             goto errExit;
        }
            
        if (HandleLineErr(lReturn))
            continue;
        else
        {
            if (bFirstDial)
                OutputDebugString("lineMakeCall unhandled error\n");
            else
                OutputDebugString("lineDial unhandled error\n");

            goto errExit;
        }
    }
    while (lReturn != SUCCESS);
        
    bFirstDial = FALSE;

    if (lpCallParams)
        LocalFree(lpCallParams);
    if (lpAddressCaps)
        LocalFree(lpAddressCaps);
    
    return TRUE;
    
  errExit:
    if (lpCallParams)
        LocalFree(lpCallParams);
    if (lpAddressCaps)
        LocalFree(lpAddressCaps);

    AfxMessageBox("Dial failed.");

    return FALSE;
}   


//
//  FUNCTION: CreateCallParams(LPLINECALLPARAMS, LPCSTR)
//
//  PURPOSE: Allocates and fills a LINECALLPARAMS structure
//
//
LPLINECALLPARAMS CTapiConnection::CreateCallParams (
    LPLINECALLPARAMS lpCallParams, LPCSTR lpszDisplayableAddress)
{
    size_t sizeDisplayableAddress;

    if (lpszDisplayableAddress == NULL)
        lpszDisplayableAddress = "";
        
    sizeDisplayableAddress = strlen(lpszDisplayableAddress) + 1;
                          
    lpCallParams = (LPLINECALLPARAMS) CheckAndReAllocBuffer(
        (LPVOID) lpCallParams, 
        sizeof(LINECALLPARAMS) + sizeDisplayableAddress);

    if (lpCallParams == NULL)
        return NULL;

    // This is where we configure the line.
    lpCallParams -> dwBearerMode = LINEBEARERMODE_VOICE;
    lpCallParams -> dwMediaMode  = LINEMEDIAMODE_INTERACTIVEVOICE;

    // This specifies that we want to use only IDLE calls and
    // don't want to cut into a call that might not be IDLE (ie, in use).
    lpCallParams -> dwCallParamFlags = LINECALLPARAMFLAGS_IDLE;
                                    
    // if there are multiple addresses on line, use first anyway.
    // It will take a more complex application than a simple tty app
    // to use multiple addresses on a line anyway.
    lpCallParams -> dwAddressMode = LINEADDRESSMODE_ADDRESSID;

    // Address we are dialing.
    lpCallParams -> dwDisplayableAddressOffset = sizeof(LINECALLPARAMS);
    lpCallParams -> dwDisplayableAddressSize = sizeDisplayableAddress;
    strcpy((LPSTR)lpCallParams + sizeof(LINECALLPARAMS),
           lpszDisplayableAddress);

    return lpCallParams;
}

//
//  FUNCTION: long WaitForReply(long)
//
//  PURPOSE: Resynchronize by waiting for a LINE_REPLY 
//
//  PARAMETERS:
//    lRequestID - The asynchronous request ID that we're
//                 on a LINE_REPLY for.
//
//  RETURN VALUE:
//    - 0 if LINE_REPLY responded with a success.
//    - LINEERR constant if LINE_REPLY responded with a LINEERR
//    - 1 if the line was shut down before LINE_REPLY is received.
//
//  COMMENTS:
//
//    This function allows us to resynchronize an asynchronous
//    TAPI line call by waiting for the LINE_REPLY message.  It
//    waits until a LINE_REPLY is received or the line is shut down.
//
//    Note that this could cause re-entrancy problems as
//    well as mess with any message preprocessing that might
//    occur on this thread (such as TranslateAccelerator).
//
//    This function should to be called from the thread that did
//    lineInitialize, or the PeekMessage is on the wrong thread
//    and the synchronization is not guaranteed to work.  Also note
//    that if another PeekMessage loop is entered while waiting,
//    this could also cause synchronization problems.
//
//    One more note.  This function can potentially be re-entered
//    if the call is dropped for any reason while waiting.  If this
//    happens, just drop out and assume the wait has been canceled.  
//    This is signaled by setting bReentered to FALSE when the function 
//    is entered and TRUE when it is left.  If bReentered is ever TRUE 
//    during the function, then the function was re-entered.
//
//    This function times out and returns WAITERR_WAITTIMEDOUT
//    after WAITTIMEOUT milliseconds have elapsed.
//
//


long CTapiConnection::WaitForReply (long lRequestID)
{
    static BOOL bReentered;
    bReentered = FALSE;

    if (lRequestID > SUCCESS)
    {
        MSG msg; 
        DWORD dwTimeStarted;

        m_bReplyReceived = FALSE;
        m_dwRequestedID = (DWORD) lRequestID;

        // Initializing this just in case there is a bug
        // that sets m_bReplyRecieved without setting the reply value.
        m_lAsyncReply = LINEERR_OPERATIONFAILED;

        dwTimeStarted = GetTickCount();

        while(!m_bReplyReceived)
        {
            if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }

            // This should only occur if the line is shut down while waiting.
            if ((m_hCall != NULL) &&(!m_bTapiInUse || bReentered))
            {
                bReentered = TRUE;
                return WAITERR_WAITABORTED;
            }

            // Its a really bad idea to timeout a wait for a LINE_REPLY.
            // If we are execting a LINE_REPLY, we should wait till we get
            // it; it might take a long time to dial (for example).

            // If 5 seconds go by without a reply, it might be a good idea
            // to display a dialog box to tell the user that a
            // wait is in progress and to give the user the capability to
            // abort the wait.
        }

        bReentered = TRUE;
        return m_lAsyncReply;
    }

    bReentered = TRUE;
    return lRequestID;
}

//
//  FUNCTION: lineCallbackFunc(..)
//
//  PURPOSE: Receive asynchronous TAPI events
//
void CALLBACK CTapiConnection::lineCallbackFunc(
    DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance, 
    DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
{

    // Handle the line messages.
    switch(dwMsg)
    {
        case LINE_CALLSTATE:
            MyThis->HandleLineCallState(dwDevice, dwMsg, dwCallbackInstance, dwParam1, dwParam2,
                dwParam3);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产小视频| 日韩视频免费观看高清完整版 | 美女视频免费一区| 一区二区在线免费| 国产蜜臀av在线一区二区三区 | 欧美最新大片在线看| 国产一本一道久久香蕉| 麻豆免费精品视频| 亚洲最新视频在线观看| 国产精品素人视频| www一区二区| 精品国产1区二区| 日韩欧美国产1| 日韩视频在线你懂得| 91麻豆精品国产| 9色porny自拍视频一区二区| 精品在线播放免费| 狠狠色丁香婷婷综合| 久久99九九99精品| 久久99国产精品尤物| 精品综合久久久久久8888| 丝袜国产日韩另类美女| 日日噜噜夜夜狠狠视频欧美人| 一区二区三区四区av| 一区二区三区鲁丝不卡| 天天色天天操综合| 美国三级日本三级久久99 | 成人精品亚洲人成在线| 成人app网站| 欧美调教femdomvk| 日韩欧美一区二区免费| 久久精品一区蜜桃臀影院| 国产精品久久久久久久久免费丝袜 | 欧美国产日韩a欧美在线观看| 欧美国产成人精品| 国产亚洲自拍一区| 一区二区三区四区亚洲| 久久嫩草精品久久久精品| 91麻豆国产福利在线观看| 精品一区二区免费在线观看| 国产精品麻豆久久久| 精品日韩成人av| 日韩女优制服丝袜电影| 狠狠色丁香婷综合久久| 亚洲少妇中出一区| 日韩三级视频中文字幕| 欧美性三三影院| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 欧美日韩一区国产| 色综合亚洲欧洲| 91色porny在线视频| 粉嫩欧美一区二区三区高清影视| 免费不卡在线视频| 成人午夜激情片| 欧美剧情片在线观看| 久久精品视频网| 亚洲gay无套男同| 成人不卡免费av| 欧美大片一区二区| 亚洲国产人成综合网站| av色综合久久天堂av综合| 欧美四级电影在线观看| 日韩理论片中文av| 99精品国产视频| 国产欧美日韩三级| 国产精品66部| 欧美亚洲精品一区| 国产精品久久久久久妇女6080| 国产精品一区二区男女羞羞无遮挡| 欧美日产国产精品| 蜜臀久久99精品久久久久久9| 欧美日韩在线精品一区二区三区激情 | 精品久久久久一区二区国产| 亚洲123区在线观看| 色婷婷综合中文久久一本| 自拍偷拍亚洲激情| 色婷婷国产精品综合在线观看| 中文字幕在线观看一区二区| 99久久精品国产一区二区三区| 国产精品久久久久永久免费观看 | 欧美色大人视频| 美女视频免费一区| 亚洲精选一二三| 国产日韩精品久久久| 欧美一区二区三区男人的天堂| jizzjizzjizz欧美| 午夜婷婷国产麻豆精品| 亚洲欧美综合网| 中文字幕乱码亚洲精品一区| 91精品国产乱码久久蜜臀| 日本精品视频一区二区三区| 中文字幕一区二区不卡| 卡一卡二国产精品| 国产精品理伦片| 7777女厕盗摄久久久| 丁香婷婷综合色啪| 午夜视频在线观看一区二区三区| 久久综合给合久久狠狠狠97色69| 99国产精品国产精品毛片| 日韩综合小视频| 亚洲日本乱码在线观看| 欧美大黄免费观看| 欧美日韩在线精品一区二区三区激情| 国产一区二区在线免费观看| 亚洲激情网站免费观看| 欧美国产激情一区二区三区蜜月| 欧美午夜一区二区三区| 91丨九色丨黑人外教| 国产精品亚洲午夜一区二区三区| 日韩激情在线观看| 亚洲电影激情视频网站| 亚洲免费av网站| 中文字幕亚洲成人| 国产精品福利影院| 亚洲国产高清在线观看视频| 久久免费电影网| 久久亚洲二区三区| 久久久精品影视| 国产视频在线观看一区二区三区 | 国产精品美女久久久久aⅴ| 欧美精品一区二区三区在线| 日韩一区和二区| 日韩免费视频一区二区| 久久一夜天堂av一区二区三区| 欧美一激情一区二区三区| 欧美一区二区三区婷婷月色| 欧美精品一卡两卡| 日韩限制级电影在线观看| 欧美成va人片在线观看| 久久久久久久电影| 国产精品久久午夜| 亚洲美女在线国产| 蜜臀av国产精品久久久久| 激情综合色综合久久| 国产白丝网站精品污在线入口| 懂色av一区二区夜夜嗨| 91激情五月电影| 欧美精品粉嫩高潮一区二区| 26uuu精品一区二区三区四区在线| 久久久午夜电影| 亚洲最大成人网4388xx| 免播放器亚洲一区| 99国产麻豆精品| 欧美一级精品在线| 亚洲欧洲在线观看av| 日韩中文字幕一区二区三区| 国模无码大尺度一区二区三区| 成人污污视频在线观看| 欧美人xxxx| 亚洲欧美激情一区二区| 男女男精品视频| 欧美日韩一卡二卡三卡| 久久久久九九视频| 首页国产欧美日韩丝袜| 成人的网站免费观看| 欧美成人r级一区二区三区| 亚洲自拍偷拍九九九| 大白屁股一区二区视频| 精品精品欲导航| 婷婷成人激情在线网| 色呦呦网站一区| 中文字幕一区二区三区av| 国产乱码精品一品二品| 欧美一级久久久| 午夜伦理一区二区| 在线视频国内自拍亚洲视频| 亚洲国产精品黑人久久久| 久久电影网电视剧免费观看| 91精品在线麻豆| 婷婷成人综合网| 日韩欧美中文字幕制服| 性感美女久久精品| 色播五月激情综合网| 最新不卡av在线| 色综合天天综合色综合av| ...av二区三区久久精品| 91网页版在线| 午夜精品一区二区三区电影天堂| 在线免费不卡视频| 五月激情丁香一区二区三区| 欧美日韩精品系列| 日本女优在线视频一区二区| 国产性做久久久久久| 国产精品一品视频| 国产精品视频观看| 91福利在线导航| 免费不卡在线视频| 国产日本亚洲高清| 色综合视频一区二区三区高清| 伊人性伊人情综合网| 欧美日韩国产影片| 激情综合色播激情啊| 亚洲欧美日韩小说| 日韩精品一区二区三区三区免费| 国产福利不卡视频| 亚洲一区二区成人在线观看| 日韩精品一区二区在线| 99久久99久久精品国产片果冻| 视频精品一区二区| 国产日产欧美一区二区视频|