summaryrefslogtreecommitdiffstats
path: root/private/tapi/dev/sp/tsp3216/tsp3216l/tsp3216l.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/tapi/dev/sp/tsp3216/tsp3216l/tsp3216l.c')
-rw-r--r--private/tapi/dev/sp/tsp3216/tsp3216l/tsp3216l.c1282
1 files changed, 1282 insertions, 0 deletions
diff --git a/private/tapi/dev/sp/tsp3216/tsp3216l/tsp3216l.c b/private/tapi/dev/sp/tsp3216/tsp3216l/tsp3216l.c
new file mode 100644
index 000000000..4180d8114
--- /dev/null
+++ b/private/tapi/dev/sp/tsp3216/tsp3216l/tsp3216l.c
@@ -0,0 +1,1282 @@
+#include <windows.h>
+#include <windowsx.h>
+#include <winuser.h>
+#include <wownt32.h>
+
+#include <tapi.h>
+#include <tspi.h>
+
+#include "tsp3216.h"
+#include "debug.h"
+
+
+LONG PASCAL TapiThk_ThunkConnect32 (
+ LPSTR pszDll16,
+ LPSTR pszDll32,
+ DWORD hInstance,
+ DWORD lReason
+ );
+
+LONG PASCAL TapiFThk_ThunkConnect32 (
+ LPSTR pszDll16,
+ LPSTR pszDll32,
+ DWORD hInstance,
+ DWORD lReason
+ );
+
+LONG PASCAL Tapi32_ThunkConnect32 (
+ LPSTR pszDll16,
+ LPSTR pszDll32,
+ DWORD hInstance,
+ DWORD lReason
+ );
+
+const char pszDll16[] = "TSP3216S.DLL";
+const char pszDll32[] = "TSP3216L.TSP";
+
+
+
+//***************************************************************************
+//***************************************************************************
+enum {
+ MYMSG_STARTER = TSP3216L_MESSAGE,
+ MYMSG_PROVIDERINIT,
+ MYMSG_PROVIDERSHUTDOWN,
+ MYMSG_PROVIDERCONFIG,
+ MYMSG_LINECONFIGDIALOG,
+ MYMSG_LINECONFIGDIALOGEDIT,
+ MYMSG_PHONECONFIGDIALOG,
+ MYMSG_LINEMAKECALL
+ };
+
+
+//***************************************************************************
+DWORD cProcessAttach = 0;
+
+
+//***************************************************************************
+HWND ghWnd = NULL;
+CRITICAL_SECTION gcs;
+
+
+//***************************************************************************
+TCHAR gszProviderKey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\"
+ "Telephony\\Providers\\Provider";
+
+DWORD gdwPermanentProviderID;
+
+
+DWORD gdwThreadParms[2];
+enum {
+ THE_HINST,
+ THE_LREASON
+ };
+
+
+
+//***************************************************************************
+LRESULT CALLBACK MyWndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam );
+
+
+
+//***************************************************************************
+//***************************************************************************
+//***************************************************************************
+LPVOID TspAlloc( UINT nSize )
+{
+ return LocalAlloc( LPTR, nSize );
+}
+
+
+
+LPVOID TspFree( LPVOID p )
+{
+ return LocalFree( p );
+}
+
+
+
+//***************************************************************************
+//***************************************************************************
+//***************************************************************************
+void InitThunks( void )
+{
+ TapiThk_ThunkConnect32(
+ (LPSTR)pszDll16,
+ (LPSTR)pszDll32,
+ gdwThreadParms[THE_HINST],
+ gdwThreadParms[THE_LREASON]
+ );
+
+ TapiFThk_ThunkConnect32(
+ (LPSTR)pszDll16,
+ (LPSTR)pszDll32,
+ gdwThreadParms[THE_HINST],
+ gdwThreadParms[THE_LREASON]
+ );
+
+ Tapi32_ThunkConnect32(
+ (LPSTR)pszDll16,
+ (LPSTR)pszDll32,
+ gdwThreadParms[THE_HINST],
+ gdwThreadParms[THE_LREASON]
+ );
+
+ InitializeCriticalSection( &gcs );
+}
+
+
+//***************************************************************************
+//***************************************************************************
+//***************************************************************************
+
+UINT PASCAL NewData( void );
+
+
+void FreeThunks( void )
+{
+ HINSTANCE hInst;
+ hInst = (HINSTANCE)NewData();
+ FreeLibrary16( hInst );
+ FreeLibrary16( hInst );
+ FreeLibrary16( hInst );
+
+
+ DeleteCriticalSection( &gcs );
+
+}
+
+
+//***************************************************************************
+//***************************************************************************
+//***************************************************************************
+DWORD WINAPI TheUIThread( LPVOID lpThreadParameter )
+{
+ MSG msg;
+
+ WNDCLASS wndclass = {
+ 0,
+ MyWndProc,
+ 0,
+ 0,
+ (HANDLE)gdwThreadParms[THE_HINST],
+ 0,
+ 0,
+ 0,
+ 0,
+ "Tsp3216LWindowClass"
+ };
+
+
+DBGOUT((2, "The UI thread"));
+
+
+ //
+ // We need _another_ goddamn window.
+ //
+
+ RegisterClass( &wndclass );
+
+ ghWnd = CreateWindow(
+ "Tsp3216LWindowClass",
+ "Tsp3216LWindow",
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ NULL,
+ (HANDLE)gdwThreadParms[THE_HINST],
+ NULL
+ );
+
+
+DBGOUT((2, "Starting message loop in ui thread"));
+
+ while (GetMessage(&msg, 0, 0, 0) != 0)
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+DBGOUT((2, "Done message loop in ui thread"));
+
+ ghWnd = NULL;
+
+ return (msg.wParam);
+}
+
+
+
+//***************************************************************************
+//***************************************************************************
+//***************************************************************************
+LONG WINAPI DllEntryPoint(
+ DWORD hModule,
+ DWORD lReason,
+ DWORD lContext
+ )
+{
+
+
+DBGOUT((2, "Entering DllEntryPoint reason=0x%08lx", lReason));
+
+
+ switch ( lReason )
+ {
+ case 0:
+ {
+#if DBG
+{
+TCHAR cName[MAX_PATH];
+TCHAR buf[256];
+GetModuleFileName( NULL, cName, MAX_PATH);
+wsprintf(buf, "DllEntryPoint - 0 process detach [%s]\r\n", cName);
+OutputDebugString(buf);
+}
+#endif
+
+
+ FreeThunks();
+ }
+ break;
+
+
+
+ case 1:
+ {
+#if DBG
+{
+TCHAR cName[MAX_PATH];
+TCHAR buf[256];
+GetModuleFileName( NULL, cName, MAX_PATH);
+wsprintf(buf, "DllEntryPoint - 1 process attach [%s]\r\n", cName);
+OutputDebugString(buf);
+}
+#endif
+
+
+ //
+ // Yeah, I know it's not threadsafe. Ask me if I care.
+ //
+ gdwThreadParms[THE_HINST] = (DWORD)hModule;
+ gdwThreadParms[THE_LREASON] = (DWORD)lReason;
+
+
+ InitThunks();
+ }
+ break;
+
+ }
+
+DBGOUT((2, "Leaving DllEntryPoint"));
+
+ return TRUE;
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG PASCAL TSPI_lineConfigDialog (
+ DWORD dwDeviceID,
+ HWND hwndOwner,
+ LPCSTR lpszDeviceClass
+ );
+
+LONG PASCAL TSPI_lineConfigDialogEdit(
+ DWORD dwDeviceID,
+ HWND hwndOwner,
+ LPCSTR lpszDeviceClass,
+ LPVOID lpDeviceConfigIn,
+ DWORD dwSize,
+ LPVARSTRING lpDeviceConfigOut
+ );
+
+
+LONG
+TSPIAPI
+TSPI_providerGenericDialogData(
+ DWORD dwObjectID,
+ DWORD dwObjectType,
+ LPVOID lpParams,
+ DWORD dwSize
+ )
+{
+// LONG lResult = LINEERR_OPERATIONUNAVAIL;
+
+
+ DBGOUT((2, "In TSPI_providerGenericDialogData"));
+
+ DBGOUT((11, " Msg=0x%08lx", ((LPDWORD)lpParams)[0]));
+
+// return SendMessage( ghWnd, ((LPDWORD)lpParams)[0], 0, (LPARAM)&(((LPDWORD)lpParams)[1]) );
+// return
+ PostMessage( ghWnd, ((LPDWORD)lpParams)[0], 0, (LPARAM)&(((LPDWORD)lpParams)[1]) );
+ return 0;
+
+// return lResult;
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG
+TSPIAPI
+TSPI_providerUIIdentify(
+ LPSTR pszUIDllName
+ )
+{
+
+ DBGOUT((2, "In TSPI_providerUIIdentify"));
+
+ lstrcpy( pszUIDllName, "TSP3216L.TSP" );
+
+ return 0;
+
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG
+TSPIAPI
+TUISPI_lineConfigDialog(
+ TUISPIDLLCALLBACK lpfnUIDLLCallback,
+ DWORD dwDeviceID,
+ HWND hwndOwner,
+ LPCSTR lpszDeviceClass
+ )
+{
+ DWORD dwParms[] = {
+ MYMSG_LINECONFIGDIALOG,
+ dwDeviceID,
+ (DWORD)hwndOwner,
+ (DWORD)lpszDeviceClass
+ };
+
+
+//BUGBUG: Can't pass strings across a callback
+
+ DBGOUT((2, "In TUISPI_lineConfigDialog"));
+ DBGOUT((11, " dwDeviceID=0x%08lx", dwDeviceID));
+ DBGOUT((11, " hwndOwner =0x%08lx", hwndOwner));
+ DBGOUT((11, " lpszDeviceClass=0x%08lx", lpszDeviceClass));
+
+ (*lpfnUIDLLCallback)(
+ dwDeviceID,
+ TUISPIDLL_OBJECT_LINEID,
+ dwParms,
+ sizeof(dwParms)
+ );
+
+//BUGBUG how do we wait and/or return error code?
+ return 0;
+
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG
+TSPIAPI
+TUISPI_lineConfigDialogEdit(
+ TUISPIDLLCALLBACK lpfnUIDLLCallback,
+ DWORD dwDeviceID,
+ HWND hwndOwner,
+ LPCSTR lpszDeviceClass,
+ LPVOID const lpDeviceConfigIn,
+ DWORD dwSize,
+ LPVARSTRING lpDeviceConfigOut
+ )
+{
+ DWORD dwParms[] = {
+ MYMSG_LINECONFIGDIALOGEDIT,
+ dwDeviceID,
+ (DWORD)hwndOwner,
+ (DWORD)lpszDeviceClass,
+ (DWORD)lpDeviceConfigIn,
+ dwSize,
+ (DWORD)lpDeviceConfigOut
+ };
+
+
+ DBGOUT((2, "In TUISPI_lineConfigDialogEdit"));
+
+ (*lpfnUIDLLCallback)(
+ dwDeviceID,
+ TUISPIDLL_OBJECT_LINEID,
+ dwParms,
+ sizeof(dwParms)
+ );
+
+//BUGBUG how do we wait and/or return error code?
+ return 0;
+
+
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG
+TSPIAPI
+TSPI_phoneConfigDialog(
+ DWORD dwDeviceID,
+ HWND hwndOwner,
+ LPCSTR lpszDeviceClass
+ );
+
+LONG
+TSPIAPI
+TUISPI_phoneConfigDialog(
+ TUISPIDLLCALLBACK lpfnUIDLLCallback,
+ DWORD dwDeviceID,
+ HWND hwndOwner,
+ LPCSTR lpszDeviceClass
+ )
+{
+ DWORD dwParms[] = {
+ MYMSG_PHONECONFIGDIALOG,
+ dwDeviceID,
+ (DWORD)hwndOwner,
+ (DWORD)lpszDeviceClass
+ };
+
+
+//BUGBUG: Can't pass strings across a callback
+
+ DBGOUT((2, "In TUISPI_phoneConfigDialog"));
+ DBGOUT((11, " dwDeviceID=0x%08lx", dwDeviceID));
+ DBGOUT((11, " hwndOwner =0x%08lx", hwndOwner));
+ DBGOUT((11, " lpszDeviceClass=0x%08lx", lpszDeviceClass));
+
+ (*lpfnUIDLLCallback)(
+ dwDeviceID,
+ TUISPIDLL_OBJECT_PHONEID,
+ dwParms,
+ sizeof(dwParms)
+ );
+
+//BUGBUG how do we wait and/or return error code?
+
+ return 0;
+
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG
+TSPIAPI
+TSPI_providerConfig(
+ HWND hwndOwner,
+ DWORD dwPermanentProviderID
+ );
+
+LONG
+TSPIAPI
+TUISPI_providerConfig(
+ TUISPIDLLCALLBACK lpfnUIDLLCallback,
+ HWND hwndOwner,
+ DWORD dwPermanentProviderID
+ )
+{
+ DWORD dwParms[] = {
+ MYMSG_PROVIDERCONFIG,
+ (DWORD)hwndOwner,
+ dwPermanentProviderID
+ };
+
+
+//BUGBUG: Can't pass strings across a callback
+
+ DBGOUT((2, "In TUISPI_providerConfig"));
+ DBGOUT((11, " hwndOwner =0x%08lx", hwndOwner));
+ DBGOUT((11, " dwPermanentProviderID=0x%08lx", dwPermanentProviderID));
+
+ (*lpfnUIDLLCallback)(
+ 0, //BUGBUG Is this correct?
+ TUISPIDLL_OBJECT_LINEID,
+ dwParms,
+ sizeof(dwParms)
+ );
+
+//BUGBUG how do we wait and/or return error code?
+
+ return 0;
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG
+TSPIAPI
+TUISPI_providerInstall(
+ TUISPIDLLCALLBACK lpfnUIDLLCallback,
+ HWND hwndOwner,
+ DWORD dwPermanentProviderID
+ )
+{
+
+ DBGOUT((2, "In TUISPI_providerInstall"));
+
+ return 0;
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG
+TSPIAPI
+TUISPI_providerRemove(
+ TUISPIDLLCALLBACK lpfnUIDLLCallback,
+ HWND hwndOwner,
+ DWORD dwPermanentProviderID
+ )
+{
+
+ DBGOUT((2, "In TUISPI_providerRemove"));
+
+ return 0;
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+
+
+
+LONG
+PASCAL
+TSPI_providerEnumDevices16( // TSPI v1.4
+ DWORD dwPermanentProviderID,
+ LPDWORD lpdwNumLines,
+ LPDWORD lpdwNumPhones,
+ HPROVIDER hProvider,
+ LINEEVENT lpfnLineCreateProc,
+ PHONEEVENT lpfnPhoneCreateProc,
+ HWND hSecretWnd
+ );
+
+
+LONG PASCAL TSPI_providerEnumDevices(
+ DWORD dwPermanentProviderID,
+ LPDWORD lpdwNumLines,
+ LPDWORD lpdwNumPhones,
+ HPROVIDER hProvider,
+ LINEEVENT lpfnLineCreateProc,
+ PHONEEVENT lpfnPhoneCreateProc
+ )
+{
+ DWORD dwThreadID;
+
+
+ DBGOUT((2, "In TSPI_providerEnumDevices"));
+
+ //
+ // BUGBUG There's gotta be a better way to earn a buck...
+ //
+
+ if ( NULL == CreateThread( NULL,
+ 0,
+ TheUIThread,
+ (LPVOID)&gdwThreadParms,
+ 0,
+ &dwThreadID
+ )
+ )
+ {
+ //
+ // The CreateThread failed!!
+ //
+ DBGOUT((1, "CreateThread() failed!!!!"));
+ return LINEERR_OPERATIONFAILED;
+ }
+
+
+ while ( !ghWnd)
+ {
+ Sleep(0);
+ }
+
+
+ return TSPI_providerEnumDevices16(
+ dwPermanentProviderID,
+ lpdwNumLines,
+ lpdwNumPhones,
+ hProvider,
+ lpfnLineCreateProc,
+ lpfnPhoneCreateProc,
+ ghWnd
+ );
+
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+
+
+
+LONG
+PASCAL
+TSPI_lineGetID16(
+ HDRVLINE hdLine,
+ DWORD dwAddressID,
+ HDRVCALL hdCall,
+ DWORD dwSelect,
+ LPVARSTRING lpDeviceID,
+ LPCSTR lpszDeviceClass
+ );
+
+
+LONG
+PASCAL
+TSPI_lineGetID(
+ HDRVLINE hdLine,
+ DWORD dwAddressID,
+ HDRVCALL hdCall,
+ DWORD dwSelect,
+ LPVARSTRING lpDeviceID,
+ LPCSTR lpszDeviceClass,
+ HANDLE hTargetProcess
+
+ )
+{
+ LONG lResult;
+
+ DBGOUT((2, "Entering TSPI_lineGetID"));
+
+
+ DBGOUT((20, "lpszDeviceClass=[%s]", lpszDeviceClass));
+
+ lResult = TSPI_lineGetID16(
+ hdLine,
+ dwAddressID,
+ hdCall,
+ dwSelect,
+ lpDeviceID,
+ lpszDeviceClass
+ );
+
+ //
+ // Only continue if the operation was successful
+ //
+ if ( 0 == lResult )
+ {
+
+ //
+ // Is this a handle that we should translate?
+ //
+
+ DWORD dwDataSize;
+ DWORD dwDataType;
+ HKEY hKey;
+ TCHAR buf[64];
+ TCHAR KeyName[128];
+
+
+ //
+ // We determine if we should translate by simply trying to retrive a
+ // value with the name of lpszDeviceClass. If we succeed, we'll
+ // translate.
+ //
+ // We'll use the value as an offset into the string part (AN OFFSET
+ // FROM THE START OF VAR DATA, NOT FROM THE START OF THE STRUCT!!!)
+ // of where we can find the handle.
+ //
+ wsprintf(KeyName, "%s%d", gszProviderKey, gdwPermanentProviderID);
+
+ RegOpenKeyEx(
+ HKEY_LOCAL_MACHINE,
+ KeyName,
+ 0,
+ KEY_ALL_ACCESS,
+ &hKey
+ );
+
+ dwDataSize = sizeof(buf);
+
+
+ DBGOUT((11, "Looking in key [%s] for [%s]", KeyName, lpszDeviceClass));
+
+
+ lResult = RegQueryValueEx(
+ hKey,
+ lpszDeviceClass,
+ 0,
+ &dwDataType,
+ buf,
+ &dwDataSize
+ );
+
+ RegCloseKey( hKey );
+
+
+ if ( 0 == lResult )
+ {
+ HANDLE hTemp;
+#if DBG
+ LONG lRet;
+
+ lRet =
+#endif
+ DuplicateHandle( GetCurrentProcess(),
+ *(LPHANDLE)((LPBYTE)lpDeviceID +
+ lpDeviceID->dwStringOffset +
+ *(LPDWORD)buf
+ ),
+ hTargetProcess,
+ &hTemp,
+ 0,
+ TRUE,
+ DUPLICATE_SAME_ACCESS |
+ DUPLICATE_CLOSE_SOURCE
+ );
+
+// CloseHandle( *(LPHANDLE)( (LPBYTE)lpDeviceID +
+// lpDeviceID->dwStringOffset +
+// *(LPDWORD)buf ) );
+
+
+ *(LPHANDLE)( (LPBYTE)lpDeviceID +
+ lpDeviceID->dwStringOffset +
+ *(LPDWORD)buf ) =
+ hTemp;
+
+ DBGOUT((2, " Duplicate handle return code=0x%08lx", lRet));
+ }
+#if DBG
+ else
+ {
+ DBGOUT((2, " We won't dupe this handle. [%s]", lpszDeviceClass));
+ }
+#endif
+
+ lResult = 0; //What else can we do? Do we fail this if the dupe failed?
+
+ }
+
+
+ DBGOUT((2, "Leaving TSPI_lineGetID - lResult=0x%08lx", lResult));
+
+ return lResult;
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG
+PASCAL
+TSPI_phoneGetID16(
+ HDRVPHONE hdPhone,
+ LPVARSTRING lpDeviceID,
+ LPCSTR lpszDeviceClass
+ );
+
+
+LONG
+PASCAL
+TSPI_phoneGetID(
+ HDRVPHONE hdPhone,
+ LPVARSTRING lpDeviceID,
+ LPCSTR lpszDeviceClass,
+ HANDLE hTargetProcess
+
+ )
+{
+ LONG lResult;
+
+ DBGOUT((2, "Entering TSPI_phoneGetID"));
+
+
+ DBGOUT((20, "lpszDeviceClass=[%s]", lpszDeviceClass));
+
+ lResult = TSPI_phoneGetID16(
+ hdPhone,
+ lpDeviceID,
+ lpszDeviceClass
+ );
+
+ //
+ // Only continue if the operation was successful
+ //
+ if ( 0 == lResult )
+ {
+
+ //
+ // Is this a handle that we should translate?
+ //
+
+ DWORD dwDataSize;
+ DWORD dwDataType;
+ HKEY hKey;
+ TCHAR buf[64];
+ TCHAR KeyName[128];
+
+
+ //
+ // We determine if we should translate by simply trying to retrive a
+ // value with the name of lpszDeviceClass. If we succeed, we'll
+ // translate.
+ //
+ // We'll use the value as an offset into the string part (AN OFFSET
+ // FROM THE START OF VAR DATA, NOT FROM THE START OF THE STRUCT!!!)
+ // of where we can find the handle.
+ //
+ wsprintf(KeyName, "%s%d", gszProviderKey, gdwPermanentProviderID);
+
+ RegOpenKeyEx(
+ HKEY_LOCAL_MACHINE,
+ KeyName,
+ 0,
+ KEY_ALL_ACCESS,
+ &hKey
+ );
+
+ dwDataSize = sizeof(buf);
+
+
+ DBGOUT((20, "Looking in key [%s] for [%s]", KeyName, lpszDeviceClass));
+
+
+ lResult = RegQueryValueEx(
+ hKey,
+ lpszDeviceClass,
+ 0,
+ &dwDataType,
+ buf,
+ &dwDataSize
+ );
+
+ RegCloseKey( hKey );
+
+
+ if ( 0 == lResult )
+ {
+ HANDLE hTemp;
+#if DBG
+ LONG lRet;
+
+ lRet =
+#endif
+ DuplicateHandle( GetCurrentProcess(),
+ *(LPHANDLE)((LPBYTE)lpDeviceID +
+ lpDeviceID->dwStringOffset +
+ *(LPDWORD)buf
+ ),
+ hTargetProcess,
+ &hTemp,
+ 0,
+ TRUE,
+ DUPLICATE_SAME_ACCESS
+// DUPLICATE_CLOSE_SOURCE
+ );
+
+ CloseHandle( *(LPHANDLE)( (LPBYTE)lpDeviceID +
+ lpDeviceID->dwStringOffset +
+ *(LPDWORD)buf ) );
+
+ *(LPHANDLE)( (LPBYTE)lpDeviceID +
+ lpDeviceID->dwStringOffset +
+ *(LPDWORD)buf ) =
+ hTemp;
+
+ DBGOUT((20, " Duplicate handle return code=0x%08lx", lRet));
+ }
+#if DBG
+ else
+ {
+ DBGOUT((20, " We won't dupe this handle. [%s]", lpszDeviceClass));
+ }
+#endif
+
+ lResult = 0; //What else can we do? Do we fail this if the dupe failed?
+
+ }
+
+
+ DBGOUT((2, "Leaving TSPI_phoneGetID - lResult=0x%08lx", lResult));
+
+ return lResult;
+}
+
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+
+LONG
+PASCAL
+TSPI_providerInit16(
+ DWORD dwTSPIVersion,
+ DWORD dwPermanentProviderID,
+ DWORD dwLineDeviceBaseID,
+ DWORD dwPhoneDeviceBaseID,
+ DWORD dwNumLines,
+ DWORD dwNumPhones,
+ ASYNC_COMPLETION lpfnCompletionProc
+ );
+
+LONG
+TSPIAPI
+TSPI_providerInit(
+ DWORD dwTSPIVersion,
+ DWORD dwPermanentProviderID,
+ DWORD dwLineDeviceIDBase,
+ DWORD dwPhoneDeviceIDBase,
+ DWORD dwNumLines,
+ DWORD dwNumPhones,
+ ASYNC_COMPLETION lpfnCompletionProc,
+ LPDWORD lpdwTSPIOptions // TAPI v2.0
+ )
+{
+ DWORD pParams[7];
+
+ DBGOUT((2, "In 32-providerinit"));
+ DBGOUT((11, " dwTSPIVersion =0x%08lx", dwTSPIVersion));
+ DBGOUT((11, " dwPermanentProviderID=0x%08lx", dwPermanentProviderID));
+
+
+ gdwPermanentProviderID = dwPermanentProviderID;
+
+ *lpdwTSPIOptions = 0;
+
+ pParams[0] = dwTSPIVersion;
+ pParams[1] = dwPermanentProviderID;
+ pParams[2] = dwLineDeviceIDBase;
+ pParams[3] = dwPhoneDeviceIDBase;
+ pParams[4] = dwNumLines;
+ pParams[5] = dwNumPhones;
+ pParams[6] = (DWORD)lpfnCompletionProc;
+
+ return SendMessage( ghWnd, MYMSG_PROVIDERINIT, 0, (LPARAM)pParams);
+
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+
+LONG
+PASCAL
+TSPI_providerShutdown16(
+ DWORD dwTSPIVersion
+ );
+
+LONG
+TSPIAPI
+TSPI_providerShutdown(
+ DWORD dwTSPIVersion
+ )
+{
+ LONG lResult;
+
+ DBGOUT((2, "In 32-providerShutdown"));
+
+
+ lResult = SendMessage( ghWnd, MYMSG_PROVIDERSHUTDOWN, 0, dwTSPIVersion);
+
+ //
+ // Is the UI thread still around?
+ //
+ if ( ghWnd )
+ {
+ SendMessage(ghWnd, WM_CLOSE, 0, 0);
+
+ //
+ // Verify that the other thread has done its work and killed
+ // the window
+ //
+ while ( ghWnd )
+ {
+ Sleep(0);
+ }
+ }
+
+ return lResult;
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+
+LONG
+PASCAL
+TSPI_lineMakeCall16(
+ DRV_REQUESTID dwRequestID,
+ HDRVLINE hdLine,
+ HTAPICALL htCall,
+ LPHDRVCALL lphdCall,
+ LPCSTR lpszDestAddress,
+ DWORD dwCountryCode,
+ LPLINECALLPARAMS const lpCallParams
+ );
+
+LONG
+TSPIAPI
+TSPI_lineMakeCall(
+ DRV_REQUESTID dwRequestID,
+ HDRVLINE hdLine,
+ HTAPICALL htCall,
+ LPHDRVCALL lphdCall,
+ LPCSTR lpszDestAddress,
+ DWORD dwCountryCode,
+ LPLINECALLPARAMS const lpCallParams
+ )
+{
+ LONG lResult;
+ DWORD pParams[7];
+
+
+ DBGOUT((2, "In 32-linemakecall"));
+
+ pParams[0] = (DWORD)dwRequestID;
+ pParams[1] = (DWORD)hdLine;
+ pParams[2] = (DWORD)htCall;
+ pParams[3] = (DWORD)lphdCall;
+ pParams[4] = (DWORD)lpszDestAddress;
+ pParams[5] = (DWORD)dwCountryCode;
+ pParams[6] = (DWORD)lpCallParams;
+
+
+ lResult = SendMessage( ghWnd, MYMSG_LINEMAKECALL, 0, (LPARAM)pParams);
+
+
+ return lResult;
+}
+
+
+//****************************************************************************
+//****************************************************************************
+//****************************************************************************
+LONG PASCAL TapiCallbackThunk( DWORD dwDevice,
+ DWORD dwMessage,
+ DWORD dwInstance,
+ DWORD dwParam1,
+ DWORD dwParam2,
+ DWORD dwParam3,
+ DWORD dwjunk
+ )
+{
+
+
+ DBGOUT((2, "TapiCallbackThunk <<<----------------"));
+
+ return 0;
+}
+
+
+
+//***************************************************************************
+//***************************************************************************
+//***************************************************************************
+void HandleCallback( PCOPYDATASTRUCT pCds )
+{
+ DWORD dwCallbackType = ((LPDWORD)pCds->lpData)[0];
+ LPDWORD lpdwCallbackData = (LPDWORD)pCds->lpData;
+
+
+
+ switch ( dwCallbackType )
+ {
+
+ case CALLBACK_ASYNCCOMPLETION:
+ DBGOUT((2, "AsyncCompletion"));
+ (((ASYNC_COMPLETION)(pCds->dwData)))( lpdwCallbackData[1],
+ lpdwCallbackData[2]
+ );
+ break;
+
+
+
+ case CALLBACK_LINEEVENT:
+
+ DBGOUT((2, "LineEvent"));
+
+ if ( lpdwCallbackData[3] == LINE_NEWCALL )
+ {
+ lpdwCallbackData[5] = (DWORD)WOWGetVDMPointer(
+ lpdwCallbackData[5],
+ sizeof(DWORD),
+ 1
+ );
+ }
+
+ //FALTHROUGH!!!
+
+ case CALLBACK_LINECREATE:
+
+ if ( dwCallbackType == CALLBACK_LINECREATE )
+ {
+ DBGOUT((2, "LineCreate"));
+ }
+
+
+ (((FARPROC)(pCds->dwData)))( lpdwCallbackData[1],
+ lpdwCallbackData[2],
+ lpdwCallbackData[3],
+ lpdwCallbackData[4],
+ lpdwCallbackData[5],
+ lpdwCallbackData[6]
+ );
+
+#if DBG
+ if ( dwCallbackType == CALLBACK_LINEEVENT &&
+ lpdwCallbackData[3] == LINE_NEWCALL )
+ DBGOUT((11, "Returned htCall=0x%08lx", *(LPDWORD)(lpdwCallbackData[5])));
+#endif
+ break;
+
+
+ case CALLBACK_PHONEEVENT:
+ DBGOUT((2, "PhoneEvent"));
+ case CALLBACK_PHONECREATE:
+ DBGOUT((2, "PhoneCreate?"));
+ (((FARPROC)(pCds->dwData)))( lpdwCallbackData[1],
+ lpdwCallbackData[2],
+ lpdwCallbackData[3],
+ lpdwCallbackData[4],
+ lpdwCallbackData[5]
+ );
+ break;
+
+
+#if DBG
+ default:
+ DBGOUT((1, "Invalid callback type!!"));
+ // Should rip or assert?
+ break;
+#endif
+ }
+}
+
+
+//***************************************************************************
+//***************************************************************************
+//***************************************************************************
+LRESULT CALLBACK _loadds MyWndProc( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam )
+{
+
+ DBGOUT((91, "msggg"));
+
+ switch( nMsg )
+ {
+
+ case TSP3216L_MESSAGE:
+ if ((wParam == 1) && (lParam == 2) )
+ DBGOUT((0," Got a message thingy"));
+ break;
+
+
+ case MYMSG_PROVIDERINIT:
+ DBGOUT((2, "Got a providerInit message"));
+ return TSPI_providerInit16(
+ ((LPDWORD)lParam)[0],
+ ((LPDWORD)lParam)[1],
+ ((LPDWORD)lParam)[2],
+ ((LPDWORD)lParam)[3],
+ ((LPDWORD)lParam)[4],
+ ((LPDWORD)lParam)[5],
+ (ASYNC_COMPLETION)((LPDWORD)lParam)[6]
+ );
+ break;
+
+
+ case MYMSG_PROVIDERSHUTDOWN:
+ DBGOUT((2, "Got a providerShutdown message"));
+ return TSPI_providerShutdown16(
+ lParam
+ );
+ break;
+
+
+ case MYMSG_PROVIDERCONFIG:
+ DBGOUT((2, "Got a providerConfig message"));
+ return TSPI_providerConfig(
+ (HWND)((LPDWORD)lParam)[0],
+ ((LPDWORD)lParam)[1]
+ );
+ break;
+
+
+ case MYMSG_LINEMAKECALL:
+ DBGOUT((2, "Got a lineMakeCall message"));
+ return TSPI_lineMakeCall16(
+ (DRV_REQUESTID)((LPDWORD)lParam)[0],
+ (HDRVLINE)((LPDWORD)lParam)[1],
+ (HTAPICALL)((LPDWORD)lParam)[2],
+ (LPHDRVCALL)((LPDWORD)lParam)[3],
+ (LPCSTR)((LPDWORD)lParam)[4],
+ (DWORD)((LPDWORD)lParam)[5],
+ (LPLINECALLPARAMS)((LPDWORD)lParam)[6]
+ );
+ break;
+
+
+ case MYMSG_LINECONFIGDIALOG:
+ DBGOUT((2, "Got a lineConfigDialog message"));
+ return TSPI_lineConfigDialog(
+ ((LPDWORD)lParam)[0],
+ (HWND)((LPDWORD)lParam)[1],
+ (LPCSTR)((LPDWORD)lParam)[2]
+ );
+ break;
+
+
+ case MYMSG_PHONECONFIGDIALOG:
+ DBGOUT((2, "Got a phoneConfigDialog message"));
+ return TSPI_phoneConfigDialog(
+ ((LPDWORD)lParam)[0],
+ (HWND)((LPDWORD)lParam)[1],
+ (LPCSTR)((LPDWORD)lParam)[2]
+ );
+ break;
+
+
+ case WM_COPYDATA:
+ DBGOUT((11, "VaHoo!"));
+
+ HandleCallback( (PCOPYDATASTRUCT)lParam );
+
+ break;
+
+
+ case WM_CLOSE:
+ DestroyWindow( hWnd );
+ break;
+
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ break;
+
+
+ default:
+ return DefWindowProc( hWnd, nMsg, wParam, lParam);
+ }
+ DBGOUT((2, "msggg done"));
+
+ return(FALSE);
+}
+
+
+
+
+
+