windows-nt/Source/XPSP1/NT/net/tapi/client/cplsimplelocation.cpp
2020-09-26 16:20:57 +08:00

380 lines
15 KiB
C++

/****************************************************************************
Copyright (c) 1998-1999 Microsoft Corporation
Module Name: cplsimplelocation.cpp
Author: toddb - 10/06/98
****************************************************************************/
//
// The dialog proc for the SimpleLocation page. This is used as a page
// inside the Modem wizard (in modemui.dll) and as a dialog from tapi
// when there are no locations.
//
#include "cplPreComp.h"
#include "cplResource.h"
HRESULT CreateCountryObject(DWORD dwCountryID, CCountry **ppCountry);
int IsCityRule(LPWSTR lpRule);
int IsCityRule(DWORD dwCountryID)
{
CCountry * pCountry;
HRESULT hr;
hr = CreateCountryObject(dwCountryID, &pCountry);
if ( SUCCEEDED(hr) )
{
int ret = IsCityRule(pCountry->GetLongDistanceRule());
delete pCountry;
return ret;
}
// in the error case we return optional as a compromise that works
// for any possible case (though no optimally).
LOG((TL_ERROR, "IsCityRule(DWORD dwCountryID) failed to create country %d", dwCountryID ));
return CITY_OPTIONAL;
}
//***************************************************************************
extern "C"
INT_PTR
CALLBACK
LocWizardDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
static DWORD dwVersion;
switch (uMsg)
{
case WM_INITDIALOG:
{
HWND hwnd;
// we either pass in zero or the TAPI version as the lParam.
dwVersion = (DWORD)lParam;
DWORD dwDefaultCountryID = GetProfileInt(TEXT("intl"), TEXT("iCountry"), 1);
hwnd = GetDlgItem(hwndDlg, IDC_COUNTRY);
PopulateCountryList(hwnd, dwDefaultCountryID);
CCountry * pCountry;
HRESULT hr;
int iCityRule;
int iLongDistanceCarrierCodeRule;
int iInternationalCarrierCodeRule;
hr = CreateCountryObject(dwDefaultCountryID, &pCountry);
if ( SUCCEEDED(hr) )
{
iCityRule = IsCityRule( pCountry->GetLongDistanceRule() );
iLongDistanceCarrierCodeRule = IsLongDistanceCarrierCodeRule( pCountry->GetLongDistanceRule() );
iInternationalCarrierCodeRule = IsInternationalCarrierCodeRule( pCountry->GetInternationalRule() );
delete pCountry;
} else
{
LOG((TL_ERROR, "LocWizardDlgProc failed to create country %d", dwDefaultCountryID));
iCityRule = CITY_OPTIONAL;
iLongDistanceCarrierCodeRule = LONG_DISTANCE_CARRIER_OPTIONAL;
iInternationalCarrierCodeRule = INTERNATIONAL_CARRIER_OPTIONAL;
}
hwnd = GetDlgItem(hwndDlg,IDC_AREACODE);
SendMessage(hwnd,EM_SETLIMITTEXT,CPL_SETTEXTLIMIT,0);
LimitInput(hwnd, LIF_ALLOWNUMBER);
if ( iCityRule == CITY_NONE )
{
SetWindowText(hwnd, TEXT(""));
EnableWindow(hwnd, FALSE);
}
hwnd = GetDlgItem(hwndDlg,IDC_CARRIERCODE);
SendMessage(hwnd,EM_SETLIMITTEXT,CPL_SETTEXTLIMIT,0);
LimitInput(hwnd, LIF_ALLOWNUMBER);
if ( (LONG_DISTANCE_CARRIER_NONE == iLongDistanceCarrierCodeRule) &&
(INTERNATIONAL_CARRIER_NONE == iInternationalCarrierCodeRule) )
{
SetWindowText(hwnd, TEXT(""));
EnableWindow(GetDlgItem(hwndDlg, IDC_STATICCC), FALSE);
EnableWindow(hwnd, FALSE);
}
hwnd = GetDlgItem(hwndDlg,IDC_LOCALACCESSNUM);
SendMessage(hwnd, EM_SETLIMITTEXT, CPL_SETTEXTLIMIT, 0);
LimitInput(hwnd, LIF_ALLOWNUMBER|LIF_ALLOWPOUND|LIF_ALLOWSTAR|LIF_ALLOWCOMMA);
BOOL bUseToneDialing = TRUE;
CheckRadioButton(hwndDlg,IDC_TONE,IDC_PULSE,bUseToneDialing?IDC_TONE:IDC_PULSE);
SetForegroundWindow (hwndDlg);
return TRUE; // auto set focus
}
case WM_NOTIFY:
// If we are controlling the property page then we will recieve WM_NOTIFY
// messages from it.
switch (((LPNMHDR)lParam)->code)
{
case PSN_WIZFINISH:
case PSN_KILLACTIVE:
// This dialog is shown in different places depending on if this is a legacy modem install
// or a PNP modem install. In the PNP case, the dialog shows on a single page wizard that
// has a "finsih" button, in the legacy case it shows in the middle of a series of pages and
// has a "next" button. We get different notify messages based on which case we are in, but
// luckly both of those notifies can be handled with the same code (ie they use the same
// return codes to mean "don't leave this page yet"). This is why we treat both PSN_WIZFINISH
// and PSN_KILLACTIVE in the same mannor.
wParam = IDOK;
break;
case PSN_SETACTIVE:
return TRUE;
default:
return FALSE;
}
// fall through. This causes WM_NOTIFY:PSN_KILLACTIVE to be treated exactly
// the same as WM_COMMAND:IDOK.
case WM_COMMAND:
// we get lots of WM_COMMAND messages, but the only one we care about is the
// "OK" button that dismisses us in dialog mode
switch ( LOWORD(wParam) )
{
case IDOK:
{
HWND hwnd;
TCHAR szBuffer[128];
WCHAR wszAreaCode[32];
WCHAR wszCarrierCode[32];
DWORD dwCountryID;
// verify all the input
hwnd = GetDlgItem( hwndDlg, IDC_COUNTRY );
LRESULT lr = SendMessage( hwnd, CB_GETCURSEL, 0, 0 );
dwCountryID = (DWORD)SendMessage( hwnd, CB_GETITEMDATA, lr, 0 );
if ( CB_ERR == dwCountryID )
{
// No country is selected
ShowErrorMessage(hwnd, IDS_NEEDACOUNTRY);
// if we are a wizard page, prevent swicthing pages
if ( uMsg == WM_NOTIFY )
{
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE);
}
return TRUE;
}
CCountry * pCountry;
HRESULT hr;
int iCityRule;
int iLongDistanceCarrierCodeRule;
int iInternationalCarrierCodeRule;
hr = CreateCountryObject(dwCountryID, &pCountry);
if ( SUCCEEDED(hr) )
{
iCityRule = IsCityRule(pCountry->GetLongDistanceRule());
iLongDistanceCarrierCodeRule = IsLongDistanceCarrierCodeRule( pCountry->GetLongDistanceRule() );
iInternationalCarrierCodeRule = IsInternationalCarrierCodeRule( pCountry->GetInternationalRule() );
delete pCountry;
} else {
LOG((TL_ERROR, "LocWizardDlgProc failed to create country %d", dwCountryID));
iCityRule = CITY_OPTIONAL;
iLongDistanceCarrierCodeRule = LONG_DISTANCE_CARRIER_OPTIONAL;
iInternationalCarrierCodeRule = INTERNATIONAL_CARRIER_OPTIONAL;
}
hwnd = GetDlgItem(hwndDlg, IDC_AREACODE);
GetWindowText( hwnd, szBuffer, ARRAYSIZE(szBuffer) );
SHTCharToUnicode( szBuffer, wszAreaCode, ARRAYSIZE(wszAreaCode) );
// if the selected country requires an area code && no area code is given
if ( (CITY_MANDATORY==iCityRule) && !*wszAreaCode )
{
// complain that the area code is missing.
ShowErrorMessage(hwnd, IDS_NEEDANAREACODE);
// if we are a wizard page, prevent swicthing pages
if ( uMsg == WM_NOTIFY )
{
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE);
}
return TRUE;
}
hwnd = GetDlgItem(hwndDlg, IDC_CARRIERCODE);
GetWindowText( hwnd, szBuffer, ARRAYSIZE(szBuffer) );
SHTCharToUnicode( szBuffer, wszCarrierCode, ARRAYSIZE(wszCarrierCode) );
// if the selected country requires a carrier code && no carrier code is given
if ( ((LONG_DISTANCE_CARRIER_MANDATORY == iLongDistanceCarrierCodeRule) ||
(INTERNATIONAL_CARRIER_MANDATORY == iInternationalCarrierCodeRule)) &&
!*wszCarrierCode )
{
// complain that the carrier code is missing.
ShowErrorMessage(hwnd, IDS_NEEDACARRIERCODE);
// if we are a wizard page, prevent swicthing pages
if ( uMsg == WM_NOTIFY )
{
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, TRUE);
}
return TRUE;
}
// if we get here then the input is all valid
WCHAR wszLocationName[128];
WCHAR wszAccessCode[32];
BOOL bUseTone;
LoadString( GetUIInstance(), IDS_MYLOCATION, szBuffer, ARRAYSIZE(szBuffer) );
SHTCharToUnicode( szBuffer, wszLocationName, ARRAYSIZE(wszLocationName) );
hwnd = GetDlgItem(hwndDlg, IDC_LOCALACCESSNUM);
GetWindowText( hwnd, szBuffer, ARRAYSIZE(szBuffer) );
SHTCharToUnicode( szBuffer, wszAccessCode, ARRAYSIZE(wszAccessCode) );
hwnd = GetDlgItem( hwndDlg, IDC_TONE );
bUseTone = (BST_CHECKED == SendMessage(hwnd, BM_GETCHECK, 0,0));
// Create a location.
CLocation location;
// Initialize it with the values from the dialog
location.Initialize(
wszLocationName,
wszAreaCode,
iLongDistanceCarrierCodeRule?wszCarrierCode:L"",
iInternationalCarrierCodeRule?wszCarrierCode:L"",
wszAccessCode,
wszAccessCode,
L"",
0,
dwCountryID,
0,
bUseTone?LOCATION_USETONEDIALING:0 );
location.NewID();
// Write it to the registry
location.WriteToRegistry();
if ( uMsg == WM_COMMAND )
{
EndDialog(hwndDlg, IDOK);
}
}
break;
case IDCANCEL:
// Do a version check, if the version is < 2.2 then we
// need to provide a strong warning message about legacy apps
// not working correctly without this information. Only upon
// a confirmation from the user will we then end the dialog.
if ( dwVersion < TAPI_VERSION2_2 )
{
int ret;
TCHAR szText[1024];
TCHAR szCaption[128];
LoadString( GetUIInstance(), IDS_NOLOCWARNING, szText, ARRAYSIZE(szText) );
LoadString( GetUIInstance(), IDS_NOLOCCAPTION, szCaption, ARRAYSIZE(szCaption) );
ret = MessageBox(hwndDlg, szText, szCaption, MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2 );
if ( IDYES != ret )
{
return TRUE;
}
}
EndDialog(hwndDlg, IDCANCEL);
break;
case IDC_COUNTRY:
if ( CBN_SELCHANGE == HIWORD(wParam) )
{
HWND hwnd;
DWORD dwCountryID;
int iCityRule;
hwnd = GetDlgItem( hwndDlg, IDC_COUNTRY );
LRESULT lr = SendMessage( hwnd, CB_GETCURSEL, 0, 0 );
dwCountryID = (DWORD)SendMessage( hwnd, CB_GETITEMDATA, lr, 0 );
CCountry * pCountry;
HRESULT hr;
int iLongDistanceCarrierCodeRule;
int iInternationalCarrierCodeRule;
hr = CreateCountryObject(dwCountryID, &pCountry);
if ( SUCCEEDED(hr) )
{
iCityRule = IsCityRule( pCountry->GetLongDistanceRule() );
iLongDistanceCarrierCodeRule = IsLongDistanceCarrierCodeRule( pCountry->GetLongDistanceRule() );
iInternationalCarrierCodeRule = IsInternationalCarrierCodeRule( pCountry->GetInternationalRule() );
delete pCountry;
} else
{
LOG((TL_ERROR, "LocWizardDlgProc failed to create country %d", dwCountryID));
iCityRule = CITY_OPTIONAL;
iLongDistanceCarrierCodeRule = LONG_DISTANCE_CARRIER_OPTIONAL;
iInternationalCarrierCodeRule = INTERNATIONAL_CARRIER_OPTIONAL;
}
hwnd = GetDlgItem(hwndDlg,IDC_AREACODE);
if ( iCityRule == CITY_NONE )
{
SetWindowText(hwnd, TEXT(""));
EnableWindow(hwnd, FALSE);
}
else
{
EnableWindow(hwnd, TRUE);
}
hwnd = GetDlgItem(hwndDlg, IDC_CARRIERCODE);
if ( (LONG_DISTANCE_CARRIER_NONE == iLongDistanceCarrierCodeRule) &&
(INTERNATIONAL_CARRIER_NONE == iInternationalCarrierCodeRule) )
{
SetWindowText(hwnd, TEXT(""));
EnableWindow(hwnd, FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_STATICCC), FALSE);
}
else
{
EnableWindow(hwnd, TRUE);
EnableWindow(GetDlgItem(hwndDlg, IDC_STATICCC), TRUE);
}
}
break;
}
break;
case WM_HELP:
// Process clicks on controls after Context Help mode selected
WinHelp ((HWND)((LPHELPINFO)lParam)->hItemHandle, gszHelpFile, HELP_WM_HELP, (DWORD_PTR)(LPTSTR) a115HelpIDs);
break;
case WM_CONTEXTMENU:
// Process right-clicks on controls
WinHelp ((HWND) wParam, gszHelpFile, HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID) a115HelpIDs);
break;
default:
// message is not handled, return FALSE.
return FALSE;
}
// message was handled. return TRUE.
return TRUE;
}