4761 lines
148 KiB
C
4761 lines
148 KiB
C
/*++ BUILD Version: 0000 // Increment this if a change has global effects
|
|
|
|
Copyright (c) 1994-98 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tb2.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) 18-Aug-1995
|
|
|
|
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"
|
|
|
|
|
|
extern char szdwDeviceID[];
|
|
extern char szdwSize[];
|
|
extern char szhCall[];
|
|
extern char szhLine[];
|
|
extern char szhLineApp[];
|
|
extern char szhPhone[];
|
|
extern char szlpCallParams[];
|
|
|
|
extern char szlphCall[];
|
|
extern char szlpParams[];
|
|
extern char szhwndOwner[];
|
|
extern char szdwAddressID[];
|
|
extern char szlpszAppName[];
|
|
extern char szdwAPIVersion[];
|
|
extern char szlphConsultCall[];
|
|
extern char szlpszDeviceClass[];
|
|
extern char szlpszDestAddress[];
|
|
extern char szlpsUserUserInfo[];
|
|
extern char szlpszFriendlyAppName[];
|
|
|
|
char szhMmcApp[] = "hMmcApp";
|
|
char szhPhoneApp[] = "hPhoneApp";
|
|
char szdwProviderID[] = "dwProviderID";
|
|
|
|
|
|
void
|
|
ShowStructByDWORDs(
|
|
LPVOID lp
|
|
);
|
|
|
|
void
|
|
ShowStructByField(
|
|
PSTRUCT_FIELD_HEADER pHeader,
|
|
BOOL bSubStructure
|
|
);
|
|
|
|
void
|
|
DumpParams(
|
|
PFUNC_PARAM_HEADER pHeader
|
|
);
|
|
|
|
void
|
|
ShowPhoneFuncResult(
|
|
LPSTR lpFuncName,
|
|
LONG lResult
|
|
);
|
|
|
|
void
|
|
ShowVARSTRING(
|
|
LPVARSTRING lpVarString
|
|
);
|
|
|
|
void
|
|
ShowTapiFuncResult(
|
|
LPSTR lpFuncName,
|
|
LONG lResult
|
|
);
|
|
|
|
VOID
|
|
UpdateWidgetListCall(
|
|
PMYCALL pCall
|
|
);
|
|
|
|
LPWSTR
|
|
PASCAL
|
|
My_lstrcpyW(
|
|
WCHAR *pString1,
|
|
WCHAR *pString2
|
|
);
|
|
|
|
void
|
|
PASCAL
|
|
MakeWideString(
|
|
LPVOID pString
|
|
);
|
|
|
|
#if (INTERNAL_VER >= 0x20000)
|
|
DWORD
|
|
APIENTRY
|
|
internalNewLocationW(
|
|
IN WCHAR* pszName
|
|
);
|
|
#endif
|
|
|
|
|
|
void
|
|
ShowWidgetList(
|
|
BOOL bShow
|
|
)
|
|
{
|
|
static RECT rect;
|
|
static int iNumHides = 0;
|
|
|
|
|
|
if (!bShow)
|
|
{
|
|
iNumHides++;
|
|
|
|
if (iNumHides > 1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
GetWindowRect (ghwndList1, &rect);
|
|
|
|
SetWindowPos(
|
|
ghwndList1,
|
|
(HWND) NULL,
|
|
0,
|
|
0,
|
|
1,
|
|
1,
|
|
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOREDRAW |
|
|
SWP_NOZORDER | SWP_HIDEWINDOW
|
|
);
|
|
}
|
|
else
|
|
{
|
|
iNumHides--;
|
|
|
|
if (iNumHides > 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Do control restoration
|
|
//
|
|
|
|
ShowWindow (ghwndList1, SW_SHOW);
|
|
|
|
SetWindowPos(
|
|
ghwndList1,
|
|
(HWND) NULL,
|
|
0,
|
|
0,
|
|
rect.right - rect.left,
|
|
rect.bottom - rect.top,
|
|
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// 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)
|
|
|
|
void
|
|
FuncDriver2(
|
|
FUNC_INDEX funcIndex
|
|
)
|
|
{
|
|
LONG lResult;
|
|
DWORD i;
|
|
|
|
|
|
switch (funcIndex)
|
|
{
|
|
case lOpen:
|
|
#if TAPI_2_0
|
|
case lOpenW:
|
|
#endif
|
|
{
|
|
PMYLINE pNewLine;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, dwDefLineDeviceID, NULL },
|
|
{ "lphLine", PT_POINTER, 0, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, dwDefLineAPIVersion, aAPIVersions },
|
|
{ "dwExtVersion", PT_DWORD, dwDefLineExtVersion, NULL },
|
|
{ "dwCallbackInstance", PT_DWORD, 0, NULL },
|
|
{ "dwPrivileges", PT_FLAGS, dwDefLinePrivilege, aLineOpenOptions },
|
|
{ "dwMediaModes", PT_FLAGS, dwDefMediaMode, aMediaModes },
|
|
{ szlpCallParams, PT_CALLPARAMS, 0, lpCallParams }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 9, funcIndex, params, (funcIndex == lOpen ?
|
|
(PFN9) lineOpen : (PFN9) lineOpenW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 9, funcIndex, params, (PFN9) lineOpen };
|
|
#endif
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
if (!(pNewLine = AllocLine (pLineAppSel)))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error creating data structure");
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
params[2].dwValue =
|
|
params[2].u.dwDefValue = (ULONG_PTR) &pNewLine->hLine;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
if ((HLINEAPP) params[0].dwValue != pLineAppSel->hLineApp)
|
|
{
|
|
//
|
|
// User has switched line apps on us we need to recreate
|
|
// the line data structure under a different line app
|
|
//
|
|
|
|
PMYLINE pNewLine2 =
|
|
AllocLine (GetLineApp((HLINEAPP)params[0].dwValue));
|
|
|
|
if (pNewLine2)
|
|
{
|
|
pNewLine2->hLine = pNewLine->hLine;
|
|
|
|
FreeLine (pNewLine);
|
|
|
|
pNewLine = pNewLine2;
|
|
}
|
|
else
|
|
{
|
|
// BUGBUG show error: couldn't alloc a new line struct
|
|
|
|
lineClose (pNewLine->hLine);
|
|
FreeLine (pNewLine);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Save info about this line that we can display
|
|
//
|
|
|
|
pNewLine->hLineApp = (HLINEAPP) params[0].dwValue;
|
|
pNewLine->dwDevID = (DWORD) params[1].dwValue;
|
|
pNewLine->dwAPIVersion = (DWORD) params[3].dwValue;
|
|
pNewLine->dwPrivileges = (DWORD) params[6].dwValue;
|
|
pNewLine->dwMediaModes = (DWORD) params[7].dwValue;
|
|
|
|
//SendMessage (ghwndLines, LB_SETCURSEL, (WPARAM) i, 0);
|
|
UpdateWidgetList();
|
|
SelectWidget ((PMYWIDGET) pNewLine);
|
|
}
|
|
else
|
|
{
|
|
FreeLine (pNewLine);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lPark:
|
|
#if TAPI_2_0
|
|
case lParkW:
|
|
#endif
|
|
{
|
|
char szDirAddress[MAX_STRING_PARAM_SIZE] = "";
|
|
LPVARSTRING lpNonDirAddress = (LPVARSTRING) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwParkMode", PT_ORDINAL, (ULONG_PTR) LINEPARKMODE_DIRECTED, aParkModes },
|
|
{ "lpszDirAddress", PT_STRING, (ULONG_PTR) szDirAddress, szDirAddress },
|
|
{ "lpNonDirAddress", PT_POINTER, (ULONG_PTR) lpNonDirAddress, lpNonDirAddress }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (funcIndex == lPark ?
|
|
(PFN4) linePark : (PFN4) lineParkW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) linePark };
|
|
#endif
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
memset (lpNonDirAddress, 0, (size_t) dwBigBufSize);
|
|
lpNonDirAddress->dwTotalSize = dwBigBufSize;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lPickup:
|
|
#if TAPI_2_0
|
|
case lPickupW:
|
|
#endif
|
|
{
|
|
PMYCALL pNewCall;
|
|
char szDestAddress[MAX_STRING_PARAM_SIZE];
|
|
char szGroupID[MAX_STRING_PARAM_SIZE] = "";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ szlphCall, PT_POINTER, (ULONG_PTR) 0, NULL },
|
|
{ szlpszDestAddress, PT_STRING, (ULONG_PTR) szDestAddress, szDestAddress },
|
|
{ "lpszGroupID", PT_STRING, (ULONG_PTR) szGroupID, szGroupID }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (funcIndex == lPickup ?
|
|
(PFN5) linePickup : (PFN5) linePickupW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) linePickup };
|
|
#endif
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
|
|
//
|
|
// Find a free entry in the call array
|
|
//
|
|
|
|
if (!(pNewCall = AllocCall (pLineSel)))
|
|
{
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
params[2].dwValue =
|
|
params[2].u.dwDefValue = (ULONG_PTR) &pNewCall->hCall;
|
|
|
|
strcpy (szDestAddress, 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 lPrepareAddToConference:
|
|
#if TAPI_2_0
|
|
case lPrepareAddToConferenceW:
|
|
#endif
|
|
{
|
|
PMYCALL pNewCall;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "hConfCall", PT_DWORD, 0, NULL },
|
|
{ szlphConsultCall, PT_POINTER, 0, NULL },
|
|
{ szlpCallParams, PT_CALLPARAMS, 0, lpCallParams }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lPrepareAddToConference ?
|
|
(PFN3) linePrepareAddToConference : (PFN3) linePrepareAddToConferenceW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) linePrepareAddToConference };
|
|
#endif
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
if (!(pNewCall = AllocCall (pLineSel)))
|
|
{
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
params[1].dwValue =
|
|
params[1].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;
|
|
}
|
|
#if TAPI_2_0
|
|
case lProxyMessage:
|
|
{
|
|
static LOOKUP aValidProxyMsgs[] =
|
|
{
|
|
{ LINE_AGENTSPECIFIC ,"AGENTSPECIFIC" },
|
|
{ LINE_AGENTSTATUS ,"AGENTSTATUS" },
|
|
{ 0xffffffff ,"" }
|
|
};
|
|
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "dwMsg", PT_ORDINAL, LINE_AGENTSTATUS, aValidProxyMsgs },
|
|
{ "dwParam1", PT_DWORD, 0, NULL },
|
|
{ "dwParam2", PT_FLAGS, 0, aAgentStatus },
|
|
{ "dwParam3", PT_ORDINAL, 0, aAgentStates }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (PFN6) lineProxyMessage };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
if (pCallSel)
|
|
{
|
|
params[1].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
}
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lProxyResponse:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ "lpProxyBuffer", PT_DWORD, 0, NULL },
|
|
{ "dwResult", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineProxyResponse };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case lRedirect:
|
|
#if TAPI_2_0
|
|
case lRedirectW:
|
|
#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 == lRedirect ?
|
|
(PFN3) lineRedirect : (PFN3) lineRedirectW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineRedirect };
|
|
#endif
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
strcpy (szDestAddress, szDefDestAddress);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lRegisterRequestRecipient:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, 0, NULL },
|
|
{ "dwRegistrationInstance", PT_DWORD, 0, NULL },
|
|
{ "dwRequestMode", PT_FLAGS, LINEREQUESTMODE_MAKECALL, aRequestModes2 },
|
|
{ "bEnable", PT_DWORD, 1, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineRegisterRequestRecipient };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lRemoveFromConference:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) lineRemoveFromConference };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSecureCall:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) lineSecureCall };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSendUserUserInfo:
|
|
{
|
|
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) lineSendUserUserInfo };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
strcpy (szUserUserInfo, szDefUserUserInfo);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case lSetAgentActivity:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, 0, NULL },
|
|
{ "dwActivityID", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineSetAgentActivity };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSetAgentGroup:
|
|
{
|
|
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) lineSetAgentGroup };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
// BUGBUG SetAgentGRp: allow user to fill in agent group list
|
|
|
|
memset (lpGroupList, 0, (size_t) dwBigBufSize);
|
|
lpGroupList->dwTotalSize = dwBigBufSize;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSetAgentState:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, 0, NULL },
|
|
{ "dwAgentState", PT_FLAGS, 0, aAgentStates },
|
|
{ "dwNextAgentState", PT_FLAGS, 0, aAgentStates }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineSetAgentState };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case lSetAppSpecific:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "dwAppSpecific", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineSetAppSpecific };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case lSetCallData:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpCallData", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineSetCallData };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case lSetCallParams:
|
|
{
|
|
LINEDIALPARAMS dialParams;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "dwBearerMode", PT_FLAGS, dwDefBearerMode, aBearerModes },
|
|
{ "dwMinRate", PT_DWORD, 3100, NULL },
|
|
{ "dwMaxRate", PT_DWORD, 3100, NULL },
|
|
{ "lpDialParams", PT_POINTER, 0, &dialParams },
|
|
{ " ->dwDialPause", PT_DWORD, 0, NULL },
|
|
{ " ->dwDialSpeed", PT_DWORD, 0, NULL },
|
|
{ " ->dwDigitDuration", PT_DWORD, 0, NULL },
|
|
{ " ->dwWaitForDialtone", PT_DWORD, 0, NULL }
|
|
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 9, funcIndex, params, NULL };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
dialParams.dwDialPause = (DWORD) params[5].dwValue;
|
|
dialParams.dwDialSpeed = (DWORD) params[6].dwValue;
|
|
dialParams.dwDigitDuration = (DWORD) params[7].dwValue;
|
|
dialParams.dwWaitForDialtone = (DWORD) params[8].dwValue;
|
|
|
|
lResult = lineSetCallParams(
|
|
(HCALL) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(DWORD) params[2].dwValue,
|
|
(DWORD) params[3].dwValue,
|
|
(LPLINEDIALPARAMS) params[4].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
break;
|
|
}
|
|
case lSetCallPrivilege:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "dwCallPrivilege", PT_ORDINAL, LINECALLPRIVILEGE_OWNER, aCallPrivileges }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineSetCallPrivilege };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
if (params[0].dwValue == (ULONG_PTR) pCallSel->hCall)
|
|
{
|
|
pCallSel->bMonitor = (params[0].dwValue ==
|
|
LINECALLPRIVILEGE_MONITOR ? TRUE : FALSE);
|
|
UpdateWidgetListCall (pCallSel);
|
|
}
|
|
else
|
|
{
|
|
PMYCALL pCall;
|
|
|
|
|
|
if ((pCall = GetCall ((HCALL) params[0].dwValue)))
|
|
{
|
|
pCall->bMonitor = (params[0].dwValue ==
|
|
LINECALLPRIVILEGE_MONITOR ? TRUE : FALSE);
|
|
UpdateWidgetListCall (pCall);
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case lSetCallQualityOfService:
|
|
{
|
|
char szSendingFlowspec[MAX_STRING_PARAM_SIZE] = "123";
|
|
char szReceivingFlowspec[MAX_STRING_PARAM_SIZE] = "321";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpSendingFlowspec", PT_STRING, (ULONG_PTR) szSendingFlowspec, szSendingFlowspec },
|
|
{ "dwSendingFlowspecSize", PT_DWORD, (ULONG_PTR) 4, 0 },
|
|
{ "lpReceivingFlowspec", PT_STRING, (ULONG_PTR) szReceivingFlowspec, szReceivingFlowspec },
|
|
{ "dwReceivingFlowspecSize",PT_DWORD, (ULONG_PTR) 4, 0 }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineSetCallQualityOfService };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSetCallTreatment:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "dwTreatment",PT_ORDINAL, LINECALLTREATMENT_SILENCE, aCallTreatments }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineSetCallTreatment };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case lSetCurrentLocation:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, 0, NULL },
|
|
{ "dwLocation", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineSetCurrentLocation };
|
|
|
|
|
|
if (pLineAppSel)
|
|
{
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
}
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSetDevConfig:
|
|
#if TAPI_2_0
|
|
case lSetDevConfigW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE];
|
|
char szErrorMsg[] = "Bad config info in buffer";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpDeviceConfig", PT_POINTER, (ULONG_PTR) 0, NULL },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpszDeviceClass, PT_STRING, (ULONG_PTR) szDeviceClass, szDeviceClass },
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (funcIndex == lSetDevConfig ?
|
|
(PFN4) lineSetDevConfig : (PFN4) lineSetDevConfigW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineSetDevConfig };
|
|
#endif
|
|
|
|
//
|
|
// Check to see if there's existing config info in the global buffer
|
|
// (not a foolproof check, but good enough)
|
|
//
|
|
|
|
ShowStr ("Call lineGetDevConfig before calling lineSetDevConfig");
|
|
|
|
if (dwBigBufSize >= sizeof (VARSTRING))
|
|
{
|
|
DWORD dwMaxDataSize = dwBigBufSize - sizeof (VARSTRING);
|
|
LPVARSTRING pVarString = (LPVARSTRING) pBigBuf;
|
|
|
|
|
|
if (pVarString->dwStringSize > dwMaxDataSize ||
|
|
|
|
(pVarString->dwStringSize != 0 &&
|
|
(pVarString->dwStringOffset < sizeof (VARSTRING) ||
|
|
pVarString->dwStringOffset >
|
|
(dwBigBufSize - pVarString->dwStringSize))))
|
|
{
|
|
ShowStr (szErrorMsg);
|
|
break;
|
|
}
|
|
|
|
params[1].dwValue =
|
|
params[1].u.dwDefValue = (ULONG_PTR)
|
|
((LPBYTE) pBigBuf + pVarString->dwStringOffset);
|
|
params[2].dwValue =
|
|
params[2].u.dwDefValue = pVarString->dwStringSize;
|
|
}
|
|
else
|
|
{
|
|
ShowStr (szErrorMsg);
|
|
break;
|
|
}
|
|
|
|
strcpy (szDeviceClass, szDefLineDeviceClass);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case lSetLineDevStatus:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ "dwStatusToChange", PT_FLAGS, 0, aLineDevStatusFlags },
|
|
{ "fStatus", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineSetLineDevStatus };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case lSetMediaControl:
|
|
{
|
|
LINEMEDIACONTROLDIGIT aDigits[1];
|
|
LINEMEDIACONTROLMEDIA aMedias[1];
|
|
LINEMEDIACONTROLTONE aTones[1];
|
|
LINEMEDIACONTROLCALLSTATE aCallSts[1];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szhCall, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwSelect", PT_ORDINAL, (ULONG_PTR) 0, aCallSelects },
|
|
|
|
{ "lpDigitList", PT_POINTER, (ULONG_PTR) aDigits, aDigits },
|
|
{ " ->dwDigit", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwDigitModes", PT_FLAGS, (ULONG_PTR) 0, aDigitModes },
|
|
{ " ->dwMediaControl", PT_ORDINAL, (ULONG_PTR) 0, aMediaControls },
|
|
{ "dwDigitNumEntries", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
|
|
{ "lpMediaList", PT_POINTER, (ULONG_PTR) aMedias, aMedias },
|
|
{ " ->dwMediaModes", PT_FLAGS, (ULONG_PTR) 0, aMediaModes },
|
|
{ " ->dwDuration", PT_DWORD, (ULONG_PTR) 0, 0 },
|
|
{ " ->dwMediaControl", PT_ORDINAL, (ULONG_PTR) 0, aMediaControls },
|
|
{ "dwMediaNumEntries", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
|
|
{ "lpToneList", PT_POINTER, (ULONG_PTR) aTones, aTones },
|
|
{ " ->dwAppSpecific", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwDuration", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwFrequency1", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwFrequency2", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwFrequency3", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwMediaControl", PT_ORDINAL, (ULONG_PTR) 0, aMediaControls },
|
|
{ "dwToneNumEntries", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
|
|
{ "lpCallStateList", PT_POINTER, (ULONG_PTR) aCallSts, aCallSts },
|
|
{ " ->dwCallStates", PT_FLAGS, (ULONG_PTR) 0, aCallStates },
|
|
{ " ->dwMediaControl", PT_ORDINAL, (ULONG_PTR) 0, aMediaControls },
|
|
{ "dwCallStateNumEntries", PT_DWORD,(ULONG_PTR) 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 26, funcIndex, params, (PFN12) lineSetMediaControl };
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
if (LetUserMungeParams (¶msHeader))
|
|
{
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = lineSetMediaControl(
|
|
(HLINE) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(HCALL) params[2].dwValue,
|
|
(DWORD) params[3].dwValue,
|
|
(LPLINEMEDIACONTROLDIGIT) params[4].dwValue,
|
|
(DWORD) params[8].dwValue,
|
|
(LPLINEMEDIACONTROLMEDIA) params[9].dwValue,
|
|
(DWORD) params[13].dwValue,
|
|
(LPLINEMEDIACONTROLTONE) params[14].dwValue,
|
|
(DWORD) params[21].dwValue,
|
|
(LPLINEMEDIACONTROLCALLSTATE) params[22].dwValue,
|
|
(DWORD) params[25].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lSetMediaMode:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "dwMediaModes", PT_FLAGS, dwDefMediaMode, aMediaModes }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineSetMediaMode };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSetNumRings:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, dwDefAddressID, NULL },
|
|
{ "dwNumRings", PT_DWORD, 5, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineSetNumRings };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSetStatusMessages:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ "dwLineStates", PT_FLAGS, 0, aLineStates },
|
|
{ "dwAddressStates", PT_FLAGS, 0, aAddressStates }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineSetStatusMessages };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSetTerminal:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, dwDefAddressID, NULL },
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ "dwSelect", PT_ORDINAL, LINECALLSELECT_LINE, aCallSelects },
|
|
{ "dwTerminalModes", PT_FLAGS, LINETERMMODE_BUTTONS, aTerminalModes },
|
|
{ "dwTerminalID", PT_DWORD, 0, NULL },
|
|
{ "bEnable", PT_DWORD, 0, NULL },
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 7, funcIndex, params, (PFN7) lineSetTerminal };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
if (pCallSel)
|
|
{
|
|
params[2].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
}
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSetTollList:
|
|
#if TAPI_2_0
|
|
case lSetTollListW:
|
|
#endif
|
|
{
|
|
char szAddressIn[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ "lpszAddressIn", PT_STRING, (ULONG_PTR) szAddressIn, szAddressIn },
|
|
{ "dwTollListOption", PT_FLAGS, (ULONG_PTR) LINETOLLLISTOPTION_ADD, aTollListOptions }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (funcIndex == lSetTollList ?
|
|
(PFN4) lineSetTollList : (PFN4) lineSetTollListW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineSetTollList };
|
|
#endif
|
|
|
|
if (pLineAppSel)
|
|
{
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
}
|
|
|
|
strcpy (szAddressIn, szDefDestAddress);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lSetupConference:
|
|
#if TAPI_2_0
|
|
case lSetupConferenceW:
|
|
#endif
|
|
{
|
|
PMYCALL pNewCall, pNewCall2;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ "lphConfCall", PT_POINTER, 0, NULL },
|
|
{ szlphConsultCall, PT_POINTER, 0, NULL },
|
|
{ "dwNumParties", PT_DWORD, 3, NULL },
|
|
{ szlpCallParams, PT_CALLPARAMS, 0, lpCallParams }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (funcIndex == lSetupConference ?
|
|
(PFN6) lineSetupConference : (PFN6) lineSetupConferenceW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (PFN6) lineSetupConference };
|
|
#endif
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
if (!(pNewCall = AllocCall (pLineSel)))
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (!(pNewCall2 = AllocCall (pLineSel)))
|
|
{
|
|
FreeCall (pNewCall);
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) (pCallSel ? pCallSel->hCall : 0);
|
|
params[1].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
params[2].dwValue =
|
|
params[2].u.dwDefValue = (ULONG_PTR) &pNewCall->hCall;
|
|
params[3].dwValue =
|
|
params[3].u.dwDefValue = (ULONG_PTR) &pNewCall2->hCall;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) >= 0)
|
|
{
|
|
//
|
|
// Note that the hLine param is ignored if the hCall is non-NULL
|
|
//
|
|
|
|
if (params[0].dwValue)
|
|
{
|
|
if (!pCallSel ||
|
|
(params[0].dwValue != (ULONG_PTR) pCallSel->hCall))
|
|
{
|
|
//
|
|
// Get the assoc pLine, if it's diff need to move new calls
|
|
//
|
|
|
|
PMYWIDGET pWidget = aWidgets;
|
|
PMYLINE pLine = (PMYLINE) NULL;
|
|
|
|
|
|
while (1)
|
|
{
|
|
if ((pWidget->dwType == WT_CALL) &&
|
|
(params[0].dwValue == (ULONG_PTR)
|
|
((PMYCALL)pWidget)->hCall))
|
|
{
|
|
break;
|
|
}
|
|
else if (pWidget->dwType == WT_LINE)
|
|
{
|
|
pLine = (PMYLINE) pWidget;
|
|
}
|
|
|
|
pWidget = pWidget->pNext;
|
|
}
|
|
|
|
if (pLine != pLineSel)
|
|
{
|
|
MoveCallToLine (pNewCall, pLine->hLine);
|
|
MoveCallToLine (pNewCall2, pLine->hLine);
|
|
}
|
|
}
|
|
}
|
|
else if (params[1].dwValue != (ULONG_PTR) pLineSel->hLine)
|
|
{
|
|
MoveCallToLine (pNewCall, (HLINE) params[1].dwValue);
|
|
MoveCallToLine (pNewCall2, (HLINE) params[1].dwValue);
|
|
}
|
|
|
|
pNewCall->lMakeCallReqID =
|
|
pNewCall2->lMakeCallReqID = lResult;
|
|
dwNumPendingMakeCalls += 2;
|
|
SelectWidget ((PMYWIDGET) pNewCall);
|
|
}
|
|
else
|
|
{
|
|
FreeCall (pNewCall);
|
|
FreeCall (pNewCall2);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lSetupTransfer:
|
|
#if TAPI_2_0
|
|
case lSetupTransferW:
|
|
#endif
|
|
{
|
|
PMYCALL pNewCall;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL },
|
|
{ szlphConsultCall, PT_POINTER, 0, NULL },
|
|
{ szlpCallParams, PT_CALLPARAMS, 0, lpCallParams }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lSetupTransfer ?
|
|
(PFN3) lineSetupTransfer : (PFN3) lineSetupTransferW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineSetupTransfer };
|
|
#endif
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
if (!(pNewCall = AllocCall (pLineSel)))
|
|
{
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
params[1].dwValue =
|
|
params[1].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 lShutdown:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) lineShutdown };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
ShowWidgetList (FALSE);
|
|
FreeLineApp (GetLineApp((HLINEAPP) params[0].dwValue));
|
|
ShowWidgetList (TRUE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lSwapHold:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "hActiveCall", PT_DWORD, 0, NULL },
|
|
{ "hHeldCall", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineSwapHold };
|
|
|
|
|
|
CHK_TWO_CALLS_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
params[1].dwValue = (ULONG_PTR) pCallSel2->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lTranslateAddress:
|
|
#if TAPI_2_0
|
|
case lTranslateAddressW:
|
|
#endif
|
|
{
|
|
char szAddressIn[MAX_STRING_PARAM_SIZE];
|
|
LPLINETRANSLATEOUTPUT lpXlatOutput = (LPLINETRANSLATEOUTPUT) 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 },
|
|
{ "lpszAddressIn", PT_STRING, (ULONG_PTR) szAddressIn, szAddressIn },
|
|
{ "dwCard", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwTranslateOptions", PT_FLAGS, (ULONG_PTR) LINETRANSLATEOPTION_CARDOVERRIDE, aTranslateOptions },
|
|
{ "lpTranslateOutput", PT_POINTER, (ULONG_PTR) lpXlatOutput, lpXlatOutput }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 7, funcIndex, params, (funcIndex == lTranslateAddress ?
|
|
(PFN7) lineTranslateAddress : (PFN7) lineTranslateAddressW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 7, funcIndex, params, (PFN7) lineTranslateAddress };
|
|
#endif
|
|
|
|
if (pLineAppSel)
|
|
{
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
}
|
|
else
|
|
{
|
|
params[0].dwValue = 0;
|
|
}
|
|
|
|
memset (lpXlatOutput, 0, (size_t) dwBigBufSize);
|
|
lpXlatOutput->dwTotalSize = dwBigBufSize;
|
|
|
|
strcpy (szAddressIn, szDefDestAddress);
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
ShowStructByDWORDs (lpXlatOutput);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwDialableStringSize", FT_SIZE, lpXlatOutput->dwDialableStringSize, NULL },
|
|
{ "dwDialableStringOffset", FT_OFFSET, lpXlatOutput->dwDialableStringOffset, NULL },
|
|
{ "dwDisplayableStringSize", FT_SIZE, lpXlatOutput->dwDisplayableStringSize, NULL },
|
|
{ "dwDisplayableStringOffset", FT_OFFSET, lpXlatOutput->dwDisplayableStringOffset, NULL },
|
|
{ "dwCurrentCountry", FT_DWORD, lpXlatOutput->dwCurrentCountry, NULL },
|
|
{ "dwDestCountry", FT_DWORD, lpXlatOutput->dwDestCountry, NULL },
|
|
{ "dwTranslateResults", FT_FLAGS, lpXlatOutput->dwTranslateResults, aTranslateResults },
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpXlatOutput,
|
|
"LINETRANSLATEOUTPUT",
|
|
7,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lUncompleteCall:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, 0, NULL },
|
|
{ "dwCompletionID", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineUncompleteCall };
|
|
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lUnhold:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) lineUnhold };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lUnpark:
|
|
#if TAPI_2_0
|
|
case lUnparkW:
|
|
#endif
|
|
{
|
|
PMYCALL pNewCall;
|
|
char szDestAddress[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLine, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwAddressID, PT_DWORD, (ULONG_PTR) dwDefAddressID, NULL },
|
|
{ szlphCall, PT_POINTER, (ULONG_PTR) 0, NULL },
|
|
{ szlpszDestAddress, PT_STRING, (ULONG_PTR) szDestAddress, szDestAddress }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (funcIndex == lUnpark ?
|
|
(PFN4) lineUnpark : (PFN4) lineUnparkW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) lineUnpark };
|
|
#endif
|
|
|
|
CHK_LINE_SELECTED()
|
|
|
|
if (!(pNewCall = AllocCall (pLineSel)))
|
|
{
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineSel->hLine;
|
|
params[2].dwValue =
|
|
params[2].u.dwDefValue = (ULONG_PTR) &pNewCall->hCall;
|
|
|
|
strcpy (szDestAddress, szDefDestAddress);
|
|
|
|
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);
|
|
}
|
|
|
|
break;
|
|
}
|
|
#if TAPI_1_1
|
|
case lAddProvider:
|
|
#if TAPI_2_0
|
|
case lAddProviderW:
|
|
#endif
|
|
{
|
|
#if TAPI_2_0
|
|
char szProviderFilename[MAX_STRING_PARAM_SIZE] = "esp32.tsp";
|
|
#else
|
|
char szProviderFilename[MAX_STRING_PARAM_SIZE] = "esp.tsp";
|
|
#endif
|
|
DWORD dwPermanentProviderID;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "lpszProviderFilename", PT_STRING, (ULONG_PTR) szProviderFilename, szProviderFilename },
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, NULL },
|
|
{ "lpdwPermanentProviderID", PT_POINTER, (ULONG_PTR) &dwPermanentProviderID, &dwPermanentProviderID }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lAddProvider ?
|
|
(PFN3) lineAddProvider : (PFN3) lineAddProviderW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineAddProvider };
|
|
#endif
|
|
|
|
#ifdef WIN32
|
|
lResult = DoFunc (¶msHeader);
|
|
#else
|
|
//
|
|
// NOTE: on win16 HWNDs are 16 bits, so we've to hard code this
|
|
//
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = lineAddProvider(
|
|
(LPCSTR) params[0].dwValue,
|
|
(HWND) params[1].dwValue,
|
|
(LPDWORD) params[2].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
ShowStr ("%sdwPermanentProviderID = x%lx", szTab, dwPermanentProviderID);
|
|
}
|
|
#endif
|
|
break;
|
|
}
|
|
case lConfigDialogEdit:
|
|
#if TAPI_2_0
|
|
case lConfigDialogEditW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE];
|
|
char szDeviceConfigIn[MAX_STRING_PARAM_SIZE] = "";
|
|
char szErrorMsg[] = "Bad config info in buffer";
|
|
LPBYTE pDataIn;
|
|
LPVARSTRING lpDeviceConfigOut = (LPVARSTRING) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, NULL },
|
|
{ szlpszDeviceClass, PT_STRING, (ULONG_PTR) szDeviceClass, szDeviceClass },
|
|
{ "lpDeviceConfigIn", PT_POINTER, (ULONG_PTR) 0, NULL },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpDeviceConfigOut", PT_POINTER, (ULONG_PTR) lpDeviceConfigOut, lpDeviceConfigOut }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (funcIndex == lConfigDialogEdit ?
|
|
(PFN6) lineConfigDialogEdit : (PFN6) lineConfigDialogEditW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (PFN6) lineConfigDialogEdit };
|
|
#endif
|
|
|
|
//
|
|
// Check to see if there's existing config info in the global buffer
|
|
// (not a foolproof check, but good enough), and if so alloc an
|
|
// intermediate buffer to use for config in data & copy the
|
|
// existing data over
|
|
//
|
|
|
|
ShowStr ("Call lineGetDevConfig before calling lineConfigDialogEdit");
|
|
|
|
if (dwBigBufSize >= sizeof (VARSTRING))
|
|
{
|
|
DWORD dwMaxDataSize = dwBigBufSize - sizeof (VARSTRING);
|
|
LPVARSTRING pVarString = (LPVARSTRING) pBigBuf;
|
|
|
|
|
|
if (pVarString->dwStringSize > dwMaxDataSize ||
|
|
|
|
(pVarString->dwStringSize != 0 &&
|
|
(pVarString->dwStringOffset < sizeof (VARSTRING) ||
|
|
pVarString->dwStringOffset >
|
|
(dwBigBufSize - pVarString->dwStringSize))))
|
|
{
|
|
ShowStr (szErrorMsg);
|
|
break;
|
|
}
|
|
|
|
pDataIn = malloc (pVarString->dwStringSize);
|
|
|
|
memcpy(
|
|
pDataIn,
|
|
(LPBYTE) pBigBuf + pVarString->dwStringOffset,
|
|
pVarString->dwStringSize
|
|
);
|
|
|
|
params[3].dwValue =
|
|
params[3].u.dwDefValue = (ULONG_PTR) pDataIn;
|
|
}
|
|
else
|
|
{
|
|
ShowStr (szErrorMsg);
|
|
break;
|
|
}
|
|
|
|
strcpy (szDeviceClass, szDefLineDeviceClass);
|
|
|
|
memset (lpDeviceConfigOut, 0, (size_t) dwBigBufSize);
|
|
|
|
lpDeviceConfigOut->dwTotalSize = dwBigBufSize;
|
|
|
|
#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 = lineConfigDialogEdit(
|
|
params[0].dwValue,
|
|
(HWND) params[1].dwValue,
|
|
(LPCSTR) params[2].dwValue,
|
|
(LPVOID) params[3].dwValue,
|
|
params[4].dwValue,
|
|
(LPVARSTRING) params[5].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif
|
|
if (lResult == 0)
|
|
{
|
|
ShowStructByDWORDs (lpDeviceConfigOut);
|
|
|
|
ShowVARSTRING (lpDeviceConfigOut);
|
|
}
|
|
|
|
free (pDataIn);
|
|
|
|
break;
|
|
}
|
|
case lConfigProvider:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, NULL },
|
|
{ "dwPermanentProviderID", PT_DWORD, (ULONG_PTR) 2, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineConfigProvider };
|
|
|
|
|
|
#ifdef WIN32
|
|
lResult = DoFunc (¶msHeader);
|
|
#else
|
|
//
|
|
// NOTE: on win16 HWNDs are 16 bits, so we've to hard code this
|
|
//
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = lineConfigProvider(
|
|
(HWND) params[0].dwValue,
|
|
params[1].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif
|
|
break;
|
|
}
|
|
case lGetAppPriority:
|
|
#if TAPI_2_0
|
|
case lGetAppPriorityW:
|
|
#endif
|
|
{
|
|
DWORD dwPriority;
|
|
LINEEXTENSIONID extID;
|
|
char szAppName[MAX_STRING_PARAM_SIZE];
|
|
LPVARSTRING lpExtName = (LPVARSTRING) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szlpszAppName, PT_STRING, (ULONG_PTR) szAppName, szAppName },
|
|
{ "dwMediaMode", PT_FLAGS, (ULONG_PTR) dwDefMediaMode, aMediaModes },
|
|
{ "lpExtensionID", PT_POINTER, (ULONG_PTR) &extID, &extID },
|
|
{ " ->dwExtensionID0", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwExtensionID1", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwExtensionID2", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwExtensionID3", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwRequestMode", PT_FLAGS, (ULONG_PTR) LINEREQUESTMODE_MAKECALL, aRequestModes },
|
|
{ "lpExtensionName", PT_POINTER, (ULONG_PTR) lpExtName, lpExtName },
|
|
{ "lpdwPriority", PT_POINTER, (ULONG_PTR) &dwPriority, &dwPriority }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 10, funcIndex, params, NULL };
|
|
|
|
|
|
memset (lpExtName, 0, (size_t) dwBigBufSize);
|
|
lpExtName->dwTotalSize = dwBigBufSize;
|
|
|
|
strcpy (szAppName, szDefAppName);
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
extID.dwExtensionID0 = (DWORD) params[3].dwValue;
|
|
extID.dwExtensionID1 = (DWORD) params[4].dwValue;
|
|
extID.dwExtensionID2 = (DWORD) params[5].dwValue;
|
|
extID.dwExtensionID3 = (DWORD) params[6].dwValue;
|
|
|
|
#if TAPI_2_0
|
|
if (funcIndex == lGetAppPriority)
|
|
{
|
|
lResult = lineGetAppPriority(
|
|
(LPCSTR) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(LPLINEEXTENSIONID) params[2].dwValue,
|
|
(DWORD) params[7].dwValue,
|
|
(LPVARSTRING) params[8].dwValue,
|
|
(LPDWORD) params[9].dwValue
|
|
);
|
|
}
|
|
else
|
|
{
|
|
MakeWideString ((LPVOID) params[0].dwValue);
|
|
|
|
lResult = lineGetAppPriorityW(
|
|
(LPCWSTR) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(LPLINEEXTENSIONID) params[2].dwValue,
|
|
(DWORD) params[7].dwValue,
|
|
(LPVARSTRING) params[8].dwValue,
|
|
(LPDWORD) params[9].dwValue
|
|
);
|
|
}
|
|
#else
|
|
lResult = lineGetAppPriority(
|
|
(LPCSTR) params[0].dwValue,
|
|
params[1].dwValue,
|
|
(LPLINEEXTENSIONID) params[2].dwValue,
|
|
params[7].dwValue,
|
|
(LPVARSTRING) params[8].dwValue,
|
|
(LPDWORD) params[9].dwValue
|
|
);
|
|
#endif
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
ShowStr ("%sdwPriority = x%lx", szTab, dwPriority);
|
|
ShowStructByDWORDs (lpExtName);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetCountry:
|
|
#if TAPI_2_0
|
|
case lGetCountryW:
|
|
#endif
|
|
{
|
|
LPLINECOUNTRYLIST lpCountryList = (LPLINECOUNTRYLIST) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "dwCountryID", PT_DWORD, (ULONG_PTR) 1, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ "lpLineCountryList", PT_POINTER, (ULONG_PTR) lpCountryList, lpCountryList }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == lGetCountry ?
|
|
(PFN3) lineGetCountry : (PFN3) lineGetCountryW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) lineGetCountry };
|
|
#endif
|
|
|
|
memset (lpCountryList, 0, (size_t) dwBigBufSize);
|
|
lpCountryList->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
UpdateResults (TRUE);
|
|
|
|
ShowStructByDWORDs (lpCountryList);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
LPLINECOUNTRYENTRY lpCountryEntry;
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwNumCountries", FT_DWORD, lpCountryList->dwNumCountries, NULL },
|
|
{ "dwCountryListSize", FT_DWORD, lpCountryList->dwCountryListSize, NULL },
|
|
{ "dwCountryListOffset", FT_DWORD, lpCountryList->dwCountryListOffset, NULL }
|
|
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpCountryList,
|
|
"LINECOUNTRYLIST",
|
|
3,
|
|
fields
|
|
};
|
|
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
|
|
lpCountryEntry = (LPLINECOUNTRYENTRY)
|
|
(((LPBYTE)lpCountryList) +
|
|
lpCountryList->dwCountryListOffset);
|
|
|
|
for (i = 0; i < lpCountryList->dwNumCountries; i++)
|
|
{
|
|
char buf[32];
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwCountryID", FT_DWORD, lpCountryEntry->dwCountryID, NULL },
|
|
{ "dwCountryCode", FT_DWORD, lpCountryEntry->dwCountryCode, NULL },
|
|
{ "dwNextCountryID", FT_DWORD, lpCountryEntry->dwNextCountryID, NULL },
|
|
{ "dwCountryNameSize", FT_SIZE, lpCountryEntry->dwCountryNameSize, NULL },
|
|
{ "dwCountryNameOffset", FT_OFFSET, lpCountryEntry->dwCountryNameOffset, NULL },
|
|
{ "dwSameAreaRuleSize", FT_SIZE, lpCountryEntry->dwSameAreaRuleSize, NULL },
|
|
{ "dwSameAreaRuleOffset", FT_OFFSET, lpCountryEntry->dwSameAreaRuleOffset, NULL },
|
|
{ "dwLongDistanceRuleSize", FT_SIZE, lpCountryEntry->dwLongDistanceRuleSize, NULL },
|
|
{ "dwLongDistanceRuleOffset", FT_OFFSET, lpCountryEntry->dwLongDistanceRuleOffset, NULL },
|
|
{ "dwInternationalRuleSize", FT_SIZE, lpCountryEntry->dwInternationalRuleSize, NULL },
|
|
{ "dwInternationalRuleOffset", FT_OFFSET, lpCountryEntry->dwInternationalRuleOffset, NULL }
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpCountryList, // size,offset relative to ctrylist
|
|
buf,
|
|
11,
|
|
fields
|
|
};
|
|
|
|
|
|
sprintf (buf, "LINECOUNTRYENTRY[%ld]", i);
|
|
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
|
|
lpCountryEntry++;
|
|
}
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lGetProviderList:
|
|
#if TAPI_2_0
|
|
case lGetProviderListW:
|
|
#endif
|
|
{
|
|
LPLINEPROVIDERLIST lpProviderList = (LPLINEPROVIDERLIST) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ "lpProviderList", PT_POINTER, (ULONG_PTR) lpProviderList, lpProviderList }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (funcIndex == lGetProviderList ?
|
|
(PFN3) lineGetProviderList : (PFN3) lineGetProviderListW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN3) lineGetProviderList };
|
|
#endif
|
|
|
|
memset (lpProviderList, 0, (size_t) dwBigBufSize);
|
|
lpProviderList->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
UpdateResults (TRUE);
|
|
|
|
ShowStructByDWORDs (lpProviderList);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
LPLINEPROVIDERENTRY lpProviderEntry;
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwNumProviders", FT_DWORD, lpProviderList->dwNumProviders, NULL },
|
|
{ "dwProviderListSize", FT_DWORD, lpProviderList->dwProviderListSize, NULL },
|
|
{ "dwProviderListOffset", FT_DWORD, lpProviderList->dwProviderListOffset, NULL },
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpProviderList,
|
|
"LINEPROVIDERLIST",
|
|
3,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
|
|
lpProviderEntry = (LPLINEPROVIDERENTRY)
|
|
(((LPBYTE) lpProviderList) +
|
|
lpProviderList->dwProviderListOffset);
|
|
|
|
for (i = 0; i < lpProviderList->dwNumProviders; i++)
|
|
{
|
|
char buf[32];
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwPermanentProviderID", FT_DWORD, lpProviderEntry->dwPermanentProviderID, NULL },
|
|
{ "dwProviderFilenameSize", FT_SIZE, lpProviderEntry->dwProviderFilenameSize, NULL },
|
|
{ "dwProviderFilenameOffset", FT_OFFSET, lpProviderEntry->dwProviderFilenameOffset, NULL }
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpProviderList, // size,offset relative to ctrylist
|
|
buf,
|
|
3,
|
|
fields
|
|
};
|
|
|
|
|
|
sprintf (buf, "LINEPROVIDERENTRY[%ld]", i);
|
|
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
|
|
lpProviderEntry++;
|
|
}
|
|
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case lReleaseUserUserInfo:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhCall, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) lineReleaseUserUserInfo };
|
|
|
|
|
|
CHK_CALL_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pCallSel->hCall;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case lRemoveProvider:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "dwPermanentProviderID", PT_DWORD, (ULONG_PTR) 2, NULL },
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) lineRemoveProvider };
|
|
|
|
|
|
#ifdef WIN32
|
|
lResult = DoFunc (¶msHeader);
|
|
#else
|
|
//
|
|
// NOTE: on win16 HWNDs are 16 bits, so we've to hard code this
|
|
//
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = lineRemoveProvider(
|
|
params[0].dwValue,
|
|
(HWND) params[1].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif
|
|
break;
|
|
}
|
|
case lSetAppPriority:
|
|
#if TAPI_2_0
|
|
case lSetAppPriorityW:
|
|
#endif
|
|
{
|
|
char szAppName[MAX_STRING_PARAM_SIZE];
|
|
char szExtName[MAX_STRING_PARAM_SIZE] = "";
|
|
LINEEXTENSIONID extID;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szlpszAppName, PT_STRING, (ULONG_PTR) szAppName, szAppName },
|
|
{ "dwMediaMode", PT_FLAGS, (ULONG_PTR) dwDefMediaMode, aMediaModes },
|
|
{ "lpExtensionID", PT_POINTER, (ULONG_PTR) &extID, &extID },
|
|
{ " ->dwExtensionID0", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwExtensionID1", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwExtensionID2", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwExtensionID3", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwRequestMode", PT_FLAGS, (ULONG_PTR) LINEREQUESTMODE_MAKECALL, aRequestModes },
|
|
{ "lpszExtensionName", PT_STRING, (ULONG_PTR) szExtName, szExtName },
|
|
{ "dwPriority", PT_DWORD, (ULONG_PTR) 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 10, funcIndex, params, NULL };
|
|
|
|
|
|
strcpy (szAppName, szDefAppName);
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
extID.dwExtensionID0 = (DWORD) params[3].dwValue;
|
|
extID.dwExtensionID1 = (DWORD) params[4].dwValue;
|
|
extID.dwExtensionID2 = (DWORD) params[5].dwValue;
|
|
extID.dwExtensionID3 = (DWORD) params[6].dwValue;
|
|
|
|
#if TAPI_2_0
|
|
if (funcIndex == lSetAppPriority)
|
|
{
|
|
lResult = lineSetAppPriority(
|
|
(LPCSTR) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(LPLINEEXTENSIONID) params[2].dwValue,
|
|
(DWORD) params[7].dwValue,
|
|
(LPCSTR) params[8].dwValue,
|
|
(DWORD) params[9].dwValue
|
|
);
|
|
}
|
|
else
|
|
{
|
|
MakeWideString ((LPVOID) params[0].dwValue);
|
|
|
|
lResult = lineSetAppPriorityW(
|
|
(LPCWSTR) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(LPLINEEXTENSIONID) params[2].dwValue,
|
|
(DWORD) params[7].dwValue,
|
|
(LPCWSTR) params[8].dwValue,
|
|
(DWORD) params[9].dwValue
|
|
);
|
|
}
|
|
#else
|
|
lResult = lineSetAppPriority(
|
|
(LPCSTR) params[0].dwValue,
|
|
params[1].dwValue,
|
|
(LPLINEEXTENSIONID) params[2].dwValue,
|
|
params[7].dwValue,
|
|
(LPCSTR) params[8].dwValue,
|
|
params[9].dwValue
|
|
);
|
|
#endif
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
break;
|
|
}
|
|
case lTranslateDialog:
|
|
#if TAPI_2_0
|
|
case lTranslateDialogW:
|
|
#endif
|
|
{
|
|
char szAddressIn[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhLineApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefLineDeviceID, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, 0 },
|
|
{ "lpszAddressIn", PT_STRING, (ULONG_PTR) szAddressIn, szAddressIn }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (funcIndex == lTranslateDialog ?
|
|
(PFN5) lineTranslateDialog : (PFN5) lineTranslateDialogW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) lineTranslateDialog };
|
|
#endif
|
|
|
|
if (pLineAppSel)
|
|
{
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
}
|
|
|
|
strcpy (szAddressIn, szDefDestAddress);
|
|
|
|
#ifdef WIN32
|
|
lResult = DoFunc (¶msHeader);
|
|
#else
|
|
//
|
|
// NOTE: on win16 HWNDs are 16 bits, so we've to hard code this
|
|
//
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = lineTranslateDialog(
|
|
(HLINEAPP) params[0].dwValue,
|
|
params[1].dwValue,
|
|
params[2].dwValue,
|
|
(HWND) params[3].dwValue,
|
|
(LPCSTR) params[4].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif
|
|
break;
|
|
}
|
|
#endif // TAPI_1_1
|
|
|
|
#if INTERNAL_3_0
|
|
|
|
case mmcAddProvider:
|
|
{
|
|
char szProviderFilename[MAX_STRING_PARAM_SIZE] = "";
|
|
DWORD dwPermanentProviderID;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD , (ULONG_PTR) 0, NULL },
|
|
{ "lpszProviderFilename", PT_STRING, (ULONG_PTR) szProviderFilename, szProviderFilename },
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, NULL },
|
|
{ "lpdwPermanentProviderID", PT_POINTER, (ULONG_PTR) &dwPermanentProviderID, &dwPermanentProviderID }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) MMCAddProvider };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStr(
|
|
"%sdwPermanentProviderID = x%lx",
|
|
szTab,
|
|
dwPermanentProviderID
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case mmcConfigProvider:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD , (ULONG_PTR) 0, NULL },
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, NULL },
|
|
{ szdwProviderID, PT_DWORD, (ULONG_PTR) 2, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) MMCConfigProvider };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case mmcGetAvailableProviders:
|
|
{
|
|
LPAVAILABLEPROVIDERLIST lpList = (LPAVAILABLEPROVIDERLIST) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpProviderList", PT_POINTER, (ULONG_PTR) lpList, lpList }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, MMCGetAvailableProviders };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (lpList, 0, (size_t) dwBigBufSize);
|
|
lpList->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
UpdateResults (TRUE);
|
|
|
|
ShowStructByDWORDs (lpList);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
LPAVAILABLEPROVIDERENTRY lpEntry;
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwNumProviderListEntries", FT_DWORD, lpList->dwNumProviderListEntries, NULL },
|
|
{ "dwProviderListSize", FT_DWORD, lpList->dwProviderListSize, NULL },
|
|
{ "dwProviderListOffset", FT_DWORD, lpList->dwProviderListOffset, NULL },
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpList,
|
|
"AVAILABLEPROVIDERLIST",
|
|
3,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
|
|
lpEntry = (LPAVAILABLEPROVIDERENTRY)
|
|
(((LPBYTE) lpList) + lpList->dwProviderListOffset);
|
|
|
|
for (i = 0; i < lpList->dwNumProviderListEntries; i++)
|
|
{
|
|
char buf[32];
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwFileNameSize", FT_SIZE, lpEntry->dwFileNameSize, NULL },
|
|
{ "dwFileNameOffset", FT_OFFSET, lpEntry->dwFileNameOffset, NULL },
|
|
{ "dwFriendlyNameSize", FT_SIZE, lpEntry->dwFriendlyNameSize, NULL },
|
|
{ "dwFriendlyNameOffset", FT_OFFSET, lpEntry->dwFriendlyNameOffset, NULL },
|
|
{ "dwOptions", FT_FLAGS, lpEntry->dwOptions, aAvailableProviderOptions }
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpList, // size,offset relative to list
|
|
buf,
|
|
5,
|
|
fields
|
|
};
|
|
|
|
|
|
sprintf (buf, "AVAILABLEPROVIDERENTRY[%ld]", i);
|
|
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
|
|
lpEntry++;
|
|
}
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
break;
|
|
}
|
|
case mmcGetLineInfo:
|
|
case mmcGetPhoneInfo:
|
|
{
|
|
LPDEVICEINFOLIST pList = (LPDEVICEINFOLIST) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD , (ULONG_PTR) 0, NULL },
|
|
{ "lpInfoList", PT_POINTER, (ULONG_PTR) pList, pList }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (funcIndex == mmcGetLineInfo ?
|
|
(PFN5) MMCGetLineInfo : (PFN5) MMCGetPhoneInfo) };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (pList, 0, (size_t) dwBigBufSize);
|
|
pList->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
LPDEVICEINFO pInfo = (LPDEVICEINFO) (((LPBYTE)
|
|
pList) + pList->dwDeviceInfoOffset);
|
|
|
|
|
|
UpdateResults (TRUE);
|
|
|
|
ShowStructByDWORDs (pList);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwNumDevInfoEntries", FT_DWORD, pList->dwNumDeviceInfoEntries, NULL },
|
|
{ "dwDevInfoSize", FT_SIZE, pList->dwDeviceInfoSize, NULL },
|
|
{ "dwDevInfoOffset", FT_OFFSET, pList->dwDeviceInfoOffset, NULL },
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
pList, "DEVICEINFOLIST", 3, fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
|
|
for (i = 0; i < pList->dwNumDeviceInfoEntries; i++, pInfo++)
|
|
{
|
|
char szDevInfoN[16];
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwPermanentDevID", FT_DWORD, pInfo->dwPermanentDeviceID, NULL },
|
|
{ szdwProviderID, FT_DWORD, pInfo->dwProviderID, NULL },
|
|
{ "dwDevNameSize", FT_SIZE, pInfo->dwDeviceNameSize, NULL },
|
|
{ "dwDevNameOffset", FT_OFFSET, pInfo->dwDeviceNameOffset, NULL },
|
|
{ "dwDomainUserNamesSize", FT_SIZE, pInfo->dwDomainUserNamesSize, NULL },
|
|
{ "dwDomainUserNamesOffset", FT_OFFSET, pInfo->dwDomainUserNamesOffset, NULL },
|
|
{ "dwFriendlyUserNamesSize", FT_SIZE, pInfo->dwFriendlyUserNamesSize, NULL },
|
|
{ "dwFriendlyUserNamesOffset", FT_OFFSET, pInfo->dwFriendlyUserNamesOffset, NULL },
|
|
{ "dwAddressesSize", FT_SIZE, pInfo->dwAddressesSize, NULL },
|
|
{ "dwAddressesOffset", FT_OFFSET, pInfo->dwAddressesOffset, NULL },
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
pList,
|
|
szDevInfoN,
|
|
(funcIndex == mmcGetLineInfo ? 10 : 8),
|
|
fields
|
|
};
|
|
|
|
wsprintf (szDevInfoN, "DEVICEINFO[%d]", i);
|
|
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
}
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case mmcGetLineStatus:
|
|
case mmcGetPhoneStatus:
|
|
{
|
|
LPVARSTRING pStatus = (LPVARSTRING) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, NULL },
|
|
{ "dwStatusLevel", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwProviderID, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwPermanentDevID", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpStatusBuffer", PT_POINTER, (ULONG_PTR) pStatus, pStatus }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 6, funcIndex, params, (funcIndex == mmcGetLineStatus ?
|
|
(PFN6) MMCGetLineStatus : (PFN6) MMCGetPhoneStatus) };
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (pStatus, 0, (size_t) dwBigBufSize);
|
|
pStatus->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (pStatus);
|
|
|
|
ShowVARSTRING (pStatus);
|
|
}
|
|
break;
|
|
}
|
|
case mmcGetProviderList:
|
|
{
|
|
LPLINEPROVIDERLIST lpList = (LPLINEPROVIDERLIST) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpProviderList", PT_POINTER, (ULONG_PTR) lpList, lpList }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, MMCGetProviderList };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (lpList, 0, (size_t) dwBigBufSize);
|
|
lpList->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
UpdateResults (TRUE);
|
|
|
|
ShowStructByDWORDs (lpList);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
LPLINEPROVIDERENTRY lpEntry;
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwNumProviders", FT_DWORD, lpList->dwNumProviders, NULL },
|
|
{ "dwProviderListSize", FT_DWORD, lpList->dwProviderListSize, NULL },
|
|
{ "dwProviderListOffset", FT_DWORD, lpList->dwProviderListOffset, NULL },
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpList,
|
|
"LINEPROVIDERLIST",
|
|
3,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
|
|
lpEntry = (LPLINEPROVIDERENTRY)
|
|
(((LPBYTE) lpList) + lpList->dwProviderListOffset);
|
|
|
|
for (i = 0; i < lpList->dwNumProviders; i++)
|
|
{
|
|
char buf[32];
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwPermanentProviderID", FT_DWORD, lpEntry->dwPermanentProviderID, NULL },
|
|
{ "dwProviderFilenameSize", FT_SIZE, lpEntry->dwProviderFilenameSize, NULL },
|
|
{ "dwProviderFilenameOffset", FT_OFFSET, lpEntry->dwProviderFilenameOffset, NULL }
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpList, // size,offset relative to list
|
|
buf,
|
|
3,
|
|
fields
|
|
};
|
|
|
|
|
|
sprintf (buf, "LINEPROVIDERENTRY[%ld]", i);
|
|
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
|
|
lpEntry++;
|
|
}
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
break;
|
|
}
|
|
case mmcGetServerConfig:
|
|
{
|
|
LPTAPISERVERCONFIG pConfig = (LPTAPISERVERCONFIG) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpConfig", PT_POINTER, (ULONG_PTR) pConfig, pConfig }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, MMCGetServerConfig };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (pConfig, 0, (size_t) dwBigBufSize);
|
|
pConfig->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
UpdateResults (TRUE);
|
|
|
|
ShowStructByDWORDs (pConfig);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwFlags", FT_FLAGS, pConfig->dwFlags, aServerConfigFlags },
|
|
{ "dwDomainNameSize", FT_SIZE, pConfig->dwDomainNameSize, NULL },
|
|
{ "dwDomainNameOffset", FT_OFFSET, pConfig->dwDomainNameOffset, NULL },
|
|
{ "dwUserNameSize", FT_SIZE, pConfig->dwUserNameSize, NULL },
|
|
{ "dwUserNameOffset", FT_OFFSET, pConfig->dwUserNameOffset, NULL },
|
|
{ "dwPasswordSize", FT_SIZE, pConfig->dwPasswordSize, NULL },
|
|
{ "dwPasswordOffset", FT_OFFSET, pConfig->dwPasswordOffset, NULL },
|
|
{ "dwAdministratorsSize", FT_SIZE, pConfig->dwAdministratorsSize, NULL },
|
|
{ "dwAdministratorsOffset", FT_OFFSET, pConfig->dwAdministratorsOffset, NULL },
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
pConfig,
|
|
"TAPISERVERCONFIG",
|
|
9,
|
|
fields
|
|
};
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case mmcInitialize:
|
|
{
|
|
PMYLINEAPP pNewLineApp;
|
|
char szComputerName[MAX_STRING_PARAM_SIZE];
|
|
DWORD dwAPIVersion, dwLength;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "lpszComputerName", PT_STRING, (ULONG_PTR) szComputerName, szComputerName },
|
|
{ "lphLineApp", PT_POINTER, (ULONG_PTR) 0, NULL },
|
|
{ "lpdwAPIVersion", PT_POINTER, (ULONG_PTR) &dwAPIVersion, &dwAPIVersion },
|
|
{ " ->dwAPIVersion", PT_ORDINAL, (ULONG_PTR) dwDefLineAPIVersion, aAPIVersions },
|
|
{ "hInstance", PT_DWORD, (ULONG_PTR) NULL, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, NULL };
|
|
|
|
|
|
if (!(pNewLineApp = AllocLineApp()))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error creating data structure");
|
|
break;
|
|
}
|
|
|
|
params[1].dwValue =
|
|
params[1].u.dwDefValue = (ULONG_PTR) &pNewLineApp->hLineApp;
|
|
|
|
dwLength = sizeof (szComputerName);
|
|
GetComputerName (szComputerName, &dwLength);
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
FreeLineApp (pNewLineApp);
|
|
|
|
break;
|
|
}
|
|
|
|
MakeWideString (szComputerName);
|
|
|
|
dwAPIVersion = params[3].dwValue;
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = MMCInitialize(
|
|
(LPCWSTR) params[0].dwValue,
|
|
(LPHMMCAPP) params[1].dwValue,
|
|
(LPDWORD) params[2].dwValue,
|
|
(HANDLE) params[4].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
UpdateWidgetList();
|
|
SelectWidget ((PMYWIDGET) pNewLineApp);
|
|
}
|
|
else
|
|
{
|
|
FreeLineApp (pNewLineApp);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case mmcRemoveProvider:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD , (ULONG_PTR) 0, NULL },
|
|
{ szhwndOwner, PT_DWORD, (ULONG_PTR) ghwndMain, NULL },
|
|
{ szdwProviderID, PT_DWORD, (ULONG_PTR) 2, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) MMCRemoveProvider };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case mmcSetLineInfo:
|
|
case mmcSetPhoneInfo:
|
|
{
|
|
char szDomainUser0[MAX_STRING_PARAM_SIZE] = "",
|
|
szDomainUser1[MAX_STRING_PARAM_SIZE] = "",
|
|
szFriendlyUser0[MAX_STRING_PARAM_SIZE] = "",
|
|
szFriendlyUser1[MAX_STRING_PARAM_SIZE] = "";
|
|
DWORD dwSize;
|
|
LPDEVICEINFO pInfo;
|
|
LPDEVICEINFOLIST pList = (LPDEVICEINFOLIST) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpInfoList", PT_POINTER, (ULONG_PTR) pList, pList },
|
|
{ " ->dwPermDevID", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->dwProviderID", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ " ->DomainUser0", PT_STRING, (ULONG_PTR) szDomainUser0, szDomainUser0 },
|
|
{ " ->DomainUser1", PT_STRING, (ULONG_PTR) szDomainUser1, szDomainUser1 },
|
|
{ " ->FriendlyUser0", PT_STRING, (ULONG_PTR) szFriendlyUser0, szFriendlyUser0 },
|
|
{ " ->FriendlyUser1", PT_STRING, (ULONG_PTR) szFriendlyUser1, szFriendlyUser1 }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 8, funcIndex, params, NULL };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (pList, 0, (size_t) dwBigBufSize);
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
pList->dwTotalSize = sizeof (*pList) + sizeof (DEVICEINFO);
|
|
|
|
pList->dwNumDeviceInfoEntries = 1;
|
|
pList->dwDeviceInfoSize = sizeof (DEVICEINFO);
|
|
pList->dwDeviceInfoOffset = sizeof (*pList);
|
|
|
|
pInfo = (LPDEVICEINFO) (pList + 1);
|
|
|
|
pInfo->dwPermanentDeviceID = params[2].dwValue;
|
|
pInfo->dwProviderID = params[3].dwValue;
|
|
|
|
MakeWideString (szDomainUser0);
|
|
MakeWideString (szDomainUser1);
|
|
MakeWideString (szFriendlyUser0);
|
|
MakeWideString (szFriendlyUser1);
|
|
|
|
if (params[3].dwValue &&
|
|
(dwSize = wcslen ((WCHAR *) szDomainUser0)))
|
|
{
|
|
//
|
|
//
|
|
//
|
|
|
|
wcscpy(
|
|
(WCHAR *) (((LPBYTE) pList) + pList->dwTotalSize),
|
|
(WCHAR *) szDomainUser0
|
|
);
|
|
|
|
dwSize++;
|
|
dwSize *= sizeof (WCHAR);
|
|
|
|
pInfo->dwDomainUserNamesSize = dwSize;
|
|
pInfo->dwDomainUserNamesOffset = pList->dwTotalSize;
|
|
|
|
pList->dwTotalSize += dwSize;
|
|
|
|
if (params[4].dwValue &&
|
|
(dwSize = wcslen ((WCHAR *) szDomainUser1)))
|
|
{
|
|
wcscpy(
|
|
(WCHAR *) (((LPBYTE) pList) + pList->dwTotalSize),
|
|
(WCHAR *) szDomainUser1
|
|
);
|
|
|
|
dwSize++;
|
|
dwSize *= sizeof (WCHAR);
|
|
|
|
pInfo->dwDomainUserNamesSize += dwSize;
|
|
|
|
pList->dwTotalSize += dwSize;
|
|
}
|
|
|
|
*((WCHAR *) (((LPBYTE) pList) + pList->dwTotalSize)) =
|
|
L'\0';
|
|
|
|
pInfo->dwDomainUserNamesSize += sizeof (WCHAR);
|
|
|
|
pList->dwTotalSize += sizeof (WCHAR);
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
dwSize = (wcslen ((WCHAR *) szFriendlyUser0) + 1) * sizeof (WCHAR);
|
|
|
|
wcscpy(
|
|
(WCHAR *) (((LPBYTE) pList) + pList->dwTotalSize),
|
|
(WCHAR *) szFriendlyUser0
|
|
);
|
|
|
|
pInfo->dwFriendlyUserNamesSize = dwSize;
|
|
pInfo->dwFriendlyUserNamesOffset = pList->dwTotalSize;
|
|
|
|
pList->dwTotalSize += dwSize;
|
|
|
|
if (params[4].dwValue &&
|
|
(dwSize = wcslen ((WCHAR *) szFriendlyUser1)))
|
|
{
|
|
wcscpy(
|
|
(WCHAR *) (((LPBYTE) pList) + pList->dwTotalSize),
|
|
(WCHAR *) szFriendlyUser1
|
|
);
|
|
|
|
dwSize++;
|
|
dwSize *= sizeof (WCHAR);
|
|
|
|
pInfo->dwFriendlyUserNamesSize += dwSize;
|
|
|
|
pList->dwTotalSize += dwSize;
|
|
}
|
|
|
|
*((WCHAR *) (((LPBYTE) pList) + pList->dwTotalSize)) =
|
|
L'\0';
|
|
|
|
pInfo->dwFriendlyUserNamesSize += sizeof (WCHAR);
|
|
|
|
pList->dwTotalSize += sizeof (WCHAR);
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
if (funcIndex == mmcSetLineInfo)
|
|
{
|
|
lResult = MMCSetLineInfo(
|
|
(HMMCAPP) params[0].dwValue,
|
|
(LPDEVICEINFOLIST) params[1].dwValue
|
|
);
|
|
}
|
|
else
|
|
{
|
|
lResult = MMCSetPhoneInfo(
|
|
(HMMCAPP) params[0].dwValue,
|
|
(LPDEVICEINFOLIST) params[1].dwValue
|
|
);
|
|
}
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
break;
|
|
}
|
|
case mmcSetServerConfig:
|
|
{
|
|
char szDomain[MAX_STRING_PARAM_SIZE] = "",
|
|
szUser[MAX_STRING_PARAM_SIZE] = "",
|
|
szPassword[MAX_STRING_PARAM_SIZE] = "",
|
|
szAdmin0[MAX_STRING_PARAM_SIZE] = "",
|
|
szAdmin1[MAX_STRING_PARAM_SIZE] = "";
|
|
LPTAPISERVERCONFIG pConfig = (LPTAPISERVERCONFIG) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpConfig", PT_POINTER, (ULONG_PTR) pConfig, pConfig },
|
|
{ " ->dwFlags", PT_FLAGS, (ULONG_PTR) 0, aServerConfigFlags },
|
|
{ " ->DomainName", PT_STRING, (ULONG_PTR) szDomain, szDomain },
|
|
{ " ->UserName", PT_STRING, (ULONG_PTR) szUser, szUser },
|
|
{ " ->Password", PT_STRING, (ULONG_PTR) szPassword, szPassword },
|
|
{ " ->Admin0", PT_STRING, (ULONG_PTR) szAdmin0, szAdmin0 },
|
|
{ " ->Admin1", PT_STRING, (ULONG_PTR) szAdmin1, szAdmin1 }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 8, funcIndex, params, NULL };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
memset (pConfig, 0, (size_t) dwBigBufSize);
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
pConfig->dwTotalSize = sizeof (*pConfig);
|
|
|
|
pConfig->dwFlags = params[2].dwValue;
|
|
|
|
if (pConfig->dwFlags & TAPISERVERCONFIGFLAGS_SETACCOUNT)
|
|
{
|
|
MakeWideString (szDomain);
|
|
MakeWideString (szUser);
|
|
MakeWideString (szPassword);
|
|
|
|
wcscpy(
|
|
(WCHAR *) (((LPBYTE) pConfig) + pConfig->dwTotalSize),
|
|
(WCHAR *) szDomain
|
|
);
|
|
|
|
pConfig->dwDomainNameOffset = pConfig->dwTotalSize;
|
|
|
|
pConfig->dwTotalSize +=
|
|
(pConfig->dwDomainNameSize =
|
|
(wcslen ((WCHAR *) szDomain) + 1) * sizeof (WCHAR));
|
|
|
|
wcscpy(
|
|
(WCHAR *) (((LPBYTE) pConfig) + pConfig->dwTotalSize),
|
|
(WCHAR *) szUser
|
|
);
|
|
|
|
pConfig->dwUserNameOffset = pConfig->dwTotalSize;
|
|
|
|
pConfig->dwTotalSize +=
|
|
(pConfig->dwUserNameSize =
|
|
(wcslen ((WCHAR *) szUser) + 1) * sizeof (WCHAR));
|
|
|
|
wcscpy(
|
|
(WCHAR *) (((LPBYTE) pConfig) + pConfig->dwTotalSize),
|
|
(WCHAR *) szPassword
|
|
);
|
|
|
|
pConfig->dwPasswordOffset = pConfig->dwTotalSize;
|
|
|
|
pConfig->dwTotalSize +=
|
|
(pConfig->dwPasswordSize =
|
|
(wcslen ((WCHAR *) szPassword) + 1) * sizeof (WCHAR));
|
|
}
|
|
|
|
MakeWideString (szAdmin0);
|
|
MakeWideString (szAdmin1);
|
|
|
|
if ((pConfig->dwFlags & TAPISERVERCONFIGFLAGS_SETTAPIADMINISTRATORS) &&
|
|
params[6].dwValue &&
|
|
wcslen ((WCHAR *) szAdmin0))
|
|
{
|
|
wcscpy(
|
|
(WCHAR *) (((LPBYTE) pConfig) + pConfig->dwTotalSize),
|
|
(WCHAR *) szAdmin0
|
|
);
|
|
|
|
pConfig->dwAdministratorsOffset = pConfig->dwTotalSize;
|
|
|
|
pConfig->dwTotalSize +=
|
|
(pConfig->dwAdministratorsSize =
|
|
(wcslen ((WCHAR *) szAdmin0) + 1) * sizeof (WCHAR));
|
|
|
|
if (params[7].dwValue && wcslen ((WCHAR *) szAdmin1))
|
|
{
|
|
DWORD dwSize;
|
|
|
|
wcscpy(
|
|
(WCHAR *) (((LPBYTE) pConfig) + pConfig->dwTotalSize),
|
|
(WCHAR *) szAdmin1
|
|
);
|
|
|
|
dwSize = (wcslen ((WCHAR *) szAdmin1) + 1) * sizeof (WCHAR);
|
|
|
|
pConfig->dwAdministratorsSize += dwSize;
|
|
|
|
pConfig->dwTotalSize += dwSize;
|
|
}
|
|
|
|
*((WCHAR *) (((LPBYTE) pConfig) + pConfig->dwTotalSize)) = L'\0';
|
|
|
|
pConfig->dwAdministratorsSize += sizeof (WCHAR);
|
|
|
|
pConfig->dwTotalSize += sizeof (WCHAR);
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = MMCSetServerConfig(
|
|
(HMMCAPP) params[0].dwValue,
|
|
(LPTAPISERVERCONFIG) params[1].dwValue
|
|
);
|
|
|
|
ShowLineFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
break;
|
|
}
|
|
case mmcShutdown:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhMmcApp, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) MMCShutdown };
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pLineAppSel->hLineApp;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
ShowWidgetList (FALSE);
|
|
FreeLineApp (GetLineApp((HLINEAPP) params[0].dwValue));
|
|
ShowWidgetList (TRUE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
#endif // INTERNAL_3_0
|
|
|
|
case pClose:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) phoneClose };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
if ((lResult = DoFunc(¶msHeader)) == 0)
|
|
{
|
|
FreePhone (GetPhone((HPHONE) params[0].dwValue));
|
|
|
|
// Try to auto select the next valid hPhone in the list
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pConfigDialog:
|
|
#if TAPI_2_0
|
|
case pConfigDialogW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefPhoneDeviceID, 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 == pConfigDialog ?
|
|
(PFN3) phoneConfigDialog : (PFN3) phoneConfigDialogW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneConfigDialog };
|
|
#endif
|
|
|
|
CHK_PHONEAPP_SELECTED()
|
|
|
|
strcpy (szDeviceClass, szDefPhoneDeviceClass);
|
|
|
|
#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 = phoneConfigDialog(
|
|
params[0].dwValue,
|
|
(HWND) params[1].dwValue,
|
|
(LPCSTR) params[2].dwValue
|
|
);
|
|
|
|
ShowPhoneFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif
|
|
break;
|
|
}
|
|
case pDevSpecific:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szlpParams, PT_STRING, (ULONG_PTR) pBigBuf, pBigBuf },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneDevSpecific };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
memset (pBigBuf, 0, (size_t) dwBigBufSize);
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case pGetButtonInfo:
|
|
#if TAPI_2_0
|
|
case pGetButtonInfoW:
|
|
#endif
|
|
{
|
|
LPPHONEBUTTONINFO lpButtonInfo = (LPPHONEBUTTONINFO) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwButtonLampID", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpButtonInfo", PT_POINTER, (ULONG_PTR) lpButtonInfo, lpButtonInfo }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == pGetButtonInfo ?
|
|
(PFN3) phoneGetButtonInfo : (PFN3) phoneGetButtonInfoW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneGetButtonInfo };
|
|
#endif
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
memset (pBigBuf, 0, (size_t) dwBigBufSize);
|
|
lpButtonInfo->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpButtonInfo);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwButtonMode", FT_FLAGS, lpButtonInfo->dwButtonMode, aButtonModes },
|
|
{ "dwButtonFunction", FT_ORD, lpButtonInfo->dwButtonFunction, aButtonFunctions },
|
|
{ "dwButtonTextSize", FT_SIZE, lpButtonInfo->dwButtonTextSize, NULL },
|
|
{ "dwButtonTextOffset", FT_OFFSET, lpButtonInfo->dwButtonTextOffset, NULL },
|
|
{ "dwDevSpecificSize", FT_SIZE, lpButtonInfo->dwDevSpecificSize, NULL },
|
|
{ "dwDevSpecificOffset", FT_OFFSET, lpButtonInfo->dwDevSpecificOffset, NULL }
|
|
#if TAPI_1_1
|
|
,
|
|
{ "dwButtonState", FT_FLAGS, lpButtonInfo->dwButtonState, aButtonStates }
|
|
#endif
|
|
|
|
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpButtonInfo,
|
|
"PHONEBUTTONINFO",
|
|
#if TAPI_1_1
|
|
7,
|
|
#else
|
|
6,
|
|
#endif
|
|
fields
|
|
};
|
|
|
|
#if TAPI_1_1
|
|
|
|
// BUGBUG only show v1.0 fields if APIver == 0x10003
|
|
// fieldHeader.dwNumFields--;
|
|
#endif
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetData:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwDataID", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpData", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) (dwBigBufSize > 64 ? 64 : dwBigBufSize), 0}
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) phoneGetData };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowBytes(
|
|
(dwBigBufSize > (DWORD) params[3].dwValue ?
|
|
(DWORD) params[3].dwValue : dwBigBufSize),
|
|
pBigBuf,
|
|
0
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetDevCaps:
|
|
#if TAPI_2_0
|
|
case pGetDevCapsW:
|
|
#endif
|
|
{
|
|
LPPHONECAPS lpDevCaps = (LPPHONECAPS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhoneApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefPhoneDeviceID, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefPhoneAPIVersion, aAPIVersions },
|
|
{ "dwExtVersion", PT_DWORD, (ULONG_PTR) dwDefPhoneExtVersion, NULL },
|
|
{ "lpPhoneDevCaps", PT_POINTER, (ULONG_PTR) lpDevCaps, lpDevCaps }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (funcIndex == pGetDevCaps ?
|
|
(PFN5) phoneGetDevCaps : (PFN5) phoneGetDevCapsW ) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) phoneGetDevCaps };
|
|
#endif
|
|
|
|
CHK_PHONEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneAppSel->hPhoneApp;
|
|
|
|
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 },
|
|
{ "dwPhoneInfoSize", FT_SIZE, lpDevCaps->dwPhoneInfoSize, NULL },
|
|
{ "dwPhoneInfoOffset", FT_OFFSET, lpDevCaps->dwPhoneInfoOffset, NULL },
|
|
{ "dwPermanentPhoneID", FT_DWORD, lpDevCaps->dwPermanentPhoneID, NULL },
|
|
{ "dwPhoneNameSize", FT_SIZE, lpDevCaps->dwPhoneNameSize, NULL },
|
|
{ "dwPhoneNameOffset", FT_OFFSET, lpDevCaps->dwPhoneNameOffset, NULL },
|
|
{ "dwStringFormat", FT_ORD, lpDevCaps->dwStringFormat, aStringFormats },
|
|
{ "dwPhoneStates", FT_FLAGS, lpDevCaps->dwPhoneStates, aPhoneStates },
|
|
{ "dwHookSwitchDevs", FT_FLAGS, lpDevCaps->dwHookSwitchDevs, aHookSwitchDevs },
|
|
{ "dwHandsetHookSwitchModes", FT_FLAGS, lpDevCaps->dwHandsetHookSwitchModes, aHookSwitchModes },
|
|
{ "dwSpeakerHookSwitchModes", FT_FLAGS, lpDevCaps->dwSpeakerHookSwitchModes, aHookSwitchModes },
|
|
{ "dwHeadsetHookSwitchModes", FT_FLAGS, lpDevCaps->dwHeadsetHookSwitchModes, aHookSwitchModes },
|
|
{ "dwVolumeFlags", FT_FLAGS, lpDevCaps->dwVolumeFlags, aHookSwitchDevs },
|
|
{ "dwGainFlags", FT_FLAGS, lpDevCaps->dwGainFlags, aHookSwitchDevs },
|
|
{ "dwDisplayNumRows", FT_DWORD, lpDevCaps->dwDisplayNumRows, NULL },
|
|
{ "dwDisplayNumColumns", FT_DWORD, lpDevCaps->dwDisplayNumColumns, NULL },
|
|
{ "dwNumRingModes", FT_DWORD, lpDevCaps->dwNumRingModes, NULL },
|
|
{ "dwNumButtonLamps", FT_DWORD, lpDevCaps->dwNumButtonLamps, NULL },
|
|
{ "dwButtonModesSize", FT_SIZE, lpDevCaps->dwButtonModesSize, NULL },
|
|
{ "dwButtonModesOffset", FT_OFFSET, lpDevCaps->dwButtonModesOffset, NULL },
|
|
{ "dwButtonFunctionsSize", FT_SIZE, lpDevCaps->dwButtonFunctionsSize, NULL },
|
|
{ "dwButtonFunctionsOffset", FT_OFFSET, lpDevCaps->dwButtonFunctionsOffset, NULL },
|
|
{ "dwLampModesSize", FT_SIZE, lpDevCaps->dwLampModesSize, NULL },
|
|
{ "dwLampModesOffset", FT_OFFSET, lpDevCaps->dwLampModesOffset, NULL },
|
|
{ "dwNumSetData", FT_DWORD, lpDevCaps->dwNumSetData, NULL },
|
|
{ "dwSetDataSize", FT_SIZE, lpDevCaps->dwSetDataSize, NULL },
|
|
{ "dwSetDataOffset", FT_OFFSET, lpDevCaps->dwSetDataOffset, NULL },
|
|
{ "dwNumGetData", FT_DWORD, lpDevCaps->dwNumGetData, NULL },
|
|
{ "dwGetDataSize", FT_SIZE, lpDevCaps->dwGetDataSize, NULL },
|
|
{ "dwGetDataOffset", FT_OFFSET, lpDevCaps->dwGetDataOffset, NULL },
|
|
{ "dwDevSpecificSize", FT_SIZE, lpDevCaps->dwDevSpecificSize, NULL },
|
|
{ "dwDevSpecificOffset", FT_OFFSET, lpDevCaps->dwDevSpecificOffset, NULL }
|
|
#if TAPI_2_0
|
|
,
|
|
{ "dwDeviceClassesSize", FT_SIZE, 0, NULL },
|
|
{ "dwDeviceClassesOffset", FT_OFFSET, 0, NULL },
|
|
{ "dwPhoneFeatures", FT_FLAGS, 0, aPhoneFeatures },
|
|
{ "dwSettableHandsetHookSwitchModes", FT_FLAGS, 0, aHookSwitchModes },
|
|
{ "dwSettableSpeakerHookSwitchModes", FT_FLAGS, 0, aHookSwitchModes },
|
|
{ "dwSettableHeadsetHookSwitchModes", FT_FLAGS, 0, aHookSwitchModes },
|
|
{ "dwMonitoredHandsetHookSwitchModes", FT_FLAGS, 0, aHookSwitchModes },
|
|
{ "dwMonitoredSpeakerHookSwitchModes", FT_FLAGS, 0, aHookSwitchModes },
|
|
{ "dwMonitoredHeadsetHookSwitchModes", FT_FLAGS, 0, aHookSwitchModes }
|
|
#if TAPI_2_2
|
|
,
|
|
{ "PermanentPhoneGuid(Size)", FT_SIZE, sizeof (lpDevCaps->PermanentPhoneGuid), NULL },
|
|
{ "PermanentPhoneGuid(Offset)", FT_OFFSET, ((LPBYTE) &lpDevCaps->PermanentPhoneGuid) - ((LPBYTE) lpDevCaps), NULL }
|
|
#endif
|
|
#endif
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpDevCaps, "PHONECAPS", 0, fields
|
|
};
|
|
|
|
|
|
if (params[2].dwValue < 0x00020000)
|
|
{
|
|
fieldHeader.dwNumFields = 33;
|
|
}
|
|
#if TAPI_2_0
|
|
else
|
|
{
|
|
fieldHeader.dwNumFields = 42;
|
|
|
|
fields[33].dwValue = lpDevCaps->dwDeviceClassesSize;
|
|
fields[34].dwValue = lpDevCaps->dwDeviceClassesOffset;
|
|
fields[35].dwValue = lpDevCaps->dwPhoneFeatures;
|
|
fields[36].dwValue = lpDevCaps->dwSettableHandsetHookSwitchModes;
|
|
fields[37].dwValue = lpDevCaps->dwSettableSpeakerHookSwitchModes;
|
|
fields[38].dwValue = lpDevCaps->dwSettableHeadsetHookSwitchModes;
|
|
fields[39].dwValue = lpDevCaps->dwMonitoredHandsetHookSwitchModes;
|
|
fields[40].dwValue = lpDevCaps->dwMonitoredSpeakerHookSwitchModes;
|
|
fields[41].dwValue = lpDevCaps->dwMonitoredHeadsetHookSwitchModes;
|
|
#if TAPI_2_2
|
|
if (params[2].dwValue >= 0x20002)
|
|
{
|
|
fieldHeader.dwNumFields += 2;
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetDisplay:
|
|
{
|
|
LPVARSTRING lpDisplay = (LPVARSTRING) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpDisplay", PT_POINTER, (ULONG_PTR) lpDisplay, lpDisplay }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) phoneGetDisplay };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
memset (pBigBuf, 0, (size_t) dwBigBufSize);
|
|
lpDisplay->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpDisplay);
|
|
|
|
ShowVARSTRING (lpDisplay);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetGain:
|
|
{
|
|
DWORD dwGain;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwHookSwitchDev", PT_ORDINAL, (ULONG_PTR) PHONEHOOKSWITCHDEV_HANDSET, aHookSwitchDevs },
|
|
{ "lpdwGain", PT_POINTER, (ULONG_PTR) &dwGain, &dwGain }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneGetGain };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
ShowStr ("%sdwGain=x%lx", szTab, dwGain);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetHookSwitch:
|
|
{
|
|
DWORD dwHookSwitchDevs;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpdwHookSwitchDevs", PT_POINTER, (ULONG_PTR) &dwHookSwitchDevs, &dwHookSwitchDevs },
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) phoneGetHookSwitch };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
char szDevsOnHook[32] = "";
|
|
char szDevsOffHook[32] = "";
|
|
|
|
if (dwHookSwitchDevs & PHONEHOOKSWITCHDEV_HANDSET)
|
|
{
|
|
strcat (szDevsOffHook, "HANDSET ");
|
|
}
|
|
else
|
|
{
|
|
strcat (szDevsOnHook, "HANDSET ");
|
|
}
|
|
|
|
if (dwHookSwitchDevs & PHONEHOOKSWITCHDEV_SPEAKER)
|
|
{
|
|
strcat (szDevsOffHook, "SPEAKER ");
|
|
}
|
|
else
|
|
{
|
|
strcat (szDevsOnHook, "SPEAKER ");
|
|
}
|
|
|
|
if (dwHookSwitchDevs & PHONEHOOKSWITCHDEV_HEADSET)
|
|
{
|
|
strcat (szDevsOffHook, "HEADSET");
|
|
}
|
|
else
|
|
{
|
|
strcat (szDevsOnHook, "HEADSET");
|
|
}
|
|
|
|
ShowStr ("%sOn hook : %s", szTab, szDevsOnHook);
|
|
ShowStr ("%sOff hook: %s", szTab, szDevsOffHook);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetIcon:
|
|
#if TAPI_2_0
|
|
case pGetIconW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE];
|
|
HICON hIcon;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefPhoneDeviceID, 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 == pGetIcon ?
|
|
(PFN3) phoneGetIcon : (PFN3) phoneGetIconW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneGetIcon };
|
|
#endif
|
|
|
|
strcpy (szDeviceClass, szDefPhoneDeviceClass);
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
DialogBoxParam (
|
|
ghInst,
|
|
(LPCSTR)MAKEINTRESOURCE(IDD_DIALOG5),
|
|
(HWND) ghwndMain,
|
|
(DLGPROC) IconDlgProc,
|
|
(LPARAM) hIcon
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetID:
|
|
#if TAPI_2_0
|
|
case pGetIDW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE];
|
|
LPVARSTRING lpDevID = (LPVARSTRING) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpDeviceID", PT_POINTER, (ULONG_PTR) lpDevID, lpDevID },
|
|
{ szlpszDeviceClass, PT_STRING, (ULONG_PTR) szDeviceClass, szDeviceClass }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (funcIndex == pGetID ?
|
|
(PFN3) phoneGetID : (PFN3) phoneGetIDW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneGetID };
|
|
#endif
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
memset (lpDevID, 0, (size_t) dwBigBufSize);
|
|
lpDevID->dwTotalSize = dwBigBufSize;
|
|
|
|
strcpy (szDeviceClass, szDefPhoneDeviceClass);
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpDevID);
|
|
|
|
ShowVARSTRING (lpDevID);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetLamp:
|
|
{
|
|
DWORD dwLampMode;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwButtonLampID", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpdwLampMode", PT_POINTER, (ULONG_PTR) &dwLampMode, &dwLampMode }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneGetLamp };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
for (i = 0; aLampModes[i].dwVal != 0xffffffff; i++)
|
|
{
|
|
if (dwLampMode == aLampModes[i].dwVal)
|
|
{
|
|
ShowStr ("%slamp mode = %s", szTab, aLampModes[i].lpszVal);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (aLampModes[i].dwVal == 0xffffffff)
|
|
{
|
|
ShowStr ("%sdwLampMode=%xlx (invalid)", szTab, dwLampMode);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case pGetMessage:
|
|
{
|
|
PHONEMESSAGE msg;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhoneApp, 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_PHONEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneAppSel->hPhoneApp;
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Max timeout of 2 seconds (don't want to hang app & excite user)
|
|
|
|
params[2].dwValue = (params[2].dwValue > 2000 ?
|
|
2000 : params[2].dwValue);
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = phoneGetMessage(
|
|
(HPHONEAPP) params[0].dwValue,
|
|
(LPPHONEMESSAGE) params[1].dwValue,
|
|
(DWORD) params[2].dwValue
|
|
);
|
|
|
|
ShowPhoneFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
tapiCallback(
|
|
msg.hDevice,
|
|
msg.dwMessageID,
|
|
msg.dwCallbackInstance,
|
|
msg.dwParam1,
|
|
msg.dwParam2,
|
|
msg.dwParam3
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case pGetRing:
|
|
{
|
|
DWORD dwRingMode, dwVolume;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpdwRingMode", PT_POINTER, (ULONG_PTR) &dwRingMode, &dwRingMode },
|
|
{ "lpdwVolume", PT_POINTER, (ULONG_PTR) &dwVolume, &dwVolume }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneGetRing };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
ShowStr(
|
|
"%sdwRingMode=x%lx, dwVolume=x%lx",
|
|
szTab,
|
|
dwRingMode,
|
|
dwVolume
|
|
);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetStatus:
|
|
#if TAPI_2_0
|
|
case pGetStatusW:
|
|
#endif
|
|
{
|
|
LPPHONESTATUS lpPhoneStatus = (LPPHONESTATUS) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpPhoneStatus", PT_POINTER, (ULONG_PTR) lpPhoneStatus, lpPhoneStatus }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (funcIndex == pGetStatus ?
|
|
(PFN2) phoneGetStatus : (PFN2) phoneGetStatusW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) phoneGetStatus };
|
|
#endif
|
|
DWORD dwAPIVersion;
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
dwAPIVersion = pPhoneSel->dwAPIVersion;
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
memset (pBigBuf, 0, (size_t) dwBigBufSize);
|
|
lpPhoneStatus->dwTotalSize = dwBigBufSize;
|
|
|
|
if ((lResult = DoFunc (¶msHeader)) == 0)
|
|
{
|
|
ShowStructByDWORDs (lpPhoneStatus);
|
|
|
|
if (dwDumpStructsFlags & DS_NONZEROFIELDS)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwStatusFlags", FT_FLAGS, lpPhoneStatus->dwStatusFlags, aPhoneStatusFlags },
|
|
{ "dwNumOwners", FT_DWORD, lpPhoneStatus->dwNumOwners, NULL },
|
|
{ "dwNumMonitors", FT_DWORD, lpPhoneStatus->dwNumMonitors, NULL },
|
|
{ "dwRingMode", FT_DWORD, lpPhoneStatus->dwRingMode, NULL },
|
|
{ "dwRingVolume", FT_DWORD, lpPhoneStatus->dwRingVolume, NULL },
|
|
{ "dwHandsetHookSwitchMode", FT_FLAGS, lpPhoneStatus->dwHandsetHookSwitchMode, aHookSwitchModes },
|
|
{ "dwHandsetVolume", FT_DWORD, lpPhoneStatus->dwHandsetVolume, NULL },
|
|
{ "dwHandsetGain", FT_DWORD, lpPhoneStatus->dwHandsetGain, NULL },
|
|
{ "dwSpeakerHookSwitchMode", FT_FLAGS, lpPhoneStatus->dwSpeakerHookSwitchMode, aHookSwitchModes },
|
|
{ "dwSpeakerVolume", FT_DWORD, lpPhoneStatus->dwSpeakerVolume, NULL },
|
|
{ "dwSpeakerGain", FT_DWORD, lpPhoneStatus->dwSpeakerGain, NULL },
|
|
{ "dwHeadsetHookSwitchMode", FT_FLAGS, lpPhoneStatus->dwHeadsetHookSwitchMode, aHookSwitchModes },
|
|
{ "dwHeadsetVolume", FT_DWORD, lpPhoneStatus->dwHeadsetVolume, NULL },
|
|
{ "dwHeadsetGain", FT_DWORD, lpPhoneStatus->dwHeadsetGain, NULL },
|
|
{ "dwDisplaySize", FT_SIZE, lpPhoneStatus->dwDisplaySize, NULL },
|
|
{ "dwDisplayOffset", FT_OFFSET, lpPhoneStatus->dwDisplayOffset, NULL },
|
|
{ "dwLampModesSize", FT_SIZE, lpPhoneStatus->dwLampModesSize, NULL },
|
|
{ "dwLampModesOffset", FT_OFFSET, lpPhoneStatus->dwLampModesOffset, NULL },
|
|
{ "dwOwnerNameSize", FT_SIZE, lpPhoneStatus->dwOwnerNameSize, NULL },
|
|
{ "dwOwnerNameOffset", FT_OFFSET, lpPhoneStatus->dwOwnerNameOffset, NULL },
|
|
{ "dwDevSpecificSize", FT_SIZE, lpPhoneStatus->dwDevSpecificSize, NULL },
|
|
{ "dwDevSpecificOffset", FT_OFFSET, lpPhoneStatus->dwDevSpecificOffset, NULL }
|
|
#if TAPI_2_0
|
|
,
|
|
{ "dwPhoneFeatures", FT_FLAGS, 0, aPhoneFeatures }
|
|
#endif
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
lpPhoneStatus, "PHONESTATUS", 0, fields
|
|
};
|
|
|
|
|
|
if (dwAPIVersion < 0x00020000)
|
|
{
|
|
fieldHeader.dwNumFields = 22;
|
|
}
|
|
#if TAPI_2_0
|
|
else
|
|
{
|
|
fieldHeader.dwNumFields = 23;
|
|
|
|
fields[22].dwValue = lpPhoneStatus->dwPhoneFeatures;
|
|
}
|
|
#endif
|
|
ShowStructByField (&fieldHeader, FALSE);
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetStatusMessages:
|
|
{
|
|
DWORD aFlags[3];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpdwPhoneStates", PT_POINTER, (ULONG_PTR) &aFlags[0], &aFlags[0] },
|
|
{ "lpdwButtonModes", PT_POINTER, (ULONG_PTR) &aFlags[1], &aFlags[1] },
|
|
{ "lpdwButtonStates", PT_POINTER, (ULONG_PTR) &aFlags[2], &aFlags[2] }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) phoneGetStatusMessages };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
STRUCT_FIELD fields[] =
|
|
{
|
|
{ "dwPhoneStates", FT_FLAGS, aFlags[0], aPhoneStates },
|
|
{ "dwButtonModes", FT_FLAGS, aFlags[1], aButtonModes },
|
|
{ "dwButtonStates", FT_FLAGS, aFlags[2], aButtonStates }
|
|
};
|
|
STRUCT_FIELD_HEADER fieldHeader =
|
|
{
|
|
aFlags,
|
|
"",
|
|
3,
|
|
fields
|
|
};
|
|
|
|
|
|
ShowStructByField (&fieldHeader, TRUE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pGetVolume:
|
|
{
|
|
DWORD dwVolume;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwHookSwitchDev", PT_ORDINAL, (ULONG_PTR) PHONEHOOKSWITCHDEV_HANDSET, aHookSwitchDevs },
|
|
{ "lpdwVolume", PT_POINTER, (ULONG_PTR) &dwVolume, &dwVolume }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneGetVolume };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
ShowStr ("%sdwVolume=x%lx", szTab, dwVolume);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pInitialize:
|
|
{
|
|
DWORD dwNumDevs;
|
|
PMYPHONEAPP pNewPhoneApp;
|
|
char szAppName[MAX_STRING_PARAM_SIZE];
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "lphPhoneApp", 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) &dwNumDevs, &dwNumDevs }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) phoneInitialize };
|
|
|
|
|
|
if (!(pNewPhoneApp = AllocPhoneApp()))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error creating data structure");
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue =
|
|
params[0].u.dwDefValue = (ULONG_PTR) &pNewPhoneApp->hPhoneApp;
|
|
|
|
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))
|
|
{
|
|
FreePhoneApp (pNewPhoneApp);
|
|
break;
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = phoneInitialize(
|
|
(LPHPHONEAPP) params[0].dwValue,
|
|
(HINSTANCE) params[1].dwValue,
|
|
(PHONECALLBACK) params[2].dwValue,
|
|
(LPCSTR) params[3].dwValue,
|
|
(LPDWORD) params[4].dwValue
|
|
);
|
|
|
|
ShowPhoneFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif // WIN32
|
|
if (lResult == 0)
|
|
{
|
|
ShowStr ("%snum phone devs=%ld", szTab, dwNumDevs);
|
|
UpdateWidgetList();
|
|
gdwNumPhoneDevs = dwNumDevs;
|
|
SelectWidget ((PMYWIDGET) pNewPhoneApp);
|
|
}
|
|
else
|
|
{
|
|
FreePhoneApp (pNewPhoneApp);
|
|
}
|
|
|
|
break;
|
|
}
|
|
#if TAPI_2_0
|
|
case pInitializeEx:
|
|
case pInitializeExW:
|
|
{
|
|
char szAppName[MAX_STRING_PARAM_SIZE];
|
|
DWORD dwNumDevs, dwAPIVersion;
|
|
PMYPHONEAPP pNewPhoneApp;
|
|
PHONEINITIALIZEEXPARAMS initExParams;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "lphPhoneApp", 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) &dwNumDevs, &dwNumDevs },
|
|
{ "lpdwAPIVersion", PT_POINTER, (ULONG_PTR) &dwAPIVersion, &dwAPIVersion },
|
|
{ " ->dwAPIVersion",PT_ORDINAL,(ULONG_PTR) dwDefPhoneAPIVersion, aAPIVersions },
|
|
{ "lpInitExParams", PT_POINTER, (ULONG_PTR) &initExParams, &initExParams },
|
|
{ " ->dwOptions", PT_ORDINAL, (ULONG_PTR) PHONEINITIALIZEEXOPTION_USECOMPLETIONPORT, aPhoneInitExOptions }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 9, funcIndex, params, NULL };
|
|
|
|
|
|
if (!(pNewPhoneApp = AllocPhoneApp()))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error creating data structure");
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue =
|
|
params[0].u.dwDefValue = (ULONG_PTR) &pNewPhoneApp->hPhoneApp;
|
|
|
|
strcpy (szAppName, szDefAppName);
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
FreePhoneApp (pNewPhoneApp);
|
|
|
|
break;
|
|
}
|
|
|
|
initExParams.dwTotalSize = sizeof (PHONEINITIALIZEEXPARAMS);
|
|
initExParams.dwOptions = (DWORD) params[8].dwValue;
|
|
initExParams.Handles.hCompletionPort = ghCompletionPort;
|
|
|
|
dwAPIVersion = (DWORD) params[6].dwValue;
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
if (funcIndex == pInitializeEx)
|
|
{
|
|
lResult = phoneInitializeEx(
|
|
(LPHPHONEAPP) params[0].dwValue,
|
|
(HINSTANCE) params[1].dwValue,
|
|
(PHONECALLBACK) params[2].dwValue,
|
|
(LPCSTR) params[3].dwValue,
|
|
(LPDWORD) params[4].dwValue,
|
|
(LPDWORD) params[5].dwValue,
|
|
(LPPHONEINITIALIZEEXPARAMS) params[7].dwValue
|
|
);
|
|
}
|
|
else
|
|
{
|
|
MakeWideString ((LPVOID) params[3].dwValue);
|
|
|
|
lResult = phoneInitializeExW(
|
|
(LPHPHONEAPP) params[0].dwValue,
|
|
(HINSTANCE) params[1].dwValue,
|
|
(PHONECALLBACK) params[2].dwValue,
|
|
(LPCWSTR) params[3].dwValue,
|
|
(LPDWORD) params[4].dwValue,
|
|
(LPDWORD) params[5].dwValue,
|
|
(LPPHONEINITIALIZEEXPARAMS) params[7].dwValue
|
|
);
|
|
}
|
|
|
|
ShowPhoneFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
ShowStr ("%snum phone devs = %ld", szTab, dwNumDevs);
|
|
|
|
if (params[7].dwValue != 0 &&
|
|
(initExParams.dwOptions & 3) ==
|
|
PHONEINITIALIZEEXOPTION_USEEVENT)
|
|
{
|
|
ShowStr(
|
|
"hPhoneApp x%x was created with the\r\n" \
|
|
"USEEVENT option, so you must use\r\n" \
|
|
"phoneGetMessage to retrieve messages.",
|
|
pNewPhoneApp->hPhoneApp
|
|
);
|
|
}
|
|
|
|
|
|
//SendMessage (ghwndLineApps, LB_SETCURSEL, (WPARAM) i, 0);
|
|
UpdateWidgetList();
|
|
gdwNumPhoneDevs = dwNumDevs;
|
|
SelectWidget ((PMYWIDGET) pNewPhoneApp);
|
|
}
|
|
else
|
|
{
|
|
FreePhoneApp (pNewPhoneApp);
|
|
}
|
|
|
|
break;
|
|
}
|
|
#endif
|
|
case pOpen:
|
|
{
|
|
PMYPHONE pNewPhone;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "hPhoneApp", PT_DWORD, 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, dwDefPhoneDeviceID, NULL },
|
|
{ "lphPhone", PT_POINTER, 0, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, dwDefPhoneAPIVersion, aAPIVersions },
|
|
{ "dwExtVersion", PT_DWORD, dwDefPhoneExtVersion, NULL },
|
|
{ "dwCallbackInstance", PT_DWORD, 0, NULL },
|
|
{ "dwPrivilege", PT_ORDINAL, dwDefPhonePrivilege, aPhonePrivileges }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 7, funcIndex, params, (PFN7) phoneOpen };
|
|
|
|
|
|
CHK_PHONEAPP_SELECTED()
|
|
|
|
if (!(pNewPhone = AllocPhone(pPhoneAppSel)))
|
|
{
|
|
ErrorAlert();
|
|
ShowStr ("error creating data structure");
|
|
break;
|
|
}
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneAppSel->hPhoneApp;
|
|
params[2].dwValue =
|
|
params[2].u.dwDefValue = (ULONG_PTR) &pNewPhone->hPhone;
|
|
|
|
if ((lResult = DoFunc(¶msHeader)) == 0)
|
|
{
|
|
if ((HPHONEAPP) params[0].dwValue != pPhoneAppSel->hPhoneApp)
|
|
{
|
|
//
|
|
// User has switched phone apps on us we need to recreate
|
|
// the phone data structure under a different phone app
|
|
//
|
|
|
|
PMYPHONE pNewPhone2 =
|
|
AllocPhone (GetPhoneApp((HPHONEAPP)params[0].dwValue));
|
|
|
|
if (pNewPhone2)
|
|
{
|
|
pNewPhone2->hPhone = pNewPhone->hPhone;
|
|
|
|
FreePhone (pNewPhone);
|
|
|
|
pNewPhone = pNewPhone2;
|
|
}
|
|
else
|
|
{
|
|
// BUGBUG show error: couldn't alloc a new phone struct
|
|
|
|
phoneClose (pNewPhone->hPhone);
|
|
FreePhone (pNewPhone);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Save info about this phone that we can display later
|
|
//
|
|
|
|
pNewPhone->hPhoneApp = (HPHONEAPP) params[0].dwValue;
|
|
pNewPhone->dwDevID = (DWORD) params[1].dwValue;
|
|
pNewPhone->dwAPIVersion = (DWORD) params[3].dwValue;
|
|
pNewPhone->dwPrivilege = (DWORD) params[6].dwValue;
|
|
|
|
UpdateWidgetList();
|
|
SelectWidget ((PMYWIDGET) pNewPhone);
|
|
}
|
|
else
|
|
{
|
|
FreePhone (pNewPhone);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pNegotiateAPIVersion:
|
|
{
|
|
DWORD dwAPIVersion;
|
|
PHONEEXTENSIONID extID;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "hPhoneApp", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefPhoneDeviceID, 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) phoneNegotiateAPIVersion };
|
|
|
|
|
|
CHK_PHONEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneAppSel->hPhoneApp;
|
|
|
|
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 pNegotiateExtVersion:
|
|
{
|
|
DWORD dwExtVersion;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhoneApp, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ szdwDeviceID, PT_DWORD, (ULONG_PTR) dwDefPhoneDeviceID, NULL },
|
|
{ szdwAPIVersion, PT_ORDINAL, (ULONG_PTR) dwDefPhoneAPIVersion, 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) phoneNegotiateExtVersion };
|
|
|
|
|
|
CHK_PHONEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneAppSel->hPhoneApp;
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
ShowStr ("%sdwExtVersion=x%lx", szTab, dwExtVersion);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case pSetButtonInfo:
|
|
#if TAPI_2_0
|
|
case pSetButtonInfoW:
|
|
#endif
|
|
{
|
|
char szButtonText[MAX_STRING_PARAM_SIZE] = "button text";
|
|
char szDevSpecific[MAX_STRING_PARAM_SIZE] = "dev specific info";
|
|
LPPHONEBUTTONINFO lpButtonInfo = (LPPHONEBUTTONINFO) pBigBuf;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwButtonLampID", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpData", PT_POINTER, (ULONG_PTR) lpButtonInfo, lpButtonInfo },
|
|
{ " ->dwButtonMode", PT_FLAGS, (ULONG_PTR) PHONEBUTTONMODE_CALL, aButtonModes },
|
|
{ " ->dwButtonFunction", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
// { " ->dwButtonFunction", PT_???, , aButtonFunctions },
|
|
{ " ->ButtonText", PT_STRING, (ULONG_PTR) szButtonText, szButtonText },
|
|
{ " ->DevSpecific", PT_STRING, (ULONG_PTR) szDevSpecific, szDevSpecific },
|
|
#if TAPI_1_1
|
|
{ " ->dwButtonState", PT_FLAGS, (ULONG_PTR) 0, aButtonStates }
|
|
#endif
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
#if TAPI_1_1
|
|
{ 8, funcIndex, params, NULL };
|
|
#else
|
|
{ 7, funcIndex, params, NULL };
|
|
#endif
|
|
DWORD dwFixedStructSize = sizeof(PHONEBUTTONINFO), dwLength;
|
|
|
|
|
|
// BUGBUG need a PT_ type to specify constants (ords?) for ->dwButtonFunction
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
|
|
//
|
|
// Note: the dwButtonState field in PHONEBUTTONINFO is only valid
|
|
// in 1.4+. It'll be ignored for phones opened w/ ver 1.3.
|
|
//
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
memset (lpButtonInfo, 0, (size_t) dwBigBufSize);
|
|
|
|
if (dwBigBufSize >= 4)
|
|
{
|
|
lpButtonInfo->dwTotalSize = dwBigBufSize;
|
|
|
|
if (dwBigBufSize >= 0x24) // sizeof(PHONEBUTTONINFO) in ver 0x10003
|
|
{
|
|
lpButtonInfo->dwButtonMode = (DWORD) params[3].dwValue;
|
|
lpButtonInfo->dwButtonFunction = (DWORD) params[4].dwValue;
|
|
|
|
if ((params[5].dwValue == (ULONG_PTR) szButtonText) &&
|
|
(dwLength = (DWORD) strlen (szButtonText)) &&
|
|
(dwBigBufSize >= (dwFixedStructSize + dwLength + 1)))
|
|
{
|
|
lpButtonInfo->dwButtonTextSize = dwLength + 1;
|
|
lpButtonInfo->dwButtonTextOffset = dwFixedStructSize;
|
|
#if TAPI_2_0
|
|
if (gbWideStringParams)
|
|
{
|
|
lpButtonInfo->dwButtonTextSize *= sizeof (WCHAR);
|
|
|
|
MultiByteToWideChar(
|
|
CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
(LPCSTR) szButtonText,
|
|
-1,
|
|
(LPWSTR) (((char far *) lpButtonInfo) +
|
|
dwFixedStructSize),
|
|
MAX_STRING_PARAM_SIZE / 2
|
|
);
|
|
}
|
|
else
|
|
{
|
|
strcpy(
|
|
((char far *) lpButtonInfo) + dwFixedStructSize,
|
|
szButtonText
|
|
);
|
|
}
|
|
#else
|
|
strcpy(
|
|
((char far *) lpButtonInfo) + dwFixedStructSize,
|
|
szButtonText
|
|
);
|
|
#endif
|
|
}
|
|
|
|
if ((params[6].dwValue == (ULONG_PTR) szDevSpecific) &&
|
|
(dwLength = (DWORD) strlen (szDevSpecific)) &&
|
|
(dwBigBufSize >= (dwFixedStructSize + dwLength + 1 +
|
|
lpButtonInfo->dwButtonTextSize)))
|
|
{
|
|
lpButtonInfo->dwDevSpecificSize = dwLength + 1;
|
|
lpButtonInfo->dwDevSpecificOffset = dwFixedStructSize +
|
|
lpButtonInfo->dwButtonTextSize;
|
|
#if TAPI_2_0
|
|
if (gbWideStringParams)
|
|
{
|
|
lpButtonInfo->dwDevSpecificSize *= sizeof (WCHAR);
|
|
|
|
MultiByteToWideChar(
|
|
CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
(LPCSTR) szDevSpecific,
|
|
-1,
|
|
(LPWSTR) (((char far *) lpButtonInfo) +
|
|
lpButtonInfo->dwDevSpecificOffset),
|
|
MAX_STRING_PARAM_SIZE / 2
|
|
);
|
|
}
|
|
else
|
|
{
|
|
strcpy(
|
|
((char far *) lpButtonInfo) +
|
|
lpButtonInfo->dwDevSpecificOffset,
|
|
szDevSpecific
|
|
);
|
|
}
|
|
#else
|
|
strcpy(
|
|
((char far *) lpButtonInfo) +
|
|
lpButtonInfo->dwDevSpecificOffset,
|
|
szDevSpecific
|
|
);
|
|
#endif
|
|
}
|
|
#if TAPI_1_1
|
|
if (dwBigBufSize >= dwFixedStructSize)
|
|
{
|
|
lpButtonInfo->dwButtonState = (DWORD) params[7].dwValue;
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#if TAPI_2_0
|
|
if (funcIndex == pSetButtonInfo)
|
|
{
|
|
lResult = phoneSetButtonInfo(
|
|
(HPHONE) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(LPPHONEBUTTONINFO) params[2].dwValue
|
|
);
|
|
}
|
|
else
|
|
{
|
|
lResult = phoneSetButtonInfoW(
|
|
(HPHONE) params[0].dwValue,
|
|
(DWORD) params[1].dwValue,
|
|
(LPPHONEBUTTONINFO) params[2].dwValue
|
|
);
|
|
}
|
|
#else
|
|
lResult = phoneSetButtonInfo(
|
|
(HPHONE) params[0].dwValue,
|
|
params[1].dwValue,
|
|
(LPPHONEBUTTONINFO) params[2].dwValue
|
|
);
|
|
#endif
|
|
ShowPhoneFuncResult (aFuncNames[funcIndex], lResult);
|
|
|
|
break;
|
|
}
|
|
case pSetData:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwDataID", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpData", PT_POINTER, (ULONG_PTR) pBigBuf, pBigBuf },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) dwBigBufSize, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) phoneSetData };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case pSetDisplay:
|
|
{
|
|
char szDisplay[MAX_STRING_PARAM_SIZE] = "123";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwRow", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "dwColumn", PT_DWORD, (ULONG_PTR) 0, NULL },
|
|
{ "lpsDisplay", PT_STRING, (ULONG_PTR) szDisplay, szDisplay },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) 3, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 5, funcIndex, params, (PFN5) phoneSetDisplay };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case pSetGain:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, 0, NULL },
|
|
{ "dwHookSwitchDev", PT_ORDINAL, PHONEHOOKSWITCHDEV_HANDSET, aHookSwitchDevs },
|
|
{ "dwGain", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneSetGain };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case pSetHookSwitch:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, 0, NULL },
|
|
{ "dwHookSwitchDevs", PT_FLAGS, PHONEHOOKSWITCHDEV_HANDSET, aHookSwitchDevs },
|
|
{ "dwHookSwitchMode", PT_ORDINAL, PHONEHOOKSWITCHMODE_ONHOOK, aHookSwitchModes }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneSetHookSwitch };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case pSetLamp:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, 0, NULL },
|
|
{ "dwButtonLampID", PT_DWORD, 0, NULL },
|
|
{ "dwLampMode", PT_ORDINAL, PHONELAMPMODE_OFF, aLampModes }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneSetLamp };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case pSetRing:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, 0, NULL },
|
|
{ "dwRingMode", PT_DWORD, 0, NULL },
|
|
{ "dwVolume", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneSetRing };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case pSetStatusMessages:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, 0, NULL },
|
|
{ "dwPhoneStates", PT_FLAGS, 0, aPhoneStates },
|
|
{ "dwButtonModes", PT_FLAGS, 0, aButtonModes },
|
|
{ "dwButtonStates", PT_FLAGS, 0, aButtonStates }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) phoneSetStatusMessages };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case pSetVolume:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhone, PT_DWORD, 0, NULL },
|
|
{ "dwHookSwitchDev", PT_ORDINAL, PHONEHOOKSWITCHDEV_HANDSET, aHookSwitchDevs },
|
|
{ "dwVolume", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 3, funcIndex, params, (PFN3) phoneSetVolume };
|
|
|
|
|
|
CHK_PHONE_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneSel->hPhone;
|
|
|
|
lResult = DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case pShutdown:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szhPhoneApp, PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, (PFN1) phoneShutdown };
|
|
|
|
|
|
CHK_PHONEAPP_SELECTED()
|
|
|
|
params[0].dwValue = (ULONG_PTR) pPhoneAppSel->hPhoneApp;
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
ShowWidgetList (FALSE);
|
|
FreePhoneApp (GetPhoneApp((HPHONEAPP) params[0].dwValue));
|
|
ShowWidgetList (TRUE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
case tGetLocationInfo:
|
|
#if TAPI_2_0
|
|
case tGetLocationInfoW:
|
|
#endif
|
|
{
|
|
char szCountryCode[MAX_STRING_PARAM_SIZE] = "";
|
|
char szCityCode[MAX_STRING_PARAM_SIZE] = "";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "lpszCountryCode", PT_POINTER, (ULONG_PTR) szCountryCode, szCountryCode },
|
|
{ "lpszCityCode", PT_POINTER, (ULONG_PTR) szCityCode, szCityCode }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (funcIndex == tGetLocationInfo ?
|
|
(PFN2) tapiGetLocationInfo : (PFN2) tapiGetLocationInfoW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) tapiGetLocationInfo };
|
|
#endif
|
|
|
|
if (DoFunc (¶msHeader) == 0)
|
|
{
|
|
#if TAPI_2_0
|
|
ShowStr(
|
|
(gbWideStringParams ? "%s*lpszCountryCode='%ws'" :
|
|
"%s*lpszCountryCode='%s'"),
|
|
szTab,
|
|
szCountryCode
|
|
);
|
|
|
|
ShowStr(
|
|
(gbWideStringParams ? "%s*lpszCityCode='%ws'" :
|
|
"%s*lpszCityCode='%s'"),
|
|
szTab,
|
|
szCityCode
|
|
);
|
|
#else
|
|
ShowStr ("%s*lpszCountryCode='%s'", szTab, szCountryCode);
|
|
ShowStr ("%s*lpszCityCode='%s'", szTab, szCityCode);
|
|
#endif
|
|
}
|
|
|
|
break;
|
|
}
|
|
case tRequestDrop:
|
|
{
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "hWnd", PT_DWORD, (ULONG_PTR) ghwndMain, 0 },
|
|
{ "wRequestID", PT_DWORD, (ULONG_PTR) 0, 0 }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 2, funcIndex, params, (PFN2) tapiRequestDrop };
|
|
|
|
#ifdef WIN32
|
|
DoFunc (¶msHeader);
|
|
#else
|
|
//
|
|
// NOTE: on win16 HWNDSs & WPARAMs are 16 bits, so we've to hard
|
|
// code this
|
|
//
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = tapiRequestDrop(
|
|
(HWND) params[0].dwValue,
|
|
(WPARAM) params[1].dwValue
|
|
);
|
|
|
|
ShowTapiFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif // WIN32
|
|
break;
|
|
}
|
|
case tRequestMakeCall:
|
|
#if TAPI_2_0
|
|
case tRequestMakeCallW:
|
|
#endif
|
|
{
|
|
char szDestAddress[MAX_STRING_PARAM_SIZE];
|
|
char szAppName[MAX_STRING_PARAM_SIZE];
|
|
char szCalledParty[MAX_STRING_PARAM_SIZE] = "";
|
|
char szComment[MAX_STRING_PARAM_SIZE] = "";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ szlpszDestAddress, PT_STRING, (ULONG_PTR) szDestAddress, szDestAddress },
|
|
{ szlpszAppName, PT_STRING, (ULONG_PTR) szAppName, szAppName },
|
|
{ "lpszCalledParty", PT_STRING, (ULONG_PTR) szCalledParty, szCalledParty },
|
|
{ "lpszComment", PT_STRING, (ULONG_PTR) szComment, szComment }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (funcIndex == tRequestMakeCall ?
|
|
(PFN4) tapiRequestMakeCall : (PFN4) tapiRequestMakeCallW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 4, funcIndex, params, (PFN4) tapiRequestMakeCall };
|
|
#endif
|
|
|
|
strcpy (szDestAddress, szDefDestAddress);
|
|
strcpy (szAppName, szDefAppName);
|
|
|
|
DoFunc (¶msHeader);
|
|
|
|
break;
|
|
}
|
|
case tRequestMediaCall:
|
|
#if TAPI_2_0
|
|
case tRequestMediaCallW:
|
|
#endif
|
|
{
|
|
char szDeviceClass[MAX_STRING_PARAM_SIZE];
|
|
char szDevID[MAX_STRING_PARAM_SIZE] = "0";
|
|
char szDestAddress[MAX_STRING_PARAM_SIZE];
|
|
char szAppName[MAX_STRING_PARAM_SIZE];
|
|
char szCalledParty[MAX_STRING_PARAM_SIZE] = "";
|
|
char szComment[MAX_STRING_PARAM_SIZE] = "";
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "hWnd", PT_DWORD, (ULONG_PTR) ghwndMain, 0 },
|
|
{ "wRequestID", PT_DWORD, (ULONG_PTR) 0, 0 },
|
|
{ szlpszDeviceClass, PT_STRING, (ULONG_PTR) szDeviceClass, szDeviceClass },
|
|
{ "lpDeviceID", PT_STRING, (ULONG_PTR) szDevID, szDevID },
|
|
{ szdwSize, PT_DWORD, (ULONG_PTR) 0, 0 },
|
|
{ "dwSecure", PT_DWORD, (ULONG_PTR) 0, 0 },
|
|
{ szlpszDestAddress, PT_STRING, (ULONG_PTR) szDestAddress, szDestAddress },
|
|
{ szlpszAppName, PT_STRING, (ULONG_PTR) szAppName, szAppName },
|
|
{ "lpszCalledParty", PT_STRING, (ULONG_PTR) szCalledParty, szCalledParty },
|
|
{ "lpszComment", PT_STRING, (ULONG_PTR) szComment, szComment }
|
|
};
|
|
#if TAPI_2_0
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 10, funcIndex, params, (funcIndex == tRequestMediaCall ?
|
|
(PFN10) tapiRequestMediaCall : (PFN10) tapiRequestMediaCallW) };
|
|
#else
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 10, funcIndex, params, (PFN10) tapiRequestMediaCall };
|
|
#endif
|
|
|
|
strcpy (szDeviceClass, szDefLineDeviceClass); // BUGBUG szDefTapiDeviceClass);
|
|
strcpy (szDestAddress, szDefDestAddress);
|
|
strcpy (szAppName, szDefAppName);
|
|
|
|
#ifdef WIN32
|
|
DoFunc (¶msHeader);
|
|
#else
|
|
//
|
|
// NOTE: on win16 HWNDSs & WPARAMs are 16 bits, so we've to hard
|
|
// code this
|
|
//
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
DumpParams (¶msHeader);
|
|
|
|
lResult = tapiRequestMediaCall(
|
|
(HWND) params[0].dwValue,
|
|
(WPARAM) params[1].dwValue,
|
|
(LPCSTR) params[2].dwValue,
|
|
(LPCSTR) params[3].dwValue,
|
|
params[4].dwValue,
|
|
params[5].dwValue,
|
|
(LPCSTR) params[6].dwValue,
|
|
(LPCSTR) params[7].dwValue,
|
|
(LPCSTR) params[8].dwValue,
|
|
(LPCSTR) params[9].dwValue
|
|
);
|
|
|
|
ShowTapiFuncResult (aFuncNames[funcIndex], lResult);
|
|
#endif // WIN32
|
|
break;
|
|
}
|
|
case OpenAllLines:
|
|
{
|
|
DWORD dwDefLineDeviceIDSav = dwDefLineDeviceID;
|
|
|
|
|
|
CHK_LINEAPP_SELECTED()
|
|
|
|
UpdateResults (TRUE);
|
|
ShowWidgetList (FALSE);
|
|
|
|
for(
|
|
dwDefLineDeviceID = 0;
|
|
dwDefLineDeviceID < gdwNumLineDevs;
|
|
dwDefLineDeviceID++
|
|
)
|
|
{
|
|
FuncDriver (lOpen);
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
ShowWidgetList (TRUE);
|
|
|
|
dwDefLineDeviceID = dwDefLineDeviceIDSav;
|
|
|
|
break;
|
|
}
|
|
case OpenAllPhones:
|
|
{
|
|
DWORD dwDefPhoneDeviceIDSav = dwDefPhoneDeviceID;
|
|
|
|
|
|
CHK_PHONEAPP_SELECTED()
|
|
|
|
UpdateResults (TRUE);
|
|
ShowWidgetList (FALSE);
|
|
|
|
for(
|
|
dwDefPhoneDeviceID = 0;
|
|
dwDefPhoneDeviceID < gdwNumPhoneDevs;
|
|
dwDefPhoneDeviceID++
|
|
)
|
|
{
|
|
FuncDriver (pOpen);
|
|
}
|
|
|
|
UpdateResults (FALSE);
|
|
ShowWidgetList (TRUE);
|
|
|
|
dwDefPhoneDeviceID = dwDefPhoneDeviceIDSav;
|
|
|
|
break;
|
|
}
|
|
case CloseHandl:
|
|
{
|
|
#ifdef WIN32
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "hObject", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, NULL };
|
|
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (CloseHandle ((HANDLE) params[0].dwValue))
|
|
{
|
|
ShowStr ("Handle x%lx closed", params[0].dwValue);
|
|
}
|
|
else
|
|
{
|
|
ShowStr ("CloseHandle failed, err=%lx", GetLastError());
|
|
}
|
|
#else
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "idCommDev", PT_DWORD, 0, NULL }
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, NULL };
|
|
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (CloseComm ((int) params[0].dwValue) == 0)
|
|
{
|
|
ShowStr ("Comm dev x%lx closed", params[0].dwValue);
|
|
}
|
|
else
|
|
{
|
|
ShowStr ("CloseComm() failed");
|
|
}
|
|
#endif
|
|
|
|
break;
|
|
}
|
|
case DumpBuffer:
|
|
|
|
ShowStr ("Buffer contents:");
|
|
|
|
ShowBytes(
|
|
(dwBigBufSize > 256 ? 256 : dwBigBufSize),
|
|
pBigBuf,
|
|
1
|
|
);
|
|
|
|
break;
|
|
|
|
#if (INTERNAL_VER >= 0x20000)
|
|
|
|
case iNewLocationW:
|
|
{
|
|
char szNewLocName[MAX_STRING_PARAM_SIZE] = "NewLocN";
|
|
LINEEXTENSIONID extID;
|
|
FUNC_PARAM params[] =
|
|
{
|
|
{ "lpszNewLocName", PT_STRING, (ULONG_PTR) szNewLocName, szNewLocName}
|
|
};
|
|
FUNC_PARAM_HEADER paramsHeader =
|
|
{ 1, funcIndex, params, NULL };
|
|
|
|
|
|
if (!LetUserMungeParams (¶msHeader))
|
|
{
|
|
break;
|
|
}
|
|
|
|
MakeWideString ((LPVOID) szNewLocName);
|
|
|
|
lResult = internalNewLocationW(
|
|
(WCHAR *) params[0].dwValue
|
|
);
|
|
|
|
break;
|
|
}
|
|
|
|
#endif
|
|
|
|
default:
|
|
|
|
ErrorAlert();
|
|
break;
|
|
}
|
|
}
|
|
|
|
#pragma warning (default:4113)
|