#include #include #if WINNT #else #include #endif #include "tchar.h" #include "prsht.h" //#define TAPI_API_VERSION 0x00020000 #define TAPI_API_VERSION 0x00010004 #define TAPI_CURRENT_VERSION 0x00010004 #include "tapi.h" #undef TAPI_CURRENT_VERSION #define TAPI_CURRENT_VERSION 0x00020000 #include "tspi.h" #undef TAPI_CURRENT_VERSION #define TAPI_CURRENT_VERSION 0x00010004 #include "clientr.h" #include "client.h" #include "privateold.h" #include "general.h" #if DBG #define InternalDebugOut(_x_) DbgPrt _x_ garbage; #else #define InternalDebugOut(_x_) #endif //*************************************************************************** TCHAR gszCurrentProfileKey[] = "System\\CurrentControlSet\\Control\\Telephony"; TCHAR gszStaticProfileKey[] = "Config\\%04d\\System\\CurrentControlSet\\Control\\Telephony"; TCHAR gszAutoLaunchKey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Telephony"; TCHAR gszAutoLaunchValue[] = "AutoLaunchFlags"; TCHAR gszAutoLocationID[] = "AutoLocationID"; UINT gnNumConfigProfiles = 0; DWORD gdwConfigProfiles[MAX_CONFIGPROFILES]; //*************************************************************************** //*************************************************************************** //*************************************************************************** //Purpose: Gets the appropriately sized translate caps structure // from TAPI. Return TRUE if successful #define LOCATION_GROW 4 BOOL GetTranslateCaps( LPLINETRANSLATECAPS FAR * pptc) { LONG lineErr; LPLINETRANSLATECAPS ptc; DWORD cbSize; cbSize = sizeof(*ptc) * LOCATION_GROW + 200; ptc = (LPLINETRANSLATECAPS)GlobalAllocPtr(GPTR, cbSize); if (ptc) { // Get the translate devcaps ptc->dwTotalSize = cbSize; lineErr = lineGetTranslateCaps (0, TAPI_API_VERSION, ptc); if (LINEERR_STRUCTURETOOSMALL == lineErr || ptc->dwNeededSize > ptc->dwTotalSize) { // Provided structure was too small, resize and try again cbSize = ptc->dwNeededSize; GlobalFreePtr(ptc); ptc = (LPLINETRANSLATECAPS)GlobalAllocPtr(GPTR, cbSize); if (ptc) { ptc->dwTotalSize = cbSize; lineErr = lineGetTranslateCaps (0, TAPI_API_VERSION, ptc); if (0 != lineErr) { // Failure GlobalFreePtr(ptc); ptc = NULL; } } } else if (0 != lineErr) { // Failure GlobalFreePtr(ptc); ptc = NULL; } } *pptc = ptc; return NULL != *pptc; } //*************************************************************************** //*************************************************************************** //*************************************************************************** // // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING // Returns 1 if a problem, 0 if no problem // Code below assumes that this function ONLY returns 0 or 1 (but I think // it would be confusing to have the rettype be BOOL, since we want a // return of '1' on a problem...) // LONG FillConfigProfileBox( HWND hWnd, DWORD dwControl, LPLINETRANSLATECAPS ptc) { UINT n; DWORD nProfileNumberZ; WPARAM wIndex; LINELOCATIONENTRY *ple; HKEY hKey; TCHAR szValueName[40]; TCHAR buf[256]; DWORD dwType; DWORD dwDataSize; LPSTR lpstrProfileLocation = NULL; LONG lResult; // // Get the zero-based Config Profile Number // nProfileNumberZ = dwControl - IDCB_DL_PROFILE1; // // Get the profile's name. If this fails, we assume we've run out // of configs // RegOpenKeyEx( HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\IDConfigDB", 0, KEY_ALL_ACCESS, &hKey ); wsprintf( szValueName, "FriendlyName%04d", nProfileNumberZ + 1); dwDataSize = sizeof(buf); lResult = RegQueryValueEx( hKey, szValueName, 0, &dwType, buf, &dwDataSize ); RegCloseKey( hKey ); // // Did we find a name for it? // if ( ERROR_SUCCESS != lResult ) { return (1); } // // Put whatever we found into the field // SendMessage( GetDlgItem( hWnd, IDCS_DL_PROFILE1 + nProfileNumberZ ), WM_SETTEXT, 0, (LPARAM)&buf ); // // Read what location ID is currently specified for this profile // wsprintf( buf, gszStaticProfileKey, nProfileNumberZ + 1); RegOpenKeyEx( HKEY_LOCAL_MACHINE, buf, 0, KEY_ALL_ACCESS, &hKey ); dwDataSize = sizeof(DWORD); lResult = RegQueryValueEx( hKey, gszAutoLocationID, 0, &dwType, (LPBYTE)&gdwConfigProfiles[ nProfileNumberZ ], &dwDataSize ); RegCloseKey( hKey ); // // If there's no value (maybe it's the first run), use current location // if (lResult != ERROR_SUCCESS) { gdwConfigProfiles[nProfileNumberZ] = ptc->dwCurrentLocationID; } for (n=0; ndwNumLocations; n++) { ple = (LINELOCATIONENTRY*) ((LPSTR)ptc + ptc->dwLocationListOffset); wIndex = SendMessage( GetDlgItem(hWnd, dwControl), CB_ADDSTRING, 0, (LPARAM)((LPSTR)ptc + ple[n].dwLocationNameOffset)); SendMessage( GetDlgItem( hWnd, dwControl), CB_SETITEMDATA, wIndex, ple[n].dwPermanentLocationID ); //{ //// UINT temp; // // wsprintf( buf, "prof=%d loop=%d s=%s dw=%ld seek=%ld", // nProfileNumberZ, // n, // (LPARAM)((LPSTR)ptc + ple[n].dwLocationNameOffset), // (DWORD)ple[n].dwPermanentLocationID, // (DWORD)gdwConfigProfiles[nProfileNumberZ]); // // MessageBox(GetFocus(), buf, "", MB_OK); //} // // If this location is the one this profile wants, select it // if ( gdwConfigProfiles[nProfileNumberZ] == ple[n].dwPermanentLocationID ) { //MessageBox(GetFocus(), "Found profile locationID", "", MB_OK); lpstrProfileLocation = (LPSTR)((LPSTR)ptc + ple[n].dwLocationNameOffset); } } //{ //// UINT temp; // // wsprintf( buf, "profile=%ld loop=%ld s=%s", // (DWORD)nProfileNumberZ, // (DWORD)n, // (LPARAM)((LPSTR)ptc + ple[n].dwLocationNameOffset)); // MessageBox(GetFocus(), buf, "", MB_OK); //} SendMessage( GetDlgItem( hWnd, dwControl), CB_SELECTSTRING, (WPARAM)-1, (LPARAM)lpstrProfileLocation ); return ERROR_SUCCESS; } //*************************************************************************** //*************************************************************************** //*************************************************************************** BOOL CALLBACK GeneralDlgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { static DWORD aIds[] = { 0, 0 }; UINT n; LONG lResult; HKEY hKey; static DWORD dwType; static DWORD dwDataSize; static DWORD dwTapiTNAFlags = 0; // these values are in GENERAL.H // #define FLAG_AUTOLAUNCH 0x00000001 // #define FLAG_AUTOLOCATIONID 0x00000002 // #define FLAG_PROMPTAUTOLOCATIONID 0x00000004 // #define FLAG_ANNOUNCEAUTOLOCATIONID 0x00000008 LPLINETRANSLATECAPS ptc; switch (msg) { case WM_INITDIALOG: { GetTranslateCaps(&ptc); //BUGBUG What if this fails? //BUGBUG If the number of hardware configs == 1, don't bother showing these // // Fill up the Hardware config boxes // if ( ptc ) { lResult = ERROR_SUCCESS; for ( n=0; (nhItemHandle, "windows.hlp", HELP_WM_HELP, (ULONG_PTR)(LPSTR) aIds); break; // Process right-clicks on controls case WM_CONTEXTMENU: InternalDebugOut((50, " WM_CONTEXT_MENU in LocationsDlgProc")); WinHelp ((HWND) wParam, "windows.hlp", HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID) aIds); break; case WM_NOTIFY: { LPNMHDR lpnm = (LPNMHDR)lParam; switch ( lpnm->code ) { case PSN_APPLY: /* case IDOK */ { DWORD dwDisposition; // Don't really care about this... InternalDebugOut((0, " PSN_APPLY - General")); if ( ((LPPSHNOTIFY)lpnm)->lParam ) InternalDebugOut((0, " (actually, it was the OK button)")); // // Write out the new flags // lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE, gszAutoLaunchKey, 0, "", //Class? Who cares? REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition ); if (ERROR_SUCCESS == lResult) { lResult = RegSetValueEx( hKey, gszAutoLaunchValue, 0, dwType, (LPBYTE)&dwTapiTNAFlags, dwDataSize ); RegCloseKey( hKey ); } for ( n=0; n < gnNumConfigProfiles; n++) { DWORD dwTemp; TCHAR szKeyName[128]; wsprintf ( szKeyName, gszStaticProfileKey, n+1); RegCreateKeyEx( HKEY_LOCAL_MACHINE, szKeyName, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwTemp ); RegSetValueEx( hKey, gszAutoLocationID, 0, REG_DWORD, (LPBYTE)&gdwConfigProfiles[n], sizeof(DWORD) ); RegCloseKey( hKey ); } break; } case PSN_RESET: /* case IDCANCEL: */ InternalDebugOut((0, " PSN_RESET - General")); break; #if DBG case PSN_SETACTIVE: InternalDebugOut((0, " PSN_SETACTIVE - General")); break; case PSN_KILLACTIVE: InternalDebugOut((0, " PSN_KILLACTIVE - General")); break; #endif } } break; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDCB_DL_PROFILE1: case IDCB_DL_PROFILE2: case IDCB_DL_PROFILE3: case IDCB_DL_PROFILE4: { // // Only process if something is changing // switch HIWORD(wParam) { case CBN_SELCHANGE: { LRESULT m; gdwConfigProfiles[LOWORD(wParam) - IDCB_DL_PROFILE1] = n = (UINT) SendMessage( GetDlgItem( hWnd, LOWORD(wParam)), CB_GETITEMDATA, ( m= SendMessage( GetDlgItem( hWnd, LOWORD(wParam)), CB_GETCURSEL, 0, 0 ) ) , 0 ); //{ // TCHAR Buffer[256]; // wsprintf( Buffer, "wParam=0x%08lx lParam=0x%08lx data=0x%08lx m=0x%08lx", // (DWORD)wParam, // (DWORD)lParam, // (DWORD)n, // (DWORD)m // ); // MessageBox(GetFocus(), Buffer, "", MB_OK); //} // // Activate the APPLY button if not already done // PropSheet_Changed(GetParent(hWnd), hWnd); } } } break; case IDCK_DL_LAUNCHTAPITNA: { dwTapiTNAFlags ^= FLAG_AUTOLAUNCH; // // Activate the APPLY button if not already done // PropSheet_Changed(GetParent(hWnd), hWnd); } break; case IDCK_DL_AUTOLOCATIONID: { dwTapiTNAFlags ^= FLAG_AUTOLOCATIONID; // // Disable the two checkboxes dependent on this one, // but keep the settings // if ( dwTapiTNAFlags & FLAG_AUTOLOCATIONID ) { EnableWindow( GetDlgItem(hWnd, IDCK_DL_PROMPTAUTOLOCATIONID), TRUE ); EnableWindow( GetDlgItem(hWnd, IDCK_DL_ANNOUNCEAUTOLOCATIONID), TRUE ); // EnableWindow( GetDlgItem(hWnd, IDCS_DL_PROMPTAUTOLOCATIONID), // TRUE // ); // EnableWindow( GetDlgItem(hWnd, IDCS_DL_ANNOUNCEAUTOLOCATIONID), // TRUE // ); } else { EnableWindow( GetDlgItem(hWnd, IDCK_DL_PROMPTAUTOLOCATIONID), FALSE ); EnableWindow( GetDlgItem(hWnd, IDCK_DL_ANNOUNCEAUTOLOCATIONID), FALSE ); // EnableWindow( GetDlgItem(hWnd, IDCS_DL_PROMPTAUTOLOCATIONID), // FALSE // ); // EnableWindow( GetDlgItem(hWnd, IDCS_DL_ANNOUNCEAUTOLOCATIONID), // FALSE // ); } // // Activate the APPLY button if not already done // PropSheet_Changed(GetParent(hWnd), hWnd); } break; case IDCK_DL_PROMPTAUTOLOCATIONID: { dwTapiTNAFlags ^= FLAG_PROMPTAUTOLOCATIONID; // // Activate the APPLY button if not already done // PropSheet_Changed(GetParent(hWnd), hWnd); } break; case IDCK_DL_UPDATEONSTARTUP: { dwTapiTNAFlags ^= FLAG_UPDATEONSTARTUP; // // Activate the APPLY button if not already done // PropSheet_Changed(GetParent(hWnd), hWnd); } break; case IDCK_DL_ANNOUNCEAUTOLOCATIONID: { dwTapiTNAFlags ^= FLAG_ANNOUNCEAUTOLOCATIONID; // // Activate the APPLY button if not already done // PropSheet_Changed(GetParent(hWnd), hWnd); } break; default: { } break; } } break; default: break; } return FALSE; }