mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
6.6 KiB
257 lines
6.6 KiB
#include <windows.h>
|
|
#include <tapi.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
char szAppName[] = "TapiTest";
|
|
|
|
#define APIVERSION 0x00010004
|
|
|
|
// TAPI global variables.
|
|
HINSTANCE hInstance;
|
|
HLINEAPP hLineApp;
|
|
DWORD dwNumDevs;
|
|
long lReturn;
|
|
|
|
void CALLBACK lineCallbackFunc(
|
|
DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance,
|
|
DWORD dwParam1, DWORD dwParam2, DWORD dwParam3);
|
|
void PrintTapiLines(DWORD dwDeviceID);
|
|
|
|
int main (int argc, char * argv[], char * envp[])
|
|
{
|
|
MSG msg;
|
|
DWORD i;
|
|
|
|
// Prime the message queue
|
|
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
|
|
|
|
hInstance = GetModuleHandle(NULL);
|
|
|
|
if (lReturn = lineInitialize(&hLineApp, hInstance, lineCallbackFunc,
|
|
szAppName, &dwNumDevs))
|
|
{
|
|
printf("lineInitialize failed: %li.\n", lReturn);
|
|
return 0;
|
|
}
|
|
|
|
if (dwNumDevs)
|
|
{
|
|
printf(
|
|
"<- dwDeviceID\n"
|
|
"| <- Max dwAPIVersion\n"
|
|
"| | <- Number of addresses\n"
|
|
"| | | <- Supports voice comm/datamodem calls?\n"
|
|
"| | | | <- Call in progress?\n"
|
|
"| | | | | <- Any application waiting for calls?\n"
|
|
"| | | | | | <- Service Povider - Line Device Name\n"
|
|
"V V V V V V V\n"
|
|
);
|
|
for (i=0;i<dwNumDevs;i++)
|
|
{
|
|
PrintTapiLines(i);
|
|
}
|
|
}
|
|
else
|
|
printf("No TAPI Line devices installed.\n");
|
|
|
|
lineShutdown(hLineApp);
|
|
}
|
|
|
|
void PrintTapiLines(DWORD dwDeviceID)
|
|
{
|
|
BOOL bSupportsDataComm = TRUE;
|
|
|
|
DWORD dwApiVersion;
|
|
LINEEXTENSIONID ExtensionID;
|
|
HLINE hLine;
|
|
DWORD dwAddressID = 0;
|
|
|
|
VARSTRING SmallVarString;
|
|
|
|
BYTE bufferLDC[4096];
|
|
LPLINEDEVCAPS lpLineDevCaps = (LPLINEDEVCAPS) bufferLDC;
|
|
|
|
BYTE bufferLDS[4096];
|
|
LPLINEDEVSTATUS lpLineDevStatus = (LPLINEDEVSTATUS) bufferLDS;
|
|
|
|
static BYTE bufferLPL[4096];
|
|
static LPLINEPROVIDERLIST lpLineProviderList =
|
|
(LPLINEPROVIDERLIST) bufferLPL;
|
|
static LPLINEPROVIDERENTRY lpLineProviderEntry;
|
|
DWORD dwCount;
|
|
|
|
char * lpszLineName;
|
|
char szLineUnavail[] = "Line Unavailable";
|
|
char szLineUnnamed[] = "Line Unnamed";
|
|
char szLineNameEmpty[] = "Line Name is Empty";
|
|
|
|
lpLineDevCaps ->dwTotalSize = sizeof(bufferLDC);
|
|
lpLineDevStatus ->dwTotalSize = sizeof(bufferLDS);
|
|
lpLineProviderList->dwTotalSize = sizeof(bufferLPL);
|
|
SmallVarString .dwTotalSize = sizeof(VARSTRING);
|
|
|
|
if (!lpLineProviderEntry)
|
|
{
|
|
lpLineProviderList->dwTotalSize = sizeof(bufferLPL);
|
|
lineGetProviderList(0x00010004, lpLineProviderList);
|
|
lpLineProviderEntry = (LPLINEPROVIDERENTRY)
|
|
((BYTE *) lpLineProviderList +
|
|
lpLineProviderList->dwProviderListOffset);
|
|
}
|
|
|
|
printf("%-2lu, ", dwDeviceID);
|
|
|
|
lReturn = lineNegotiateAPIVersion (hLineApp, dwDeviceID,
|
|
0x00010003, 0x00FF0004, &dwApiVersion, &ExtensionID);
|
|
|
|
if (lReturn)
|
|
{
|
|
printf("lineNegotiateAPIVersion error: %li\n", lReturn);
|
|
return;
|
|
}
|
|
|
|
printf("%lx.%lx, ", (dwApiVersion&0xFFFF0000)/0x00010000,
|
|
dwApiVersion&0x0000FFFF);
|
|
|
|
lReturn = lineNegotiateAPIVersion (hLineApp, dwDeviceID,
|
|
APIVERSION, APIVERSION, &dwApiVersion, &ExtensionID);
|
|
|
|
if (lReturn == LINEERR_INCOMPATIBLEAPIVERSION)
|
|
bSupportsDataComm = FALSE;
|
|
else if (lReturn)
|
|
{
|
|
printf("lineNegotiateAPIVersion error: %li\n", lReturn);
|
|
return;
|
|
}
|
|
|
|
//printf("\r\nAbout to call linegetdevcaps");
|
|
|
|
lReturn = lineGetDevCaps(hLineApp, dwDeviceID,
|
|
dwApiVersion, 0, lpLineDevCaps);
|
|
|
|
//printf("\r\nDone\r\n");
|
|
|
|
if (lReturn)
|
|
{
|
|
printf("lineGetDevCaps error: %li\n", lReturn);
|
|
return;
|
|
}
|
|
|
|
//printf("\r\nprint\r\n");
|
|
|
|
printf("%lu, ", lpLineDevCaps->dwNumAddresses);
|
|
|
|
//printf("\r\nDone2\r\n");
|
|
|
|
// TODO list available bearer modes
|
|
|
|
if (!(lpLineDevCaps->dwBearerModes & LINEBEARERMODE_VOICE ))
|
|
bSupportsDataComm = FALSE;
|
|
|
|
if (!(lpLineDevCaps->dwMediaModes & LINEMEDIAMODE_DATAMODEM))
|
|
bSupportsDataComm = FALSE;
|
|
|
|
if (!(lpLineDevCaps->dwLineFeatures & LINEFEATURE_MAKECALL))
|
|
bSupportsDataComm = FALSE;
|
|
|
|
lReturn = lineOpen(hLineApp, dwDeviceID, &hLine,
|
|
dwApiVersion, 0, 0, LINECALLPRIVILEGE_NONE, 0, 0);
|
|
|
|
if(lReturn == LINEERR_ALLOCATED)
|
|
{
|
|
printf("Line is already in use by a non-TAPI app or another TSP\n");
|
|
return;
|
|
}
|
|
|
|
if (lReturn)
|
|
{
|
|
printf("lineOpen error: %li\n", lReturn);
|
|
return;
|
|
}
|
|
|
|
// Make sure the "comm/datamodem" device class is supported
|
|
// Note that we don't want any of the 'extra' information
|
|
// normally returned in the VARSTRING structure. All we care
|
|
// about is if lineGetID succeeds.
|
|
lReturn = lineGetID(hLine, 0, 0, LINECALLSELECT_LINE,
|
|
&SmallVarString, "comm/datamodem");
|
|
|
|
if (lReturn)
|
|
bSupportsDataComm = FALSE;
|
|
|
|
if (bSupportsDataComm)
|
|
printf("Y, ");
|
|
else
|
|
printf("N, ");
|
|
|
|
// TODO list calls already in progress.
|
|
|
|
lReturn = lineGetLineDevStatus(hLine, lpLineDevStatus);
|
|
if (lReturn)
|
|
{
|
|
printf("lineGetLineDevStatus error: %li\n", lReturn);
|
|
return;
|
|
}
|
|
|
|
if (lpLineDevStatus->dwNumActiveCalls ||
|
|
lpLineDevStatus->dwNumOnHoldCalls ||
|
|
lpLineDevStatus->dwNumOnHoldPendCalls)
|
|
printf("Y, ");
|
|
else
|
|
printf("N, ");
|
|
|
|
if (lpLineDevStatus->dwOpenMediaModes)
|
|
printf("Y, ");
|
|
else
|
|
printf("N, ");
|
|
|
|
|
|
dwCount = lpLineProviderList->dwNumProviders;
|
|
while(dwCount--)
|
|
{
|
|
if (HIWORD(lpLineDevCaps->dwPermanentLineID) ==
|
|
lpLineProviderEntry[dwCount].dwPermanentProviderID)
|
|
{
|
|
printf("%s - ", (char *)
|
|
((BYTE *) lpLineProviderList +
|
|
lpLineProviderEntry[dwCount].dwProviderFilenameOffset));
|
|
dwCount = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (dwCount != 1)
|
|
printf("Unknown TSP - ");
|
|
|
|
if ((lpLineDevCaps -> dwLineNameSize) &&
|
|
(lpLineDevCaps -> dwLineNameOffset) &&
|
|
(lpLineDevCaps -> dwStringFormat == STRINGFORMAT_ASCII))
|
|
{
|
|
// This is the name of the device.
|
|
lpszLineName = (char *)
|
|
((BYTE *) lpLineDevCaps + lpLineDevCaps -> dwLineNameOffset);
|
|
|
|
if (lpszLineName[0] != '\0')
|
|
{
|
|
// If the device name is not null terminated, null
|
|
// terminate it. Yes, this looses the end character.
|
|
// Its a bug in the service provider.
|
|
lpszLineName[lpLineDevCaps->dwLineNameSize-1] = '\0';
|
|
}
|
|
else // Line name started with a NULL.
|
|
lpszLineName = szLineNameEmpty;
|
|
}
|
|
else // DevCaps doesn't have a valid line name. Unnamed.
|
|
lpszLineName = szLineUnnamed;
|
|
|
|
printf("%s\n",lpszLineName);
|
|
lineClose(hLine);
|
|
}
|
|
|
|
|
|
void CALLBACK lineCallbackFunc(
|
|
DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance,
|
|
DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
|
|
{
|
|
}
|