📄 tapi.cpp
字号:
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 + -