📄 wavetsp.cpp
字号:
pac->dwCallFeatures = LINECALLFEATURE_DIAL |
LINECALLFEATURE_DROP |
LINECALLFEATURE_GENERATEDIGITS;
pac->dwAddressFeatures = LINEADDRFEATURE_MAKECALL;
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineGetID(
HDRVLINE hdLine,
DWORD dwAddressID,
HDRVCALL hdCall,
DWORD dwSelect,
LPVARSTRING pDeviceID,
LPCWSTR pszDeviceClass,
HANDLE hTargetProcess)
{
BEGIN_PARAM_TABLE("TSPI_lineGetID")
DWORD_IN_ENTRY(hdLine)
DWORD_IN_ENTRY(dwAddressID)
DWORD_IN_ENTRY(hdCall)
DWORD_IN_ENTRY(dwSelect)
DWORD_IN_ENTRY(pDeviceID)
STRING_IN_ENTRY(pszDeviceClass)
DWORD_IN_ENTRY(hTargetProcess)
END_PARAM_TABLE()
LONG tr = LINEERR_NODEVICE;
/*
// TAPI handles "tapi/line" and "tapi/phone",
// so long as this function is present and returns LINEERR_NODEVICE
LONG tr = 0;
CtspCall* pCall = (dwSelect == LINECALLSELECT_CALL ? (CtspCall*)hdCall : 0);
CtspLine* pLine = (dwSelect == LINECALLSELECT_LINE ? (CtspLine*)hdLine : (pCall ? pCall->GetLine() : 0));
if( lstrcmpiW(pszDeviceClass, L"tapi/line") == 0 )
{
pDeviceID->dwNeededSize = sizeof(VARSTRING) + sizeof(DWORD);
if( pDeviceID->dwNeededSize <= pDeviceID->dwTotalSize )
{
pDeviceID->dwUsedSize = pDeviceID->dwNeededSize;
pDeviceID->dwStringFormat = STRINGFORMAT_BINARY;
pDeviceID->dwStringSize = sizeof(DWORD);
pDeviceID->dwStringOffset = sizeof(VARSTRING);
*((LPDWORD)(pDeviceID + 1)) = pLine->GetDeviceID();
}
else
{
pDeviceID->dwUsedSize = 3 * sizeof(DWORD);
tr = LINEERR_STRUCTURETOOSMALL;
}
}
else
{
tr = LINEERR_NODEVICE;
}
*/
return EPILOG(tr);
}
LONG TSPIAPI TSPI_lineOpen(
DWORD dwDeviceID,
HTAPILINE htLine,
LPHDRVLINE phdLine,
DWORD dwTSPIVersion,
LINEEVENT pfnEventProc)
{
BEGIN_PARAM_TABLE("TSPI_lineOpen")
DWORD_IN_ENTRY(dwDeviceID)
DWORD_IN_ENTRY(htLine)
DWORD_OUT_ENTRY(phdLine)
DWORD_IN_ENTRY(dwTSPIVersion)
DWORD_IN_ENTRY(pfnEventProc)
END_PARAM_TABLE()
LONG tr = LINEERR_NOMEM;
CtspLine* pLine = new CtspLine(htLine, pfnEventProc, dwDeviceID);
if( pLine )
{
*phdLine = (HDRVLINE)pLine;
tr = 0;
}
return EPILOG(tr);
}
LONG TSPIAPI TSPI_lineSetDefaultMediaDetection(
HDRVLINE hdLine,
DWORD dwMediaModes)
{
BEGIN_PARAM_TABLE("TSPI_lineSetDefaultMediaDetection")
DWORD_IN_ENTRY(hdLine)
DWORD_IN_ENTRY(dwMediaModes)
END_PARAM_TABLE()
// This function is required, or TAPISRV will crash
// if any application attempts to open this line
// for incoming calls (sigh)
return EPILOG(LINEERR_OPERATIONUNAVAIL);
}
LONG TSPIAPI TSPI_lineGetNumAddressIDs(
HDRVLINE hdLine,
LPDWORD pdwNumAddressIDs)
{
BEGIN_PARAM_TABLE("TSPI_lineGetNumAddressIDs")
DWORD_IN_ENTRY(hdLine)
DWORD_OUT_ENTRY(pdwNumAddressIDs)
END_PARAM_TABLE()
// We only support 1 address (id=0)
*pdwNumAddressIDs = 1;
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineClose(
HDRVLINE hdLine)
{
BEGIN_PARAM_TABLE("TSPI_lineClose")
DWORD_IN_ENTRY(hdLine)
END_PARAM_TABLE()
delete (CtspLine*)hdLine;
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineMakeCall(
DRV_REQUESTID dwRequestID,
HDRVLINE hdLine,
HTAPICALL htCall,
LPHDRVCALL phdCall,
LPCWSTR pszDestAddress,
DWORD dwCountryCode,
LPLINECALLPARAMS const pCallParams)
{
BEGIN_PARAM_TABLE("TSPI_lineMakeCall")
DWORD_IN_ENTRY(dwRequestID)
DWORD_IN_ENTRY(hdLine)
DWORD_IN_ENTRY(htCall)
DWORD_OUT_ENTRY(phdCall)
STRING_IN_ENTRY(pszDestAddress)
DWORD_IN_ENTRY(dwCountryCode)
DWORD_IN_ENTRY(pCallParams)
END_PARAM_TABLE()
LONG tr;
CtspLine* pLine = (CtspLine*)hdLine;
tr = pLine->MakeCall(dwRequestID, htCall, phdCall, pszDestAddress, dwCountryCode, pCallParams);
return EPILOG(tr);
}
LONG TSPIAPI TSPI_lineSetStatusMessages(
HDRVLINE hdLine,
DWORD dwLineStates,
DWORD dwAddressStates)
{
BEGIN_PARAM_TABLE("TSPI_lineSetStatusMessages")
DWORD_IN_ENTRY(hdLine)
DWORD_IN_ENTRY(dwLineStates)
DWORD_IN_ENTRY(dwAddressStates)
END_PARAM_TABLE()
// Since we don't ever send status messages of any kind
// we're happy at any limit. However, some apps require
// that this function return successfully before a call
// can be made, e.g. Outlook 98.
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineDrop(
DRV_REQUESTID dwRequestID,
HDRVCALL hdCall,
LPCSTR psUserUserInfo,
DWORD dwSize)
{
BEGIN_PARAM_TABLE("TSPI_lineDrop")
DWORD_IN_ENTRY(dwRequestID)
DWORD_IN_ENTRY(hdCall)
DWORD_IN_ENTRY(psUserUserInfo)
DWORD_IN_ENTRY(dwSize)
END_PARAM_TABLE()
CtspCall* pCall = (CtspCall*)hdCall;
pCall->Drop();
g_pfnCompletionProc(dwRequestID, 0);
return EPILOG(dwRequestID);
}
LONG TSPIAPI TSPI_lineCloseCall(
HDRVCALL hdCall)
{
BEGIN_PARAM_TABLE("TSPI_lineCloseCall")
DWORD_IN_ENTRY(hdCall)
END_PARAM_TABLE()
// Note that in TAPI 2.0 TSPI_lineCloseCall can get called
// without TSPI_lineDrop ever being called, so we need to
// be prepared for either case.
CtspCall* pCall = (CtspCall*)hdCall;
pCall->Drop();
delete pCall;
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineGetAddressStatus(
HDRVLINE hdLine,
DWORD dwAddressID,
LPLINEADDRESSSTATUS pas)
{
BEGIN_PARAM_TABLE("TSPI_lineGetAddressStatus")
DWORD_IN_ENTRY(hdLine)
DWORD_IN_ENTRY(dwAddressID)
DWORD_IN_ENTRY(pas)
END_PARAM_TABLE()
pas->dwNeededSize = sizeof(LINEADDRESSSTATUS);
pas->dwUsedSize = sizeof(LINEADDRESSSTATUS);
pas->dwNumActiveCalls = ((CtspLine*)hdLine)->GetNumActiveCalls();
pas->dwAddressFeatures = LINEADDRFEATURE_MAKECALL;
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineGetCallAddressID(
HDRVCALL hdCall,
LPDWORD pdwAddressID)
{
BEGIN_PARAM_TABLE("TSPI_lineGetCallAddressID")
DWORD_IN_ENTRY(hdCall)
DWORD_OUT_ENTRY(pdwAddressID)
END_PARAM_TABLE()
// We only support 1 address (id=0)
*pdwAddressID = 0;
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineGetCallInfo(
HDRVCALL hdCall,
LPLINECALLINFO pli)
{
BEGIN_PARAM_TABLE("TSPI_lineGetCallInfo")
DWORD_IN_ENTRY(hdCall)
DWORD_IN_ENTRY(pli)
END_PARAM_TABLE()
pli->dwNeededSize = sizeof(LINECALLINFO);
pli->dwUsedSize = sizeof(LINECALLINFO);
pli->dwBearerMode = LINEBEARERMODE_VOICE;
pli->dwMediaMode = LINEMEDIAMODE_INTERACTIVEVOICE;
pli->dwCallStates = LINECALLSTATE_IDLE |
LINECALLSTATE_DIALING |
LINECALLSTATE_CONNECTED |
LINECALLSTATE_PROCEEDING |
LINECALLSTATE_UNKNOWN;
pli->dwOrigin = LINECALLORIGIN_OUTBOUND;
pli->dwReason = LINECALLREASON_DIRECT;
pli->dwCallerIDFlags = LINECALLPARTYID_UNAVAIL;
pli->dwCalledIDFlags = LINECALLPARTYID_UNAVAIL;
pli->dwConnectedIDFlags = LINECALLPARTYID_UNAVAIL;
pli->dwRedirectionIDFlags = LINECALLPARTYID_UNAVAIL;
pli->dwRedirectingIDFlags = LINECALLPARTYID_UNAVAIL;
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineGetCallStatus(
HDRVCALL hdCall,
LPLINECALLSTATUS pls)
{
BEGIN_PARAM_TABLE("TSPI_lineGetCallStatus")
DWORD_IN_ENTRY(hdCall)
DWORD_IN_ENTRY(pls)
END_PARAM_TABLE()
CtspCall* pCall = (CtspCall*)hdCall;
pls->dwNeededSize = sizeof(LINECALLSTATUS);
pls->dwUsedSize = sizeof(LINECALLSTATUS);
pls->dwCallState = pCall->GetCallState();
if( pls->dwCallState != LINECALLSTATE_IDLE )
{
pls->dwCallFeatures = LINECALLFEATURE_DROP;
}
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineGetLineDevStatus(
HDRVLINE hdLine,
LPLINEDEVSTATUS plds)
{
BEGIN_PARAM_TABLE("TSPI_lineGetLineDevStatus")
DWORD_IN_ENTRY(hdLine)
DWORD_IN_ENTRY(plds)
END_PARAM_TABLE()
plds->dwUsedSize = sizeof(LINEDEVSTATUS);
plds->dwNeededSize = sizeof(LINEDEVSTATUS);
plds->dwNumActiveCalls = ((CtspLine*)hdLine)->GetNumActiveCalls();
plds->dwDevStatusFlags = LINEDEVSTATUSFLAGS_CONNECTED |
LINEDEVSTATUSFLAGS_INSERVICE;
return EPILOG(0);
}
LONG TSPIAPI TSPI_lineGetIcon(
DWORD dwDeviceID,
LPCWSTR lpszDeviceClass,
LPHICON lphIcon)
{
BEGIN_PARAM_TABLE("TSPI_lineGetIcon")
DWORD_IN_ENTRY(dwDeviceID)
STRING_IN_ENTRY(lpszDeviceClass)
DWORD_OUT_ENTRY(lphIcon)
END_PARAM_TABLE()
*lphIcon = LoadIcon(g_hinst, MAKEINTRESOURCE(IDI_WAVETSP));
return EPILOG(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -