windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/wizard.cpp

2064 lines
49 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
// File: wizard.cpp
#include "precomp.h"
#include <vfw.h>
#include <ulsreg.h>
#include "call.h"
#include "ulswizrd.h"
#include "ConfWnd.h"
#include "ConfCpl.h"
#include "mrulist.h"
#include "conf.h"
#include "setupdd.h"
#include "vidwiz.h"
#include "dstest.h"
#include "splash.h"
#include "nmmkcert.h"
#include "confroom.h" // for GetConfRoom
#include "FnObjs.h"
#include "ConfPolicies.h"
#include "SysPol.h"
#include "confUtil.h"
#include "shlWAPI.h"
#include "help_ids.h"
extern VOID SaveDefaultCodecSettings(UINT uBandWidth);
INT_PTR CALLBACK ShortcutWizDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
// from ulscpl.cpp
VOID FixServerDropList(HWND hdlg, int id, LPTSTR pszServer, UINT cchMax);
static const TCHAR g_szRegOwner[] = WIN_REGKEY_REGOWNER; // concatenated string of first name + last name
static const TCHAR g_szClientFld[] = ULS_REGISTRY TEXT ("\\") ULS_REGFLD_CLIENT;
static const TCHAR g_szFirstName[] = ULS_REGKEY_FIRST_NAME;
static const TCHAR g_szLastName[] = ULS_REGKEY_LAST_NAME;
static const TCHAR g_szEmailName[] = ULS_REGKEY_EMAIL_NAME;
static const TCHAR g_szLocation[] = ULS_REGKEY_LOCATION;
static const TCHAR g_szComments[] = ULS_REGKEY_COMMENTS;
static const TCHAR g_szServerName[] = ULS_REGKEY_SERVER_NAME;
static const TCHAR g_szDontPublish[] = ULS_REGKEY_DONT_PUBLISH;
static const TCHAR g_szResolveName[] = ULS_REGKEY_RESOLVE_NAME; // concatenated string of uls://servername/emailname
static const TCHAR g_szUserName[] = ULS_REGKEY_USER_NAME; // concatenated string of first name + last name
// These functions are implemented below:
static INT_PTR APIENTRY IntroWiz(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static INT_PTR APIENTRY AppSharingWiz(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static INT_PTR APIENTRY BandwidthWiz(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static BOOL NeedAudioWizard(LPLONG plSoundCaps, BOOL fForce);
static BOOL CheckForNames(ULS_CONF *pConf);
static void FillWizardPages ( PROPSHEETPAGE *pPage, LPARAM lParam );
struct INTRO_PAGE_CONFIG
{
BOOL * fContinue;
BOOL fAllowBack;
};
BOOL g_fSilentWizard = FALSE;
// This holdn the user info page HWND...
static HWND s_hDlgUserInfo = NULL;
static HWND s_hDlgGKSettings = NULL;
class IntroWiz
{
public:
// The order of the pages
// Make sure to change the order the pages are created at the same time
// you change this
enum
{
Intro,
AppSharing,
ULSFirst,
ULSLast,
Bandwidth,
Video,
Shortcuts,
AudioFirst,
Count
} ;
static void InitPages()
{
// Init to NULL before adding any pages
for (int i=0; i<Count; ++i)
{
g_idWizOrder[i] = 0;
}
}
static void SetPage(UINT nPage, UINT_PTR id)
{
g_idWizOrder[nPage] = id;
}
static UINT_PTR GetPrevPage(UINT nPageCur)
{
if (0 == nPageCur)
{
return(0);
}
for (int i=nPageCur-1; i>=1; --i)
{
if (0 != g_idWizOrder[i])
{
break;
}
}
return(g_idWizOrder[i]);
}
static UINT_PTR GetNextPage(UINT nPageCur)
{
if (Count-1 <= nPageCur)
{
return(0);
}
for (int i=nPageCur+1; i<Count-1; ++i)
{
if (0 != g_idWizOrder[i])
{
break;
}
}
return(g_idWizOrder[i]);
}
static BOOL HandleWizNotify(HWND hPage, NMHDR *pHdr, UINT nPageCur)
{
switch(pHdr->code)
{
case PSN_SETACTIVE:
InitBackNext(hPage, nPageCur);
if (g_fSilentWizard)
{
PropSheet_PressButton(GetParent(hPage), PSBTN_NEXT);
}
break;
case PSN_WIZBACK:
{
UINT_PTR iPrev = GetPrevPage(nPageCur);
SetWindowLongPtr(hPage, DWLP_MSGRESULT, iPrev);
break;
}
case PSN_WIZNEXT:
{
UINT_PTR iPrev = GetNextPage(nPageCur);
SetWindowLongPtr(hPage, DWLP_MSGRESULT, iPrev);
break;
}
default:
return(FALSE);
}
return(TRUE);
}
private:
static UINT_PTR g_idWizOrder[Count];
static void InitBackNext(HWND hPage, UINT nPageCur)
{
DWORD dwFlags = 0;
if (0 != nPageCur && 0 != GetPrevPage(nPageCur))
{
dwFlags |= PSWIZB_BACK;
}
if (Count-1 != nPageCur && 0 != GetNextPage(nPageCur))
{
dwFlags |= PSWIZB_NEXT;
}
else
{
dwFlags |= PSWIZB_FINISH;
}
PropSheet_SetWizButtons(::GetParent(hPage), dwFlags);
}
} ;
UINT_PTR IntroWiz::g_idWizOrder[Count];
UINT_PTR GetPageBeforeULS()
{
return(IntroWiz::GetPrevPage(IntroWiz::ULSFirst));
}
UINT_PTR GetPageBeforeVideoWiz()
{
return(IntroWiz::GetPrevPage(IntroWiz::Video));
}
UINT_PTR GetPageBeforeAudioWiz()
{
return(IntroWiz::GetPrevPage(IntroWiz::AudioFirst));
}
UINT_PTR GetPageAfterVideo()
{
return(IntroWiz::GetNextPage(IntroWiz::Video));
}
UINT_PTR GetPageAfterULS()
{
return(IntroWiz::GetNextPage(IntroWiz::ULSLast));
}
void HideWizard(HWND hwnd)
{
SetWindowPos(hwnd, NULL, -1000, -1000, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
void ShowWizard(HWND hwnd)
{
CenterWindow(hwnd, HWND_DESKTOP);
g_fSilentWizard = FALSE;
PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
}
/* F I L L I N P R O P E R T Y P A G E */
/*-------------------------------------------------------------------------
%%Function: FillInPropertyPage
Fill in the given PROPSHEETPAGE structure.
-------------------------------------------------------------------------*/
VOID FillInPropertyPage(PROPSHEETPAGE* psp, int idDlg,
DLGPROC pfnDlgProc, LPARAM lParam, LPCTSTR pszProc)
{
// Clear and set the size of the PROPSHEETPAGE
InitStruct(psp);
ASSERT(0 == psp->dwFlags); // No special flags.
ASSERT(NULL == psp->pszIcon); // Don't use a special icon in the caption bar.
psp->hInstance = ::GetInstanceHandle();
psp->pszTemplate = MAKEINTRESOURCE(idDlg); // The dialog box template to use.
psp->pfnDlgProc = pfnDlgProc; // The dialog procedure that handles this page.
psp->pszTitle = pszProc; // The title for this page.
psp->lParam = lParam; // Special application-specific data.
}
static const UINT NOVALSpecified = 666;
UINT GetBandwidth()
{
RegEntry reAudio(AUDIO_KEY, HKEY_CURRENT_USER);
return(reAudio.GetNumber(REGVAL_TYPICALBANDWIDTH, NOVALSpecified ));
}
void SetBandwidth(UINT uBandwidth)
{
RegEntry reAudio(AUDIO_KEY, HKEY_CURRENT_USER);
reAudio.SetValue(REGVAL_TYPICALBANDWIDTH, uBandwidth);
}
HRESULT StartRunOnceWizard(LPLONG plSoundCaps, BOOL fForce, BOOL fVisible)
{
LPPROPSHEETPAGE pAudioPages = NULL;
UINT nNumAudioPages = 0;
PWIZCONFIG pAudioConfig;
CULSWizard* pIWizard = NULL;
LPPROPSHEETPAGE pULSPages = NULL;
DWORD dwNumULSPages = 0;
ULS_CONF* pulsConf = NULL;
UINT uOldBandwidth = 0;
UINT uBandwidth = 0;
int idAppSharingIntroWiz = 0;
BOOL fULSWiz = FALSE;
BOOL fAudioWiz = FALSE;
BOOL fVideoWiz = FALSE;
BOOL fVidWizInit = FALSE;
HRESULT hrRet = E_FAIL;
g_fSilentWizard = !fVisible;
ASSERT(plSoundCaps);
BOOL fNeedUlsWizard = FALSE;
BOOL fNeedVideoWizard = FALSE;
BOOL fNeedAudioWizard = NeedAudioWizard(plSoundCaps, fForce);
if (fNeedAudioWizard)
{
if (GetAudioWizardPages(RUNDUE_NEVERBEFORE,
WAVE_MAPPER,
&pAudioPages,
&pAudioConfig,
&nNumAudioPages))
{
fAudioWiz = TRUE;
}
else
{
ERROR_OUT(("could not get AudioWiz pages"));
}
}
fVidWizInit = InitVidWiz();
if (fVidWizInit == FALSE)
{
fVideoWiz = FALSE;
WARNING_OUT(("InitVidWiz failed"));
}
else
{
fNeedVideoWizard = NeedVideoPropPage(fForce);
fVideoWiz = fNeedVideoWizard;
}
if (NULL != (pIWizard = new CULSWizard))
{
ASSERT (pIWizard);
// BUGBUG: not checking return value:
HRESULT hr = pIWizard->GetWizardPages (&pULSPages, &dwNumULSPages, &pulsConf);
if (SUCCEEDED(hr))
{
ASSERT(pulsConf);
TRACE_OUT(("ULS_CONF from UlsGetConfiguration:"));
TRACE_OUT(("\tdwFlags: 0x%08x", pulsConf->dwFlags));
TRACE_OUT(("\tszServerName: >%s<", pulsConf->szServerName));
TRACE_OUT(("\tszUserName: >%s<", pulsConf->szUserName));
TRACE_OUT(("\tszEmailName: >%s<", pulsConf->szEmailName));
fNeedUlsWizard = ((pulsConf->dwFlags &
(ULSCONF_F_EMAIL_NAME | ULSCONF_F_FIRST_NAME | ULSCONF_F_LAST_NAME)) !=
(ULSCONF_F_EMAIL_NAME | ULSCONF_F_FIRST_NAME | ULSCONF_F_LAST_NAME));
// Don't bother with the ULS wizard if we have all the information
if ((!fForce) && !fNeedUlsWizard)
{
// We have all of the necessary names
hrRet = S_OK;
// release the pages we won't be needing them
pIWizard->ReleaseWizardPages (pULSPages);
delete pIWizard;
pIWizard = NULL;
dwNumULSPages = 0;
}
else
{
// some information is not available - we need to run the
// wizard...
//SS: if for some reason the user name is not set
//even though the others are set??
fULSWiz = TRUE;
if (::GetDefaultName(pulsConf->szUserName, CCHMAX(pulsConf->szUserName)))
{
// We have added a default name, so mark that structure
// member as valid:
pulsConf->dwFlags |= ULSCONF_F_USER_NAME;
}
}
}
}
else
{
ERROR_OUT(("CreateUlsWizardInterface() failed!"));
}
// Determine if we need to display the app sharing info page, and if
// so which one.
if (::IsWindowsNT() && !g_fNTDisplayDriverEnabled)
{
idAppSharingIntroWiz = ::CanInstallNTDisplayDriver()
? IDD_APPSHARINGWIZ_HAVESP
: IDD_APPSHARINGWIZ_NEEDSP;
}
if ((fULSWiz || fAudioWiz || fVideoWiz))
{
UINT nNumPages = 0;
// Now fill in remaining PROPSHEETHEADER structures:
PROPSHEETHEADER psh;
InitStruct(&psh);
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD | PSH_NOAPPLYNOW;
psh.hInstance = ::GetInstanceHandle();
ASSERT(0 == psh.nStartPage);
// alocate enough space for all pages
DWORD nPages = dwNumULSPages + nNumAudioPages
+ ( (0 != idAppSharingIntroWiz) ? 1 : 0 )
+ (fVideoWiz ? 1 : 0)
+ 2 // intro page & bandwidth page
+ 1 // shortcuts page
;
LPPROPSHEETPAGE ppsp = new PROPSHEETPAGE[ nPages ];
if (NULL != ppsp)
{
IntroWiz::InitPages();
BOOL fContinue = TRUE;
INTRO_PAGE_CONFIG ipcIntro = { &fContinue, FALSE };
INTRO_PAGE_CONFIG ipcAppSharing = { &fContinue, TRUE };
if (fULSWiz)
{
// Insert the intro page:
FillInPropertyPage(&ppsp[nNumPages++], IDD_INTROWIZ,
IntroWiz, (LPARAM) &ipcIntro);
IntroWiz::SetPage(IntroWiz::Intro, IDD_INTROWIZ);
// Insert an NT application page, if necessary. It uses the
// same dialog proc as the intro page.
if (0 != idAppSharingIntroWiz)
{
FillInPropertyPage(&ppsp[nNumPages++], idAppSharingIntroWiz,
AppSharingWiz, (LPARAM) &ipcAppSharing);
IntroWiz::SetPage(IntroWiz::AppSharing, idAppSharingIntroWiz);
}
ASSERT(pulsConf);
pulsConf->dwFlags |= (ULSWIZ_F_SHOW_BACK |
((fAudioWiz || fVideoWiz) ? ULSWIZ_F_NO_FINISH : 0));
::CopyMemory( &(ppsp[nNumPages]),
pULSPages,
dwNumULSPages * sizeof(PROPSHEETPAGE));
IntroWiz::SetPage(IntroWiz::ULSFirst,
reinterpret_cast<UINT_PTR>(pULSPages[0].pszTemplate));
IntroWiz::SetPage(IntroWiz::ULSLast,
reinterpret_cast<UINT_PTR>(pULSPages[dwNumULSPages-1].pszTemplate));
nNumPages += dwNumULSPages;
uBandwidth = uOldBandwidth = GetBandwidth();
if( NOVALSpecified == uBandwidth )
{
FillInPropertyPage(&ppsp[nNumPages++], IDD_BANDWIDTHWIZ,
BandwidthWiz, (LPARAM) &uBandwidth);
IntroWiz::SetPage(IntroWiz::Bandwidth, IDD_BANDWIDTHWIZ);
}
}
BOOL fShortcuts = fForce && !g_fSilentWizard;
if (fVideoWiz)
{
LONG button_mask = 0;
if (fULSWiz == TRUE)
button_mask |= PSWIZB_BACK;
if (fShortcuts || fAudioWiz)
button_mask |= PSWIZB_NEXT;
else
button_mask |= PSWIZB_FINISH;
FillInPropertyPage(&ppsp[nNumPages], IDD_VIDWIZ,
VidWizDlg, button_mask, "NetMeeting");
nNumPages++;
IntroWiz::SetPage(IntroWiz::Video, IDD_VIDWIZ);
}
if (fShortcuts)
{
FillInPropertyPage(&ppsp[nNumPages], IDD_SHRTCUTWIZ,
ShortcutWizDialogProc, 0);
nNumPages++;
IntroWiz::SetPage(IntroWiz::Shortcuts, IDD_SHRTCUTWIZ);
}
if (fAudioWiz)
{
if (fULSWiz || fVideoWiz)
{
pAudioConfig->uFlags |= STARTWITH_BACK;
}
::CopyMemory( &(ppsp[nNumPages]),
pAudioPages,
nNumAudioPages * sizeof(PROPSHEETPAGE));
nNumPages += nNumAudioPages;
IntroWiz::SetPage(IntroWiz::AudioFirst,
reinterpret_cast<UINT_PTR>(pAudioPages[0].pszTemplate));
}
psh.ppsp = ppsp;
psh.nPages = nNumPages;
if( !PropertySheet(&psh) )
{ // User hit CANCEL
pIWizard->ReleaseWizardPages (pULSPages);
delete pIWizard;
delete ppsp;
return S_FALSE;
}
delete ppsp;
if ((FALSE == fContinue) && fULSWiz)
{
// Clear out the flags, because we don't want to store
// any info in the registry (and therefore, we don't want
// to run)
pulsConf->dwFlags = 0;
}
}
}
if (fULSWiz)
{
if (!(ULSCONF_F_USER_NAME & pulsConf->dwFlags))
{
if (::GetDefaultName(pulsConf->szUserName, CCHMAX(pulsConf->szUserName)))
{
pulsConf->dwFlags |= ULSCONF_F_USER_NAME;
}
}
if ((S_OK == pIWizard->SetConfig (pulsConf)) &&
(ULSCONF_F_USER_NAME & pulsConf->dwFlags) &&
(ULSCONF_F_EMAIL_NAME & pulsConf->dwFlags) &&
(ULSCONF_F_FIRST_NAME & pulsConf->dwFlags) &&
(ULSCONF_F_LAST_NAME & pulsConf->dwFlags))
{
// We have all of the necessary names
hrRet = S_OK;
}
else
{
WARNING_OUT(("Unable to obtain a name!"));
}
TRACE_OUT(("ULS_CONF after running wizard:"));
TRACE_OUT(("\tdwFlags: 0x%08x", pulsConf->dwFlags));
TRACE_OUT(("\tszServerName: >%s<", pulsConf->szServerName));
TRACE_OUT(("\tszUserName: >%s<", pulsConf->szUserName));
TRACE_OUT(("\tszEmailName: >%s<", pulsConf->szEmailName));
pIWizard->ReleaseWizardPages (pULSPages);
delete pIWizard;
pIWizard = NULL;
}
// Display the Splash screen as soon as possible
if( SUCCEEDED(hrRet) && fForce && fVisible && (NULL == GetConfRoom()))
{
::StartSplashScreen(NULL);
}
if (uOldBandwidth != uBandwidth)
{
SetBandwidth(uBandwidth);
SaveDefaultCodecSettings(uBandwidth);
}
if (fAudioWiz)
{
AUDIOWIZOUTPUT awo;
ReleaseAudioWizardPages(pAudioPages, pAudioConfig, &awo);
if (awo.uValid & SOUNDCARDCAPS_CHANGED)
{
*plSoundCaps = awo.uSoundCardCaps;
}
else
{
// The wizard was cancelled, so we should only take the
// information that tells us whether or not a sound card
// is present.
*plSoundCaps = (awo.uSoundCardCaps & SOUNDCARD_PRESENT);
// Write this value to the registry so that the wizard will not
// auto-launch the next time we run:
RegEntry reSoundCaps(AUDIO_KEY, HKEY_CURRENT_USER);
reSoundCaps.SetValue(REGVAL_SOUNDCARDCAPS, *plSoundCaps);
}
}
// Even if the VidWiz page wasn't shown, we still need to call this
// function (UpdateVidConfigRegistry) to fix the registry if the video
// capture device configurations have changed since the last time.
if (fVidWizInit)
{
UpdateVidConfigRegistry();
UnInitVidWiz();
}
g_fSilentWizard = FALSE;
return hrRet;
}
INT_PTR APIENTRY AppSharingWiz( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
// Save the lParam information. in DWL_USER
::SetWindowLongPtr(hDlg, DWLP_USER, ((PROPSHEETPAGE*)lParam)->lParam);
if (g_fSilentWizard)
{
HideWizard(GetParent(hDlg));
}
else
{
ShowWizard(GetParent(hDlg));
}
return TRUE;
}
case WM_NOTIFY:
{
switch (((NMHDR FAR *) lParam)->code)
{
case PSN_SETACTIVE:
{
ASSERT(lParam);
INTRO_PAGE_CONFIG* pipc = (INTRO_PAGE_CONFIG*)
::GetWindowLongPtr(hDlg, DWLP_USER);
ASSERT(pipc);
DWORD dwFlags = pipc->fAllowBack ? PSWIZB_BACK : 0;
if( IntroWiz::GetNextPage(IntroWiz::AppSharing) == 0 )
{
dwFlags |= PSWIZB_FINISH;
}
else
{
dwFlags |= PSWIZB_NEXT;
}
// Initialize the controls.
PropSheet_SetWizButtons( ::GetParent(hDlg), dwFlags );
if (g_fSilentWizard)
{
PropSheet_PressButton(
GetParent(hDlg), PSBTN_NEXT);
}
break;
}
case PSN_KILLACTIVE:
{
::SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
return TRUE;
}
case PSN_WIZNEXT:
{
UINT_PTR iNext = IntroWiz::GetNextPage(IntroWiz::AppSharing);
ASSERT( iNext );
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, iNext );
return TRUE;
}
case PSN_RESET:
{
ASSERT(lParam);
INTRO_PAGE_CONFIG* pipc = (INTRO_PAGE_CONFIG*)
::GetWindowLongPtr(hDlg, DWLP_USER);
ASSERT(pipc);
*pipc->fContinue = FALSE;
break;
}
}
break;
}
default:
break;
}
return FALSE;
}
INT_PTR APIENTRY IntroWiz( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
// Save the lParam information. in DWL_USER
::SetWindowLongPtr(hDlg, DWLP_USER, ((PROPSHEETPAGE*)lParam)->lParam);
if (g_fSilentWizard)
{
HideWizard(GetParent(hDlg));
}
else
{
ShowWizard(GetParent(hDlg));
}
return TRUE;
}
case WM_NOTIFY:
{
switch (((NMHDR FAR *) lParam)->code)
{
case PSN_SETACTIVE:
{
ASSERT(lParam);
INTRO_PAGE_CONFIG* pipc = (INTRO_PAGE_CONFIG*)
::GetWindowLongPtr(hDlg, DWLP_USER);
ASSERT(pipc);
// Initialize the controls.
PropSheet_SetWizButtons(
::GetParent(hDlg),
PSWIZB_NEXT | (pipc->fAllowBack ? PSWIZB_BACK : 0));
if (g_fSilentWizard)
{
PropSheet_PressButton(
GetParent(hDlg), PSBTN_NEXT);
}
break;
}
case PSN_KILLACTIVE:
{
::SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
return TRUE;
}
case PSN_WIZNEXT:
{
break;
}
case PSN_RESET:
{
ASSERT(lParam);
INTRO_PAGE_CONFIG* pipc = (INTRO_PAGE_CONFIG*)
::GetWindowLongPtr(hDlg, DWLP_USER);
ASSERT(pipc);
*pipc->fContinue = FALSE;
break;
}
}
break;
}
default:
break;
}
return FALSE;
}
static void BandwidthWiz_InitDialog(HWND hDlg, UINT uOldBandwidth)
{
INT idChecked;
//set the initial value
switch (uOldBandwidth)
{
case BW_144KBS:
idChecked = IDC_RADIO144KBS;
break;
case BW_ISDN:
idChecked = IDC_RADIOISDN;
break;
case BW_MOREKBS:
idChecked = IDC_RADIOMOREKBS;
break;
case BW_288KBS:
default:
idChecked = IDC_RADIO288KBS;
break;
}
CheckRadioButton(hDlg, IDC_RADIO144KBS, IDC_RADIOISDN, idChecked);
}
static void BandwidthWiz_OK(HWND hDlg, UINT *puBandwidth)
{
//check the radio button
if (IsDlgButtonChecked(hDlg,IDC_RADIO144KBS))
{
*puBandwidth = BW_144KBS;
}
else if (IsDlgButtonChecked(hDlg,IDC_RADIO288KBS))
{
*puBandwidth = BW_288KBS;
}
else if (IsDlgButtonChecked(hDlg,IDC_RADIOISDN))
{
*puBandwidth = BW_ISDN;
}
else
{
*puBandwidth = BW_MOREKBS;
}
// if (BW_MOREKBS != *puBandwidth)
// {
// // disable refresh of speed dials if not on a LAN
// RegEntry re(UI_KEY, HKEY_CURRENT_USER);
// re.SetValue(REGVAL_ENABLE_FRIENDS_AUTOREFRESH, (ULONG) 0L);
// }
}
INT_PTR APIENTRY BandwidthWiz( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
PROPSHEETPAGE *ps;
static UINT *puBandwidth;
static UINT uOldBandwidth;
switch (message) {
case WM_INITDIALOG:
{
// Save the PROPSHEETPAGE information.
ps = (PROPSHEETPAGE *)lParam;
puBandwidth = (UINT*)ps->lParam;
uOldBandwidth = *puBandwidth;
BandwidthWiz_InitDialog(hDlg, uOldBandwidth);
return (TRUE);
}
case WM_NOTIFY:
switch (((NMHDR FAR *) lParam)->code) {
case PSN_SETACTIVE:
{
// Initialize the controls.
IntroWiz::HandleWizNotify(hDlg,
reinterpret_cast<NMHDR*>(lParam), IntroWiz::Bandwidth);
break;
}
case PSN_WIZBACK:
return(IntroWiz::HandleWizNotify(hDlg,
reinterpret_cast<NMHDR*>(lParam), IntroWiz::Bandwidth));
case PSN_WIZFINISH:
case PSN_WIZNEXT:
{
BandwidthWiz_OK(hDlg, puBandwidth);
return(IntroWiz::HandleWizNotify(hDlg,
reinterpret_cast<NMHDR*>(lParam), IntroWiz::Bandwidth));
}
case PSN_RESET:
*puBandwidth = uOldBandwidth;
break;
default:
break;
}
break;
default:
break;
}
return FALSE;
}
static void BandwidthDlg_OnCommand(HWND hDlg, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDOK:
{
UINT uBandwidth;
BandwidthWiz_OK(hDlg, &uBandwidth);
EndDialog(hDlg, uBandwidth);
break;
}
// Fall through
case IDCANCEL:
EndDialog(hDlg, 0);
break;
default:
break;
}
}
INT_PTR CALLBACK BandwidthDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static const DWORD aContextHelpIds[] = {
IDC_RADIO144KBS, IDH_AUDIO_CONNECTION_SPEED,
IDC_RADIO288KBS, IDH_AUDIO_CONNECTION_SPEED,
IDC_RADIOISDN, IDH_AUDIO_CONNECTION_SPEED,
IDC_RADIOMOREKBS, IDH_AUDIO_CONNECTION_SPEED,
0, 0 // terminator
};
switch (message) {
HANDLE_MSG(hDlg, WM_COMMAND, BandwidthDlg_OnCommand);
case WM_INITDIALOG:
BandwidthWiz_InitDialog(hDlg, (UINT)lParam);
break;
case WM_CONTEXTMENU:
DoHelpWhatsThis(wParam, aContextHelpIds);
break;
case WM_HELP:
DoHelp(lParam, aContextHelpIds);
break;
default:
return(FALSE);
}
return(TRUE);
}
BOOL NeedAudioWizard(LPLONG plSoundCaps, BOOL fForce)
{
if (_Module.IsSDKCallerRTC() || SysPol::NoAudio())
{
WARNING_OUT(("Audio disabled through system policy switch"));
return FALSE;
}
if (fForce)
{
return TRUE;
}
BOOL fAudioWiz = FALSE;
RegEntry reSoundCaps(AUDIO_KEY, HKEY_CURRENT_USER);
// a default that doesn't overlap with real values
long lCapsNotPresent = 0x7FFFFFFF;
*plSoundCaps = reSoundCaps.GetNumber( REGVAL_SOUNDCARDCAPS,
lCapsNotPresent);
if (lCapsNotPresent == *plSoundCaps)
{
TRACE_OUT(("Missing sound caps - starting calib wizard"));
fAudioWiz = TRUE;
}
else
{
if (!ISSOUNDCARDPRESENT(*plSoundCaps))
{
if (waveInGetNumDevs() && waveOutGetNumDevs())
fAudioWiz = TRUE;
}
else
{
WAVEINCAPS waveinCaps;
WAVEOUTCAPS waveoutCaps;
//if the wavein has changed since last
if (waveInGetDevCaps(reSoundCaps.GetNumber(REGVAL_WAVEINDEVICEID,WAVE_MAPPER),
&waveinCaps, sizeof(WAVEINCAPS)) == MMSYSERR_NOERROR)
{
//check the name, if changed, run the wizard
if (lstrcmp(reSoundCaps.GetString(REGVAL_WAVEINDEVICENAME),waveinCaps.szPname))
fAudioWiz = TRUE;
}
else
fAudioWiz = TRUE;
//if the waveout has changed since last
if (waveOutGetDevCaps(reSoundCaps.GetNumber(REGVAL_WAVEOUTDEVICEID,WAVE_MAPPER),
&waveoutCaps, sizeof(WAVEOUTCAPS)) == MMSYSERR_NOERROR)
{
//check the name, if changed, run the wizard
if (lstrcmp(reSoundCaps.GetString(REGVAL_WAVEOUTDEVICENAME),waveoutCaps.szPname))
fAudioWiz = TRUE;
}
else
fAudioWiz = TRUE;
}
}
return fAudioWiz;
}
///////////////////////////////////////////////////////
//
// Wizard pages
//
DWORD SetUserPageWizButtons(HWND hDlg, DWORD dwConfFlags)
{
DWORD dwButtonFlags = PSWIZB_BACK;
// disable the 'Next' button if not all of first name, last name and email
// are filled in
if (!FEmptyDlgItem(hDlg, IDEC_FIRSTNAME) &&
!FEmptyDlgItem(hDlg, IDEC_LASTNAME) &&
!FEmptyDlgItem(hDlg, IDC_USER_EMAIL))
{
dwButtonFlags |= (dwConfFlags & ULSWIZ_F_NO_FINISH) ? PSWIZB_NEXT : PSWIZB_FINISH;
}
PropSheet_SetWizButtons (GetParent (hDlg), dwButtonFlags);
return dwButtonFlags;
}
void GetUserPageState(HWND hDlg, ULS_CONF *pConf)
{
//strip the first name/email name and last name
TrimDlgItemText(hDlg, IDEC_FIRSTNAME);
TrimDlgItemText(hDlg, IDEC_LASTNAME);
TrimDlgItemText(hDlg, IDC_USER_EMAIL);
TrimDlgItemText(hDlg, IDC_USER_LOCATION);
TrimDlgItemText(hDlg, IDC_USER_INTERESTS);
Edit_GetText(GetDlgItem(hDlg, IDEC_FIRSTNAME),
pConf->szFirstName, MAX_FIRST_NAME_LENGTH);
Edit_GetText(GetDlgItem(hDlg, IDEC_LASTNAME),
pConf->szLastName, MAX_LAST_NAME_LENGTH);
Edit_GetText(GetDlgItem(hDlg, IDC_USER_EMAIL),
pConf->szEmailName, MAX_EMAIL_NAME_LENGTH);
Edit_GetText(GetDlgItem(hDlg, IDC_USER_LOCATION),
pConf->szLocation, MAX_LOCATION_NAME_LENGTH);
Edit_GetText(GetDlgItem(hDlg, IDC_USER_INTERESTS),
pConf->szComments, MAX_COMMENTS_LENGTH);
if (pConf->szFirstName[0]) pConf->dwFlags |= ULSCONF_F_FIRST_NAME;
if (pConf->szLastName[0]) pConf->dwFlags |= ULSCONF_F_LAST_NAME;
if (pConf->szEmailName[0]) pConf->dwFlags |= ULSCONF_F_EMAIL_NAME;
if (pConf->szLocation[0]) pConf->dwFlags |= ULSCONF_F_LOCATION;
if (pConf->szComments[0]) pConf->dwFlags |= ULSCONF_F_COMMENTS;
}
UINT_PTR GetPageAfterUser()
{
UINT_PTR iNext = 0;
if( SysPol::AllowDirectoryServices() )
{
iNext = IDD_PAGE_SERVER;
}
else
{
iNext = GetPageAfterULS();
}
return iNext;
}
INT_PTR APIENTRY PageUserDlgProc ( HWND hDlg, UINT uMsg, WPARAM uParam, LPARAM lParam )
{
ULS_CONF *pConf;
PROPSHEETPAGE *pPage;
static DWORD dwWizButtons;
switch (uMsg)
{
case WM_DESTROY:
s_hDlgUserInfo = NULL;
break;
case WM_INITDIALOG:
s_hDlgUserInfo = hDlg;
pPage = (PROPSHEETPAGE *) lParam;
pConf = (ULS_CONF *) pPage->lParam;
SetWindowLongPtr (hDlg, GWLP_USERDATA, lParam);
// Set the font
::SendDlgItemMessage(hDlg, IDEC_FIRSTNAME, WM_SETFONT, (WPARAM) g_hfontDlg, 0);
::SendDlgItemMessage(hDlg, IDEC_LASTNAME, WM_SETFONT, (WPARAM) g_hfontDlg, 0);
::SendDlgItemMessage(hDlg, IDC_USER_LOCATION, WM_SETFONT, (WPARAM) g_hfontDlg, 0);
::SendDlgItemMessage(hDlg, IDC_USER_INTERESTS, WM_SETFONT, (WPARAM) g_hfontDlg, 0);
// Limit the text
Edit_LimitText(GetDlgItem(hDlg, IDEC_FIRSTNAME), MAX_FIRST_NAME_LENGTH - 1);
Edit_LimitText(GetDlgItem(hDlg, IDEC_LASTNAME), MAX_LAST_NAME_LENGTH - 1);
Edit_LimitText(GetDlgItem(hDlg, IDC_USER_EMAIL), MAX_EMAIL_NAME_LENGTH - 1);
Edit_LimitText(GetDlgItem(hDlg, IDC_USER_LOCATION), MAX_LOCATION_NAME_LENGTH - 1);
Edit_LimitText(GetDlgItem(hDlg, IDC_USER_INTERESTS), UI_COMMENTS_LENGTH - 1);
if (pConf->dwFlags & ULSCONF_F_FIRST_NAME)
{
Edit_SetText(GetDlgItem(hDlg, IDEC_FIRSTNAME), pConf->szFirstName);
}
if (pConf->dwFlags & ULSCONF_F_LAST_NAME)
{
Edit_SetText(GetDlgItem(hDlg, IDEC_LASTNAME), pConf->szLastName);
}
if (pConf->dwFlags & ULSCONF_F_EMAIL_NAME)
{
Edit_SetText(GetDlgItem(hDlg, IDC_USER_EMAIL), pConf->szEmailName);
}
if (pConf->dwFlags & ULSCONF_F_LOCATION)
{
Edit_SetText(GetDlgItem(hDlg, IDC_USER_LOCATION), pConf->szLocation);
}
#ifdef DEBUG
if ((0 == (pConf->dwFlags & ULSCONF_F_COMMENTS)) &&
(0 == (pConf->dwFlags & ULSCONF_F_EMAIL_NAME)) )
{
extern VOID DbgGetComments(LPTSTR);
DbgGetComments(pConf->szComments);
pConf->dwFlags |= ULSCONF_F_COMMENTS;
}
#endif
if (pConf->dwFlags & ULSCONF_F_COMMENTS)
{
Edit_SetText(GetDlgItem (hDlg, IDC_USER_INTERESTS), pConf->szComments);
}
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID (uParam, lParam))
{
case IDEC_FIRSTNAME:
case IDEC_LASTNAME:
case IDC_USER_EMAIL:
if (GET_WM_COMMAND_CMD(uParam,lParam) == EN_CHANGE)
{
pPage = (PROPSHEETPAGE *) GetWindowLongPtr (hDlg, GWLP_USERDATA);
pConf = (ULS_CONF *) pPage->lParam;
dwWizButtons = SetUserPageWizButtons(hDlg, pConf->dwFlags);
}
break;
}
break;
case WM_NOTIFY:
pPage = (PROPSHEETPAGE *) GetWindowLongPtr (hDlg, GWLP_USERDATA);
pConf = (ULS_CONF *) pPage->lParam;
switch (((NMHDR *) lParam)->code)
{
case PSN_KILLACTIVE:
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, FALSE);
break;
case PSN_RESET:
ZeroMemory (pConf, sizeof (ULS_CONF));
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, FALSE);
break;
case PSN_SETACTIVE:
dwWizButtons = SetUserPageWizButtons(hDlg, pConf->dwFlags);
if (g_fSilentWizard)
{
PropSheet_PressButton(GetParent(hDlg), PSBTN_NEXT);
}
break;
case PSN_WIZBACK:
return(IntroWiz::HandleWizNotify(hDlg,
reinterpret_cast<NMHDR*>(lParam), IntroWiz::ULSFirst));
case PSN_WIZNEXT:
case PSN_WIZFINISH:
if (!(dwWizButtons & ((PSN_WIZNEXT == ((NMHDR *) lParam)->code) ?
PSWIZB_NEXT : PSWIZB_FINISH)))
{
// Reject the next/finish button
ShowWizard(GetParent(hDlg));
::SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
if (!FLegalEmailName(hDlg, IDC_USER_EMAIL))
{
ShowWizard(GetParent(hDlg));
ConfMsgBox(hDlg, (LPCTSTR)IDS_ILLEGALEMAILNAME);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
return TRUE;
}
GetUserPageState(hDlg, pConf);
if( PSN_WIZNEXT == (((NMHDR *) lParam)->code) )
{
UINT_PTR iNext = GetPageAfterUser();
ASSERT( iNext );
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, iNext);
return TRUE;
}
break;
default:
return FALSE;
}
default:
return FALSE;
}
return TRUE;
}
HRESULT CULSWizard::GetWizardPages ( PROPSHEETPAGE **ppPage, ULONG *pcPages, ULS_CONF **ppUlsConf )
{
const int cULS_Pages = 5;
PROPSHEETPAGE *pPage = NULL;
ULONG cPages = 0;
UINT cbSize = cULS_Pages * sizeof (PROPSHEETPAGE) + sizeof (ULS_CONF);
ULS_CONF *pConf = NULL;
HRESULT hr;
if (ppPage == NULL || pcPages == NULL || ppUlsConf == NULL)
{
return E_POINTER;
}
pPage = (PROPSHEETPAGE*) LocalAlloc(LPTR, cbSize);
if (pPage == NULL)
{
return E_OUTOFMEMORY;
}
pConf = (ULS_CONF *) (((LPBYTE) pPage) +
cULS_Pages * sizeof (PROPSHEETPAGE));
hr = GetConfig (pConf);
if (hr != S_OK)
{
// REVIEW: GetConfig will never fail, but if it did, pPage would not be released.
return hr;
}
#if USE_GAL
if( !ConfPolicies::IsGetMyInfoFromGALEnabled() ||
!ConfPolicies::GetMyInfoFromGALSucceeded() ||
ConfPolicies::InvalidMyInfo()
)
#endif // USE_GAL
{
FillInPropertyPage(&pPage[cPages], IDD_PAGE_USER, PageUserDlgProc, (LPARAM) pConf);
cPages++;
}
m_WizDirectCallingSettings.SetULS_CONF( pConf );
FillInPropertyPage( &pPage[cPages++],
IDD_PAGE_SERVER,
CWizDirectCallingSettings::StaticDlgProc,
reinterpret_cast<LPARAM>(&m_WizDirectCallingSettings)
);
*ppPage = pPage;
*pcPages = cPages;
*ppUlsConf = pConf;
return S_OK;
}
HRESULT CULSWizard::ReleaseWizardPages ( PROPSHEETPAGE *pPage)
{
LocalFree(pPage);
return S_OK;
}
HRESULT CULSWizard::GetConfig ( ULS_CONF *pConf )
{
HRESULT hr = E_POINTER;
if (NULL != pConf)
{
::ZeroMemory (pConf, sizeof (ULS_CONF));
// always return these as valid
pConf->dwFlags = ULSCONF_F_SERVER_NAME | ULSCONF_F_PUBLISH;
RegEntry reULS(g_szClientFld, HKEY_CURRENT_USER);
// BUGBUG: ChrisPi - this was a bad idea - lstrcpyn() returns NULL on failure!
if (_T('\0') != *(lstrcpyn( pConf->szEmailName,
reULS.GetString(g_szEmailName),
CCHMAX(pConf->szEmailName))))
{
pConf->dwFlags |= ULSCONF_F_EMAIL_NAME;
}
if (_T('\0') != *(lstrcpyn( pConf->szFirstName,
reULS.GetString(g_szFirstName),
CCHMAX(pConf->szFirstName))))
{
pConf->dwFlags |= ULSCONF_F_FIRST_NAME;
}
if (_T('\0') != *(lstrcpyn( pConf->szLastName,
reULS.GetString(g_szLastName),
CCHMAX(pConf->szLastName))))
{
pConf->dwFlags |= ULSCONF_F_LAST_NAME;
}
if (_T('\0') != *(lstrcpyn( pConf->szLocation,
reULS.GetString(g_szLocation),
CCHMAX(pConf->szLocation))))
{
pConf->dwFlags |= ULSCONF_F_LOCATION;
}
if (_T('\0') != *(lstrcpyn( pConf->szUserName,
reULS.GetString(g_szUserName),
CCHMAX(pConf->szUserName))))
{
pConf->dwFlags |= ULSCONF_F_USER_NAME;
}
if (_T('\0') != *(lstrcpyn( pConf->szComments,
reULS.GetString(g_szComments),
CCHMAX(pConf->szComments))))
{
pConf->dwFlags |= ULSCONF_F_COMMENTS;
}
if (!_Module.IsSDKCallerRTC())
{
lstrcpyn( pConf->szServerName, CDirectoryManager::get_defaultServer(), CCHMAX( pConf->szServerName ) );
}
else
{
lstrcpyn( pConf->szServerName, _T(" "), CCHMAX( pConf->szServerName ) );
}
pConf->fDontPublish = reULS.GetNumber(g_szDontPublish,
REGVAL_ULS_DONT_PUBLISH_DEFAULT);
pConf->dwFlags |= ULSCONF_F_PUBLISH;
hr = S_OK;
}
return hr;
}
// FUTURE: Use CombineNames
static BOOL CheckForNames(ULS_CONF *pConf)
{
// only care if one of first name, last name, email address is missing
if ((pConf->dwFlags & ULSCONF_F_FIRST_NAME) &&
(pConf->dwFlags & ULSCONF_F_LAST_NAME) &&
(pConf->dwFlags & ULSCONF_F_EMAIL_NAME))
{
return TRUE;
}
if ((pConf->dwFlags & ULSCONF_F_FIRST_NAME) || (pConf->dwFlags & ULSCONF_F_LAST_NAME))
//set the user name too
{
TCHAR szSource[128];
TCHAR *argw[2];
argw[0] = pConf->szFirstName;
argw[1] = pConf->szLastName;
LoadString (GetInstanceHandle(), IDS_NAME_ORDER, szSource, sizeof(szSource)/sizeof(TCHAR));
FormatMessage(FORMAT_MESSAGE_ARGUMENT_ARRAY|FORMAT_MESSAGE_FROM_STRING,szSource,
0,0,pConf->szUserName, sizeof(pConf->szUserName),(va_list *)argw );
//truncate at 47 character
pConf->szUserName[47] = TEXT('\0');
pConf->dwFlags |= ULSCONF_F_USER_NAME;
}
return TRUE;
}
/* S E T C O N F I G */
/*-------------------------------------------------------------------------
%%Function: SetConfig
-------------------------------------------------------------------------*/
HRESULT CULSWizard::SetConfig ( ULS_CONF *pConf )
{
if (pConf->dwFlags == 0)
{
// nothing to set value
return S_OK;
}
if ((pConf->dwFlags & ULSCONF_F_EMAIL_NAME) &&
(!FLegalEmailSz(pConf->szEmailName)) )
{
// email name must be legal
return E_INVALIDARG;
}
RegEntry re(g_szClientFld);
if (pConf->dwFlags & ULSCONF_F_PUBLISH)
{
re.SetValue(g_szDontPublish, (LONG) pConf->fDontPublish);
}
if (pConf->dwFlags & ULSCONF_F_EMAIL_NAME)
{
re.SetValue(g_szEmailName, pConf->szEmailName);
}
if (pConf->dwFlags & ULSCONF_F_FIRST_NAME)
{
re.SetValue(g_szFirstName, pConf->szFirstName);
}
if (pConf->dwFlags & ULSCONF_F_LAST_NAME)
{
re.SetValue(g_szLastName, pConf->szLastName);
}
if (pConf->dwFlags & ULSCONF_F_LOCATION)
{
re.SetValue(g_szLocation, pConf->szLocation);
}
if (pConf->dwFlags & ULSCONF_F_COMMENTS)
{
re.SetValue(g_szComments, pConf->szComments);
}
if (pConf->dwFlags & ULSCONF_F_SERVER_NAME)
{
CDirectoryManager::set_defaultServer( pConf->szServerName );
}
//SS:may be oprah should do this and store it as their own key
if ((pConf->dwFlags & ULSCONF_F_FIRST_NAME) || (pConf->dwFlags & ULSCONF_F_LAST_NAME))
{
ULS_CONF ulcExisting;
if ((ULSCONF_F_FIRST_NAME | ULSCONF_F_LAST_NAME) !=
(pConf->dwFlags & (ULSCONF_F_FIRST_NAME | ULSCONF_F_LAST_NAME)) )
{
// If only one of these fields is being set, load the previous config:
GetConfig(&ulcExisting);
}
CombineNames(pConf->szUserName, MAX_DCL_NAME_LEN,
(pConf->dwFlags & ULSCONF_F_FIRST_NAME) ?
pConf->szFirstName : ulcExisting.szFirstName,
(pConf->dwFlags & ULSCONF_F_LAST_NAME) ?
pConf->szLastName : ulcExisting.szLastName);
pConf->dwFlags |= ULSCONF_F_USER_NAME;
re.SetValue(g_szUserName, pConf->szUserName);
}
if ((pConf->dwFlags & ULSCONF_F_SERVER_NAME) || (pConf->dwFlags & ULSCONF_F_EMAIL_NAME))
{
TCHAR szTemp[MAX_SERVER_NAME_LENGTH + MAX_EMAIL_NAME_LENGTH + 6];
ULS_CONF ulcExisting;
if ((ULSCONF_F_SERVER_NAME | ULSCONF_F_EMAIL_NAME) !=
(pConf->dwFlags & (ULSCONF_F_SERVER_NAME | ULSCONF_F_EMAIL_NAME)))
{
// If only one of these fields is being set, load the previous config:
GetConfig(&ulcExisting);
}
FCreateIlsName(szTemp,
(pConf->dwFlags & ULSCONF_F_SERVER_NAME) ?
pConf->szServerName : ulcExisting.szServerName,
(pConf->dwFlags & ULSCONF_F_EMAIL_NAME) ?
pConf->szEmailName : ulcExisting.szEmailName,
CCHMAX(szTemp));
re.SetValue(g_szResolveName, szTemp);
}
// Generate a cert based on the entered information for secure calls
// ...make sure all fields we care about are valid first
#define ULSCONF_F_IDFIELDS (ULSCONF_F_FIRST_NAME|ULSCONF_F_LAST_NAME|\
ULSCONF_F_EMAIL_NAME)
if ((pConf->dwFlags & ULSCONF_F_IDFIELDS ) == ULSCONF_F_IDFIELDS)
{
//
// LAURABU BUGBUG:
// If we can't make a cert (France?) or have wrong SCHANNEL or
// buggy crypto or unrecognized provider, can we propagate that info
// and act like security is diabled (not available)?
//
// How/can we make a common "security not possible" setting we
// can use.
//
MakeCertWrap(pConf->szFirstName, pConf->szLastName,
pConf->szEmailName, 0);
//
// LAURABU BOGUS!
// Only do this when RDS is installed. And just ONCE.
//
// Now make a local machine cert for RDS
CHAR szComputerName[MAX_COMPUTERNAME_LENGTH+1];
DWORD cbComputerName = sizeof(szComputerName);
if (GetComputerName(szComputerName, &cbComputerName))
{
MakeCertWrap(szComputerName, NULL, NULL, NMMKCERT_F_LOCAL_MACHINE);
}
else
{
ERROR_OUT(("GetComputerName failed: %x", GetLastError()));
}
}
return S_OK;
}
bool IsLegalGatewaySz(LPCTSTR szServer)
{
bool bRet = false;
if( szServer && szServer[0] )
{
bRet = true;
}
return bRet;
}
bool IsLegalGateKeeperServerSz(LPCTSTR szServer)
{
bool bRet = false;
if( szServer && szServer[0] )
{
bRet = true;
}
return bRet;
}
bool IsLegalE164Number(LPCTSTR szPhone)
{
if( (NULL == szPhone) || (0 == szPhone[0]) )
{
return false;
}
// assume a legal phone number is anything with at least 1
// digit, *,or #. Anything else will be considered the user's
// own pretty print formatting (e.g. "876-5309")
// the bad chars will get filtered out later
while (*szPhone)
{
if ( ((*szPhone >= '0') && (*szPhone <= '9')) ||
((*szPhone == '#') || (*szPhone == '*')) )
{
return true;
}
szPhone++;
}
return false;
}
/* F L E G A L E M A I L S Z */
/*-------------------------------------------------------------------------
%%Function: FLegalEmailSz
A legal email name contains only ANSI characters.
"a-z, A-Z, numbers 0-9 and some common symbols"
It cannot include extended characters or < > ( ) /
-------------------------------------------------------------------------*/
BOOL FLegalEmailSz(PTSTR pszName)
{
if (IS_EMPTY_STRING(pszName))
return FALSE;
for ( ; ; )
{
UINT ch = (UINT) ((*pszName++) & 0x00FF);
if (0 == ch)
break;
switch (ch)
{
default:
if ((ch > (UINT) _T(' ')) && (ch <= (UINT) _T('~')) )
break;
// else fall thru to error code
case '(': case ')':
case '<': case '>':
case '[': case ']':
case '/': case '\\':
case ':': case ';':
case '+':
case '=':
case ',':
case '\"':
WARNING_OUT(("FLegalEmailSz: Invalid character '%s' (0x%02X)", &ch, ch));
return FALSE;
}
}
return TRUE;
}
/* F L E G A L E M A I L N A M E */
/*-------------------------------------------------------------------------
%%Function: FLegalEmailName
-------------------------------------------------------------------------*/
BOOL FLegalEmailName(HWND hdlg, UINT id)
{
TCHAR sz[MAX_PATH];
GetDlgItemTextTrimmed(hdlg, id, sz, CCHMAX(sz));
return FLegalEmailSz(sz);
}
/* F I L L S E R V E R C O M B O B O X */
/*-------------------------------------------------------------------------
%%Function: FillServerComboBox
-------------------------------------------------------------------------*/
VOID FillServerComboBox(HWND hwndCombo)
{
CMRUList MRUList;
MRUList.Load( DIR_MRU_KEY );
const TCHAR * const pszDomainDirectory = CDirectoryManager::get_DomainDirectory();
if( pszDomainDirectory != NULL )
{
// Make sure the configured domain server name is in the list...
MRUList.AppendEntry( pszDomainDirectory );
}
if( CDirectoryManager::isWebDirectoryEnabled() )
{
// Make sure the web directory is in the list...
MRUList.AppendEntry( CDirectoryManager::get_webDirectoryIls() );
}
const TCHAR * const defaultServer = CDirectoryManager::get_defaultServer();
if( lstrlen( defaultServer ) > 0 )
{
// Make sure the default server name is in the list and at the top...
MRUList.AddNewEntry( defaultServer );
}
::SendMessage( hwndCombo, WM_SETREDRAW, FALSE, 0 );
::SendMessage( hwndCombo, CB_RESETCONTENT, 0, 0 );
int nCount = MRUList.GetNumEntries();
for( int nn = MRUList.GetNumEntries() - 1; nn >= 0; nn-- )
{
::SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM) CDirectoryManager::get_displayName( MRUList.GetNameEntry( nn ) ) );
}
::SendMessage( hwndCombo, WM_SETREDRAW, TRUE, 0 );
} // End of FillServerComboBox.
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// CWizDirectCallingSettings wizard page
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/* static */ HWND CWizDirectCallingSettings::s_hDlg;
INT_PTR CWizDirectCallingSettings::StaticDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
INT_PTR bRet = FALSE;
if ( message == WM_INITDIALOG )
{
PROPSHEETPAGE* pPage = reinterpret_cast<PROPSHEETPAGE*>(lParam);
SetWindowLongPtr( hDlg, GWLP_USERDATA, pPage->lParam );
s_hDlg = hDlg;
CWizDirectCallingSettings* pThis = reinterpret_cast<CWizDirectCallingSettings*>(pPage->lParam);
if( pThis )
{
bRet = pThis->_OnInitDialog();
}
}
else
{
CWizDirectCallingSettings* pThis = reinterpret_cast<CWizDirectCallingSettings*>( GetWindowLongPtr( hDlg, GWLP_USERDATA ) );
if( pThis )
{
bRet = pThis->_DlgProc(hDlg, message, wParam, lParam );
}
}
return bRet;
}
/* static */ void CWizDirectCallingSettings::OnWizFinish()
{
if( s_hDlg && IsWindow( s_hDlg ) )
{
CWizDirectCallingSettings* pThis = reinterpret_cast<CWizDirectCallingSettings*>( GetWindowLongPtr( s_hDlg, GWLP_USERDATA ) );
if( pThis )
{
pThis->_OnWizFinish();
}
}
}
INT_PTR APIENTRY CWizDirectCallingSettings::_DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
BOOL bRet = FALSE;
switch( message )
{
case WM_DESTROY:
s_hDlg = NULL;
break;
case WM_NOTIFY:
{
NMHDR* pNmHdr = reinterpret_cast<NMHDR*>(lParam);
switch(pNmHdr->code)
{
case PSN_SETACTIVE: return _OnSetActive();
case PSN_KILLACTIVE: return _OnKillActive();
case PSN_WIZBACK: return _OnWizBack();
case PSN_WIZNEXT: bRet = _OnWizNext();
// We fall through from the WIZ_NEXT becaus
// we have to save the informaition when we change
// pages
case PSN_APPLY:
case PSN_WIZFINISH: _OnWizFinish();
}
break;
}
case WM_COMMAND:
return _OnCommand(wParam, lParam);
default:
break;
}
return bRet;
}
/* static */ bool CWizDirectCallingSettings::IsGatewayNameInvalid()
{
TCHAR szServer[MAX_SERVER_NAME_LENGTH];
szServer[0] = NULL;
if( s_hDlg )
{
GetDlgItemTextTrimmed(s_hDlg, IDE_CALLOPT_GW_SERVER, szServer, CCHMAX(szServer) );
}
else
{
GetDefaultGateway( szServer, CCHMAX( szServer ) );
}
return !IsLegalGatewaySz(szServer);
}
void CWizDirectCallingSettings::_SetWizButtons()
{
DWORD dwFlags = NULL;
if( ( BST_CHECKED == IsDlgButtonChecked( s_hDlg, IDC_CHECK_USE_GATEWAY ) ) && IsGatewayNameInvalid() )
{
dwFlags = PSWIZB_BACK;
}
else
{
dwFlags = PSWIZB_BACK | PSWIZB_NEXT;
}
if( 0 == GetPageAfterULS() )
{
dwFlags |= PSWIZB_FINISH;
}
else
{
dwFlags |= PSWIZB_NEXT;
}
PropSheet_SetWizButtons( GetParent( s_hDlg ), dwFlags );
}
BOOL CWizDirectCallingSettings::_OnCommand( WPARAM wParam, LPARAM lParam )
{
BOOL bRet = TRUE;
switch( LOWORD( wParam ) )
{
case IDC_CHECK_USE_GATEWAY:
{
bool bEnable = ( BST_CHECKED == IsDlgButtonChecked( s_hDlg, IDC_CHECK_USE_GATEWAY ) );
EnableWindow( GetDlgItem( s_hDlg, IDC_STATIC_GATEWAY_NAME ), bEnable );
EnableWindow( GetDlgItem( s_hDlg, IDE_CALLOPT_GW_SERVER ), bEnable );
_SetWizButtons();
}
break;
case IDE_CALLOPT_GW_SERVER:
if( HIWORD( wParam ) == EN_CHANGE )
{
_SetWizButtons();
}
break;
default:
break;
}
return bRet;
}
BOOL CWizDirectCallingSettings::_OnInitDialog()
{
BOOL bRet = TRUE;
_SetWizButtons();
InitDirectoryServicesDlgInfo( s_hDlg, m_pWiz, m_bInitialEnableGateway, m_szInitialServerName, CCHMAX(m_szInitialServerName) );
return bRet;
}
BOOL CWizDirectCallingSettings::_OnSetActive()
{
_SetWizButtons();
if (g_fSilentWizard)
{
PropSheet_PressButton(GetParent(s_hDlg), PSBTN_NEXT);
}
return FALSE;
}
BOOL CWizDirectCallingSettings::_OnKillActive()
{
return FALSE;
}
BOOL CWizDirectCallingSettings::_OnWizBack()
{
UINT iPrev = IDD_PAGE_USER;
#if USE_GAL
if( !ConfPolicies::IsGetMyInfoFromGALEnabled() )
{
iPrev = IDD_PAGE_USER;
}
else
{
iPrev = GetPageBeforeULS();
}
#endif
ASSERT( iPrev );
SetWindowLongPtr( s_hDlg, DWLP_MSGRESULT, iPrev );
return TRUE;
}
BOOL CWizDirectCallingSettings::_OnWizFinish()
{
RegEntry reConf(CONFERENCING_KEY, HKEY_CURRENT_USER);
m_pConf->dwFlags |= ULSCONF_F_PUBLISH | ULSCONF_F_SERVER_NAME;
// Get the server name
SendDlgItemMessage( s_hDlg, IDC_NAMESERVER, WM_GETTEXT, CCHMAX( m_pConf->szServerName ), (LPARAM) m_pConf->szServerName );
TrimSz( m_pConf->szServerName );
lstrcpyn( m_pConf->szServerName, CDirectoryManager::get_dnsName( m_pConf->szServerName ), CCHMAX( m_pConf->szServerName ) );
// Get the don't publish flags
m_pConf->fDontPublish = ( BST_CHECKED == IsDlgButtonChecked( s_hDlg, IDC_USER_PUBLISH ) );
reConf.SetValue(REGVAL_DONT_LOGON_ULS, BST_CHECKED != IsDlgButtonChecked( s_hDlg, IDC_USEULS ));
return FALSE;
}
BOOL CWizDirectCallingSettings::_OnWizNext()
{
UINT_PTR iNext = GetPageAfterULS();
ASSERT( iNext );
SetWindowLongPtr( s_hDlg, DWLP_MSGRESULT, iNext );
return TRUE;
}
// Taken from MSDN:
static HRESULT CreateLink(LPCSTR lpszPathObj,
LPCTSTR lpszPathLink, LPCSTR lpszDesc)
{
HRESULT hres;
IShellLink* psl;
// Get a pointer to the IShellLink interface.
hres = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast<LPVOID *>(&psl));
if (SUCCEEDED(hres)) {
IPersistFile* ppf;
// Set the path to the shortcut target and add the
// description.
psl->SetPath(lpszPathObj);
if (NULL != lpszDesc)
{
psl->SetDescription(lpszDesc);
}
// Query IShellLink for the IPersistFile interface for saving the
// shortcut in persistent storage.
hres = psl->QueryInterface(IID_IPersistFile,
reinterpret_cast<LPVOID *>(&ppf));
if (SUCCEEDED(hres)) {
#ifndef UNICODE
WCHAR wsz[MAX_PATH];
// Ensure that the string is ANSI.
MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1,
wsz, MAX_PATH);
#else // UNICODE
LPCWSTR wsz = lpszPathLink;
#endif // UNICODE
// Save the link by calling IPersistFile::Save.
hres = ppf->Save(wsz, TRUE);
ppf->Release();
}
psl->Release();
}
return hres;
}
void DeleteShortcut(int csidl, LPCTSTR pszSubDir)
{
TCHAR szSpecial[MAX_PATH];
if (!NMGetSpecialFolderPath(NULL, szSpecial, csidl, TRUE))
{
return;
}
LPCTSTR pszNetMtg = RES2T(IDS_MEDIAPHONE_TITLE);
TCHAR szPath[MAX_PATH];
wsprintf(szPath, TEXT("%s%s\\%s.lnk"), szSpecial, pszSubDir, pszNetMtg);
DeleteFile(szPath);
}
static void CreateShortcut(HWND hDlg, int csidl, LPCTSTR pszSubDir)
{
TCHAR szSpecial[MAX_PATH];
if (!NMGetSpecialFolderPath(hDlg, szSpecial, csidl, TRUE))
{
return;
}
LPCTSTR pszNetMtg = RES2T(IDS_MEDIAPHONE_TITLE);
TCHAR szPath[MAX_PATH];
wsprintf(szPath, TEXT("%s%s\\%s.lnk"), szSpecial, pszSubDir, pszNetMtg);
char szThis[MAX_PATH];
GetModuleFileNameA(NULL, szThis, ARRAY_ELEMENTS(szThis));
CreateLink(szThis, szPath, NULL);
}
INT_PTR CALLBACK ShortcutWizDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
CheckDlgButton(hDlg, IDC_ONDESKTOP, BST_CHECKED);
CheckDlgButton(hDlg, IDC_ONQUICKLAUNCH, BST_CHECKED);
break;
case WM_DESTROY:
if (IsDlgButtonChecked(hDlg, IDC_ONDESKTOP))
{
CreateShortcut(hDlg, CSIDL_DESKTOP, g_szEmpty);
}
if (IsDlgButtonChecked(hDlg, IDC_ONQUICKLAUNCH))
{
CreateShortcut(hDlg, CSIDL_APPDATA, QUICK_LAUNCH_SUBDIR);
}
break;
case WM_NOTIFY:
{
NMHDR* pNmHdr = reinterpret_cast<NMHDR*>(lParam);
switch(pNmHdr->code)
{
case PSN_RESET:
// HACKHACK georgep: Uncheck the buttons so we will not try to
// create the shortcuts
CheckDlgButton(hDlg, IDC_ONDESKTOP, BST_UNCHECKED);
CheckDlgButton(hDlg, IDC_ONQUICKLAUNCH, BST_UNCHECKED);
// Fall through
default:
return(IntroWiz::HandleWizNotify(hDlg, pNmHdr, IntroWiz::Shortcuts));
}
break;
}
default:
return(FALSE);
}
return(TRUE);
}