mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
885 lines
24 KiB
885 lines
24 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
widget.c
|
|
|
|
Abstract:
|
|
|
|
This module contains
|
|
|
|
Author:
|
|
|
|
Dan Knudson (DanKn) dd-Mmm-1995
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <malloc.h>
|
|
#include "esp.h"
|
|
#include "vars.h"
|
|
|
|
|
|
char szProviderInfo[] = "ESP v1.0";
|
|
|
|
void
|
|
UpdateWidgetList(
|
|
void
|
|
)
|
|
{
|
|
PDRVWIDGET pWidget = gaWidgets;
|
|
|
|
|
|
if (gbDisableUI)
|
|
{
|
|
return;
|
|
}
|
|
|
|
SendMessage (ghwndList1, LB_RESETCONTENT, 0, 0);
|
|
|
|
#ifdef WIN32
|
|
try
|
|
{
|
|
#endif
|
|
while (pWidget)
|
|
{
|
|
char buf[128];
|
|
|
|
|
|
switch (pWidget->dwType)
|
|
{
|
|
case WT_DRVLINE:
|
|
|
|
wsprintf(
|
|
buf,
|
|
"Line%ld, hd=x%lx (ht=x%lx, %s)",
|
|
((PDRVLINE)pWidget)->dwDeviceID,
|
|
pWidget,
|
|
((PDRVLINE)pWidget)->htLine,
|
|
(((PDRVLINE)pWidget)->htLine ? "open" : "closed")
|
|
);
|
|
|
|
break;
|
|
|
|
case WT_DRVCALL:
|
|
{
|
|
int i;
|
|
char far *lpszCallState = "";
|
|
|
|
|
|
for (i = 0; aCallStates[i].dwVal != 0xffffffff; i++)
|
|
{
|
|
if (((PDRVCALL)pWidget)->dwCallState == aCallStates[i].dwVal)
|
|
{
|
|
lpszCallState = aCallStates[i].lpszVal;
|
|
break;
|
|
}
|
|
}
|
|
|
|
wsprintf(
|
|
buf,
|
|
" Addr%ld, hdCall=x%lx %s (htCall=x%lx)",
|
|
((PDRVCALL)pWidget)->LineCallInfo.dwAddressID,
|
|
pWidget,
|
|
lpszCallState,
|
|
((PDRVCALL)pWidget)->htCall
|
|
);
|
|
|
|
break;
|
|
}
|
|
case WT_DRVPHONE:
|
|
|
|
wsprintf(
|
|
buf,
|
|
"Phone%ld, hd=x%lx (ht=x%lx, %s)",
|
|
((PDRVPHONE)pWidget)->dwDeviceID,
|
|
pWidget,
|
|
((PDRVPHONE)pWidget)->htPhone,
|
|
(((PDRVPHONE)pWidget)->htPhone ? "open" : "closed")
|
|
);
|
|
|
|
break;
|
|
}
|
|
|
|
SendMessage (ghwndList1, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)buf);
|
|
|
|
pWidget = pWidget->pNext;
|
|
}
|
|
#ifdef WIN32
|
|
}
|
|
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
|
|
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
|
|
{
|
|
PostUpdateWidgetListMsg();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
void
|
|
PostUpdateWidgetListMsg(
|
|
void
|
|
)
|
|
{
|
|
PostMessage (ghwndMain, WM_UPDATEWIDGETLIST, ESP_MSG_KEY, 0);
|
|
}
|
|
|
|
|
|
void
|
|
InsertWidgetInList(
|
|
PDRVWIDGET pNewWidget,
|
|
PDRVWIDGET pWidgetInsertBefore
|
|
)
|
|
{
|
|
pNewWidget->pNext = pWidgetInsertBefore;
|
|
|
|
if ((gaWidgets == NULL) || (pWidgetInsertBefore == gaWidgets))
|
|
{
|
|
gaWidgets = pNewWidget;
|
|
}
|
|
else
|
|
{
|
|
PDRVWIDGET pPrevWidget = gaWidgets;
|
|
|
|
|
|
while (pPrevWidget->pNext &&
|
|
(pPrevWidget->pNext != pWidgetInsertBefore))
|
|
{
|
|
pPrevWidget = pPrevWidget->pNext;
|
|
}
|
|
|
|
pPrevWidget->pNext = pNewWidget;
|
|
}
|
|
|
|
//UpdateWidgetList();
|
|
PostUpdateWidgetListMsg();
|
|
}
|
|
|
|
|
|
BOOL
|
|
RemoveWidgetFromList(
|
|
PDRVWIDGET pWidgetToRemove
|
|
)
|
|
{
|
|
if (gaWidgets == NULL)
|
|
{
|
|
goto RemoveWidgetFromList_error;
|
|
}
|
|
|
|
if (pWidgetToRemove == gaWidgets)
|
|
{
|
|
gaWidgets = pWidgetToRemove->pNext;
|
|
}
|
|
else
|
|
{
|
|
PDRVWIDGET pPrevWidget = gaWidgets;
|
|
|
|
|
|
while (pPrevWidget->pNext && (pPrevWidget->pNext != pWidgetToRemove))
|
|
{
|
|
pPrevWidget = pPrevWidget->pNext;
|
|
}
|
|
|
|
if (pPrevWidget->pNext == NULL)
|
|
{
|
|
goto RemoveWidgetFromList_error;
|
|
}
|
|
|
|
pPrevWidget->pNext = pWidgetToRemove->pNext;
|
|
}
|
|
|
|
DrvFree (pWidgetToRemove);
|
|
|
|
//UpdateWidgetList();
|
|
PostUpdateWidgetListMsg();
|
|
|
|
return TRUE;
|
|
|
|
RemoveWidgetFromList_error:
|
|
|
|
ShowStr(
|
|
"error: RemoveWidgetFromList: widget x%lx not in list",
|
|
pWidgetToRemove
|
|
);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
PDRVLINE
|
|
AllocLine(
|
|
DWORD dwDeviceID
|
|
)
|
|
{
|
|
PDRVLINE pNewLine = (PDRVLINE) DrvAlloc (sizeof(DRVLINE));
|
|
|
|
|
|
if (pNewLine)
|
|
{
|
|
char far *p;
|
|
PDRVWIDGET pWidget = gaWidgets;
|
|
|
|
|
|
//
|
|
// Init the data structure
|
|
//
|
|
|
|
memset (pNewLine, 0, sizeof(DRVLINE));
|
|
pNewLine->Widget.dwType = WT_DRVLINE;
|
|
pNewLine->dwDeviceID = dwDeviceID;
|
|
|
|
|
|
//
|
|
// Dev caps
|
|
//
|
|
|
|
pNewLine->LineDevCaps.dwNeededSize =
|
|
pNewLine->LineDevCaps.dwUsedSize = sizeof(LINEDEVCAPS) +
|
|
LINE_DEV_CAPS_VAR_DATA_SIZE;
|
|
|
|
pNewLine->LineDevCaps.dwProviderInfoSize = strlen (szProviderInfo) + 1;
|
|
pNewLine->LineDevCaps.dwProviderInfoOffset = sizeof(LINEDEVCAPS);
|
|
|
|
p = ((char far *) &pNewLine->LineDevCaps) +
|
|
pNewLine->LineDevCaps.dwProviderInfoOffset;
|
|
|
|
strcpy (p, szProviderInfo);
|
|
|
|
//pNewLine->LineDevCaps.dwSwitchInfoSize;
|
|
//pNewLine->LineDevCaps.dwSwitchInfoOffset =
|
|
|
|
pNewLine->LineDevCaps.dwPermanentLineID =
|
|
(0x0000ffff & dwDeviceID) |
|
|
((0x0000ffff & gdwPermanentProviderID) << 16);
|
|
|
|
pNewLine->LineDevCaps.dwLineNameOffset =
|
|
sizeof(LINEDEVCAPS) + 2*MAX_STRING_PARAM_SIZE;
|
|
|
|
p = ((char far *) &pNewLine->LineDevCaps) +
|
|
pNewLine->LineDevCaps.dwLineNameOffset;
|
|
|
|
sprintf (p, "Line%ld (ESP)", dwDeviceID);
|
|
|
|
pNewLine->LineDevCaps.dwLineNameSize = (DWORD) strlen (p) + 1;
|
|
pNewLine->LineDevCaps.dwStringFormat = STRINGFORMAT_ASCII;
|
|
|
|
pNewLine->LineDevCaps.dwAddressModes = ALL_ADDRESS_MODES;
|
|
pNewLine->LineDevCaps.dwNumAddresses = gdwNumAddrsPerLine;
|
|
pNewLine->LineDevCaps.dwBearerModes = ALL_BEARER_MODES;
|
|
pNewLine->LineDevCaps.dwMaxRate = 0x100000; //BUGBUG
|
|
pNewLine->LineDevCaps.dwMediaModes = ALL_MEDIA_MODES;
|
|
|
|
//pNewLine->LineDevCaps.dwGenerateToneModes;
|
|
//pNewLine->LineDevCaps.dwGenerateToneMaxNumFreq;
|
|
//pNewLine->LineDevCaps.dwGenerateDigitModes;
|
|
//pNewLine->LineDevCaps.dwMonitorToneMaxNumFreq;
|
|
//pNewLine->LineDevCaps.dwMonitorToneMaxNumEntries;
|
|
//pNewLine->LineDevCaps.dwMonitorDigitModes;
|
|
//pNewLine->LineDevCaps.dwGatherDigitsMinTimeout;
|
|
//pNewLine->LineDevCaps.dwGatherDigitsMaxTimeout;
|
|
|
|
//pNewLine->LineDevCaps.dwMedCtlDigitMaxListSize;
|
|
//pNewLine->LineDevCaps.dwMedCtlMediaMaxListSize;
|
|
//pNewLine->LineDevCaps.dwMedCtlToneMaxListSize;
|
|
//pNewLine->LineDevCaps.dwMedCtlCallStateMaxListSize;
|
|
|
|
pNewLine->LineDevCaps.dwDevCapFlags = ALL_LINE_DEV_CAP_FLAGS;
|
|
pNewLine->LineDevCaps.dwMaxNumActiveCalls = 1024; // BUGBUG
|
|
pNewLine->LineDevCaps.dwAnswerMode = LINEANSWERMODE_NONE; // BUGBUG???
|
|
pNewLine->LineDevCaps.dwRingModes = 1;
|
|
pNewLine->LineDevCaps.dwLineStates = ALL_LINE_STATES;
|
|
|
|
//pNewLine->LineDevCaps.dwUUIAcceptSize;
|
|
//pNewLine->LineDevCaps.dwUUIAnswerSize;
|
|
//pNewLine->LineDevCaps.dwUUIMakeCallSize;
|
|
//pNewLine->LineDevCaps.dwUUIDropSize;
|
|
//pNewLine->LineDevCaps.dwUUISendUserUserInfoSize;
|
|
//pNewLine->LineDevCaps.dwUUICallInfoSize;
|
|
|
|
//pNewLine->LineDevCaps.MinDialParams;
|
|
//pNewLine->LineDevCaps.MaxDialParams;
|
|
//pNewLine->LineDevCaps.DefaultDialParams;
|
|
|
|
//pNewLine->LineDevCaps.dwNumTerminals;
|
|
//pNewLine->LineDevCaps.dwTerminalCapsSize;
|
|
//pNewLine->LineDevCaps.dwTerminalCapsOffset
|
|
//pNewLine->LineDevCaps.dwTerminalTextEntrySize;
|
|
//pNewLine->LineDevCaps.dwTerminalTextSize;
|
|
//pNewLine->LineDevCaps.dwTerminalTextOffset
|
|
|
|
//pNewLine->LineDevCaps.dwDevSpecificSize;
|
|
//pNewLine->LineDevCaps.dwDevSpecificOffset
|
|
pNewLine->LineDevCaps.dwLineFeatures = ALL_LINE_FEATURES;
|
|
|
|
|
|
//
|
|
// Dev status
|
|
//
|
|
|
|
pNewLine->LineDevStatus.dwNeededSize =
|
|
pNewLine->LineDevStatus.dwUsedSize = sizeof (LINEDEVSTATUS) +
|
|
LINE_DEV_STATUS_VAR_DATA_SIZE;
|
|
|
|
//pNewLine->LineDevStatus.dwNumOpens // TAPI.DLL fills in
|
|
//pNewLine->LineDevStatus.dwOpenMediaModes // TAPI.DLL fills in
|
|
|
|
//pNewLine->LineDevStatus.dwNumActiveCalls
|
|
//pNewLine->LineDevStatus.dwNumOnHoldCalls
|
|
//pNewLine->LineDevStatus.dwNumOnHoldPendCalls
|
|
pNewLine->LineDevStatus.dwLineFeatures = ALL_LINE_FEATURES;
|
|
//pNewLine->LineDevStatus.dwNumCallCompletions
|
|
//pNewLine->LineDevStatus.dwRingMode
|
|
//pNewLine->LineDevStatus.dwSignalLevel
|
|
//pNewLine->LineDevStatus.dwBatteryLevel
|
|
//pNewLine->LineDevStatus.dwRoamMode
|
|
|
|
pNewLine->LineDevStatus.dwDevStatusFlags =
|
|
LINEDEVSTATUSFLAGS_CONNECTED | LINEDEVSTATUSFLAGS_INSERVICE;
|
|
|
|
//pNewLine->LineDevStatus.dwTerminalModesSize;
|
|
//pNewLine->LineDevStatus.dwTerminalModesOffset
|
|
|
|
//pNewLine->LineDevStatus.dwDevSpecificSize
|
|
//pNewLine->LineDevStatus.dwDevSpecificOffset
|
|
|
|
|
|
//
|
|
// Addr caps
|
|
//
|
|
|
|
pNewLine->LineAddrCaps.dwNeededSize =
|
|
pNewLine->LineAddrCaps.dwUsedSize = sizeof(LINEADDRESSCAPS) +
|
|
LINE_ADDR_CAPS_VAR_DATA_SIZE;
|
|
|
|
pNewLine->LineAddrCaps.dwLineDeviceID = dwDeviceID;
|
|
|
|
//pNewLine->LineAddrCaps.dwAddressSize
|
|
pNewLine->LineAddrCaps.dwAddressOffset = sizeof(LINEADDRESSCAPS);
|
|
|
|
//pNewLine->LineAddrCaps.dwDevSpecificSize
|
|
//pNewLine->LineAddrCaps.dwDevSpecificOffset
|
|
|
|
pNewLine->LineAddrCaps.dwAddressSharing = LINEADDRESSSHARING_PRIVATE;
|
|
pNewLine->LineAddrCaps.dwAddressStates = ALL_ADDRESS_STATES;
|
|
pNewLine->LineAddrCaps.dwCallInfoStates = ALL_CALL_INFO_STATES;
|
|
pNewLine->LineAddrCaps.dwCallerIDFlags =
|
|
pNewLine->LineAddrCaps.dwCalledIDFlags =
|
|
pNewLine->LineAddrCaps.dwConnectedIDFlags =
|
|
pNewLine->LineAddrCaps.dwRedirectionIDFlags =
|
|
pNewLine->LineAddrCaps.dwRedirectingIDFlags = ALL_CALL_PARTY_ID_FLAGS;
|
|
pNewLine->LineAddrCaps.dwCallStates = ALL_CALL_STATES;
|
|
pNewLine->LineAddrCaps.dwDialToneModes = ALL_DIAL_TONE_MODES;
|
|
pNewLine->LineAddrCaps.dwBusyModes = ALL_BUSY_MODES;
|
|
pNewLine->LineAddrCaps.dwSpecialInfo = ALL_SPECIAL_INFO;
|
|
pNewLine->LineAddrCaps.dwDisconnectModes = ALL_DISCONNECT_MODES;
|
|
|
|
pNewLine->LineAddrCaps.dwMaxNumActiveCalls =
|
|
pNewLine->LineAddrCaps.dwMaxNumOnHoldCalls =
|
|
pNewLine->LineAddrCaps.dwMaxNumOnHoldPendingCalls =
|
|
pNewLine->LineAddrCaps.dwMaxNumConference =
|
|
pNewLine->LineAddrCaps.dwMaxNumTransConf = 64; // BUGBUG
|
|
|
|
pNewLine->LineAddrCaps.dwAddrCapFlags = ALL_ADDRESS_CAP_FLAGS;
|
|
pNewLine->LineAddrCaps.dwCallFeatures = ALL_CALL_FEATURES;
|
|
//pNewLine->LineAddrCaps.dwRemoveFromConfCaps
|
|
//pNewLine->LineAddrCaps.dwRemoveFromConfState
|
|
//pNewLine->LineAddrCaps.dwTransferModes
|
|
//pNewLine->LineAddrCaps.dwParkModes
|
|
|
|
//pNewLine->LineAddrCaps.dwForwardModes
|
|
//pNewLine->LineAddrCaps.dwMaxForwardEntries
|
|
//pNewLine->LineAddrCaps.dwMaxSpecificEntries
|
|
//pNewLine->LineAddrCaps.dwMinFwdNumRings
|
|
//pNewLine->LineAddrCaps.dwMaxFwdNumRings
|
|
|
|
//pNewLine->LineAddrCaps.dwMaxCallCompletions
|
|
//pNewLine->LineAddrCaps.dwCallCompletionConds
|
|
//pNewLine->LineAddrCaps.dwCallCompletionModes
|
|
//pNewLine->LineAddrCaps.dwNumCompletionMessages
|
|
//pNewLine->LineAddrCaps.dwCompletionMsgTextEntrySize
|
|
//pNewLine->LineAddrCaps.dwCompletionMsgTextSize
|
|
//pNewLine->LineAddrCaps.dwCompletionMsgTextOffset
|
|
pNewLine->LineAddrCaps.dwAddressFeatures = ALL_ADDRESS_FEATURES;
|
|
|
|
|
|
//
|
|
// Addr status
|
|
//
|
|
|
|
pNewLine->LineAddrStatus.dwNeededSize =
|
|
pNewLine->LineAddrStatus.dwUsedSize =
|
|
sizeof (LINEADDRESSSTATUS) + LINE_ADDR_STATUS_VAR_DATA_SIZE;
|
|
|
|
//pNewLine->LineAddrStatus.dwNumInUse
|
|
//pNewLine->LineAddrStatus.dwNumActiveCalls
|
|
//pNewLine->LineAddrStatus.dwNumOnHoldCalls
|
|
//pNewLine->LineAddrStatus.dwNumOnHoldPendCalls
|
|
pNewLine->LineAddrStatus.dwAddressFeatures = ALL_ADDRESS_FEATURES;
|
|
|
|
//pNewLine->LineAddrStatus.dwNumRingsNoAnswer
|
|
//pNewLine->LineAddrStatus.dwForwardNumEntries
|
|
//pNewLine->LineAddrStatus.dwForwardSize
|
|
//pNewLine->LineAddrStatus.dwForwardOffset
|
|
|
|
//pNewLine->LineAddrStatus.dwTerminalModesSize
|
|
//pNewLine->LineAddrStatus.dwTerminalModesOffset
|
|
|
|
//pNewLine->LineAddrStatus.dwDevSpecificSize
|
|
//pNewLine->LineAddrStatus.dwDevSpecificOffset
|
|
|
|
|
|
//
|
|
// Insert new line...
|
|
//
|
|
|
|
while (pWidget && (pWidget->dwType != WT_DRVPHONE))
|
|
{
|
|
PDRVLINE pLine = (PDRVLINE) pWidget;
|
|
|
|
|
|
if ((pWidget->dwType == WT_DRVLINE) &&
|
|
(pLine->dwDeviceID > dwDeviceID))
|
|
{
|
|
break;
|
|
}
|
|
|
|
pWidget = pWidget->pNext;
|
|
}
|
|
|
|
InsertWidgetInList ((PDRVWIDGET) pNewLine, pWidget);
|
|
}
|
|
|
|
return pNewLine;
|
|
}
|
|
|
|
|
|
PDRVLINE
|
|
GetLine(
|
|
DWORD dwDeviceID
|
|
)
|
|
{
|
|
PDRVWIDGET pWidget = gaWidgets;
|
|
|
|
|
|
while (pWidget)
|
|
{
|
|
if ((pWidget->dwType == WT_DRVLINE) &&
|
|
(((PDRVLINE) pWidget)->dwDeviceID == dwDeviceID))
|
|
{
|
|
return ((PDRVLINE) pWidget);
|
|
}
|
|
|
|
pWidget = pWidget->pNext;
|
|
}
|
|
|
|
return ((PDRVLINE) NULL);
|
|
}
|
|
|
|
|
|
VOID
|
|
FreeLine(
|
|
PDRVLINE pLine
|
|
)
|
|
{
|
|
PDRVWIDGET pWidget = pLine->Widget.pNext;
|
|
|
|
|
|
if (RemoveWidgetFromList ((PDRVWIDGET) pLine))
|
|
{
|
|
// BUGBUG need to complete all pending reqs
|
|
|
|
while (pWidget && (pWidget->dwType == WT_DRVCALL))
|
|
{
|
|
PDRVWIDGET pWidget2 = pWidget->pNext;
|
|
|
|
|
|
RemoveWidgetFromList (pWidget);
|
|
pWidget = pWidget2;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
LONG
|
|
AllocCall(
|
|
PDRVLINE pLine,
|
|
HTAPICALL htCall,
|
|
LPLINECALLPARAMS lpCallParams,
|
|
PDRVCALL *ppCall
|
|
)
|
|
{
|
|
LONG lResult = 0;
|
|
DWORD dwAddressID = 0;
|
|
PDRVCALL pNewCall = (PDRVCALL) DrvAlloc (sizeof(DRVCALL));
|
|
PDRVWIDGET pWidget = (PDRVWIDGET) pLine->Widget.pNext;
|
|
|
|
|
|
//
|
|
// Validate call params
|
|
//
|
|
|
|
if (lpCallParams)
|
|
{
|
|
if (lpCallParams->dwAddressMode == LINEADDRESSMODE_ADDRESSID)
|
|
{
|
|
if (lpCallParams->dwAddressID >= gdwNumAddrsPerLine)
|
|
{
|
|
lResult = LINEERR_INVALCALLPARAMS;
|
|
goto AllocCall_exit;
|
|
}
|
|
else
|
|
{
|
|
dwAddressID = lpCallParams->dwAddressID;
|
|
}
|
|
}
|
|
|
|
// BUGBUG chk against currently supported bearer/media modes on line
|
|
}
|
|
|
|
|
|
//
|
|
// Alloc a new call struct
|
|
//
|
|
|
|
if (!pNewCall)
|
|
{
|
|
lResult = LINEERR_NOMEM;
|
|
goto AllocCall_exit;
|
|
}
|
|
|
|
|
|
//
|
|
// Initialize the new call fields
|
|
//
|
|
|
|
memset (pNewCall, 0, sizeof(DRVCALL));
|
|
|
|
pNewCall->Widget.dwType = WT_DRVCALL;
|
|
pNewCall->pLine = pLine;
|
|
pNewCall->htCall = htCall;
|
|
pNewCall->dwCallState = LINECALLSTATE_UNKNOWN;
|
|
pNewCall->dwCallFeatures = ALL_CALL_FEATURES;
|
|
|
|
pNewCall->LineCallInfo.dwNeededSize =
|
|
pNewCall->LineCallInfo.dwUsedSize = sizeof (LINECALLINFO) +
|
|
LINE_CALL_INFO_VAR_DATA_SIZE;
|
|
|
|
pNewCall->LineCallInfo.dwLineDeviceID = pLine->dwDeviceID;
|
|
pNewCall->LineCallInfo.dwAddressID = dwAddressID;
|
|
|
|
pNewCall->LineCallInfo.dwBearerMode =
|
|
(lpCallParams ? lpCallParams->dwBearerMode : LINEBEARERMODE_VOICE);
|
|
pNewCall->LineCallInfo.dwRate =
|
|
(lpCallParams ? lpCallParams->dwMaxRate : 65536);
|
|
pNewCall->LineCallInfo.dwMediaMode =
|
|
(lpCallParams ? lpCallParams->dwMediaMode :
|
|
LINEMEDIAMODE_INTERACTIVEVOICE);
|
|
|
|
//pNewCall->LineCallInfo.dwAppSpecific
|
|
//pNewCall->LineCallInfo.dwCallID
|
|
//pNewCall->LineCallInfo.dwRelatedCallID
|
|
//pNewCall->LineCallInfo.dwCallParamFlags
|
|
pNewCall->LineCallInfo.dwCallStates = ALL_CALL_STATES;
|
|
|
|
//pNewCall->LineCallInfo.dwMonitorDigitModes FILLED IN BY TAPI
|
|
//pNewCall->LineCallInfo.dwMonitorMediaModes FILLED IN BY TAPI
|
|
|
|
if (lpCallParams)
|
|
{
|
|
memcpy(
|
|
&pNewCall->LineCallInfo.DialParams,
|
|
&lpCallParams->DialParams,
|
|
sizeof(LINEDIALPARAMS)
|
|
);
|
|
}
|
|
|
|
//pNewCall->LineCallInfo.dwOrigin
|
|
//pNewCall->LineCallInfo.dwReason
|
|
//pNewCall->LineCallInfo.dwCompletionID
|
|
|
|
//pNewCall->LineCallInfo.dwNumOwners FILLED IN BY TAPI
|
|
//pNewCall->LineCallInfo.dwNumMonitors FILLED IN BY TAPI
|
|
|
|
//pNewCall->LineCallInfo.dwCountryCode
|
|
//pNewCall->LineCallInfo.dwTrunk
|
|
|
|
//pNewCall->LineCallInfo.dwCallerIDFlags
|
|
//pNewCall->LineCallInfo.dwCallerIDSize
|
|
//pNewCall->LineCallInfo.dwCallerIDOffset
|
|
|
|
//pNewCall->LineCallInfo.dwCallerIDNameSize
|
|
//pNewCall->LineCallInfo.dwCallerIDNameOffset
|
|
|
|
//pNewCall->LineCallInfo.dwCalledIDFlags
|
|
//pNewCall->LineCallInfo.dwCalledIDSize
|
|
//pNewCall->LineCallInfo.dwCalledIDOffset
|
|
|
|
//pNewCall->LineCallInfo.dwCalledIDNameSize
|
|
//pNewCall->LineCallInfo.dwCalledIDNameOffset
|
|
|
|
//pNewCall->LineCallInfo.dwConnectedIDFlags
|
|
//pNewCall->LineCallInfo.dwConnectedIDSize
|
|
//pNewCall->LineCallInfo.dwConnectedIDOffset
|
|
|
|
//pNewCall->LineCallInfo.dwConnectedIDNameSize
|
|
//pNewCall->LineCallInfo.dwConnectedIDNameOffset
|
|
|
|
//pNewCall->LineCallInfo.dwRedirectionIDFlags
|
|
//pNewCall->LineCallInfo.dwRedirectionIDSize
|
|
//pNewCall->LineCallInfo.dwRedirectionIDOffset
|
|
|
|
//pNewCall->LineCallInfo.dwRedirectionIDNameSize
|
|
//pNewCall->LineCallInfo.dwRedirectionIDNameOffset
|
|
|
|
//pNewCall->LineCallInfo.dwRedirectingIDFlags
|
|
//pNewCall->LineCallInfo.dwRedirectingIDSize
|
|
//pNewCall->LineCallInfo.dwRedirectingIDOffset
|
|
|
|
//pNewCall->LineCallInfo.dwRedirectingIDNameSize
|
|
//pNewCall->LineCallInfo.dwRedirectingIDNameOffset
|
|
|
|
//pNewCall->LineCallInfo.dwAppNameSize FILLED IN BY TAPI
|
|
//pNewCall->LineCallInfo.dwAppNameOffset FILLED IN BY TAPI
|
|
//pNewCall->LineCallInfo.dwDisplayableAddressSize FILLED IN BY TAPI
|
|
//pNewCall->LineCallInfo.dwDisplayableAddressOffset FILLED IN BY TAPI
|
|
//pNewCall->LineCallInfo.dwCalledPartySize FILLED IN BY TAPI
|
|
//pNewCall->LineCallInfo.dwCalledPartyOffset FILLED IN BY TAPI
|
|
//pNewCall->LineCallInfo.dwCommentSize FILLED IN BY TAPI
|
|
//pNewCall->LineCallInfo.dwCommentOffset FILLED IN BY TAPI
|
|
|
|
//pNewCall->LineCallInfo.dwDisplaySize
|
|
//pNewCall->LineCallInfo.dwDisplayOffset
|
|
|
|
//pNewCall->LineCallInfo.dwUserUserInfoSize
|
|
//pNewCall->LineCallInfo.dwUserUserInfoOffset
|
|
|
|
//pNewCall->LineCallInfo.dwHighLevelCompSize
|
|
//pNewCall->LineCallInfo.dwHighLevelCompOffset
|
|
|
|
//pNewCall->LineCallInfo.dwLowLevelCompSize
|
|
//pNewCall->LineCallInfo.dwLowLevelCompOffset
|
|
|
|
//pNewCall->LineCallInfo.dwChargingInfoSize
|
|
//pNewCall->LineCallInfo.dwChargingInfoOffset
|
|
|
|
//pNewCall->LineCallInfo.dwTerminalModesSize
|
|
//pNewCall->LineCallInfo.dwTerminalModesOffset
|
|
|
|
//pNewCall->LineCallInfo.dwDevSpecificSize
|
|
//pNewCall->LineCallInfo.dwDevSpecificOffset
|
|
|
|
|
|
//
|
|
// Insert new call...
|
|
//
|
|
|
|
while (pWidget &&
|
|
(pWidget->dwType == WT_DRVCALL) &&
|
|
(((PDRVCALL)pWidget)->LineCallInfo.dwAddressID <= dwAddressID))
|
|
{
|
|
pWidget = pWidget->pNext;
|
|
}
|
|
|
|
InsertWidgetInList ((PDRVWIDGET) pNewCall, pWidget);
|
|
|
|
|
|
//
|
|
// Fill in the blanks
|
|
//
|
|
|
|
*ppCall = pNewCall;
|
|
|
|
AllocCall_exit:
|
|
|
|
return lResult;
|
|
}
|
|
|
|
|
|
VOID
|
|
FreeCall(
|
|
PDRVCALL pCall
|
|
)
|
|
{
|
|
// BUGBUG need to complete all pending reqs
|
|
|
|
RemoveWidgetFromList ((PDRVWIDGET) pCall);
|
|
}
|
|
|
|
|
|
PDRVPHONE
|
|
AllocPhone(
|
|
DWORD dwDeviceID
|
|
)
|
|
{
|
|
PDRVPHONE pNewPhone = (PDRVPHONE) DrvAlloc (sizeof(DRVPHONE));
|
|
|
|
|
|
if (pNewPhone)
|
|
{
|
|
PDRVWIDGET pWidget = gaWidgets;
|
|
char far *p;
|
|
|
|
|
|
memset (pNewPhone, 0, sizeof(DRVPHONE));
|
|
|
|
pNewPhone->Widget.dwType = WT_DRVPHONE;
|
|
pNewPhone->dwDeviceID = dwDeviceID;
|
|
|
|
|
|
//
|
|
// Caps
|
|
//
|
|
|
|
pNewPhone->PhoneCaps.dwNeededSize =
|
|
pNewPhone->PhoneCaps.dwUsedSize =
|
|
sizeof(PHONECAPS) + PHONE_CAPS_VAR_DATA_SIZE;
|
|
|
|
pNewPhone->PhoneCaps.dwProviderInfoSize = strlen (szProviderInfo) + 1;
|
|
pNewPhone->PhoneCaps.dwProviderInfoOffset = sizeof(PHONECAPS);
|
|
|
|
p = ((char far *) &pNewPhone->PhoneCaps) +
|
|
pNewPhone->PhoneCaps.dwProviderInfoOffset;
|
|
|
|
strcpy (p, szProviderInfo);
|
|
|
|
//pNewPhone->PhoneCaps.dwPhoneInfoSize
|
|
//pNewPhone->PhoneCaps.dwPhoneInfoOffset
|
|
|
|
pNewPhone->PhoneCaps.dwPermanentPhoneID;
|
|
(0x0000ffff & dwDeviceID) |
|
|
((0x0000ffff & gdwPermanentProviderID) << 16);
|
|
|
|
pNewPhone->PhoneCaps.dwPhoneNameOffset =
|
|
sizeof(PHONECAPS) + 2*MAX_STRING_PARAM_SIZE;
|
|
|
|
p = ((char far *) &pNewPhone->PhoneCaps) +
|
|
pNewPhone->PhoneCaps.dwPhoneNameOffset;
|
|
|
|
sprintf (p, "Phone%ld (ESP)", dwDeviceID);
|
|
|
|
pNewPhone->PhoneCaps.dwPhoneNameSize = (DWORD) strlen (p) + 1;
|
|
|
|
pNewPhone->PhoneCaps.dwStringFormat = STRINGFORMAT_ASCII;
|
|
|
|
//pNewPhone->PhoneCaps.dwPhoneStates
|
|
//pNewPhone->PhoneCaps.dwHookSwitchDevs
|
|
//pNewPhone->PhoneCaps.dwHandsetHookSwitchModes
|
|
//pNewPhone->PhoneCaps.dwSpeakerHookSwitchModes
|
|
//pNewPhone->PhoneCaps.dwHeadsetHookSwitchModes
|
|
|
|
//pNewPhone->PhoneCaps.dwVolumeFlags
|
|
//pNewPhone->PhoneCaps.dwGainFlags
|
|
//pNewPhone->PhoneCaps.dwDisplayNumRows
|
|
//pNewPhone->PhoneCaps.dwDisplayNumColumns
|
|
//pNewPhone->PhoneCaps.dwNumRingModes
|
|
//pNewPhone->PhoneCaps.dwNumButtonLamps
|
|
|
|
//pNewPhone->PhoneCaps.dwButtonModesSize
|
|
//pNewPhone->PhoneCaps.dwButtonModesOffset
|
|
|
|
//pNewPhone->PhoneCaps.dwButtonFunctionsSize
|
|
//pNewPhone->PhoneCaps.dwButtonFunctionsOffset
|
|
|
|
//pNewPhone->PhoneCaps.dwLampModesSize
|
|
//pNewPhone->PhoneCaps.dwLampModesOffset
|
|
|
|
//pNewPhone->PhoneCaps.dwNumSetData
|
|
//pNewPhone->PhoneCaps.dwSetDataSize
|
|
//pNewPhone->PhoneCaps.dwSetDataOffset
|
|
|
|
//pNewPhone->PhoneCaps.dwNumGetData
|
|
//pNewPhone->PhoneCaps.dwGetDataSize
|
|
//pNewPhone->PhoneCaps.dwGetDataOffset
|
|
|
|
//pNewPhone->PhoneCaps.dwDevSpecificSize
|
|
//pNewPhone->PhoneCaps.dwDevSpecificOffset
|
|
|
|
|
|
//
|
|
// Status
|
|
//
|
|
|
|
pNewPhone->PhoneStatus.dwUsedSize =
|
|
pNewPhone->PhoneStatus.dwNeededSize = sizeof(PHONESTATUS);
|
|
|
|
|
|
//
|
|
// Insert new phone...
|
|
//
|
|
|
|
while (pWidget)
|
|
{
|
|
if ((pWidget->dwType == WT_DRVPHONE) &&
|
|
(((PDRVPHONE)pWidget)->dwDeviceID > dwDeviceID))
|
|
{
|
|
break;
|
|
}
|
|
|
|
pWidget = pWidget->pNext;
|
|
}
|
|
|
|
InsertWidgetInList ((PDRVWIDGET) pNewPhone, pWidget);
|
|
}
|
|
|
|
return pNewPhone;
|
|
}
|
|
|
|
|
|
PDRVPHONE
|
|
GetPhone(
|
|
DWORD dwDeviceID
|
|
)
|
|
{
|
|
PDRVWIDGET pWidget = gaWidgets;
|
|
|
|
|
|
while (pWidget)
|
|
{
|
|
if ((pWidget->dwType == WT_DRVPHONE) &&
|
|
(((PDRVPHONE) pWidget)->dwDeviceID == dwDeviceID))
|
|
{
|
|
return ((PDRVPHONE) pWidget);
|
|
}
|
|
|
|
pWidget = pWidget->pNext;
|
|
}
|
|
|
|
return ((PDRVPHONE) NULL);
|
|
}
|
|
|
|
|
|
VOID
|
|
FreePhone(
|
|
PDRVPHONE pPhone
|
|
)
|
|
{
|
|
// BUGBUG need to complete all pending reqs
|
|
|
|
RemoveWidgetFromList ((PDRVWIDGET) pPhone);
|
|
}
|
|
|
|
|
|
int
|
|
GetWidgetIndex(
|
|
PDRVWIDGET pWidget
|
|
)
|
|
{
|
|
int i;
|
|
PDRVWIDGET pWidget2 = gaWidgets;
|
|
|
|
|
|
for (i = 0; pWidget != pWidget2; i++)
|
|
{
|
|
pWidget2 = pWidget2->pNext;
|
|
}
|
|
|
|
return i;
|
|
}
|