3924 lines
128 KiB
C
3924 lines
128 KiB
C
/*++ BUILD Version: 0000 // Increment this if a change has global effects
|
|
|
|
Copyright (c) 1994-97 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tb.c
|
|
|
|
Abstract:
|
|
|
|
API wrapper code for the TAPI Browser util. Contains the big switch
|
|
statement for all the supported Telephony API's, & various support funcs.
|
|
|
|
Author:
|
|
|
|
Dan Knudson (DanKn) 23-Aug-1994
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <malloc.h>
|
|
#include "tb.h"
|
|
#include "vars.h"
|
|
#include "resource.h"
|
|
|
|
|
|
char szdwDeviceID[] = "dwDeviceID";
|
|
char szdwSize[] = "dwSize";
|
|
char szhCall[] = "hCall";
|
|
char szhLine[] = "hLine";
|
|
char szhLineApp[] = "hLineApp";
|
|
char szhPhone[] = "hPhone";
|
|
char szlpCallParams[] = "lpCallParams";
|
|
|
|
char szlphCall[] = "lphCall";
|
|
char szlpParams[] = "lpParams";
|
|
char szhwndOwner[] = "hwndOwner";
|
|
char szdwAddressID[] = "dwAddressID";
|
|
char szlpszAppName[] = "lpszAppName";
|
|
char szdwAPIVersion[] = "APIVersion";
|
|
char szlphConsultCall[] = "lphConsultCall";
|
|
char szlpszDeviceClass[] = "lpszDeviceClass";
|
|
char szlpszDestAddress[] = "lpszDestAddress";
|
|
char szlpsUserUserInfo[] = "lpsUserUserInfo";
|
|
char szlpszFriendlyAppName[] = "lpszFriendlyAppName";
|
|
|
|
|
|
DWORD NullWidget[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
|
|
|
|
void
|
|
FuncDriver2(
|
|
FUNC_INDEX funcIndex
|
|
);
|
|
|
|
|
|
void
|
|
ErrorAlert(
|
|
void
|
|
)
|
|
{
|
|
//
|
|
// We used to do MessageBeep(-1) when user hit an error, but
|
|
// in NT bug #160090 MessageBeep will hang on HP Vectra boxes.
|
|
// So the MessageBeep's were replaced with this func, which
|
|
// simply flashes the window text.
|
|
//
|
|
|
|
SetWindowText (ghwndMain, " Error!");
|
|
Sleep (250);
|
|
SetWindowText (ghwndMain, "Tapi Browser");
|
|
}
|
|
|
|
|
|
LPWSTR
|
|
PASCAL
|
|
My_lstrcpyW(
|
|
WCHAR *pString1,
|
|
WCHAR *pString2
|
|
)
|
|
{
|
|
//
|
|
// lstrcpyW isn't supported on win95 (at least up to osr2)
|
|
// so we'll use our own func
|
|
//
|
|
|
|
WCHAR *p = pString1;
|
|
|
|
|
|
for (; (*p = *pString2); p++, pString2++);
|
|
return pString1;
|
|
}
|
|
|
|
|
|
char *
|
|
PASCAL
|
|
GetTimeStamp(
|
|
void
|
|
)
|
|
{
|
|
static char szEmptyString[] = "", szTimeStamp[32];
|
|
SYSTEMTIME systemTime;
|
|
|
|
|
|
if (!bTimeStamp)
|
|
{
|
|
return szEmptyString;
|
|
}
|
|
|
|
GetLocalTime (&systemTime);
|
|
|
|
wsprintf(
|
|
szTimeStamp,
|
|
"%d:%d.%d.%d : ",
|
|
(DWORD) systemTime.wHour,
|
|
(DWORD) systemTime.wMinute,
|
|
(DWORD) systemTime.wSecond,
|
|
(DWORD) systemTime.wMilliseconds
|
|
);
|
|
|
|
return szTimeStamp;
|
|
}
|
|
|
|
|
|
void
|
|
ShowLineFuncResult(
|
|
LPSTR lpFuncName,
|
|
LONG lResult
|
|
)
|
|
{
|
|
char *pszTimeStamp = GetTimeStamp();
|
|
|
|
|
|
if (lResult > 0)
|
|
{
|
|
ShowStr ("%s%s returned x%lx", pszTimeStamp, lpFuncName, lResult);
|
|
}
|
|
else if (lResult != 0 &&
|
|
((DWORD) lResult < LINEERR_ALLOCATED ||
|
|
(DWORD) lResult > LAST_LINEERR))
|
|
{
|
|
ErrorAlert();
|
|
|
|
ShowStr(
|
|
"%s%s returned inval err code (x%lx)",
|
|
pszTimeStamp,
|
|
lpFuncName,
|
|
lResult
|
|
);
|
|
}
|
|
else
|
|
{
|
|
if (lResult < 0)
|
|
{
|
|
ErrorAlert();
|
|
}
|
|
|
|
ShowStr(
|
|
"%s%s returned %s%s",
|
|
pszTimeStamp,
|
|
lpFuncName,
|
|
(lResult ? "LINEERR_" : ""), // ...to shrink aszLineErrs array
|
|
aszLineErrs[LOWORD(lResult)]
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
ShowPhoneFuncResult(
|
|
LPSTR lpFuncName,
|
|
LONG lResult
|
|
)
|
|
{
|
|
char *pszTimeStamp = GetTimeStamp();
|
|
|
|
|
|
if (lResult > 0)
|
|
{
|
|
ShowStr ("%s%s returned x%lx", pszTimeStamp, lpFuncName, lResult);
|
|
}
|
|
else if (lResult != 0 &&
|
|
((DWORD) lResult < PHONEERR_ALLOCATED ||
|
|
(DWORD) lResult > PHONEERR_REINIT))
|
|
{
|
|
ErrorAlert();
|
|
|
|
ShowStr(
|
|
"%s%s returned inval err code (x%lx)",
|
|
pszTimeStamp,
|
|
lpFuncName,
|
|
lResult
|
|
);
|
|
}
|
|
else
|
|
{
|
|
if (lResult < 0)
|
|
{
|
|
ErrorAlert();
|
|
}
|
|
|
|
ShowStr(
|
|
"%s%s returned %s%s",
|
|
pszTimeStamp,
|
|
lpFuncName,
|
|
(lResult ? "PHONEERR_" : ""), // ...to shrink aszPhoneErrs array
|
|
aszPhoneErrs[LOWORD(lResult)]
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
ShowTapiFuncResult(
|
|
LPSTR lpFuncName,
|
|
LONG lResult
|
|
)
|
|
{
|
|
char *pszTimeStamp = GetTimeStamp();
|
|
|
|
|
|
if ((lResult > 0) || (lResult < TAPIERR_INVALPOINTER))
|
|
{
|
|
ShowStr(
|
|
"%s%s returned inval err code (x%lx)",
|
|
pszTimeStamp,
|
|
lpFuncName,
|
|
lResult
|
|
);
|
|
}
|
|
else
|
|
{
|
|
lResult = (~lResult) + 1;
|
|
|
|
if (lResult > 0)
|
|
{
|
|
ErrorAlert();
|
|
}
|
|
|
|
ShowStr(
|
|
"%s%s returned %s%s",
|
|
pszTimeStamp,
|
|
lpFuncName,
|
|
(lResult ? "TAPIERR_" : ""), // ...to shrink aszTapiErrs array
|
|
aszTapiErrs[lResult]
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
UpdateResults(
|
|
BOOL bBegin
|
|
)
|
|
{
|
|
//
|
|
// In order to maximize speed, minimize flash, & have the
|
|
// latest info in the edit control scrolled into view we
|
|
// shrink the window down and hide it. Later, when all the
|
|
// text has been inserted in the edit control, we show
|
|
// the window (since window must be visible in order to
|
|
// scroll caret into view), then tell it to scroll the caret
|
|
// (at this point the window is still 1x1 so the painting
|
|
// overhead is 0), and finally restore the control to it's
|
|
// full size. In doing so we have zero flash and only 1 real
|
|
// complete paint. Also put up the hourglass for warm fuzzies.
|
|
//
|
|
|
|
static RECT rect;
|
|
static HCURSOR hCurSave;
|
|
static int iNumBegins = 0;
|
|
|
|
|
|
if (bBegin)
|
|
{
|
|
iNumBegins++;
|
|
|
|
if (iNumBegins > 1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
hCurSave = SetCursor (LoadCursor ((HINSTANCE)NULL, IDC_WAIT));
|
|
GetWindowRect (ghwndEdit, &rect);
|
|
SetWindowPos(
|
|
ghwndEdit,
|
|
(HWND) NULL,
|
|
0,
|
|
0,
|
|
1,
|
|
1,
|
|
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOREDRAW |
|
|
SWP_NOZORDER | SWP_HIDEWINDOW
|
|
);
|
|
}
|
|
else
|
|
{
|
|
iNumBegins--;
|
|
|
|
if (iNumBegins > 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Do control restoration as described above
|
|
//
|
|
|
|
ShowWindow (ghwndEdit, SW_SHOW);
|
|
#ifdef WIN32
|
|
SendMessage (ghwndEdit, EM_SCROLLCARET, 0, 0);
|
|
#else
|
|
SendMessage(
|
|
ghwndEdit,
|
|
EM_SETSEL,
|
|
(WPARAM)0,
|
|
(LPARAM) MAKELONG(0xfffd,0xfffe)
|
|
);
|
|
#endif
|
|
SetWindowPos(
|
|
ghwndEdit,
|
|
(HWND) NULL,
|
|
0,
|
|
0,
|
|
rect.right - rect.left,
|
|
rect.bottom - rect.top,
|
|
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER
|
|
);
|
|
SetCursor (hCurSave);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
ShowModBytes(
|
|
DWORD dwSize,
|
|
unsigned char far *lpc,
|
|
char *pszTab,
|
|
char *buf
|
|
)
|
|
{
|
|
DWORD dwSize2 = dwSize, i, j, k;
|
|
|
|
|
|
strcpy (buf, pszTab);
|
|
|
|
k = strlen (buf);
|
|
|
|
for (i = 8; i < 36; i += 9)
|
|
{
|
|
buf[k + i] = ' ';
|
|
|
|
for (j = 2; j < 9; j += 2)
|
|
{
|
|
char buf2[8] = "xx";
|
|
|
|
if (dwSize2)
|
|
{
|
|
sprintf (buf2, "%02x", (int) (*lpc));
|
|
dwSize2--;
|
|
}
|
|
|
|
buf[k + i - j] = buf2[0];
|
|
buf[k + i - j + 1] = buf2[1];
|
|
|
|
lpc++;
|
|
}
|
|
}
|
|
|
|
k += 37;
|
|
|
|
buf[k - 1] = ' ';
|
|
|
|
lpc -= 16;
|
|
|
|
for (i = 0; i < dwSize; i++)
|
|
{
|
|
buf[k + i] = aAscii[*(lpc+i)];
|
|
}
|
|
|
|
buf[k + i] = 0;
|
|
|
|
ShowStr (buf);
|
|
}
|
|
|
|
|
|
void
|
|
ShowBytes(
|
|
DWORD dwSize,
|
|
LPVOID lp,
|
|
DWORD dwNumTabs
|
|
)
|
|
{
|
|
char tabBuf[17] = "";
|
|
char buf[80];
|
|
DWORD i, j, k, dwNumDWORDs, dwMod4 = (DWORD) (((ULONG_PTR) lp) & 3);
|
|
LPDWORD lpdw;
|
|
unsigned char far *lpc = (unsigned char far *) lp;
|
|
|
|
|
|
UpdateResults (TRUE);
|
|
|
|
|
|
for (i = 0; i < dwNumTabs; i++)
|
|
{
|
|
strcat (tabBuf, szTab);
|
|
}
|
|
|
|
|
|
//
|
|
// Special case for unaligned pointers (will fault on ppc/mips)
|
|
//
|
|
|
|
if (dwMod4)
|
|
{
|
|
DWORD dwNumUnalignedBytes = 4 - dwMod4,
|
|
dwNumBytesToShow = (dwNumUnalignedBytes > dwSize ?
|
|
dwSize : dwNumUnalignedBytes);
|
|
|
|
|
|
ShowModBytes (dwNumBytesToShow, lpc, tabBuf, buf);
|
|
lpc += dwNumUnalignedBytes;
|
|
lpdw = (LPDWORD) lpc;
|
|
dwSize -= dwNumBytesToShow;
|
|
}
|
|
else
|
|
{
|
|
lpdw = (LPDWORD) lp;
|
|
}
|
|
|
|
|
|
//
|
|
// Dump full lines of four DWORDs in hex & corresponding ASCII
|
|
//
|
|
|
|
if (dwSize >= (4*sizeof(DWORD)))
|
|
{
|
|
dwNumDWORDs = dwSize / 4; // adjust from numBytes to num DWORDs
|
|
|
|
for (i = 0; i < (dwNumDWORDs - (dwNumDWORDs%4)); i += 4)
|
|
{
|
|
sprintf (
|
|
buf,
|
|
"%s%08lx %08lx %08lx %08lx ",
|
|
tabBuf,
|
|
*lpdw,
|
|
*(lpdw+1),
|
|
*(lpdw+2),
|
|
*(lpdw+3)
|
|
);
|
|
|
|
k = strlen (buf);
|
|
|
|
for (j = 0; j < 16; j++)
|
|
{
|
|
buf[k + j] = aAscii[*(lpc + j)];
|
|
}
|
|
|
|
buf[k + j] = 0;
|
|
|
|
ShowStr (buf);
|
|
lpdw += 4;
|
|
lpc += 16;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Special case for remaining bytes to dump (0 < n < 16)
|
|
//
|
|
|
|
if ((dwSize %= 16))
|
|
{
|
|
ShowModBytes (dwSize, lpc, tabBuf, buf);
|
|
}
|
|
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
|
|
|
|
void
|
|
ShowStructByDWORDs(
|
|
LPVOID lp
|
|
)
|
|
{
|
|
|
|
if (dwDumpStructsFlags & DS_BYTEDUMP)
|
|
{
|
|
//
|
|
// Cast lp as DWORD, then add 2 to point to where a
|
|
// dwUsedSize field is in a TAPI struct
|
|
//
|
|
|
|
ShowBytes (*(((LPDWORD) lp) + 2), lp, 0);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
ShowStructByField(
|
|
PSTRUCT_FIELD_HEADER pHeader,
|
|
BOOL bSubStructure
|
|
)
|
|
{
|
|
static char far *aszCommonFields[] =
|
|
{
|
|
"dwTotalSize",
|
|
"dwNeededSize",
|
|
"dwUsedSize"
|
|
};
|
|
DWORD i, j;
|
|
char far *buf = malloc (256);
|
|
|
|
|
|
UpdateResults (TRUE);
|
|
|
|
ShowStr (pHeader->szName);
|
|
|
|
if (!bSubStructure)
|
|
{
|
|
LPDWORD lpdw = (LPDWORD) pHeader->pStruct;
|
|
|
|
|
|
for (i = 0; i < 3; i++)
|
|
{
|
|
ShowStr ("%s%s=x%lx", szTab, aszCommonFields[i], *lpdw);
|
|
lpdw++;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < pHeader->dwNumFields; i++)
|
|
{
|
|
if ((pHeader->aFields[i].dwValue == 0) &&
|
|
!(dwDumpStructsFlags & DS_ZEROFIELDS))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
sprintf(
|
|
buf,
|
|
"%s%s=x%lx",
|
|
szTab,
|
|
pHeader->aFields[i].szName,
|
|
pHeader->aFields[i].dwValue
|
|
);
|
|
|
|
switch (pHeader->aFields[i].dwType)
|
|
{
|
|
case FT_DWORD:
|
|
|
|
ShowStr (buf);
|
|
break;
|
|
|
|
case FT_FLAGS:
|
|
{
|
|
PLOOKUP pLookup = pHeader->aFields[i].pLookup;
|
|
|
|
|
|
strcat (buf, ", ");
|
|
|
|
for(
|
|
j = 0;
|
|
pHeader->aFields[i].dwValue, pLookup[j].dwVal != 0xffffffff;
|
|
j++
|
|
)
|
|
{
|
|
if (pHeader->aFields[i].dwValue & pLookup[j].dwVal)
|
|
{
|
|
if (buf[0] == 0)
|
|
{
|
|
sprintf (buf, "%s%s", szTab, szTab);
|
|
}
|
|
|
|
strcat (buf, pLookup[j].lpszVal);
|
|
strcat (buf, " ");
|
|
pHeader->aFields[i].dwValue =
|
|
pHeader->aFields[i].dwValue & ~pLookup[j].dwVal;
|
|
|
|
if (strlen (buf) > 50)
|
|
{
|
|
//
|
|
// We don't want strings getting so long that
|
|
// they're going offscreen, so break them up.
|
|
//
|
|
|
|
ShowStr (buf);
|
|
buf[0] = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pHeader->aFields[i].dwValue)
|
|
{
|
|
strcat (buf, "<unknown flag(s)>");
|
|
}
|
|
|
|
if (buf[0])
|
|
{
|
|
ShowStr (buf);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case FT_ORD:
|
|
{
|
|
PLOOKUP pLookup = pHeader->aFields[i].pLookup;
|
|
|
|
|
|
strcat (buf, ", ");
|
|
|
|
for(
|
|
j = 0;
|
|
pLookup[j].dwVal != 0xffffffff;
|
|
j++
|
|
)
|
|
{
|
|
if (pHeader->aFields[i].dwValue == pLookup[j].dwVal)
|
|
{
|
|
strcat (buf, pLookup[j].lpszVal);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (pLookup[j].dwVal == 0xffffffff)
|
|
{
|
|
strcpy (buf, "<unknown ordinal>");
|
|
}
|
|
|
|
ShowStr (buf);
|
|
break;
|
|
}
|
|
case FT_SIZE:
|
|
|
|
ShowStr (buf);
|
|
break;
|
|
|
|
case FT_OFFSET:
|
|
|
|
ShowStr (buf);
|
|
|
|
if (IsBadReadPtr(
|
|
((char far *) pHeader->pStruct) +
|
|
pHeader->aFields[i].dwValue,
|
|
(UINT)pHeader->aFields[i-1].dwValue
|
|
))
|
|
{
|
|
ShowStr ("<size/offset pair yields bad pointer>");
|
|
}
|
|
else
|
|
{
|
|
ShowBytes(
|
|
pHeader->aFields[i-1].dwValue,
|
|
((char far *) pHeader->pStruct) +
|
|
pHeader->aFields[i].dwValue,
|
|
2
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
free (buf);
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
|
|
|
|
void
|
|
ShowVARSTRING(
|
|
LPVARSTRING lpVarString
|
|
)
|
|
{
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwStringFormat", FT_ORD, lpVarString->dwStringFormat, aStringFormats },
|
|
{ "dwStringSize", FT_SIZE, lpVarString->dwStringSize, NULL },
|
|
{ "dwStringOffset", FT_OFFSET, lpVarString->dwStringOffset, NULL }
|
|
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpVarString,
|
|
"VARSTRING",
|
|
3,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
INT_PTR
|
|
LetUserMungeParams(
|
|
PFUNC_PARAM_HEADER pParamsHeader
|
|
)
|
|
{
|
|
if (!bShowParams)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
return (DialogBoxParam(
|
|
ghInst,
|
|
(LPCSTR)MAKEINTRESOURCE(IDD_DIALOG2),
|
|
ghwndMain,
|
|
(DLGPROC) ParamsDlgProc,
|
|
(LPARAM) pParamsHeader
|
|
));
|
|
}
|
|
|
|
|
|
void
|
|
DumpParams(
|
|
PFUNC_PARAM_HEADER pHeader
|
|
)
|
|
{
|
|
if (bTimeStamp || bDumpParams)
|
|
{
|
|
char *pszTimeStamp = GetTimeStamp();
|
|
|
|
|
|
UpdateResults (TRUE);
|
|
|
|
ShowStr(
|
|
"%sCalling %s",
|
|
pszTimeStamp,
|
|
aFuncNames[pHeader->FuncIndex]
|
|
);
|
|
|
|
if (bDumpParams)
|
|
{
|
|
DWORD i;
|
|
|
|
|
|
for (i = 0; i < pHeader->dwNumParams; i++)
|
|
{
|
|
ShowStr(
|
|
" %s=x%lx",
|
|
pHeader->aParams[i].szName,
|
|
pHeader->aParams[i].dwValue
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
PASCAL
|
|
MakeWideString(
|
|
LPVOID pString
|
|
)
|
|
{
|
|
if (!IsBadStringPtr ((LPCSTR) pString, 0xffffffff))
|
|
{
|
|
int len = strlen ((char *) pString) + 1;
|
|
WCHAR buf[MAX_STRING_PARAM_SIZE/2];
|
|
|
|
|
|
MultiByteToWideChar(
|
|
GetACP(),
|
|
MB_PRECOMPOSED,
|
|
(LPCSTR) pString,
|
|
(len > MAX_STRING_PARAM_SIZE/2 ? MAX_STRING_PARAM_SIZE/2 - 1 : -1),
|
|
buf,
|
|
MAX_STRING_PARAM_SIZE/2
|
|
);
|
|
|
|
buf[MAX_STRING_PARAM_SIZE/2 - 1] = 0;
|
|
|
|
My_lstrcpyW ((WCHAR *) pString, buf);
|
|
}
|
|
}
|
|
|
|
|
|
LONG
|
|
DoFunc(
|
|
PFUNC_PARAM_HEADER pHeader
|
|
)
|
|
{
|
|
LONG lResult;
|
|
|
|
|
|
if (!LetUserMungeParams (pHeader))
|
|
{
|
|
return 0xffffffff;
|
|
}
|
|
|
|
#if TAPI_2_0
|
|
|
|
//
|
|
// Convert any unicode string params as appropriate
|
|
//
|
|
|
|
if (gbWideStringParams)
|
|
{
|
|
DWORD dwNumParams = pHeader->dwNumParams, i;
|
|
PFUNC_PARAM pParam = pHeader->aParams;
|
|
|
|
|
|
for (i = 0; i < dwNumParams; i++)
|
|
{
|
|
if (pParam->dwType == PT_STRING)
|
|
{
|
|
MakeWideString ((LPVOID) pParam->dwValue);
|
|
}
|
|
|
|
pParam++;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
DumpParams (pHeader);
|
|
|
|
switch (pHeader->dwNumParams)
|
|
{
|
|
case 1:
|
|
|
|
lResult = (*pHeader->u.pfn1)(
|
|
pHeader->aParams[0].dwValue
|
|
);
|
|
break;
|
|
|
|
case 2:
|
|
|
|
lResult = (*pHeader->u.pfn2)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue
|
|
);
|
|
break;
|
|
|
|
case 3:
|
|
|
|
lResult = (*pHeader->u.pfn3)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue,
|
|
pHeader->aParams[2].dwValue
|
|
);
|
|
break;
|
|
|
|
case 4:
|
|
|
|
lResult = (*pHeader->u.pfn4)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue,
|
|
pHeader->aParams[2].dwValue,
|
|
pHeader->aParams[3].dwValue
|
|
);
|
|
break;
|
|
|
|
case 5:
|
|
|
|
lResult = (*pHeader->u.pfn5)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue,
|
|
pHeader->aParams[2].dwValue,
|
|
pHeader->aParams[3].dwValue,
|
|
pHeader->aParams[4].dwValue
|
|
);
|
|
break;
|
|
|
|
case 6:
|
|
|
|
lResult = (*pHeader->u.pfn6)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue,
|
|
pHeader->aParams[2].dwValue,
|
|
pHeader->aParams[3].dwValue,
|
|
pHeader->aParams[4].dwValue,
|
|
pHeader->aParams[5].dwValue
|
|
);
|
|
break;
|
|
|
|
case 7:
|
|
|
|
lResult = (*pHeader->u.pfn7)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue,
|
|
pHeader->aParams[2].dwValue,
|
|
pHeader->aParams[3].dwValue,
|
|
pHeader->aParams[4].dwValue,
|
|
pHeader->aParams[5].dwValue,
|
|
pHeader->aParams[6].dwValue
|
|
);
|
|
break;
|
|
|
|
case 8:
|
|
|
|
lResult = (*pHeader->u.pfn8)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue,
|
|
pHeader->aParams[2].dwValue,
|
|
pHeader->aParams[3].dwValue,
|
|
pHeader->aParams[4].dwValue,
|
|
pHeader->aParams[5].dwValue,
|
|
pHeader->aParams[6].dwValue,
|
|
pHeader->aParams[7].dwValue
|
|
);
|
|
break;
|
|
|
|
case 9:
|
|
|
|
lResult = (*pHeader->u.pfn9)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue,
|
|
pHeader->aParams[2].dwValue,
|
|
pHeader->aParams[3].dwValue,
|
|
pHeader->aParams[4].dwValue,
|
|
pHeader->aParams[5].dwValue,
|
|
pHeader->aParams[6].dwValue,
|
|
pHeader->aParams[7].dwValue,
|
|
pHeader->aParams[8].dwValue
|
|
);
|
|
break;
|
|
|
|
case 10:
|
|
|
|
lResult = (*pHeader->u.pfn10)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue,
|
|
pHeader->aParams[2].dwValue,
|
|
pHeader->aParams[3].dwValue,
|
|
pHeader->aParams[4].dwValue,
|
|
pHeader->aParams[5].dwValue,
|
|
pHeader->aParams[6].dwValue,
|
|
pHeader->aParams[7].dwValue,
|
|
pHeader->aParams[8].dwValue,
|
|
pHeader->aParams[9].dwValue
|
|
);
|
|
break;
|
|
|
|
default: // case 12:
|
|
|
|
lResult = (*pHeader->u.pfn12)(
|
|
pHeader->aParams[0].dwValue,
|
|
pHeader->aParams[1].dwValue,
|
|
pHeader->aParams[2].dwValue,
|
|
pHeader->aParams[3].dwValue,
|
|
pHeader->aParams[4].dwValue,
|
|
pHeader->aParams[5].dwValue,
|
|
pHeader->aParams[6].dwValue,
|
|
pHeader->aParams[7].dwValue,
|
|
pHeader->aParams[8].dwValue,
|
|
pHeader->aParams[9].dwValue,
|
|
pHeader->aParams[10].dwValue,
|
|
pHeader->aParams[11].dwValue
|
|
);
|
|
break;
|
|
}
|
|
|
|
if (pHeader->FuncIndex < pClose)
|
|
{
|
|
ShowLineFuncResult (aFuncNames[pHeader->FuncIndex], lResult);
|
|
}
|
|
else if (pHeader->FuncIndex < tGetLocationInfo)
|
|
{
|
|
ShowPhoneFuncResult (aFuncNames[pHeader->FuncIndex], lResult);
|
|
}
|
|
else
|
|
{
|
|
ShowTapiFuncResult (aFuncNames[pHeader->FuncIndex], lResult);
|
|
}
|
|
|
|
return lResult;
|
|
}
|
|
|
|
|
|
BOOL
|
|
IsLineAppSelected(
|
|
void
|
|
)
|
|
{
|
|
if (!pLineAppSel)
|
|
{
|
|
if (gbDisableHandleChecking)
|
|
{
|
|
pLineAppSel = (PMYLINEAPP) NullWidget;
|
|
}
|
|
else
|
|
{
|
|
MessageBox (ghwndMain, "Select an hLineApp", "", MB_OK);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
IsLineSelected(
|
|
void
|
|
)
|
|
{
|
|
if (!pLineSel)
|
|
{
|
|
if (gbDisableHandleChecking)
|
|
{
|
|
pLineSel = (PMYLINE) NullWidget;
|
|
}
|
|
else
|
|
{
|
|
MessageBox (ghwndMain, "Select a Line", "", MB_OK);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
IsCallSelected(
|
|
void
|
|
)
|
|
{
|
|
if (!pCallSel)
|
|
{
|
|
if (gbDisableHandleChecking)
|
|
{
|
|
pCallSel = (PMYCALL) NullWidget;
|
|
}
|
|
else
|
|
{
|
|
MessageBox (ghwndMain, "Select a Call", "", MB_OK);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
IsTwoCallsSelected(
|
|
void
|
|
)
|
|
{
|
|
if (!pCallSel || !pCallSel2)
|
|
{
|
|
if (gbDisableHandleChecking)
|
|
{
|
|
if (!pCallSel)
|
|
{
|
|
pCallSel = (PMYCALL) NullWidget;
|
|
}
|
|
|
|
pCallSel2 = (PMYCALL) NullWidget;
|
|
}
|
|
else
|
|
{
|
|
MessageBox(
|
|
ghwndMain,
|
|
"Select a Call (must have at least two calls on same line)",
|
|
"",
|
|
MB_OK
|
|
);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
IsPhoneAppSelected(
|
|
void
|
|
)
|
|
{
|
|
if (!pPhoneAppSel)
|
|
{
|
|
if (gbDisableHandleChecking)
|
|
{
|
|
pPhoneAppSel = (PMYPHONEAPP) NullWidget;
|
|
}
|
|
else
|
|
{
|
|
MessageBox (ghwndMain, "Select a PhoneApp", "", MB_OK);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
IsPhoneSelected(
|
|
void
|
|
)
|
|
{
|
|
if (!pPhoneSel)
|
|
{
|
|
if (gbDisableHandleChecking)
|
|
{
|
|
pPhoneSel = (PMYPHONE) NullWidget;
|
|
}
|
|
else
|
|
{
|
|
MessageBox (ghwndMain, "Select a Phone", "", MB_OK);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//
|
|
// We get a slough of C4113 (func param lists differed) warnings down below
|
|
// in the initialization of FUNC_PARAM_HEADER structs as a result of the
|
|
// real func prototypes having params that are pointers rather than DWORDs,
|
|
// so since these are known non-interesting warnings just turn them off
|
|
//
|
|
|
|
#pragma warning (disable:4113)
|
|
|
|
//#pragma code_seg ("myseg")
|
|
|
|
void
|
|
FuncDriver(
|
|
FUNC_INDEX funcIndex
|
|
)
|
|
{
|
|
int i;
|
|
LONG lResult;
|
|
|
|
|
|
#if TAPI_2_0
|
|
|
|
//
|
|
// Determine if we're doing a ascii or a unicode op
|
|
//
|
|
|
|
gbWideStringParams =
|
|
((aFuncNames[funcIndex])[strlen (aFuncNames[funcIndex]) - 1] == 'W' ?
|
|
TRUE : FALSE);
|
|
|
|
#endif
|
|
|
|
switch (funcIndex)
|
|
{
|
|
case lAccept:
|
|
{
|
|
char szUserUserInfo[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpsUserUserInfo, PT_STRING, (ULONG_PTR) szUserUserInfo, szUserUserInfo },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) strlen(szDefUserUserInfo)+1, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineAccept };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
strcpy (szUserUserInfo, szDefUserUserInfo);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lAddToConference:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "hConfCall", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "hConsultCall", PT_DWORD, (ULONG_PTR) 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineAddToConference };
|
|
|
|
|
|
CHK_TWO_CALLS_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
params[1].dwValue = (ULONG_PTR) pCallSel2->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case lAgentSpecific:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwAgentExtensionIDIndex", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpParams, PT_STRING, (ULONG_PTR) pBigBuf, pBigBuf },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineAgentSpecific };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case lAnswer:
|
|
{
|
|
char szUserUserInfo[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpsUserUserInfo, PT_STRING, (ULONG_PTR) szUserUserInfo, szUserUserInfo },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) strlen(szDefUserUserInfo)+1, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineAnswer };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
strcpy (szUserUserInfo, szDefUserUserInfo);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lBlindTransfer:
|
|
#if TAPI_2_0
|
|
case lBlindTransferW:
|
|
#endif
|
|
{
|
|
char szDestAddress[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpszDestAddress, PT_STRING, (ULONG_PTR) szDestAddress, szDestAddress },
|
|
{ "dwCountryCode", PT_DWORD, (ULONG_PTR) dwDefCountryCode, NULL }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lBlindTransfer ?
|
|
(PFN3) lineBlindTransfer : (PFN3) lineBlindTransferW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineBlindTransfer };
|
|
#endif
|
|
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
strcpy (szDestAddress, szDefDestAddress);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lClose:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) lineClose };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
if ((lResult = DoFunc(¶msHeader)) == 0)
|
|
{
|
|
FreeLine (GetLine((HLINE) params[0].dwValue));
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lCompleteCall:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "lpdwCompletionID", PT_POINTER, 0, NULL },
|
|
{ "dwCompletionMode", PT_FLAGS, LINECALLCOMPLMODE_CAMPON, aCallComplModes },
|
|
{ "dwMessageID", PT_DWORD, 0, NULL },
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineCompleteCall };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
params[1].dwValue = (ULONG_PTR) &pCallSel->dwCompletionID;
|
|
|
|
// BUGBUG if user chgs hCall the wrong &pCallSel->dwCompletionID filled in
|
|
|
|
DoFunc(¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lCompleteTransfer:
|
|
{
|
|
PMYCALL pNewCall;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "hConsultCall", PT_DWORD, 0, NULL },
|
|
{ "lphConfCall", PT_POINTER, 0, NULL },
|
|
{ "dwTransferMode", PT_ORDINAL, LINETRANSFERMODE_TRANSFER, aTransferModes }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineCompleteTransfer };
|
|
|
|
|
|
CHK_TWO_CALLS_SELECTED()
|
|
|
|
if (!(pNewCall = AllocCall (pLineSel)))
|
|
{
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
params[1].dwValue = (ULONG_PTR) pCallSel2->hCall;
|
|
params[2].dwValue =
|
|
params[2].u.dwDefValue = (ULONG_PTR) &pNewCall->hCall;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) >= 0)
|
|
{
|
|
//
|
|
// First make sure we're created the call under the right line,
|
|
// and if not move it to the right place in the widgets list
|
|
//
|
|
|
|
LINECALLINFO callInfo;
|
|
|
|
|
|
memset (&callInfo, 0, sizeof(LINECALLINFO));
|
|
callInfo.dwTotalSize = sizeof(LINECALLINFO);
|
|
|
|
if (lineGetCallInfo ((HCALL) params[0].dwValue, &callInfo) == 0)
|
|
{
|
|
if (callInfo.hLine != pLineSel->hLine)
|
|
{
|
|
MoveCallToLine (pNewCall, callInfo.hLine);
|
|
}
|
|
}
|
|
|
|
pNewCall->lMakeCallReqID = lResult;
|
|
dwNumPendingMakeCalls++;
|
|
SelectWidget ((PMYWIDGET) pNewCall);
|
|
}
|
|
else
|
|
{
|
|
FreeCall (pNewCall);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lConfigDialog:
|
|
#if TAPI_2_0
|
|
case lConfigDialogW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szdwDeviceID, PT_DWORD, dwDefLineDeviceID, NULL },
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, NULL },
|
|
{ szlpszDeviceClass, PT_STRING, (ULONG_PTR) szDeviceClass, szDeviceClass }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lConfigDialog ?
|
|
(PFN3) lineConfigDialog : (PFN3) lineConfigDialogW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineConfigDialog };
|
|
#endif
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
strcpy (szDeviceClass, szDefLineDeviceClass);
|
|
|
|
#ifdef WIN32
|
|
lResult = DoFunc (¶msHeader);
|
|
#else
|
|
//
|
|
// NOTE: on win16 HWNDSs are 16 bits, so we've to hard code this
|
|
//
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = lineConfigDialog(
|
|
params[0].dwValue,
|
|
(HWND) params[1].dwValue,
|
|
(LPCSTR) params[2].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif
|
|
break;
|
|
}
|
|
case lDeallocateCall:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) lineDeallocateCall };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
FreeCall (GetCall((HCALL) params[0].dwValue));
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lDevSpecific:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpParams, PT_STRING, (ULONG_PTR) pBigBuf, pBigBuf },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineDevSpecific };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
if (pCallSel)
|
|
{
|
|
params[2].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
}
|
|
|
|
memset (pBigBuf, 0, (size_t) dwBigBufSize);
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lDevSpecificFeature:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
// { "dwFeature", PT_???, 0, aPhoneButtonFunctions },
|
|
{ "dwFeature", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpParams, PT_STRING, (ULONG_PTR) pBigBuf, pBigBuf },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineDevSpecificFeature };
|
|
|
|
|
|
// BUGBUG need another PT_ type for constants for dwFeature param
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
memset (pBigBuf, 0, (size_t) dwBigBufSize);
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lDial:
|
|
#if TAPI_2_0
|
|
case lDialW:
|
|
#endif
|
|
{
|
|
char szAddress[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpszDestAddress, PT_STRING, (ULONG_PTR) szAddress, szAddress },
|
|
{ "dwCountryCode", PT_DWORD, (ULONG_PTR) dwDefCountryCode, NULL }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lDial ?
|
|
(PFN3) lineDial : (PFN3) lineDialW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineDial };
|
|
#endif
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
strcpy (szAddress, szDefDestAddress);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lDrop:
|
|
{
|
|
char szUserUserInfo[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpsUserUserInfo, PT_STRING, (ULONG_PTR) szUserUserInfo, szUserUserInfo },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) strlen(szDefUserUserInfo)+1, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineDrop };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
strcpy (szUserUserInfo, szDefUserUserInfo);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
// assert (lResult != 0);
|
|
|
|
if (gbDeallocateCall && (lResult > 0))
|
|
{
|
|
PMYCALL pCall = GetCall ((HCALL) params[0].dwValue);
|
|
|
|
dwNumPendingDrops++;
|
|
pCall->lDropReqID = lResult;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lForward:
|
|
#if TAPI_2_0
|
|
case lForwardW:
|
|
#endif
|
|
{
|
|
PMYCALL pNewCall;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ "bAllAddresses", PT_DWORD, 1, NULL },
|
|
{ szdwAddressID, PT_DWORD, 0, NULL },
|
|
{ "lpForwardList", PT_FORWARDLIST, 0, NULL },
|
|
{ "dwNumRingsNoAnswer", PT_DWORD, 5, NULL },
|
|
{ szlphConsultCall, PT_POINTER, 0, NULL },
|
|
{ szlpCallParams, PT_CALLPARAMS, 0, lpCallParams }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 7, funcIndex, params, (funcIndex == lForward ?
|
|
(PFN7) lineForward : (PFN7) lineForwardW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 7, funcIndex, params, (PFN7) lineForward };
|
|
#endif
|
|
LPLINEFORWARDLIST lpForwardList;
|
|
DWORD dwTotalSize = sizeof(LINEFORWARDLIST) +
|
|
MAX_LINEFORWARD_ENTRIES *
|
|
(sizeof(LINEFORWARD) + 2*MAX_STRING_PARAM_SIZE);
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
|
|
if (!(lpForwardList = malloc (dwTotalSize)))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error alloc'ing data structure");
|
|
break;
|
|
}
|
|
|
|
memset (lpForwardList, 0, dwTotalSize);
|
|
|
|
lpForwardList->dwTotalSize = dwTotalSize;
|
|
lpForwardList->dwNumEntries = 0;
|
|
|
|
if (!(pNewCall = AllocCall (pLineSel)))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error creating data structure");
|
|
free (lpForwardList);
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
params[3].dwValue =
|
|
params[3].u.dwDefValue = (ULONG_PTR) lpForwardList;
|
|
params[5].dwValue =
|
|
params[5].u.dwDefValue = (ULONG_PTR) &pNewCall->hCall;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) > 0)
|
|
{
|
|
if (params[0].dwValue != (ULONG_PTR) pLineSel->hLine)
|
|
{
|
|
MoveCallToLine (pNewCall, (HLINE) params[0].dwValue);
|
|
}
|
|
|
|
pNewCall->lMakeCallReqID = lResult;
|
|
dwNumPendingMakeCalls++;
|
|
SelectWidget ((PMYWIDGET) pNewCall);
|
|
}
|
|
else
|
|
{
|
|
FreeCall (pNewCall);
|
|
}
|
|
|
|
free (lpForwardList);
|
|
|
|
break;
|
|
}
|
|
case lGatherDigits:
|
|
#if TAPI_2_0
|
|
case lGatherDigitsW:
|
|
#endif
|
|
{
|
|
char *buf;
|
|
char szTermDigits[MAX_STRING_PARAM_SIZE] = "";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwDigitModes", PT_FLAGS, (ULONG_PTR) LINEDIGITMODE_DTMF, aDigitModes },
|
|
{ "lpsDigits", PT_POINTER, (ULONG_PTR) 0, NULL },
|
|
{ "dwNumDigits", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpszTerminationDigits", PT_STRING, (ULONG_PTR) szTermDigits, szTermDigits },
|
|
{ "dwFirstDigitTimeout", PT_DWORD, (ULONG_PTR) 0x8000, NULL },
|
|
{ "dwInterDigitTimeout", PT_DWORD, (ULONG_PTR) 0x8000, NULL },
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 7, funcIndex, params, (funcIndex == lGatherDigits ?
|
|
(PFN7) lineGatherDigits : (PFN7) lineGatherDigitsW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 7, funcIndex, params, (PFN7) lineGatherDigits };
|
|
#endif
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
#define DEF_NUM_GATHERED_DIGITS 64
|
|
|
|
if (!(buf = (char *) malloc ((DEF_NUM_GATHERED_DIGITS + 1) * 2)))
|
|
{
|
|
ShowStr ("failed to allocate memory");
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
params[2].dwValue =
|
|
params[2].u.dwDefValue = (ULONG_PTR) buf;
|
|
params[3].dwValue = DEF_NUM_GATHERED_DIGITS;
|
|
|
|
memset (buf, 0, DEF_NUM_GATHERED_DIGITS * 2);
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (params[0].dwValue != (DWORD) pCallSel->hCall)
|
|
{
|
|
pCallSel = GetCall ((HCALL) params[0].dwValue);
|
|
}
|
|
|
|
if (params[2].dwValue == (ULONG_PTR) buf &&
|
|
params[3].dwValue > DEF_NUM_GATHERED_DIGITS)
|
|
{
|
|
if (MessageBox(
|
|
ghwndMain,
|
|
"Do you want to allocate a larger GatherDigits buffer?" \
|
|
"(Not doing so may cause undefined app behavior.)",
|
|
"Warning: lineGatherDigits",
|
|
MB_YESNO
|
|
) == IDYES)
|
|
{
|
|
free (buf);
|
|
|
|
// Note: we get weird errors in malloc when specifying a
|
|
// size > 0xffffff00, so special case
|
|
|
|
if (params[3].dwValue > 0x10000)
|
|
{
|
|
ShowStr ("sorry, too many digits.");
|
|
break;
|
|
}
|
|
|
|
buf = (char *) malloc ((size_t) (params[3].dwValue + 1) * 2);
|
|
|
|
if (!(params[2].dwValue = (ULONG_PTR) buf))
|
|
{
|
|
ShowStr ("failed to allocate memory");
|
|
break;
|
|
}
|
|
|
|
memset (buf, 0, (size_t) params[3].dwValue * 2);
|
|
}
|
|
}
|
|
|
|
if (pCallSel->lpsGatheredDigits && params[2].dwValue)
|
|
{
|
|
if (MessageBox(
|
|
ghwndMain,
|
|
"GatherDigits already in progress on this hCall; if you" \
|
|
"continue previous digits buffer may be discarded" \
|
|
"without being freed",
|
|
"Warning: lineGatherDigits",
|
|
MB_OKCANCEL
|
|
|
|
) == IDCANCEL)
|
|
{
|
|
if (buf)
|
|
{
|
|
free (buf);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
#if TAPI_2_0
|
|
if (funcIndex == lGatherDigits)
|
|
{
|
|
lResult = lineGatherDigits(
|
|
(HCALL) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(LPSTR) params[2].dwValue,
|
|
(DWORD) params[3].dwValue,
|
|
(LPCSTR) params[4].dwValue,
|
|
(DWORD) params[5].dwValue,
|
|
(DWORD) params[6].dwValue
|
|
);
|
|
}
|
|
else
|
|
{
|
|
MakeWideString (szTermDigits);
|
|
|
|
lResult = lineGatherDigitsW(
|
|
(HCALL) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(LPWSTR) params[2].dwValue,
|
|
(DWORD) params[3].dwValue,
|
|
(LPCWSTR) params[4].dwValue,
|
|
(DWORD) params[5].dwValue,
|
|
(DWORD) params[6].dwValue
|
|
);
|
|
}
|
|
#else
|
|
lResult = lineGatherDigits(
|
|
(HCALL) params[0].dwValue,
|
|
params[1].dwValue,
|
|
(LPSTR) params[2].dwValue,
|
|
params[3].dwValue,
|
|
(LPCSTR) params[4].dwValue,
|
|
params[5].dwValue,
|
|
params[6].dwValue
|
|
);
|
|
|
|
#endif
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
if (lResult) // FAILURE
|
|
{
|
|
if (buf)
|
|
{
|
|
free (buf);
|
|
}
|
|
}
|
|
else // SUCCESS
|
|
{
|
|
if (pCallSel->lpsGatheredDigits)
|
|
{
|
|
//free (pCallSel->lpsGatheredDigits);
|
|
}
|
|
|
|
pCallSel->lpsGatheredDigits = (char *) params[2].dwValue;
|
|
pCallSel->dwNumGatheredDigits = (DWORD) params[3].dwValue;
|
|
#if TAPI_2_0
|
|
if (funcIndex == lGatherDigitsW)
|
|
{
|
|
pCallSel->dwNumGatheredDigits *= 2;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGenerateDigits:
|
|
#if TAPI_2_0
|
|
case lGenerateDigitsW:
|
|
#endif
|
|
{
|
|
char szDigits[MAX_STRING_PARAM_SIZE] = "123";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwDigitMode", PT_FLAGS, (ULONG_PTR) LINEDIGITMODE_DTMF, aDigitModes },
|
|
{ "lpszDigits", PT_STRING, (ULONG_PTR) szDigits, szDigits },
|
|
{ "dwDuration", PT_DWORD, (ULONG_PTR) 0, NULL }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (funcIndex == lGenerateDigits ?
|
|
(PFN4) lineGenerateDigits : (PFN4) lineGenerateDigitsW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineGenerateDigits };
|
|
#endif
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lGenerateTone:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwToneMode", PT_FLAGS, (ULONG_PTR) LINETONEMODE_CUSTOM, aToneModes },
|
|
{ "dwDuration", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwNumTones", PT_DWORD, (ULONG_PTR) 1, NULL },
|
|
{ "lpTones", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineGenerateTone };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lGetAddressCaps:
|
|
#if TAPI_2_0
|
|
case lGetAddressCapsW:
|
|
#endif
|
|
{
|
|
LPLINEADDRESSCAPS lpAddrCaps = (LPLINEADDRESSCAPS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ "dwExtVersion", PT_DWORD, (ULONG_PTR) dwDefLineExtVersion, NULL },
|
|
{ "lpAddressCaps", PT_POINTER, (ULONG_PTR) lpAddrCaps, lpAddrCaps }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (funcIndex == lGetAddressCaps ?
|
|
(PFN6) lineGetAddressCaps : (PFN6) lineGetAddressCapsW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (PFN6) lineGetAddressCaps };
|
|
#endif
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (lpAddrCaps, 0, (size_t) dwBigBufSize);
|
|
|
|
lpAddrCaps->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpAddrCaps);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwLineDeviceID", FT_DWORD, lpAddrCaps->dwLineDeviceID, NULL },
|
|
{ "dwAddressSize", FT_SIZE, lpAddrCaps->dwAddressSize, NULL },
|
|
{ "dwAddressOffset", FT_OFFSET, lpAddrCaps->dwAddressOffset, NULL },
|
|
{ "dwDevSpecificSize", FT_SIZE, lpAddrCaps->dwDevSpecificSize, NULL },
|
|
{ "dwDevSpecificOffset", FT_OFFSET, lpAddrCaps->dwDevSpecificOffset, NULL },
|
|
{ "dwAddressSharing", FT_FLAGS, lpAddrCaps->dwAddressSharing, aAddressSharing },
|
|
{ "dwAddressStates", FT_FLAGS, lpAddrCaps->dwAddressStates, aAddressStates },
|
|
{ "dwCallInfoStates", FT_FLAGS, lpAddrCaps->dwCallInfoStates, aCallInfoStates },
|
|
{ "dwCallerIDFlags", FT_FLAGS, lpAddrCaps->dwCallerIDFlags, aCallerIDFlags },
|
|
{ "dwCalledIDFlags", FT_FLAGS, lpAddrCaps->dwCalledIDFlags, aCallerIDFlags },
|
|
{ "dwConnectedIDFlags", FT_FLAGS, lpAddrCaps->dwConnectedIDFlags, aCallerIDFlags },
|
|
{ "dwRedirectionIDFlags", FT_FLAGS, lpAddrCaps->dwRedirectionIDFlags, aCallerIDFlags },
|
|
{ "dwRedirectingIDFlags", FT_FLAGS, lpAddrCaps->dwRedirectingIDFlags, aCallerIDFlags },
|
|
{ "dwCallStates", FT_FLAGS, lpAddrCaps->dwCallStates, aCallStates },
|
|
{ "dwDialToneModes", FT_FLAGS, lpAddrCaps->dwDialToneModes, aDialToneModes },
|
|
{ "dwBusyModes", FT_FLAGS, lpAddrCaps->dwBusyModes, aBusyModes },
|
|
{ "dwSpecialInfo", FT_FLAGS, lpAddrCaps->dwSpecialInfo, aSpecialInfo },
|
|
{ "dwDisconnectModes", FT_FLAGS, lpAddrCaps->dwDisconnectModes, aDisconnectModes },
|
|
{ "dwMaxNumActiveCalls", FT_DWORD, lpAddrCaps->dwMaxNumActiveCalls, NULL },
|
|
{ "dwMaxNumOnHoldCalls", FT_DWORD, lpAddrCaps->dwMaxNumOnHoldCalls, NULL },
|
|
{ "dwMaxNumOnHoldPendingCalls", FT_DWORD, lpAddrCaps->dwMaxNumOnHoldPendingCalls, NULL },
|
|
{ "dwMaxNumConference", FT_DWORD, lpAddrCaps->dwMaxNumConference, NULL },
|
|
{ "dwMaxNumTransConf", FT_DWORD, lpAddrCaps->dwMaxNumTransConf, NULL },
|
|
{ "dwAddrCapFlags", FT_FLAGS, lpAddrCaps->dwAddrCapFlags, aAddressCapFlags },
|
|
{ "dwCallFeatures", FT_FLAGS, lpAddrCaps->dwCallFeatures, aCallFeatures },
|
|
{ "dwRemoveFromConfCaps", FT_ORD, lpAddrCaps->dwRemoveFromConfCaps, aRemoveFromConfCaps },
|
|
{ "dwRemoveFromConfState", FT_FLAGS, lpAddrCaps->dwRemoveFromConfState, aCallStates },
|
|
{ "dwTransferModes", FT_FLAGS, lpAddrCaps->dwTransferModes, aTransferModes },
|
|
{ "dwParkModes", FT_FLAGS, lpAddrCaps->dwParkModes, aParkModes },
|
|
{ "dwForwardModes", FT_FLAGS, lpAddrCaps->dwForwardModes, aForwardModes },
|
|
{ "dwMaxForwardEntries", FT_DWORD, lpAddrCaps->dwMaxForwardEntries, NULL },
|
|
{ "dwMaxSpecificEntries", FT_DWORD, lpAddrCaps->dwMaxSpecificEntries, NULL },
|
|
{ "dwMinFwdNumRings", FT_DWORD, lpAddrCaps->dwMinFwdNumRings, NULL },
|
|
{ "dwMaxFwdNumRings", FT_DWORD, lpAddrCaps->dwMaxFwdNumRings, NULL },
|
|
{ "dwMaxCallCompletions", FT_DWORD, lpAddrCaps->dwMaxCallCompletions, NULL },
|
|
{ "dwCallCompletionConds", FT_FLAGS, lpAddrCaps->dwCallCompletionConds, aCallComplConds },
|
|
{ "dwCallCompletionModes", FT_FLAGS, lpAddrCaps->dwCallCompletionModes, aCallComplModes },
|
|
{ "dwNumCompletionMessages", FT_DWORD, lpAddrCaps->dwNumCompletionMessages, NULL },
|
|
{ "dwCompletionMsgTextEntrySize", FT_DWORD, lpAddrCaps->dwCompletionMsgTextEntrySize, NULL },
|
|
{ "dwCompletionMsgTextSize", FT_SIZE, lpAddrCaps->dwCompletionMsgTextSize, NULL },
|
|
{ "dwCompletionMsgTextOffset", FT_OFFSET, lpAddrCaps->dwCompletionMsgTextOffset, NULL }
|
|
#if TAPI_1_1
|
|
,
|
|
{ "dwAddressFeatures", FT_FLAGS, 0, aAddressFeatures }
|
|
#if TAPI_2_0
|
|
,
|
|
{ "dwPredictiveAutoTransferStates", FT_FLAGS, 0, aCallStates },
|
|
{ "dwNumCallTreatments", FT_DWORD, 0, NULL },
|
|
{ "dwCallTreatmentListSize", FT_SIZE, 0, NULL },
|
|
{ "dwCallTreatmentListOffset", FT_OFFSET, 0, NULL },
|
|
{ "dwDeviceClassesSize", FT_SIZE, 0, NULL },
|
|
{ "dwDeviceClassesOffset", FT_OFFSET, 0, NULL },
|
|
{ "dwMaxCallDataSize", FT_DWORD, 0, NULL },
|
|
{ "dwCallFeatures2", FT_FLAGS, 0, aCallFeatures2 },
|
|
{ "dwMaxNoAnswerTimeout", FT_DWORD, 0, NULL },
|
|
{ "dwConnectedModes", FT_FLAGS, 0, aConnectedModes },
|
|
{ "dwOfferingModes", FT_FLAGS, 0, aOfferingModes },
|
|
{ "dwAvailableMediaModes", FT_FLAGS, 0, aMediaModes }
|
|
#endif
|
|
#endif
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpAddrCaps, "LINEADDRESSCAPS", 0, fields
|
|
};
|
|
|
|
|
|
if (params[3].dwValue == 0x10003)
|
|
{
|
|
//
|
|
// Only show ver 1.0 params
|
|
//
|
|
|
|
fieldHeader.dwNumFields = 41;
|
|
}
|
|
#if TAPI_1_1
|
|
else if (params[3].dwValue == 0x10004)
|
|
{
|
|
//
|
|
// Only show <= ver 1.4 params
|
|
//
|
|
|
|
fieldHeader.dwNumFields = 42;
|
|
|
|
fields[41].dwValue = lpAddrCaps->dwAddressFeatures;
|
|
}
|
|
#if TAPI_2_0
|
|
else
|
|
{
|
|
//
|
|
// Only show <= ver 2.0 params
|
|
//
|
|
|
|
fieldHeader.dwNumFields = 54;
|
|
|
|
fields[41].dwValue = lpAddrCaps->dwAddressFeatures;
|
|
fields[42].dwValue = lpAddrCaps->dwPredictiveAutoTransferStates;
|
|
fields[43].dwValue = lpAddrCaps->dwNumCallTreatments;
|
|
fields[44].dwValue = lpAddrCaps->dwCallTreatmentListSize;
|
|
fields[45].dwValue = lpAddrCaps->dwCallTreatmentListOffset;
|
|
fields[46].dwValue = lpAddrCaps->dwDeviceClassesSize;
|
|
fields[47].dwValue = lpAddrCaps->dwDeviceClassesOffset;
|
|
fields[48].dwValue = lpAddrCaps->dwMaxCallDataSize;
|
|
fields[49].dwValue = lpAddrCaps->dwCallFeatures2;
|
|
fields[50].dwValue = lpAddrCaps->dwMaxNoAnswerTimeout;
|
|
fields[51].dwValue = lpAddrCaps->dwConnectedModes;
|
|
fields[52].dwValue = lpAddrCaps->dwOfferingModes;
|
|
fields[53].dwValue = lpAddrCaps->dwAvailableMediaModes;
|
|
}
|
|
#endif
|
|
#endif
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetAddressID:
|
|
#if TAPI_2_0
|
|
case lGetAddressIDW:
|
|
#endif
|
|
{
|
|
DWORD dwAddressID;
|
|
char szAddress[MAX_STRING_PARAM_SIZE] = "0";
|
|
LPLINEADDRESSCAPS lpAddrCaps = (LPLINEADDRESSCAPS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpdwAddressID", PT_POINTER, (ULONG_PTR) &dwAddressID, &dwAddressID },
|
|
{ "dwAddressMode", PT_FLAGS, (ULONG_PTR) LINEADDRESSMODE_DIALABLEADDR, aAddressModes },
|
|
{ "lpsAddress", PT_STRING, (ULONG_PTR) szAddress, szAddress },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) 2, NULL }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (funcIndex == lGetAddressID ?
|
|
(PFN5) lineGetAddressID : (PFN5) lineGetAddressIDW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineGetAddressID };
|
|
#endif
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStr ("%s%s=x%lx", szTab, szdwAddressID, dwAddressID);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetAddressStatus:
|
|
#if TAPI_2_0
|
|
case lGetAddressStatusW:
|
|
#endif
|
|
{
|
|
LPLINEADDRESSSTATUS lpAddrStatus = (LPLINEADDRESSSTATUS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ "lpAddressCaps", PT_POINTER, (ULONG_PTR) lpAddrStatus, lpAddrStatus }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lGetAddressStatus ?
|
|
(PFN3) lineGetAddressStatus : (PFN3) lineGetAddressStatusW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetAddressStatus };
|
|
#endif
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
memset (lpAddrStatus, 0, (size_t) dwBigBufSize);
|
|
lpAddrStatus->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpAddrStatus);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwNumInUse", FT_DWORD, lpAddrStatus->dwNumInUse, NULL },
|
|
{ "dwNumActiveCalls", FT_DWORD, lpAddrStatus->dwNumActiveCalls, NULL },
|
|
{ "dwNumOnHoldCalls", FT_DWORD, lpAddrStatus->dwNumOnHoldCalls, NULL },
|
|
{ "dwNumOnHoldPendCalls", FT_DWORD, lpAddrStatus->dwNumOnHoldPendCalls, NULL },
|
|
{ "dwAddressFeatures", FT_FLAGS, lpAddrStatus->dwAddressFeatures, aAddressFeatures },
|
|
{ "dwNumRingsNoAnswer", FT_DWORD, lpAddrStatus->dwNumRingsNoAnswer, NULL },
|
|
{ "dwForwardNumEntries", FT_DWORD, lpAddrStatus->dwForwardNumEntries, NULL },
|
|
{ "dwForwardSize", FT_SIZE, lpAddrStatus->dwForwardSize, NULL },
|
|
{ "dwForwardOffset", FT_OFFSET, lpAddrStatus->dwForwardOffset, NULL },
|
|
{ "dwTerminalModesSize", FT_SIZE, lpAddrStatus->dwTerminalModesSize, NULL },
|
|
{ "dwTerminalModesOffset", FT_OFFSET, lpAddrStatus->dwTerminalModesOffset, NULL },
|
|
{ "dwDevSpecificSize", FT_SIZE, lpAddrStatus->dwDevSpecificSize, NULL },
|
|
{ "dwDevSpecificOffset", FT_OFFSET, lpAddrStatus->dwDevSpecificOffset, NULL }
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpAddrStatus,
|
|
"LINEADDRESSSTATUS",
|
|
13,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case lGetAgentActivityList:
|
|
case lGetAgentActivityListW:
|
|
{
|
|
LPLINEAGENTACTIVITYLIST lpActivityList = (LPLINEAGENTACTIVITYLIST)
|
|
pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ "lpAgentActivityList", PT_POINTER, (ULONG_PTR) lpActivityList, lpActivityList }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lGetAgentActivityList ?
|
|
(PFN3) lineGetAgentActivityList :
|
|
(PFN3) lineGetAgentActivityListW) };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
memset (lpActivityList, 0, (size_t) dwBigBufSize);
|
|
lpActivityList->dwTotalSize = dwBigBufSize;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
// BUGBUG dump agent activity list on successful async completion
|
|
|
|
break;
|
|
}
|
|
case lGetAgentCaps:
|
|
{
|
|
LPLINEAGENTCAPS lpAgentCaps = (LPLINEAGENTCAPS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ "lpAgentCaps", PT_POINTER, (ULONG_PTR) lpAgentCaps, lpAgentCaps }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineGetAgentCaps };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (lpAgentCaps, 0, (size_t) dwBigBufSize);
|
|
lpAgentCaps->dwTotalSize = dwBigBufSize;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
// BUGBUG dump agent caps on successful async completion
|
|
|
|
break;
|
|
}
|
|
case lGetAgentGroupList:
|
|
{
|
|
LPLINEAGENTGROUPLIST lpGroupList = (LPLINEAGENTGROUPLIST) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ "lpAgentGroupList", PT_POINTER, (ULONG_PTR) lpGroupList, lpGroupList }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetAgentGroupList };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
memset (lpGroupList, 0, (size_t) dwBigBufSize);
|
|
lpGroupList->dwTotalSize = dwBigBufSize;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
// BUGBUG dump agent group list on successful async completion
|
|
|
|
break;
|
|
}
|
|
case lGetAgentStatus:
|
|
{
|
|
LPLINEAGENTSTATUS lpStatus = (LPLINEAGENTSTATUS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ "lpAgentStatus", PT_POINTER, (ULONG_PTR) lpStatus, lpStatus }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetAgentStatus };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
memset (lpStatus, 0, (size_t) dwBigBufSize);
|
|
lpStatus->dwTotalSize = dwBigBufSize;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
// BUGBUG dump agent status on successful async completion
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case lGetCallInfo:
|
|
#if TAPI_2_0
|
|
case lGetCallInfoW:
|
|
#endif
|
|
{
|
|
LPLINECALLINFO lpCallInfo = (LPLINECALLINFO) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpCallInfo", PT_POINTER, (ULONG_PTR) lpCallInfo, lpCallInfo }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (funcIndex == lGetCallInfo ?
|
|
(PFN2) lineGetCallInfo : (PFN2) lineGetCallInfoW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineGetCallInfo };
|
|
#endif
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
memset (lpCallInfo, 0x5a, (size_t) dwBigBufSize);
|
|
lpCallInfo->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpCallInfo);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ szhLine, FT_DWORD, (DWORD)lpCallInfo->hLine, NULL },
|
|
{ "dwLineDeviceID", FT_DWORD, lpCallInfo->dwLineDeviceID, NULL },
|
|
{ szdwAddressID, FT_DWORD, lpCallInfo->dwAddressID, NULL },
|
|
{ "dwBearerMode", FT_FLAGS, lpCallInfo->dwBearerMode, aBearerModes },
|
|
{ "dwRate", FT_DWORD, lpCallInfo->dwRate, NULL },
|
|
{ "dwMediaMode", FT_FLAGS, lpCallInfo->dwMediaMode, aMediaModes },
|
|
{ "dwAppSpecific", FT_DWORD, lpCallInfo->dwAppSpecific, NULL },
|
|
{ "dwCallID", FT_DWORD, lpCallInfo->dwCallID, NULL },
|
|
{ "dwRelatedCallID", FT_DWORD, lpCallInfo->dwRelatedCallID, NULL },
|
|
{ "dwCallParamFlags", FT_FLAGS, lpCallInfo->dwCallParamFlags, aCallParamFlags },
|
|
{ "dwCallStates", FT_FLAGS, lpCallInfo->dwCallStates, aCallStates },
|
|
{ "dwMonitorDigitModes", FT_FLAGS, lpCallInfo->dwMonitorDigitModes, aDigitModes },
|
|
{ "dwMonitorMediaModes", FT_FLAGS, lpCallInfo->dwMonitorMediaModes, aMediaModes },
|
|
{ "DialParams.dwDialPause", FT_DWORD, lpCallInfo->DialParams.dwDialPause, NULL },
|
|
{ "DialParams.dwDialSpeed", FT_DWORD, lpCallInfo->DialParams.dwDialSpeed, NULL },
|
|
{ "DialParams.dwDigitDuration", FT_DWORD, lpCallInfo->DialParams.dwDigitDuration, NULL },
|
|
{ "DialParams.dwWaitForDialtone", FT_DWORD, lpCallInfo->DialParams.dwWaitForDialtone, NULL },
|
|
{ "dwOrigin", FT_FLAGS, lpCallInfo->dwOrigin, aCallOrigins },
|
|
{ "dwReason", FT_FLAGS, lpCallInfo->dwReason, aCallReasons },
|
|
{ "dwCompletionID", FT_DWORD, lpCallInfo->dwCompletionID, NULL },
|
|
{ "dwNumOwners", FT_DWORD, lpCallInfo->dwNumOwners, NULL },
|
|
{ "dwNumMonitors", FT_DWORD, lpCallInfo->dwNumMonitors, NULL },
|
|
{ "dwCountryCode", FT_DWORD, lpCallInfo->dwCountryCode, NULL },
|
|
{ "dwTrunk", FT_DWORD, lpCallInfo->dwTrunk, NULL },
|
|
{ "dwCallerIDFlags", FT_FLAGS, lpCallInfo->dwCallerIDFlags, aCallerIDFlags },
|
|
{ "dwCallerIDSize", FT_SIZE, lpCallInfo->dwCallerIDSize, NULL },
|
|
{ "dwCallerIDOffset", FT_OFFSET, lpCallInfo->dwCallerIDOffset, NULL },
|
|
{ "dwCallerIDNameSize", FT_SIZE, lpCallInfo->dwCallerIDNameSize, NULL },
|
|
{ "dwCallerIDNameOffset", FT_OFFSET, lpCallInfo->dwCallerIDNameOffset, NULL },
|
|
{ "dwCalledIDFlags", FT_FLAGS, lpCallInfo->dwCalledIDFlags, aCallerIDFlags },
|
|
{ "dwCalledIDSize", FT_SIZE, lpCallInfo->dwCalledIDSize, NULL },
|
|
{ "dwCalledIDOffset", FT_OFFSET, lpCallInfo->dwCalledIDOffset, NULL },
|
|
{ "dwCalledIDNameSize", FT_SIZE, lpCallInfo->dwCalledIDNameSize, NULL },
|
|
{ "dwCalledIDNameOffset", FT_OFFSET, lpCallInfo->dwCalledIDNameOffset, NULL },
|
|
{ "dwConnectedIDFlags", FT_FLAGS, lpCallInfo->dwConnectedIDFlags, aCallerIDFlags },
|
|
{ "dwConnectedIDSize", FT_SIZE, lpCallInfo->dwConnectedIDSize, NULL },
|
|
{ "dwConnectedIDOffset", FT_OFFSET, lpCallInfo->dwConnectedIDOffset, NULL },
|
|
{ "dwConnectedIDNameSize", FT_SIZE, lpCallInfo->dwConnectedIDNameSize, NULL },
|
|
{ "dwConnectedIDNameOffset", FT_OFFSET, lpCallInfo->dwConnectedIDNameOffset, NULL },
|
|
{ "dwRedirectionIDFlags", FT_FLAGS, lpCallInfo->dwRedirectionIDFlags, aCallerIDFlags },
|
|
{ "dwRedirectionIDSize", FT_SIZE, lpCallInfo->dwRedirectionIDSize, NULL },
|
|
{ "dwRedirectionIDOffset", FT_OFFSET, lpCallInfo->dwRedirectionIDOffset, NULL },
|
|
{ "dwRedirectionIDNameSize", FT_SIZE, lpCallInfo->dwRedirectionIDNameSize, NULL },
|
|
{ "dwRedirectionIDNameOffset", FT_OFFSET, lpCallInfo->dwRedirectionIDNameOffset, NULL },
|
|
{ "dwRedirectingIDFlags", FT_FLAGS, lpCallInfo->dwRedirectingIDFlags, aCallerIDFlags },
|
|
{ "dwRedirectingIDSize", FT_SIZE, lpCallInfo->dwRedirectingIDSize, NULL },
|
|
{ "dwRedirectingIDOffset", FT_OFFSET, lpCallInfo->dwRedirectingIDOffset, NULL },
|
|
{ "dwRedirectingIDNameSize", FT_SIZE, lpCallInfo->dwRedirectingIDNameSize, NULL },
|
|
{ "dwRedirectingIDNameOffset", FT_OFFSET, lpCallInfo->dwRedirectingIDNameOffset, NULL },
|
|
{ "dwAppNameSize", FT_SIZE, lpCallInfo->dwAppNameSize, NULL },
|
|
{ "dwAppNameOffset", FT_OFFSET, lpCallInfo->dwAppNameOffset, NULL },
|
|
{ "dwDisplayableAddressSize", FT_SIZE, lpCallInfo->dwDisplayableAddressSize, NULL },
|
|
{ "dwDisplayableAddressOffset", FT_OFFSET, lpCallInfo->dwDisplayableAddressOffset, NULL },
|
|
{ "dwCalledPartySize", FT_SIZE, lpCallInfo->dwCalledPartySize, NULL },
|
|
{ "dwCalledPartyOffset", FT_OFFSET, lpCallInfo->dwCalledPartyOffset, NULL },
|
|
{ "dwCommentSize", FT_SIZE, lpCallInfo->dwCommentSize, NULL },
|
|
{ "dwCommentOffset", FT_OFFSET, lpCallInfo->dwCommentOffset, NULL },
|
|
{ "dwDisplaySize", FT_SIZE, lpCallInfo->dwDisplaySize, NULL },
|
|
{ "dwDisplayOffset", FT_OFFSET, lpCallInfo->dwDisplayOffset, NULL },
|
|
{ "dwUserUserInfoSize", FT_SIZE, lpCallInfo->dwUserUserInfoSize, NULL },
|
|
{ "dwUserUserInfoOffset", FT_OFFSET, lpCallInfo->dwUserUserInfoOffset, NULL },
|
|
{ "dwHighLevelCompSize", FT_SIZE, lpCallInfo->dwHighLevelCompSize, NULL },
|
|
{ "dwHighLevelCompOffset", FT_OFFSET, lpCallInfo->dwHighLevelCompOffset, NULL },
|
|
{ "dwLowLevelCompSize", FT_SIZE, lpCallInfo->dwLowLevelCompSize, NULL },
|
|
{ "dwLowLevelCompOffset", FT_OFFSET, lpCallInfo->dwLowLevelCompOffset, NULL },
|
|
{ "dwChargingInfoSize", FT_SIZE, lpCallInfo->dwChargingInfoSize, NULL },
|
|
{ "dwChargingInfoOffset", FT_OFFSET, lpCallInfo->dwChargingInfoOffset, NULL },
|
|
{ "dwTerminalModesSize", FT_SIZE, lpCallInfo->dwTerminalModesSize, NULL },
|
|
{ "dwTerminalModesOffset", FT_OFFSET, lpCallInfo->dwTerminalModesOffset, NULL },
|
|
{ "dwDevSpecificSize", FT_SIZE, lpCallInfo->dwDevSpecificSize, NULL },
|
|
{ "dwDevSpecificOffset", FT_OFFSET, lpCallInfo->dwDevSpecificOffset, NULL }
|
|
#if TAPI_2_0
|
|
,
|
|
{ "dwCallTreatment", FT_DWORD, 0, NULL },
|
|
{ "dwCallDataSize", FT_SIZE, 0, NULL },
|
|
{ "dwCallDataOffset", FT_OFFSET, 0, NULL },
|
|
{ "dwSendingFlowspecSize", FT_SIZE, 0, NULL },
|
|
{ "dwSendingFlowspecOffset", FT_OFFSET, 0, NULL },
|
|
{ "dwReceivingFlowspecSize", FT_SIZE, 0, NULL },
|
|
{ "dwReceivingFlowspecOffset", FT_OFFSET, 0, NULL }
|
|
#endif
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpCallInfo, "LINECALLINFO", 0, fields
|
|
};
|
|
|
|
|
|
if (pLineSel->dwAPIVersion < 0x00020000)
|
|
{
|
|
//
|
|
// Only show ver 1.0 params
|
|
//
|
|
|
|
fieldHeader.dwNumFields = 71;
|
|
}
|
|
#if TAPI_2_0
|
|
else
|
|
{
|
|
fieldHeader.dwNumFields = 78;
|
|
|
|
fields[71].dwValue = lpCallInfo->dwCallTreatment;
|
|
fields[72].dwValue = lpCallInfo->dwCallDataSize;
|
|
fields[73].dwValue = lpCallInfo->dwCallDataOffset;
|
|
fields[74].dwValue = lpCallInfo->dwSendingFlowspecSize;
|
|
fields[75].dwValue = lpCallInfo->dwSendingFlowspecOffset;
|
|
fields[76].dwValue = lpCallInfo->dwReceivingFlowspecSize;
|
|
fields[77].dwValue = lpCallInfo->dwReceivingFlowspecOffset;
|
|
}
|
|
#endif
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetCallStatus:
|
|
{
|
|
LPLINECALLSTATUS lpCallStatus = (LPLINECALLSTATUS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpCallStatus", PT_POINTER, (ULONG_PTR) lpCallStatus, lpCallStatus }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineGetCallStatus };
|
|
DWORD dwAPIVersion;
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
dwAPIVersion = pLineSel->dwAPIVersion;
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
memset (lpCallStatus, 0, (size_t) dwBigBufSize);
|
|
lpCallStatus->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpCallStatus);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwCallState", FT_FLAGS, lpCallStatus->dwCallState, aCallStates },
|
|
{ "dwCallStateMode", FT_FLAGS, lpCallStatus->dwCallStateMode, NULL },
|
|
{ "dwCallPrivilege", FT_FLAGS, lpCallStatus->dwCallPrivilege, aCallPrivileges },
|
|
{ "dwCallFeatures", FT_FLAGS, lpCallStatus->dwCallFeatures, aCallFeatures },
|
|
{ "dwDevSpecificSize", FT_SIZE, lpCallStatus->dwDevSpecificSize, NULL },
|
|
{ "dwDevSpecificOffset", FT_OFFSET, lpCallStatus->dwDevSpecificOffset, NULL }
|
|
#if TAPI_2_0
|
|
,
|
|
{ "dwCallFeatures2", FT_FLAGS, 0, aCallFeatures2 },
|
|
{ "tStateEntryTime[0]", FT_DWORD, 0, NULL },
|
|
{ "tStateEntryTime[1]", FT_DWORD, 0, NULL },
|
|
{ "tStateEntryTime[2]", FT_DWORD, 0, NULL },
|
|
{ "tStateEntryTime[3]", FT_DWORD, 0, NULL }
|
|
#endif
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpCallStatus, "LINECALLSTATUS", 0, fields
|
|
};
|
|
|
|
|
|
switch (lpCallStatus->dwCallState)
|
|
{
|
|
case LINECALLSTATE_DIALTONE:
|
|
|
|
fields[1].pLookup = aDialToneModes;
|
|
break;
|
|
|
|
case LINECALLSTATE_BUSY:
|
|
|
|
fields[1].pLookup = aBusyModes;
|
|
break;
|
|
|
|
case LINECALLSTATE_SPECIALINFO:
|
|
|
|
fields[1].pLookup = aSpecialInfo;
|
|
break;
|
|
|
|
case LINECALLSTATE_DISCONNECTED:
|
|
|
|
fields[1].pLookup = aDisconnectModes;
|
|
break;
|
|
|
|
default:
|
|
|
|
fields[1].dwType = FT_DWORD;
|
|
break;
|
|
}
|
|
|
|
if (dwAPIVersion < 0x00020000)
|
|
{
|
|
fieldHeader.dwNumFields = 6;
|
|
}
|
|
#if TAPI_2_0
|
|
else
|
|
{
|
|
fieldHeader.dwNumFields = 11;
|
|
|
|
fields[6].dwValue = lpCallStatus->dwCallFeatures2;
|
|
fields[7].dwValue = *((LPDWORD) &lpCallStatus->tStateEntryTime);
|
|
fields[8].dwValue = *(((LPDWORD) &lpCallStatus->tStateEntryTime) + 1);
|
|
fields[9].dwValue = *(((LPDWORD) &lpCallStatus->tStateEntryTime) + 2);
|
|
fields[10].dwValue = *(((LPDWORD) &lpCallStatus->tStateEntryTime) + 3);
|
|
}
|
|
#endif
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetConfRelatedCalls:
|
|
{
|
|
LPLINECALLLIST lpCallList = (LPLINECALLLIST) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpCallList", PT_POINTER, (ULONG_PTR) lpCallList, lpCallList }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineGetConfRelatedCalls };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
memset (lpCallList, 0, (size_t) dwBigBufSize);
|
|
lpCallList->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpCallList);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwCallsNumEntries", FT_DWORD, lpCallList->dwCallsNumEntries, NULL },
|
|
{ "dwCallsSize", FT_SIZE, lpCallList->dwCallsSize, NULL },
|
|
{ "dwCallsOffset", FT_OFFSET, lpCallList->dwCallsOffset, NULL }
|
|
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpCallList,
|
|
"LINECALLLIST",
|
|
3,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetDevCaps:
|
|
#if TAPI_2_0
|
|
case lGetDevCapsW:
|
|
#endif
|
|
{
|
|
LPLINEDEVCAPS lpDevCaps = (LPLINEDEVCAPS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ "dwExtVersion", PT_DWORD, (ULONG_PTR) dwDefLineExtVersion, NULL },
|
|
{ "lpLineDevCaps", PT_POINTER, (ULONG_PTR) lpDevCaps, lpDevCaps }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (funcIndex == lGetDevCaps ?
|
|
(PFN5) lineGetDevCaps : (PFN5) lineGetDevCapsW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineGetDevCaps };
|
|
#endif
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (lpDevCaps, 0, (size_t) dwBigBufSize);
|
|
lpDevCaps->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpDevCaps);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwProviderInfoSize", FT_SIZE, lpDevCaps->dwProviderInfoSize, NULL },
|
|
{ "dwProviderInfoOffset", FT_OFFSET, lpDevCaps->dwProviderInfoOffset, NULL },
|
|
{ "dwSwitchInfoSize", FT_SIZE, lpDevCaps->dwSwitchInfoSize, NULL },
|
|
{ "dwSwitchInfoOffset", FT_OFFSET, lpDevCaps->dwSwitchInfoOffset, NULL },
|
|
{ "dwPermanentLineID", FT_DWORD, lpDevCaps->dwPermanentLineID, NULL },
|
|
{ "dwLineNameSize", FT_SIZE, lpDevCaps->dwLineNameSize, NULL },
|
|
{ "dwLineNameOffset", FT_OFFSET, lpDevCaps->dwLineNameOffset, NULL },
|
|
{ "dwStringFormat", FT_ORD, lpDevCaps->dwStringFormat, aStringFormats },
|
|
{ "dwAddressModes", FT_FLAGS, lpDevCaps->dwAddressModes, aAddressModes },
|
|
{ "dwNumAddresses", FT_DWORD, lpDevCaps->dwNumAddresses, NULL },
|
|
{ "dwBearerModes", FT_FLAGS, lpDevCaps->dwBearerModes, aBearerModes },
|
|
{ "dwMaxRate", FT_DWORD, lpDevCaps->dwMaxRate, NULL },
|
|
{ "dwMediaModes", FT_FLAGS, lpDevCaps->dwMediaModes, aMediaModes },
|
|
{ "dwGenerateToneModes", FT_FLAGS, lpDevCaps->dwGenerateToneModes, aToneModes },
|
|
{ "dwGenerateToneMaxNumFreq", FT_DWORD, lpDevCaps->dwGenerateToneMaxNumFreq, NULL },
|
|
{ "dwGenerateDigitModes", FT_FLAGS, lpDevCaps->dwGenerateDigitModes, aDigitModes },
|
|
{ "dwMonitorToneMaxNumFreq", FT_DWORD, lpDevCaps->dwMonitorToneMaxNumFreq, NULL },
|
|
{ "dwMonitorToneMaxNumEntries", FT_DWORD, lpDevCaps->dwMonitorToneMaxNumEntries, NULL },
|
|
{ "dwMonitorDigitModes", FT_FLAGS, lpDevCaps->dwMonitorDigitModes, aDigitModes },
|
|
{ "dwGatherDigitsMinTimeout", FT_DWORD, lpDevCaps->dwGatherDigitsMinTimeout, NULL },
|
|
{ "dwGatherDigitsMaxTimeout", FT_DWORD, lpDevCaps->dwGatherDigitsMaxTimeout, NULL },
|
|
{ "dwMedCtlDigitMaxListSize", FT_DWORD, lpDevCaps->dwMedCtlDigitMaxListSize, NULL },
|
|
{ "dwMedCtlMediaMaxListSize", FT_DWORD, lpDevCaps->dwMedCtlMediaMaxListSize, NULL },
|
|
{ "dwMedCtlToneMaxListSize", FT_DWORD, lpDevCaps->dwMedCtlToneMaxListSize, NULL },
|
|
{ "dwMedCtlCallStateMaxListSize", FT_DWORD, lpDevCaps->dwMedCtlCallStateMaxListSize, NULL },
|
|
{ "dwDevCapFlags", FT_FLAGS, lpDevCaps->dwDevCapFlags, aDevCapsFlags },
|
|
{ "dwMaxNumActiveCalls", FT_DWORD, lpDevCaps->dwMaxNumActiveCalls, NULL },
|
|
{ "dwAnswerMode", FT_FLAGS, lpDevCaps->dwAnswerMode, aAnswerModes },
|
|
{ "dwRingModes", FT_DWORD, lpDevCaps->dwRingModes, NULL },
|
|
{ "dwLineStates", FT_FLAGS, lpDevCaps->dwLineStates, aLineStates },
|
|
{ "dwUUIAcceptSize", FT_DWORD, lpDevCaps->dwUUIAcceptSize, NULL },
|
|
{ "dwUUIAnswerSize", FT_DWORD, lpDevCaps->dwUUIAnswerSize, NULL },
|
|
{ "dwUUIMakeCallSize", FT_DWORD, lpDevCaps->dwUUIMakeCallSize, NULL },
|
|
{ "dwUUIDropSize", FT_DWORD, lpDevCaps->dwUUIDropSize, NULL },
|
|
{ "dwUUISendUserUserInfoSize", FT_DWORD, lpDevCaps->dwUUISendUserUserInfoSize, NULL },
|
|
{ "dwUUICallInfoSize", FT_DWORD, lpDevCaps->dwUUICallInfoSize, NULL },
|
|
{ "MinDialParams.dwDialPause", FT_DWORD, lpDevCaps->MinDialParams.dwDialPause, NULL },
|
|
{ "MinDialParams.dwDialSpeed", FT_DWORD, lpDevCaps->MinDialParams.dwDialSpeed, NULL },
|
|
{ "MinDialParams.dwDigitDuration", FT_DWORD, lpDevCaps->MinDialParams.dwDigitDuration, NULL },
|
|
{ "MinDialParams.dwWaitForDialtone", FT_DWORD, lpDevCaps->MinDialParams.dwWaitForDialtone, NULL },
|
|
{ "MaxDialParams.dwDialPause", FT_DWORD, lpDevCaps->MaxDialParams.dwDialPause, NULL },
|
|
{ "MaxDialParams.dwDialSpeed", FT_DWORD, lpDevCaps->MaxDialParams.dwDialSpeed, NULL },
|
|
{ "MaxDialParams.dwDigitDuration", FT_DWORD, lpDevCaps->MaxDialParams.dwDigitDuration, NULL },
|
|
{ "MaxDialParams.dwWaitForDialtone", FT_DWORD, lpDevCaps->MaxDialParams.dwWaitForDialtone, NULL },
|
|
{ "DefDialParams.dwDialPause", FT_DWORD, lpDevCaps->DefaultDialParams.dwDialPause, NULL },
|
|
{ "DefDialParams.dwDialSpeed", FT_DWORD, lpDevCaps->DefaultDialParams.dwDialSpeed, NULL },
|
|
{ "DefDialParams.dwDigitDuration", FT_DWORD, lpDevCaps->DefaultDialParams.dwDigitDuration, NULL },
|
|
{ "DefDialParams.dwWaitForDialtone", FT_DWORD, lpDevCaps->DefaultDialParams.dwWaitForDialtone, NULL },
|
|
{ "dwNumTerminals", FT_DWORD, lpDevCaps->dwNumTerminals, NULL },
|
|
{ "dwTerminalCapsSize", FT_SIZE, lpDevCaps->dwTerminalCapsSize, NULL },
|
|
{ "dwTerminalCapsOffset", FT_OFFSET, lpDevCaps->dwTerminalCapsOffset, NULL },
|
|
{ "dwTerminalTextEntrySize", FT_DWORD, lpDevCaps->dwTerminalTextEntrySize, NULL },
|
|
{ "dwTerminalTextSize", FT_SIZE, lpDevCaps->dwTerminalTextSize, NULL },
|
|
{ "dwTerminalTextOffset", FT_OFFSET, lpDevCaps->dwTerminalTextOffset, NULL },
|
|
{ "dwDevSpecificSize", FT_SIZE, lpDevCaps->dwDevSpecificSize, NULL },
|
|
{ "dwDevSpecificOffset", FT_OFFSET, lpDevCaps->dwDevSpecificOffset, NULL }
|
|
#if TAPI_1_1
|
|
,
|
|
{ "dwLineFeatures", FT_FLAGS, 0, aLineFeatures }
|
|
#if TAPI_2_0
|
|
,
|
|
{ "dwSettableDevStatus", FT_FLAGS, 0, aLineDevStatusFlags },
|
|
{ "dwDeviceClassesSize", FT_SIZE, 0, NULL },
|
|
{ "dwDeviceClassesOffset", FT_OFFSET, 0, NULL }
|
|
#if TAPI_2_2
|
|
,
|
|
{ "PermanentLineGuid(Size)", FT_SIZE, sizeof (lpDevCaps->PermanentLineGuid), NULL },
|
|
{ "PermanentLineGuid(Offset)", FT_OFFSET, ((LPBYTE) &lpDevCaps->PermanentLineGuid) - ((LPBYTE) lpDevCaps), NULL }
|
|
#endif
|
|
#endif
|
|
#endif
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpDevCaps, "LINEDEVCAPS", 0, fields
|
|
};
|
|
|
|
if (params[2].dwValue == 0x10003)
|
|
{
|
|
//
|
|
// Only show ver 1.0 params
|
|
//
|
|
|
|
fieldHeader.dwNumFields = 56;
|
|
}
|
|
#if TAPI_1_1
|
|
else if (params[2].dwValue == 0x10004)
|
|
{
|
|
//
|
|
// Only show <= ver 1.1 params
|
|
//
|
|
|
|
fieldHeader.dwNumFields = 57;
|
|
|
|
fields[56].dwValue = lpDevCaps->dwLineFeatures;
|
|
}
|
|
#if TAPI_2_0
|
|
else
|
|
{
|
|
//
|
|
// Only show <= ver 2.0 params
|
|
//
|
|
|
|
fieldHeader.dwNumFields = 60;
|
|
|
|
fields[56].dwValue = lpDevCaps->dwLineFeatures;
|
|
fields[57].dwValue = lpDevCaps->dwSettableDevStatus;
|
|
fields[58].dwValue = lpDevCaps->dwDeviceClassesSize;
|
|
fields[59].dwValue = lpDevCaps->dwDeviceClassesOffset;
|
|
#if TAPI_2_2
|
|
if (params[2].dwValue >= 0x20002)
|
|
{
|
|
fieldHeader.dwNumFields += 2;
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetDevConfig:
|
|
#if TAPI_2_0
|
|
case lGetDevConfigW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE];
|
|
LPVARSTRING lpDevConfig = (LPVARSTRING) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ "lpDeviceConfig", PT_POINTER, (ULONG_PTR) lpDevConfig, lpDevConfig },
|
|
{ szlpszDeviceClass, PT_STRING, (ULONG_PTR) szDeviceClass, szDeviceClass }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lGetDevConfig ?
|
|
(PFN3) lineGetDevConfig : (PFN3) lineGetDevConfigW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetDevConfig };
|
|
#endif
|
|
|
|
memset (lpDevConfig, 0, (size_t) dwBigBufSize);
|
|
lpDevConfig->dwTotalSize = dwBigBufSize;
|
|
|
|
strcpy (szDeviceClass, szDefLineDeviceClass);
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpDevConfig);
|
|
|
|
ShowVARSTRING (lpDevConfig);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetIcon:
|
|
#if TAPI_2_0
|
|
case lGetIconW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE] = "";
|
|
HICON hIcon;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ szlpszDeviceClass, PT_STRING, (ULONG_PTR) szDeviceClass, szDeviceClass },
|
|
{ "lphIcon", PT_POINTER, (ULONG_PTR) &hIcon, &hIcon }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lGetIcon ?
|
|
(PFN3) lineGetIcon : (PFN3) lineGetIconW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetIcon };
|
|
#endif
|
|
|
|
strcpy (szDeviceClass, szDefLineDeviceClass);
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
DialogBoxParam (
|
|
ghInst,
|
|
(LPCSTR)MAKEINTRESOURCE(IDD_DIALOG5),
|
|
(HWND) ghwndMain,
|
|
(DLGPROC) IconDlgProc,
|
|
(LPARAM) hIcon
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetID:
|
|
#if TAPI_2_0
|
|
case lGetIDW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE];
|
|
LPVARSTRING lpDevID = (LPVARSTRING) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwSelect", PT_ORDINAL, (ULONG_PTR) LINECALLSELECT_LINE, aCallSelects },
|
|
{ "lpDeviceID", PT_POINTER, (ULONG_PTR) lpDevID, lpDevID },
|
|
{ szlpszDeviceClass, PT_STRING, (ULONG_PTR) szDeviceClass, szDeviceClass }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (funcIndex == lGetID ?
|
|
(PFN6) lineGetID : (PFN6) lineGetIDW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (PFN6) lineGetID };
|
|
#endif
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
if (pCallSel)
|
|
{
|
|
params[2].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
params[3].dwValue = LINECALLSELECT_CALL;
|
|
}
|
|
else
|
|
{
|
|
params[3].dwValue = LINECALLSELECT_LINE;
|
|
}
|
|
|
|
memset (lpDevID, 0, (size_t) dwBigBufSize);
|
|
lpDevID->dwTotalSize = dwBigBufSize;
|
|
|
|
strcpy (szDeviceClass, szDefLineDeviceClass);
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpDevID);
|
|
|
|
ShowVARSTRING (lpDevID);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetLineDevStatus:
|
|
#if TAPI_2_0
|
|
case lGetLineDevStatusW:
|
|
#endif
|
|
{
|
|
LPLINEDEVSTATUS lpDevStatus = (LPLINEDEVSTATUS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpLineDevStatus", PT_POINTER, (ULONG_PTR) lpDevStatus, lpDevStatus }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (funcIndex == lGetLineDevStatus ?
|
|
(PFN2) lineGetLineDevStatus : (PFN2) lineGetLineDevStatusW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineGetLineDevStatus };
|
|
#endif
|
|
DWORD dwAPIVersion;
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
dwAPIVersion = pLineSel->dwAPIVersion;
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
memset (lpDevStatus, 0, (size_t) dwBigBufSize);
|
|
lpDevStatus->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpDevStatus);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwNumOpens", FT_DWORD, lpDevStatus->dwNumOpens, NULL },
|
|
{ "dwOpenMediaModes", FT_FLAGS, lpDevStatus->dwOpenMediaModes, aMediaModes },
|
|
{ "dwNumActiveCalls", FT_DWORD, lpDevStatus->dwNumActiveCalls, NULL },
|
|
{ "dwNumOnHoldCalls", FT_DWORD, lpDevStatus->dwNumOnHoldCalls, NULL },
|
|
{ "dwNumOnHoldPendCalls", FT_DWORD, lpDevStatus->dwNumOnHoldPendCalls, NULL },
|
|
{ "dwLineFeatures", FT_FLAGS, lpDevStatus->dwLineFeatures, aLineFeatures },
|
|
{ "dwNumCallCompletions", FT_DWORD, lpDevStatus->dwNumCallCompletions, NULL },
|
|
{ "dwRingMode", FT_DWORD, lpDevStatus->dwRingMode, NULL },
|
|
{ "dwSignalLevel", FT_DWORD, lpDevStatus->dwSignalLevel, NULL },
|
|
{ "dwBatteryLevel", FT_DWORD, lpDevStatus->dwBatteryLevel, NULL },
|
|
{ "dwRoamMode", FT_FLAGS, lpDevStatus->dwRoamMode, aLineRoamModes },
|
|
{ "dwDevStatusFlags", FT_FLAGS, lpDevStatus->dwDevStatusFlags, aLineDevStatusFlags },
|
|
{ "dwTerminalModesSize", FT_SIZE, lpDevStatus->dwTerminalModesSize, NULL },
|
|
{ "dwTerminalModesOffset", FT_OFFSET, lpDevStatus->dwTerminalModesOffset, NULL },
|
|
{ "dwDevSpecificSize", FT_SIZE, lpDevStatus->dwDevSpecificSize, NULL },
|
|
{ "dwDevSpecificOffset", FT_OFFSET, lpDevStatus->dwDevSpecificOffset, NULL }
|
|
#if TAPI_2_0
|
|
,
|
|
{ "dwAvailableMediaModes", FT_FLAGS, 0, aMediaModes },
|
|
{ "dwAppInfoSize", FT_DWORD, 0, NULL },
|
|
{ "dwAppInfoOffset", FT_DWORD, 0, NULL }
|
|
#endif
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpDevStatus, "LINEDEVSTATUS", 0, fields
|
|
};
|
|
|
|
if (dwAPIVersion < 0x00020000)
|
|
{
|
|
fieldHeader.dwNumFields = 16;
|
|
}
|
|
#if TAPI_2_0
|
|
else
|
|
{
|
|
fieldHeader.dwNumFields = 19;
|
|
|
|
fields[16].dwValue = lpDevStatus->dwAvailableMediaModes;
|
|
fields[17].dwValue = lpDevStatus->dwAppInfoSize;
|
|
fields[18].dwValue = lpDevStatus->dwAppInfoOffset;
|
|
}
|
|
#endif
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
|
|
#if TAPI_2_0
|
|
if (dwAPIVersion >= 0x00020000 && lpDevStatus->dwAppInfoSize)
|
|
{
|
|
char szAppInfoN[16];
|
|
DWORD i;
|
|
LPLINEAPPINFO pAppInfo;
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwMachineNameSize", FT_SIZE, 0, NULL },
|
|
{ "dwMachineNameOffset", FT_OFFSET, 0, NULL },
|
|
{ "dwUserNameSize", FT_SIZE, 0, NULL },
|
|
{ "dwUserNameOffset", FT_OFFSET, 0, NULL },
|
|
{ "dwModuleFilenameSize", FT_SIZE, 0, NULL },
|
|
{ "dwModuleFilenameOffset", FT_OFFSET, 0, NULL },
|
|
{ "dwFriendlyNameSize", FT_SIZE, 0, NULL },
|
|
{ "dwFriendlyNameOffset", FT_OFFSET, 0, NULL },
|
|
{ "dwMediaModes", FT_FLAGS, 0, aMediaModes },
|
|
{ "dwAddressID", FT_DWORD, 0, NULL },
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpDevStatus, szAppInfoN, 10, fields
|
|
};
|
|
|
|
|
|
pAppInfo = (LPLINEAPPINFO) (((LPBYTE) lpDevStatus) +
|
|
lpDevStatus->dwAppInfoOffset);
|
|
|
|
for (i = 0; i < lpDevStatus->dwNumOpens; i++)
|
|
{
|
|
wsprintf (szAppInfoN, "APPINFO[%d]", i);
|
|
|
|
fields[0].dwValue = pAppInfo->dwMachineNameSize;
|
|
fields[1].dwValue = pAppInfo->dwMachineNameOffset;
|
|
fields[2].dwValue = pAppInfo->dwUserNameSize;
|
|
fields[3].dwValue = pAppInfo->dwUserNameOffset;
|
|
fields[4].dwValue = pAppInfo->dwModuleFilenameSize;
|
|
fields[5].dwValue = pAppInfo->dwModuleFilenameOffset;
|
|
fields[6].dwValue = pAppInfo->dwFriendlyNameSize;
|
|
fields[7].dwValue = pAppInfo->dwFriendlyNameOffset;
|
|
fields[8].dwValue = pAppInfo->dwMediaModes;;
|
|
fields[9].dwValue = pAppInfo->dwAddressID;
|
|
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
|
|
pAppInfo++;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case lGetMessage:
|
|
{
|
|
LINEMESSAGE msg;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpMessage", PT_POINTER, (ULONG_PTR) &msg, &msg },
|
|
{ "dwTimeout", PT_DWORD, (ULONG_PTR) 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, NULL };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
// // Max timeout of 10 seconds (don't want to hang app & excite user)
|
|
// // unless the user wants INFINITE
|
|
//
|
|
// if ( 0xffffffff != params[2].dwValue )
|
|
// {
|
|
// if ( params[2].dwValue > 10000 )
|
|
// {
|
|
// params[2].dwValue = 10000;
|
|
// }
|
|
// }
|
|
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = lineGetMessage(
|
|
(HLINEAPP) params[0].dwValue,
|
|
(LPLINEMESSAGE) params[1].dwValue,
|
|
(DWORD) params[2].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
tapiCallback(
|
|
msg.hDevice,
|
|
msg.dwMessageID,
|
|
msg.dwCallbackInstance,
|
|
msg.dwParam1,
|
|
msg.dwParam2,
|
|
msg.dwParam3
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case lGetNewCalls:
|
|
{
|
|
LPLINECALLLIST lpCallList = (LPLINECALLLIST) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ "dwSelect", PT_ORDINAL, (ULONG_PTR) LINECALLSELECT_LINE, aCallSelects },
|
|
{ "lpCallList", PT_POINTER, (ULONG_PTR) lpCallList, lpCallList }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineGetNewCalls };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
memset (lpCallList, 0, (size_t) dwBigBufSize);
|
|
lpCallList->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpCallList);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwCallsNumEntries", FT_DWORD, lpCallList->dwCallsNumEntries, NULL },
|
|
{ "dwCallsSize", FT_SIZE, lpCallList->dwCallsSize, NULL },
|
|
{ "dwCallsOffset", FT_OFFSET, lpCallList->dwCallsOffset, NULL }
|
|
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpCallList,
|
|
"LINECALLLIST",
|
|
3,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
|
|
|
|
//
|
|
// If there are any hCalls returned in this struct we want
|
|
// to add them to the widget list
|
|
//
|
|
|
|
if (lpCallList->dwCallsNumEntries)
|
|
{
|
|
PMYLINE pLine = GetLine ((HLINE) params[0].dwValue);
|
|
LPHCALL lphCall = (LPHCALL)
|
|
(((LPBYTE) lpCallList) + lpCallList->dwCallsOffset);
|
|
|
|
|
|
for (i = 0; i < (int) lpCallList->dwCallsNumEntries; i++)
|
|
{
|
|
PMYCALL pNewCall = AllocCall (pLine);
|
|
LINECALLSTATUS callStatus;
|
|
|
|
|
|
if (pNewCall)
|
|
{
|
|
pNewCall->hCall = *lphCall;
|
|
pNewCall->bMonitor = TRUE;
|
|
lphCall++;
|
|
|
|
memset (&callStatus, 0, sizeof(LINECALLSTATUS));
|
|
callStatus.dwTotalSize = sizeof(LINECALLSTATUS);
|
|
|
|
if (lineGetCallStatus (pNewCall->hCall, &callStatus)
|
|
== 0)
|
|
{
|
|
//
|
|
// Special case chk for bNukeIdleMonitorCalls
|
|
//
|
|
|
|
if ((callStatus.dwCallState
|
|
== LINECALLSTATE_IDLE) &&
|
|
bNukeIdleMonitorCalls &&
|
|
(callStatus.dwCallPrivilege
|
|
== LINECALLPRIVILEGE_MONITOR))
|
|
{
|
|
if ((lResult = lineDeallocateCall(
|
|
(HCALL) pNewCall->hCall)) == 0)
|
|
{
|
|
ShowStr(
|
|
"Monitored call x%lx deallocated " \
|
|
"on IDLE",
|
|
pNewCall->hCall
|
|
);
|
|
|
|
FreeCall (pNewCall);
|
|
}
|
|
else
|
|
{
|
|
ShowStr(
|
|
"lineDeallocateCall failed (x%lx) to" \
|
|
" free idle monitored call x%lx",
|
|
lResult,
|
|
pNewCall->hCall
|
|
);
|
|
|
|
pNewCall->dwCallState = callStatus.dwCallState;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pNewCall->dwCallState = callStatus.dwCallState;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pNewCall->dwCallState = LINECALLSTATE_UNKNOWN;
|
|
}
|
|
}
|
|
}
|
|
|
|
UpdateWidgetList();
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetNumRings:
|
|
{
|
|
DWORD dwNumRings;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ "lpdwNumRings", PT_POINTER, (ULONG_PTR) &dwNumRings, &dwNumRings }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetNumRings };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStr ("%snum rings = x%lx", szTab, dwNumRings);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetRequest:
|
|
#if TAPI_2_0
|
|
case lGetRequestW:
|
|
#endif
|
|
{
|
|
#if TAPI_2_0
|
|
LINEREQMEDIACALLW reqXxxCall;
|
|
#else
|
|
LINEREQMEDIACALL reqXxxCall;
|
|
#endif
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwRequestMode", PT_ORDINAL, (ULONG_PTR) LINEREQUESTMODE_MAKECALL, aRequestModes },
|
|
{ "lpRequestBuffer", PT_POINTER, (ULONG_PTR) &reqXxxCall, &reqXxxCall }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lGetRequest ?
|
|
(PFN3) lineGetRequest : (PFN3) lineGetRequestW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetRequest };
|
|
#endif
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (&reqXxxCall, 0, sizeof (reqXxxCall));
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
if (params[1].dwValue == LINEREQUESTMODE_MAKECALL)
|
|
{
|
|
#if TAPI_2_0
|
|
if (gbWideStringParams)
|
|
{
|
|
LPLINEREQMAKECALLW lpReqMakeCall = (LPLINEREQMAKECALLW)
|
|
&reqXxxCall;
|
|
|
|
|
|
ShowStr ("%sszDestAddress=%ws", szTab, lpReqMakeCall->szDestAddress);
|
|
ShowStr ("%sszAppName=%ws", szTab, lpReqMakeCall->szAppName);
|
|
ShowStr ("%sszCalledParty=%ws", szTab, lpReqMakeCall->szCalledParty);
|
|
ShowStr ("%sszComment=%ws", szTab, lpReqMakeCall->szComment);
|
|
}
|
|
else
|
|
{
|
|
LPLINEREQMAKECALL lpReqMakeCall = (LPLINEREQMAKECALL)
|
|
&reqXxxCall;
|
|
|
|
ShowStr ("%sszDestAddress=%s", szTab, lpReqMakeCall->szDestAddress);
|
|
ShowStr ("%sszAppName=%s", szTab, lpReqMakeCall->szAppName);
|
|
ShowStr ("%sszCalledParty=%s", szTab, lpReqMakeCall->szCalledParty);
|
|
ShowStr ("%sszComment=%s", szTab, lpReqMakeCall->szComment);
|
|
}
|
|
#else
|
|
LPLINEREQMAKECALL lpReqMakeCall = (LPLINEREQMAKECALL)
|
|
&reqXxxCall;
|
|
|
|
|
|
ShowStr ("%sszDestAddress=%s", szTab, lpReqMakeCall->szDestAddress);
|
|
ShowStr ("%sszAppName=%s", szTab, lpReqMakeCall->szAppName);
|
|
ShowStr ("%sszCalledParty=%s", szTab, lpReqMakeCall->szCalledParty);
|
|
ShowStr ("%sszComment=%s", szTab, lpReqMakeCall->szComment);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// NOTE: lineGetRequest(MEDIACALL) is a NOOP for win32,
|
|
// so we don't have to sweat differing sizes for
|
|
// HWND & WPARAM in the struct
|
|
//
|
|
|
|
LPLINEREQMEDIACALL lpReqMediaCall = (LPLINEREQMEDIACALL)
|
|
&reqXxxCall;
|
|
|
|
|
|
ShowStr ("%shWnd=x%x", szTab, lpReqMediaCall->hWnd);
|
|
ShowStr ("%swRequestID=x%x", szTab, lpReqMediaCall->wRequestID);
|
|
ShowStr ("%sszDeviceClass=%s", szTab, lpReqMediaCall->szDeviceClass);
|
|
ShowStr ("%sdwSize=x%lx", szTab, lpReqMediaCall->dwSize);
|
|
ShowStr ("%sdwSecure=x%lx", szTab, lpReqMediaCall->dwSecure);
|
|
ShowStr ("%sszDestAddress=%s", szTab, lpReqMediaCall->szDestAddress);
|
|
ShowStr ("%sszAppName=%s", szTab, lpReqMediaCall->szAppName);
|
|
ShowStr ("%sszCalledParty=%s", szTab, lpReqMediaCall->szCalledParty);
|
|
ShowStr ("%sszComment=%s", szTab, lpReqMediaCall->szComment);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetStatusMessages:
|
|
{
|
|
DWORD aFlags[2];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpdwLineStates", PT_POINTER, (ULONG_PTR) &aFlags[0], &aFlags[0] },
|
|
{ "lpdwAddressStates", PT_POINTER, (ULONG_PTR) &aFlags[1], &aFlags[1] }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetStatusMessages };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwLineStates", FT_FLAGS, aFlags[0], aLineStates },
|
|
{ "dwAddressStates", FT_FLAGS, aFlags[1], aAddressStates }
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
aFlags,
|
|
"",
|
|
2,
|
|
fields
|
|
};
|
|
|
|
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetTranslateCaps:
|
|
#if TAPI_2_0
|
|
case lGetTranslateCapsW:
|
|
#endif
|
|
{
|
|
LPLINETRANSLATECAPS lpTranslateCaps = (LPLINETRANSLATECAPS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ "lpTranslateCaps", PT_POINTER, (ULONG_PTR) lpTranslateCaps, lpTranslateCaps }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lGetTranslateCaps ?
|
|
(PFN3) lineGetTranslateCaps : (PFN3) lineGetTranslateCapsW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetTranslateCaps };
|
|
#endif
|
|
|
|
if (pLineAppSel)
|
|
{
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
}
|
|
|
|
memset (lpTranslateCaps, 0, (size_t) dwBigBufSize);
|
|
lpTranslateCaps->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
UpdateResults (TRUE);
|
|
|
|
ShowStructByDWORDs (lpTranslateCaps);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
DWORD i;
|
|
LPLINECARDENTRY lpCardEntry;
|
|
LPLINELOCATIONENTRY lpLocationEntry;
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwNumLocations", FT_DWORD, lpTranslateCaps->dwNumLocations, NULL },
|
|
{ "dwLocationListSize", FT_DWORD, lpTranslateCaps->dwLocationListSize, NULL },
|
|
{ "dwLocationListOffset", FT_DWORD, lpTranslateCaps->dwLocationListOffset, NULL },
|
|
{ "dwCurrentLocationID", FT_DWORD, lpTranslateCaps->dwCurrentLocationID, NULL },
|
|
{ "dwNumCards", FT_DWORD, lpTranslateCaps->dwNumCards, NULL },
|
|
{ "dwCardListSize", FT_DWORD, lpTranslateCaps->dwCardListSize, NULL },
|
|
{ "dwCardListOffset", FT_DWORD, lpTranslateCaps->dwCardListOffset, NULL },
|
|
{ "dwCurrentPreferredCardID", FT_DWORD, lpTranslateCaps->dwCurrentPreferredCardID, NULL }
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpTranslateCaps,
|
|
"LINETRANSLATECAPS",
|
|
8,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
|
|
lpLocationEntry = (LPLINELOCATIONENTRY)
|
|
(((LPBYTE) lpTranslateCaps) +
|
|
lpTranslateCaps->dwLocationListOffset);
|
|
|
|
for (i = 0; i < lpTranslateCaps->dwNumLocations; i++)
|
|
{
|
|
char buf[32];
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwPermanentLocationID", FT_DWORD, lpLocationEntry->dwPermanentLocationID, NULL },
|
|
{ "dwLocationNameSize", FT_SIZE, lpLocationEntry->dwLocationNameSize, NULL },
|
|
{ "dwLocationNameOffset", FT_OFFSET, lpLocationEntry->dwLocationNameOffset, NULL },
|
|
{ "dwCountryCode", FT_DWORD, lpLocationEntry->dwCountryCode, NULL },
|
|
{ "dwCityCodeSize", FT_SIZE, lpLocationEntry->dwCityCodeSize, NULL },
|
|
{ "dwCityCodeOffset", FT_OFFSET, lpLocationEntry->dwCityCodeOffset, NULL },
|
|
{ "dwPreferredCardID", FT_DWORD, lpLocationEntry->dwPreferredCardID, NULL }
|
|
#if TAPI_1_1
|
|
,
|
|
{ "dwLocalAccessCodeSize", FT_SIZE, lpLocationEntry->dwLocalAccessCodeSize, NULL },
|
|
{ "dwLocalAccessCodeOffset", FT_OFFSET, lpLocationEntry->dwLocalAccessCodeOffset, NULL },
|
|
{ "dwLongDistanceAccessCodeSize", FT_SIZE, lpLocationEntry->dwLongDistanceAccessCodeSize, NULL },
|
|
{ "dwLongDistanceAccessCodeOffset", FT_OFFSET, lpLocationEntry->dwLongDistanceAccessCodeOffset, NULL },
|
|
{ "dwTollPrefixListSize", FT_SIZE, lpLocationEntry->dwTollPrefixListSize, NULL },
|
|
{ "dwTollPrefixListOffset", FT_OFFSET, lpLocationEntry->dwTollPrefixListOffset, NULL },
|
|
{ "dwCountryID", FT_DWORD, lpLocationEntry->dwCountryID, NULL },
|
|
{ "dwOptions", FT_FLAGS, lpLocationEntry->dwOptions, aLocationOptions },
|
|
{ "dwCancelCallWaitingSize", FT_SIZE, lpLocationEntry->dwCancelCallWaitingSize, NULL },
|
|
{ "dwCancelCallWaitingOffset", FT_OFFSET, lpLocationEntry->dwCancelCallWaitingOffset, NULL }
|
|
#endif
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpTranslateCaps, // size,offset relative to lpXlatCaps
|
|
buf,
|
|
#if TAPI_1_1
|
|
17,
|
|
#else
|
|
7,
|
|
#endif
|
|
fields
|
|
};
|
|
|
|
|
|
sprintf (buf, "LINELOCATIONENTRY[%ld]", i);
|
|
|
|
lpLocationEntry++;
|
|
#if TAPI_1_1
|
|
if (params[1].dwValue == 0x10003)
|
|
{
|
|
//
|
|
// Only show ver 1.0 params & munge ptr to
|
|
// compensate for for smaller struct size
|
|
//
|
|
|
|
fieldHeader.dwNumFields = 7;
|
|
lpLocationEntry = (LPLINELOCATIONENTRY)
|
|
(((LPBYTE) lpLocationEntry) - 10*sizeof(DWORD));
|
|
|
|
}
|
|
#endif
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
|
|
}
|
|
|
|
lpCardEntry = (LPLINECARDENTRY)
|
|
(((LPBYTE) lpTranslateCaps) +
|
|
lpTranslateCaps->dwCardListOffset);
|
|
|
|
for (i = 0; i < lpTranslateCaps->dwNumCards; i++)
|
|
{
|
|
char buf[32];
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwPermanentCardID", FT_DWORD, lpCardEntry->dwPermanentCardID, NULL },
|
|
{ "dwCardNameSize", FT_SIZE, lpCardEntry->dwCardNameSize, NULL },
|
|
{ "dwCardNameOffset", FT_OFFSET, lpCardEntry->dwCardNameOffset, NULL }
|
|
#if TAPI_1_1
|
|
,
|
|
{ "dwCardNumberDigits", FT_DWORD, lpCardEntry->dwCardNumberDigits, NULL },
|
|
{ "dwSameAreaRuleSize", FT_SIZE, lpCardEntry->dwSameAreaRuleSize, NULL },
|
|
{ "dwSameAreaRuleOffset", FT_OFFSET, lpCardEntry->dwSameAreaRuleOffset, NULL },
|
|
{ "dwLongDistanceRuleSize", FT_SIZE, lpCardEntry->dwLongDistanceRuleSize, NULL },
|
|
{ "dwLongDistanceRuleOffset", FT_OFFSET, lpCardEntry->dwLongDistanceRuleOffset, NULL },
|
|
{ "dwInternationalRuleSize", FT_SIZE, lpCardEntry->dwInternationalRuleSize, NULL },
|
|
{ "dwInternationalRuleOffset", FT_OFFSET, lpCardEntry->dwInternationalRuleOffset, NULL },
|
|
{ "dwOptions", FT_FLAGS, lpCardEntry->dwOptions, aCardOptions }
|
|
#endif
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpTranslateCaps, // size,offset relative to lpXlatCaps
|
|
buf,
|
|
#if TAPI_1_1
|
|
11,
|
|
#else
|
|
3,
|
|
#endif
|
|
fields
|
|
};
|
|
|
|
|
|
sprintf (buf, "LINECARDENTRY[%ld]", i);
|
|
|
|
lpCardEntry++;
|
|
#if TAPI_1_1
|
|
if (params[1].dwValue == 0x10003)
|
|
{
|
|
//
|
|
// Only show ver 1.0 params & munge ptr to
|
|
// compensate for for smaller struct size
|
|
//
|
|
|
|
fieldHeader.dwNumFields = 3;
|
|
lpCardEntry = (LPLINECARDENTRY)
|
|
(((LPBYTE) lpCardEntry) - 8*sizeof(DWORD));
|
|
|
|
}
|
|
#endif
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
}
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lHandoff:
|
|
#if TAPI_2_0
|
|
case lHandoffW:
|
|
#endif
|
|
{
|
|
char szFilename[MAX_STRING_PARAM_SIZE] = "tb20.exe";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpszFileName", PT_STRING, (ULONG_PTR) szFilename, szFilename },
|
|
{ "dwMediaMode", PT_FLAGS, (ULONG_PTR) dwDefMediaMode, aMediaModes }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lHandoff ?
|
|
(PFN3) lineHandoff : (PFN3) lineHandoffW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineHandoff };
|
|
#endif
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lHold:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) lineHold };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lInitialize:
|
|
{
|
|
PMYLINEAPP pNewLineApp;
|
|
char szAppName[MAX_STRING_PARAM_SIZE];
|
|
DWORD dwNumLineDevs;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "lphLineApp", PT_POINTER, (ULONG_PTR) 0, NULL },
|
|
{ "hInstance", PT_DWORD, (ULONG_PTR) ghInst, NULL },
|
|
{ "lpfnCallback", PT_POINTER, (ULONG_PTR) tapiCallback, tapiCallback },
|
|
{ szlpszAppName, PT_STRING, (ULONG_PTR) szAppName, szAppName },
|
|
{ "lpdwNumDevs", PT_POINTER, (ULONG_PTR) &dwNumLineDevs, &dwNumLineDevs }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineInitialize };
|
|
|
|
|
|
if (!(pNewLineApp = AllocLineApp()))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error creating data structure");
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue =
|
|
params[0].u.dwDefValue = (ULONG_PTR) &pNewLineApp->hLineApp;
|
|
|
|
strcpy (szAppName, szDefAppName);
|
|
|
|
#ifdef WIN32
|
|
lResult = DoFunc (¶msHeader);
|
|
#else
|
|
//
|
|
// NOTE: on win16 HINSTANCEs are 16 bits, so we've to hard code this
|
|
//
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
FreeLineApp (pNewLineApp);
|
|
|
|
break;
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = lineInitialize(
|
|
(LPHLINEAPP) params[0].dwValue,
|
|
(HINSTANCE) params[1].dwValue,
|
|
(LINECALLBACK) params[2].dwValue,
|
|
(LPCSTR) params[3].dwValue,
|
|
(LPDWORD) params[4].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif
|
|
if (lResult == 0)
|
|
{
|
|
ShowStr ("%snum line devs = %ld", szTab, dwNumLineDevs);
|
|
//SendMessage (ghwndLineApps, LB_SETCURSEL, (WPARAM) i, 0);
|
|
UpdateWidgetList();
|
|
gdwNumLineDevs = dwNumLineDevs;
|
|
SelectWidget ((PMYWIDGET) pNewLineApp);
|
|
}
|
|
else
|
|
{
|
|
FreeLineApp (pNewLineApp);
|
|
}
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case lInitializeEx:
|
|
case lInitializeExW:
|
|
{
|
|
char szAppName[MAX_STRING_PARAM_SIZE];
|
|
DWORD dwNumLineDevs, dwAPIVersion;
|
|
PMYLINEAPP pNewLineApp;
|
|
LINEINITIALIZEEXPARAMS initExParams;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "lphLineApp", PT_POINTER, (ULONG_PTR) 0, NULL },
|
|
{ "hInstance", PT_DWORD, (ULONG_PTR) ghInst, NULL },
|
|
{ "lpfnCallback", PT_POINTER, (ULONG_PTR) tapiCallback, tapiCallback },
|
|
{ szlpszFriendlyAppName, PT_STRING, (ULONG_PTR) szAppName, szAppName },
|
|
{ "lpdwNumDevs", PT_POINTER, (ULONG_PTR) &dwNumLineDevs, &dwNumLineDevs },
|
|
{ "lpdwAPIVersion", PT_POINTER, (ULONG_PTR) &dwAPIVersion, &dwAPIVersion },
|
|
{ " ->dwAPIVersion",PT_ORDINAL,(ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ "lpInitExParams", PT_POINTER, (ULONG_PTR) &initExParams, &initExParams },
|
|
{ " ->dwOptions", PT_FLAGS, (ULONG_PTR) LINEINITIALIZEEXOPTION_USECOMPLETIONPORT, aLineInitExOptions }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 9, funcIndex, params, NULL };
|
|
|
|
|
|
if (!(pNewLineApp = AllocLineApp()))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error creating data structure");
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue =
|
|
params[0].u.dwDefValue = (ULONG_PTR) &pNewLineApp->hLineApp;
|
|
|
|
strcpy (szAppName, szDefAppName);
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
FreeLineApp (pNewLineApp);
|
|
|
|
break;
|
|
}
|
|
|
|
initExParams.dwTotalSize = sizeof (LINEINITIALIZEEXPARAMS);
|
|
initExParams.dwOptions = (DWORD) params[8].dwValue;
|
|
initExParams.Handles.hCompletionPort = ghCompletionPort;
|
|
|
|
dwAPIVersion = (DWORD) params[6].dwValue;
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
if (funcIndex == lInitializeEx)
|
|
{
|
|
lResult = lineInitializeEx(
|
|
(LPHLINEAPP) params[0].dwValue,
|
|
(HINSTANCE) params[1].dwValue,
|
|
(LINECALLBACK) params[2].dwValue,
|
|
(LPCSTR) params[3].dwValue,
|
|
(LPDWORD) params[4].dwValue,
|
|
(LPDWORD) params[5].dwValue,
|
|
(LPLINEINITIALIZEEXPARAMS) params[7].dwValue
|
|
);
|
|
}
|
|
else
|
|
{
|
|
MakeWideString ((LPVOID) params[3].dwValue);
|
|
|
|
lResult = lineInitializeExW(
|
|
(LPHLINEAPP) params[0].dwValue,
|
|
(HINSTANCE) params[1].dwValue,
|
|
(LINECALLBACK) params[2].dwValue,
|
|
(LPCWSTR) params[3].dwValue,
|
|
(LPDWORD) params[4].dwValue,
|
|
(LPDWORD) params[5].dwValue,
|
|
(LPLINEINITIALIZEEXPARAMS) params[7].dwValue
|
|
);
|
|
}
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
ShowStr ("%snum line devs = %ld", szTab, dwNumLineDevs);
|
|
|
|
if (params[7].dwValue != 0 &&
|
|
(initExParams.dwOptions & 3) ==
|
|
LINEINITIALIZEEXOPTION_USEEVENT)
|
|
{
|
|
ShowStr(
|
|
"hLineApp x%x was created with the\r\n" \
|
|
"USEEVENT option, so you must use\r\n" \
|
|
"lineGetMessage to retrieve messages.",
|
|
pNewLineApp->hLineApp
|
|
);
|
|
}
|
|
|
|
//SendMessage (ghwndLineApps, LB_SETCURSEL, (WPARAM) i, 0);
|
|
UpdateWidgetList();
|
|
gdwNumLineDevs = dwNumLineDevs;
|
|
SelectWidget ((PMYWIDGET) pNewLineApp);
|
|
}
|
|
else
|
|
{
|
|
FreeLineApp (pNewLineApp);
|
|
}
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case lMakeCall:
|
|
#if TAPI_2_0
|
|
case lMakeCallW:
|
|
#endif
|
|
{
|
|
PMYCALL pNewCall;
|
|
char szAddress[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlphCall, PT_POINTER, (ULONG_PTR) 0, NULL },
|
|
{ szlpszDestAddress, PT_STRING, (ULONG_PTR) szAddress, szAddress },
|
|
{ "dwCountryCode", PT_DWORD, (ULONG_PTR) dwDefCountryCode, NULL },
|
|
{ szlpCallParams, PT_CALLPARAMS, (ULONG_PTR) 0, lpCallParams }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (funcIndex == lMakeCall ?
|
|
(PFN5) lineMakeCall : (PFN5) lineMakeCallW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineMakeCall };
|
|
#endif
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
if (!(pNewCall = AllocCall (pLineSel)))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error creating data structure");
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
params[1].dwValue =
|
|
params[1].u.dwDefValue = (ULONG_PTR) &pNewCall->hCall;
|
|
|
|
strcpy (szAddress, szDefDestAddress);
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) > 0)
|
|
{
|
|
if (params[0].dwValue != (DWORD) pLineSel->hLine)
|
|
{
|
|
MoveCallToLine (pNewCall, (HLINE) params[0].dwValue);
|
|
}
|
|
|
|
pNewCall->lMakeCallReqID = lResult;
|
|
dwNumPendingMakeCalls++;
|
|
SelectWidget ((PMYWIDGET) pNewCall);
|
|
}
|
|
else
|
|
{
|
|
FreeCall (pNewCall);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lMonitorDigits:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "dwDigitModes", PT_FLAGS, LINEDIGITMODE_DTMF, aDigitModes }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineMonitorDigits };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lMonitorMedia:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "dwMediaModes", PT_FLAGS, dwDefMediaMode, aMediaModes }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineMonitorMedia };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lMonitorTones:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpToneList", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf },
|
|
{ "dwNumEntries", PT_DWORD, (ULONG_PTR) 1, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineMonitorTones };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lNegotiateAPIVersion:
|
|
{
|
|
DWORD dwAPIVersion;
|
|
LINEEXTENSIONID extID;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ "dwAPILowVersion", PT_DWORD, (ULONG_PTR) 0x00010000, aAPIVersions },
|
|
{ "dwAPIHighVersion", PT_DWORD, (ULONG_PTR) 0x10000000, aAPIVersions },
|
|
{ "lpdwAPIVersion", PT_POINTER, (ULONG_PTR) &dwAPIVersion, &dwAPIVersion },
|
|
{ "lpExtensionID", PT_POINTER, (ULONG_PTR) &extID, &extID }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (PFN6) lineNegotiateAPIVersion };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStr ("%s%s=x%lx", szTab, szdwAPIVersion, dwAPIVersion);
|
|
ShowStr(
|
|
"%sextID.ID0=x%lx, .ID1=x%lx, .ID2=x%lx, .ID3=x%lx, ",
|
|
szTab,
|
|
extID.dwExtensionID0,
|
|
extID.dwExtensionID1,
|
|
extID.dwExtensionID2,
|
|
extID.dwExtensionID3
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lNegotiateExtVersion:
|
|
{
|
|
DWORD dwExtVersion;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ "dwExtLowVersion", PT_DWORD, (ULONG_PTR) 0x00000000, NULL },
|
|
{ "dwExtHighVersion", PT_DWORD, (ULONG_PTR) 0x80000000, NULL },
|
|
{ "lpdwExtVersion", PT_POINTER, (ULONG_PTR) &dwExtVersion, &dwExtVersion }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (PFN6) lineNegotiateExtVersion };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
ShowStr ("%sdwExtVersion=x%lx", szTab, dwExtVersion);
|
|
}
|
|
|
|
break;
|
|
}
|
|
default:
|
|
|
|
FuncDriver2 (funcIndex);
|
|
break;
|
|
}
|
|
|
|
gbWideStringParams = FALSE;
|
|
}
|
|
|
|
//#pragma code_seg ()
|
|
|
|
#pragma warning (default:4113)
|