2064 lines
49 KiB
C++
2064 lines
49 KiB
C++
|
// 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);
|
|||
|
}
|
|||
|
|