⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tapi.cpp

📁 Windows CE操作系统中适用的蓝牙驱动程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    DWORD dwRetVal = ERROR_SUCCESS;

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: ++BthAGNetworkDialNumber\n"));

    TapiLock();

    if (NETWORK_STATE_INCALL == g_Data.dwState) {
        // We are already in an active call.  Put this call on hold first.
        
        ASSERT(g_Data.hHoldCall == NULL);

        LONG lCallId = lineHold(g_Data.hCall);
        if (lCallId < 0) {
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkDialNumber - call to lineHold failed: %d.\n", lCallId));
        }
        
        dwRetVal = BlockingTapiCall(lCallId);
        if (ERROR_SUCCESS != dwRetVal) {
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkDialNumber - call to ActiveCallToHoldBlocking failed: %d.\n", dwRetVal));
        }
        else {
            // Call state change should have already updated this
            ASSERT(g_Data.hCall == NULL);   
            ASSERT(g_Data.dwState == NETWORK_STATE_ONHOLD);
        }
    }

    if ((NETWORK_STATE_DISCONNECTED == g_Data.dwState) ||   // Outgoing call
        (NETWORK_STATE_ONHOLD == g_Data.dwState)            // Outgoing call with call on hold
        ) {
        ASSERT(g_Data.hCall == NULL);
        
        LONG lCallId = lineMakeCall(g_Data.hLine, &g_Data.hCall, pwszNumber, 0, NULL);
        if (lCallId < 0) {
            dwRetVal = lCallId;
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkDialNumber - call to lineMakeCall failed: %d.\n", dwRetVal));            
            goto exit;
        }

        dwRetVal = AddTapiCall(lCallId, CALL_TYPE_DIAL, NULL);
    }
    
exit:
    TapiUnlock();

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: --BthAGNetworkDialNumber\n"));
    
    return dwRetVal;    
}


//
// This function hangs up one or more calls in the specified states
//
DWORD BthAGNetworkDropCall(DWORD dwFlags)
{
    DWORD dwRetVal = ERROR_SUCCESS;

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: ++BthAGNetworkDropCall\n"));

    TapiLock();

    if (g_Data.dwState > NETWORK_STATE_DISCONNECTED) {
        if (g_Data.hCall && g_Data.hHoldCall && (dwFlags & NETWORK_FLAGS_DROP_ACTIVE)) {
            // We have an active call and a call on hold and we are dropping the active call.
            // In this case, we want to unhold the other call.

            LONG lCallId = lineDrop(g_Data.hCall, NULL, 0);
            if (lCallId < 0) {
                dwRetVal = lCallId;
                DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkDropCall - call to lineDrop failed: %d.\n", dwRetVal));
                goto exit;
            }

            dwRetVal = BlockingTapiCall(lCallId);
            if (ERROR_SUCCESS != dwRetVal) {
                DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkDropCall - call to BlockingTapiCall failed: %d.\n", dwRetVal));
                goto exit;
            }

            g_Data.AddRef();
            TapiUnlock();
            
            dwRetVal = BthAGNetworkUnholdCall();
            
            TapiLock();  
            g_Data.DelRef();

            if (ERROR_SUCCESS != dwRetVal) {
                DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkDropCall - call to BthAGNetworkUnholdCall failed: %d.\n", dwRetVal));
                goto exit;
            }
        }
        else {
            // Normal case

            HCALL hCall = g_Data.hCall;
            if (! hCall) {
                hCall = g_Data.hOfferingCall;
            }

            LONG lCallId;
            
            if (hCall && (dwFlags & NETWORK_FLAGS_DROP_ACTIVE)) {
                lCallId = lineDrop(hCall, NULL, 0);
                if (lCallId < 0) {
                    dwRetVal = lCallId;
                    DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkDropCall - call to lineDrop failed: %d.\n", dwRetVal));
                    goto exit;
                }

                dwRetVal = AddTapiCall(lCallId, CALL_TYPE_DROP, NULL);
                if (ERROR_SUCCESS != dwRetVal) {
                    goto exit;
                }
            }

            hCall = g_Data.hHoldCall;

            if (hCall && (dwFlags & NETWORK_FLAGS_DROP_HOLD)) {
                lCallId = lineDrop(hCall, NULL, 0);
                if (lCallId < 0) {
                    dwRetVal = lCallId;
                    DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkDropCall - call to lineDrop failed: %d.\n", dwRetVal));
                    goto exit;
                }

                dwRetVal = AddTapiCall(lCallId, CALL_TYPE_DROP, NULL);
                if (ERROR_SUCCESS != dwRetVal) {
                    goto exit;
                }
            }
        }
    }
    else {
        dwRetVal = ERROR_NOT_READY;
    }

exit:    
    TapiUnlock();

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: --BthAGNetworkDropCall\n"));

    return dwRetVal;    
}


//
// This function answers the current incoming call.
//
DWORD BthAGNetworkAnswerCall(void)
{
    DWORD dwRetVal = ERROR_SUCCESS;

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: ++BthAGNetworkAnswerCall\n"));

    TapiLock();

    if ((NETWORK_STATE_RINGING == g_Data.dwState) ||    // incoming call
        (NETWORK_STATE_ONHOLD == g_Data.dwState)        // call-waiting
        ) {

        ASSERT(g_Data.hCall == NULL);
        
        LONG lErr = lineSetCallPrivilege(g_Data.hOfferingCall, LINECALLPRIVILEGE_OWNER);
        if (0 != lErr) {
            DEBUGMSG(ZONE_WARN, (L"BTAGSVC: Network - Error calling lineSetCallPrivilege: %d.\n", lErr));
        }
        
        LONG lCallId = lineAnswer(g_Data.hOfferingCall, NULL, 0);
        if (lCallId < 0) {
            dwRetVal = lCallId;
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkAnswerCall - call to lineAnswer failed: %d.\n", dwRetVal));
            goto exit;
        }

        dwRetVal = AddTapiCall(lCallId, CALL_TYPE_ANSWER, NULL);
        if (ERROR_SUCCESS != dwRetVal) {
            goto exit;
        }        
    }
    else {
        dwRetVal = ERROR_NOT_READY;
    }

exit:
    TapiUnlock();

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: --BthAGNetworkAnswerCall\n"));

    return dwRetVal;    
}


//
// This function puts the active call on hold
//
DWORD BthAGNetworkHoldCall(void)
{
    DWORD dwRetVal = ERROR_SUCCESS;

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: ++BthAGNetworkHoldCall\n"));

    TapiLock();

    if (NETWORK_STATE_INCALL == g_Data.dwState) {
        ASSERT(g_Data.hCall);
        
        LONG lErr = lineSetCallPrivilege(g_Data.hCall, LINECALLPRIVILEGE_OWNER);
        if (0 != lErr) {
            DEBUGMSG(ZONE_WARN, (L"BTAGSVC: Network - Error calling lineSetCallPrivilege: %d.\n", lErr));
        }
        
        LONG lCallId = lineHold(g_Data.hCall);
        if (lCallId < 0) {
            dwRetVal = lCallId;
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkHoldCall - call to lineHold failed: %d.\n", dwRetVal));
            goto exit;
        }

        dwRetVal = AddTapiCall(lCallId, CALL_TYPE_HOLD, NULL);
        if (ERROR_SUCCESS != dwRetVal) {
            goto exit;
        }
    }
    else {
        dwRetVal = ERROR_NOT_READY;
    }

exit:
    TapiUnlock();

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: --BthAGNetworkHoldCall\n"));

    return dwRetVal;    
}


//
// This function puts the active call on hold (if it exists) and puts another call (offering or held) in
// the active state.
//
DWORD BthAGNetworkSwapCall(void)
{
    DWORD dwRetVal = ERROR_SUCCESS;
    LONG lCallId;

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: ++BthAGNetworkSwapCall\n"));

    TapiLock();

    if ((NETWORK_STATE_INCALL == g_Data.dwState) && g_Data.hHoldCall) {
        //
        // We are in an active call with a call on hold
        //
        ASSERT(g_Data.hCall);
        
        
        lCallId = lineSwapHold(g_Data.hCall, g_Data.hHoldCall);
        if (lCallId < 0) {
            dwRetVal = lCallId;
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkSwapCall - call to lineSwapHold failed: %d.\n", dwRetVal));
            goto exit;
        }

        dwRetVal = AddTapiCall(lCallId, CALL_TYPE_SWAP, NULL);
        if (ERROR_SUCCESS != dwRetVal) {
            goto exit;
        }
    }
    else if ((NETWORK_STATE_INCALL == g_Data.dwState) && g_Data.hOfferingCall) {
        //
        // We are in an active call with an offering call
        //
        ASSERT(g_Data.hCall);
        ASSERT(g_Data.hHoldCall == NULL);

        lCallId = lineHold(g_Data.hCall);
        if (lCallId < 0) {
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkSwapCall - call to lineHold failed: %d.\n", lCallId));
        }
        
        dwRetVal = BlockingTapiCall(lCallId);
        if (ERROR_SUCCESS != dwRetVal) {
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkSwapCall - call to ActiveCallToHoldBlocking failed: %d.\n", dwRetVal));
        }
        else {
            // Call state change should have already updated this
            ASSERT(g_Data.hCall == NULL);   
            ASSERT(g_Data.dwState == NETWORK_STATE_ONHOLD);
        }

        g_Data.AddRef();
        TapiUnlock();
        
        dwRetVal = BthAGNetworkAnswerCall();
        
        TapiLock();
        g_Data.DelRef();
        
        if (ERROR_SUCCESS != dwRetVal) {
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkSwapCall - call to BthAGNetworkAnswerCall failed: %d.\n", dwRetVal));
            goto exit;
        }
    }
    else if (NETWORK_STATE_INCALL == g_Data.dwState) {
        //
        // We are in an active call with no other calls
        //
        ASSERT(g_Data.hCall);

        g_Data.AddRef();
        TapiUnlock();
        
        dwRetVal = BthAGNetworkHoldCall();
        
        TapiLock();
        g_Data.DelRef();

        if (ERROR_SUCCESS != dwRetVal) {
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkSwapCall - call to BthAGNetworkHoldCall failed: %d.\n", dwRetVal));
            goto exit;
        }
    }
    else if (NETWORK_STATE_ONHOLD == g_Data.dwState) {
        //
        // We are not in an active call and have a call on hold
        //
        ASSERT(g_Data.hCall == NULL);
        ASSERT(g_Data.hHoldCall);

        g_Data.AddRef();
        TapiUnlock();
        
        dwRetVal = BthAGNetworkUnholdCall();
        
        TapiLock();
        g_Data.DelRef();

        if (ERROR_SUCCESS != dwRetVal) {
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkSwapCall - call to BthAGNetworkUnholdCall failed: %d.\n", dwRetVal));
            goto exit;
        }
    }
    else {
        // Unknown state
        dwRetVal = ERROR_NOT_READY;
        DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkSwapCall - Error: We are not in a valid state to perform this operation.\n"));
    }

exit:
    TapiUnlock();

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: --BthAGNetworkSwapCall\n"));

    return dwRetVal;    
}


DWORD BthAGNetworkUnholdCall(void)
{
    DWORD dwRetVal = ERROR_SUCCESS;

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: ++BthAGNetworkUnholdCall\n"));

    TapiLock();

    if (NETWORK_STATE_ONHOLD == g_Data.dwState) {
        LONG lCallId = lineUnhold(g_Data.hHoldCall);
        if (lCallId < 0) {
            dwRetVal = lCallId;
            DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkUnholdCall - call to lineUnhold failed: %d.\n", dwRetVal));
            goto exit;
        }

        dwRetVal = AddTapiCall(lCallId, CALL_TYPE_UNHOLD, NULL);
        if (ERROR_SUCCESS != dwRetVal) {
            goto exit;
        }
    }
    else {
        DEBUGMSG(ZONE_ERROR, (L"BTAGSVC: BthAGNetworkUnholdCall - Invalid state current=%d need to be in NETWORK_STATE_ONHOLD.\n", g_Data.dwState));
        dwRetVal = ERROR_NOT_READY;
    }

exit:
    TapiUnlock();

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: --BthAGNetworkUnholdCall\n"));

    return dwRetVal;    
}


// This function transmits DTMF codes to TAPI.
DWORD BthAGNetworkTransmitDTMF(LPWSTR pwszDTMF)
{
    LONG dwRetVal = ERROR_SUCCESS;

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: ++BthAGNetworkTransmitDTMF\n"));

    TapiLock();

    if (NETWORK_STATE_INCALL == g_Data.dwState) {
        dwRetVal = lineGenerateDigits(g_Data.hCall, LINEDIGITMODE_DTMF, pwszDTMF, 0);                
    }
    else {
        dwRetVal = ERROR_NOT_READY;
    }

    TapiUnlock();

    DEBUGMSG(ZONE_NETWORK, (L"BTAGSVC: --BthAGNetworkTransmitDTMF\n"));

    return dwRetVal;    
}


// This function gets the call state
DWORD BthAGNetworkGetCallState(PDWORD pdwFlags)
{
    TapiLock();

    if (g_Data.hCall) {
        *pdwFlags |= NETWORK_FLAGS_STATE_ACTIVE;
    }
    if (g_Data.hHoldCall) {
        *pdwFlags |= NETWORK_FLAGS_STATE_HOLD;
    }
    if (g_Data.hOfferingCall) {
        *pdwFlags |= NETWORK_FLAGS_STATE_OFFERING;
    }   

    TapiUnlock();

    return ERROR_SUCCESS;
}


⌨️ 快捷键说明

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