//Copyright (c) 1998 - 1999 Microsoft Corporation
#include<stdafx.h>
#include"resource.h"
#include"sdlgs.h"
#include"snodes.h"


#include<shellapi.h>
#include<shlapip.h>
#include <shlobj.h>
#include<shlobjp.h>

BOOL OnHelp( HWND hwnd , LPHELPINFO lphi );

BOOL OnContextMenu( HWND hwnd , POINT& pt );

void ErrMessage( HWND hwndOwner , INT_PTR iResourceID );

extern void xxxErrMessage( HWND hwnd , INT_PTR nResMessageId , INT_PTR nResTitleId , UINT nFlags );

void SnodeErrorHandler( HWND hParent , INT nObjectId , DWORD dwStatus );

#define RECTWIDTH( rc )  ((rc).right - (rc).left)
#define RECTHEIGHT( rc ) ((rc).bottom - (rc).top)

extern BOOL g_bAppSrvMode;


#if 0
//--------------------------------------------------------------------------------------
INT_PTR CALLBACK CachedSessionsDlgProc( HWND hDlg , UINT msg , WPARAM wp , LPARAM lp )
{
    CSettingNode *pNode;
    
    DWORD nVal = 0;

    switch( msg )
    {
    case WM_INITDIALOG :

        pNode = ( CSettingNode *)lp;

        ASSERT( pNode != NULL );
        
        // ok to store null -- it's initializing DWLP_USER area

        SetWindowLongPtr( hDlg , DWLP_USER , ( LONG_PTR )pNode );
        
        SetFocus( GetDlgItem( hDlg , IDC_EDIT_CACHEDSESSION ) );

        pNode->m_pSettings->GetCachedSessions( &nVal );

        SetDlgItemInt( hDlg , IDC_EDIT_CACHEDSESSION , ( UINT )nVal , FALSE );

        break;

    case WM_COMMAND:

        if( LOWORD( wp ) == IDOK )
        {
            pNode = ( CSettingNode *)GetWindowLongPtr( hDlg , DWLP_USER );

            if( pNode == NULL )
            {
                break;
            }

            BOOL bSuccess = FALSE;

            UINT uVal = GetDlgItemInt( hDlg , IDC_EDIT_CACHEDSESSION , &bSuccess , FALSE );
            
            if( !bSuccess )
            {
                ErrMessage( hDlg , IDS_ERR_CACHEDVALUE );

                return 0;
            }

            // check for any errors when setting this value

            pNode->SetAttributeValue( ( DWORD )uVal );
            
            EndDialog( hDlg , 0 );

        }

        else if( LOWORD( wp ) == IDCANCEL )
        {
            EndDialog( hDlg , 0 );
        }

        break;
    }

    return 0;
}

#endif 

//--------------------------------------------------------------------------------------
INT_PTR CALLBACK UsePerSessionTempDirsDlgProc( HWND hDlg , UINT msg , WPARAM wp , LPARAM lp )
{
    CSettingNode *pNode;

    // TCHAR tchNewName[ 128 ];
    
    BOOL bVal = FALSE;

    static INT nOldSelection;

    switch( msg )
    {
    case WM_INITDIALOG :

        pNode = ( CSettingNode *)lp;

        ASSERT( pNode != NULL );
        
        // ok to store null -- it's initializing DWLP_USER area

        SetWindowLongPtr( hDlg , DWLP_USER , ( LONG_PTR )pNode );

        if( pNode->GetObjectId( ) == PERSESSION_TEMPDIR )
        {            
            bVal = ( BOOL )pNode->xx_GetValue( );
        }

        SendMessage( GetDlgItem( hDlg , IDC_RADIO_PERSESSION_YES ) , BM_SETCHECK , ( WPARAM )bVal , 0 );
        SendMessage( GetDlgItem( hDlg , IDC_RADIO_PERSESSION_NO ) , BM_SETCHECK , ( WPARAM )!bVal , 0 );
        
        POLICY_TS_MACHINE p;
        RegGetMachinePolicy(&p);
        EnableWindow(GetDlgItem(hDlg, IDC_RADIO_PERSESSION_YES), !p.fPolicyTempFoldersPerSession);
        EnableWindow(GetDlgItem(hDlg, IDC_RADIO_PERSESSION_NO), !p.fPolicyTempFoldersPerSession);

        nOldSelection = bVal;
        
        break;

    case WM_CONTEXTMENU:
        {
            POINT pt;

            pt.x = LOWORD( lp );

            pt.y = HIWORD( lp );

            if( hDlg == GetParent( ( HWND )wp ) )
            {
                OnContextMenu( ( HWND )wp , pt );
            }
        }

        break;

    case WM_HELP:

        OnHelp( hDlg , ( LPHELPINFO )lp );

        break;


    case WM_COMMAND:

        if( LOWORD( wp ) == IDOK )
        {
            pNode = ( CSettingNode *)GetWindowLongPtr( hDlg , DWLP_USER );

            if( pNode == NULL )
            {
                break;
            }            
            
            INT nCurrent = IsDlgButtonChecked( hDlg , IDC_RADIO_PERSESSION_YES ) == BST_CHECKED ? 1 : 0;

            if( nOldSelection != nCurrent )
            {
                DWORD dwStatus;

                if( FAILED( pNode->SetAttributeValue( ( DWORD )nCurrent , &dwStatus ) ) )
                {
                    SnodeErrorHandler( hDlg , pNode->GetObjectId( ) , dwStatus );
                }
            }
            
            EndDialog( hDlg , 0 );

        }

        else if( LOWORD( wp ) == IDCANCEL )
        {
            EndDialog( hDlg , 0 );
        }

        break;
    }

    return 0;
}

#if 0 // removed from final release
//--------------------------------------------------------------------------------------
INT_PTR CALLBACK DefConSecurityDlgProc( HWND hDlg , UINT msg , WPARAM wp , LPARAM lp )
{
    CSettingNode *pNode = NULL;
    
    DWORD nVal = 0;
    

    switch( msg )
    {
    case WM_INITDIALOG :
        {
            TCHAR tchBuffer[ 128 ];

            INT rgid[] = { IDS_RAA , IDS_AS , IDS_AA , -1 };
            
            pNode = ( CSettingNode *)lp;

            ASSERT( pNode != NULL );
        
            // ok to store null -- it's initializing DWLP_USER area

            SetWindowLongPtr( hDlg , DWLP_USER , ( LONG_PTR )pNode );

            for( int idx = 0; rgid[ idx ] != -1 ; ++idx )
            {
                VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , rgid[ idx ] , tchBuffer , SIZE_OF_BUFFER( tchBuffer ) ) );

                SendMessage( GetDlgItem( hDlg , IDC_COMBO_DEFSEC ) , CB_ADDSTRING , 0 , ( LPARAM )tchBuffer );
            }


            nVal = ( DWORD )pNode->xx_GetValue( );

            if( nVal == 0 )
            {
                // error message 

                ErrMessage( hDlg , IDS_ERROR_INVALID_SD );
                            
            }
        
            SendMessage( GetDlgItem( hDlg , IDC_COMBO_DEFSEC ) , CB_SETCURSEL , ( WPARAM )( nVal - 1 ) , 0 );

        }

        break;

    case WM_CONTEXTMENU:
        {
            POINT pt;

            pt.x = LOWORD( lp );

            pt.y = HIWORD( lp );

            if( hDlg == GetParent( ( HWND )wp ) )
            {
                OnContextMenu( ( HWND )wp , pt );
            }
        }

        break;

    case WM_HELP:

        OnHelp( hDlg , ( LPHELPINFO )lp );

        break;


    case WM_COMMAND:

        if( LOWORD( wp ) == IDOK )
        {
            pNode = ( CSettingNode *)GetWindowLongPtr( hDlg , DWLP_USER );

            if( pNode == NULL )
            {
                break;
            }
            
            INT_PTR iSel = SendMessage( GetDlgItem( hDlg , IDC_COMBO_DEFSEC ) , CB_GETCURSEL , 0 , 0 );

            if( iSel != CB_ERR )
            {
                INT nOld = pNode->xx_GetValue( );

                if( nOld != ( INT )( iSel + 1 ) )
                {
                    DWORD dwStatus;

                    if( FAILED( pNode->SetAttributeValue( ( DWORD )( iSel + 1 ) , &dwStatus ) ) )
                    {
                        SnodeErrorHandler( hDlg , pNode->GetObjectId( ) , dwStatus );
                    }
                }
            }
            else
            {
                ErrMessage( hDlg , IDS_ERROR_INVALID_SD );                
            }

            EndDialog( hDlg , 0 );

        }

        else if( LOWORD( wp ) == IDCANCEL )
        {
            EndDialog( hDlg , 0 );
        }

        break;
    }

    return 0;

}

#endif

//--------------------------------------------------------------------------------------
INT_PTR CALLBACK LicensingDlgProc( HWND hDlg , UINT msg , WPARAM wp , LPARAM lp )
{
    CSettingNode *pNode;
    DWORD dwStatus;

    static HCURSOR hcurWait;

    static ULONG ulOldSelection;

    static ULONG *rgulModes = NULL;

    static WCHAR **rgszNames = NULL;

    static WCHAR **rgszDescriptions = NULL;

    static ULONG cModes = 0;

    switch( msg )
    {
    case WM_INITDIALOG :
        {
        ULONG ulMode;
        ULONG iMode = 0;        // index of ulMode in rgulModes
        DWORD nTermSrvMode;
        DWORD idcRA;
        RECT rcTextCtrl;
        HRESULT hr;
        HWND hLW;
        ISettingsComp *pSc;
        BOOL fIModeFound = FALSE;

        pNode = ( CSettingNode *)lp;

        ASSERT( pNode != NULL );

        pSc = reinterpret_cast< ISettingsComp * >( pNode->GetInterface() );

        ASSERT(NULL != pSc)
        
        // ok to store null -- it's initializing DWLP_USER area

        SetWindowLongPtr( hDlg , DWLP_USER , ( LONG_PTR )pNode );

        //
        // read valid modes and cache them
        //

        hr = pSc->GetLicensingModeList( &cModes, &rgulModes, &dwStatus );

        if (FAILED(hr))
        {
            ErrMessage( hDlg , IDS_ERROR_NO_LICENSING_MODE_LIST );
            EndDialog( hDlg , 0 );
            goto done_init;
        }

        hr = pSc->GetLicensingMode( &ulMode, &dwStatus );

        if (FAILED(hr))
        {
            ErrMessage( hDlg , IDS_ERROR_NO_LICENSING_MODE );
            EndDialog( hDlg , 0 );
            goto done_init;
        }

        rgszNames = (WCHAR **) CoTaskMemAlloc(cModes * sizeof(WCHAR *));

        if (NULL == rgszNames)
        {
            ErrMessage( hDlg , IDS_ERROR_NO_MEMORY );
            EndDialog( hDlg , 0 );
            goto done_init;
        }

        rgszDescriptions = (WCHAR **) CoTaskMemAlloc(cModes * sizeof(WCHAR *));

        if (NULL == rgszDescriptions)
        {
            ErrMessage( hDlg , IDS_ERROR_NO_MEMORY );
            EndDialog( hDlg , 0 );
            goto done_init;
        }

        for (ULONG i = 0; i < cModes; i++)
        {
            hr = pSc->GetLicensingModeInfo(rgulModes[i],rgszNames+i,rgszDescriptions+i,&dwStatus);

            if (FAILED(hr))
            {
                ErrMessage( hDlg , IDS_ERROR_NO_LICENSING_MODE_INFO );
                EndDialog( hDlg , 0 );
                goto done_init;
            }

            if (ulMode == rgulModes[i])
            {
                iMode = i;
                fIModeFound = TRUE;
            }

            SendMessage( GetDlgItem( hDlg , IDC_LICENSING_MODE ) , CB_ADDSTRING , 0 , (LPARAM) rgszNames[i] ); 
        }

        ASSERT(fIModeFound);

        ulOldSelection = iMode;

        //
        // make current mode the selection in the dropdown
        //
        SendMessage( GetDlgItem( hDlg , IDC_LICENSING_MODE ) , CB_SETCURSEL , (WPARAM) iMode , 0 );

        //
        // Show the mode description in the description control
        //
        SetWindowText( GetDlgItem( hDlg , IDC_LICENSING_DESCRIPTION ),  rgszDescriptions[iMode] );

        //
        // make the valid remote admin control visible
        //
        hr = pSc->GetTermSrvMode( &nTermSrvMode , &dwStatus );

        if (FAILED(hr))
        {
            ErrMessage( hDlg , IDS_ERR_TERMSRVMODE );
            EndDialog( hDlg , 0 );
            goto done_init;
        }

        idcRA = nTermSrvMode ? IDC_LICENSING_TO_REMOTE_ADMIN : IDC_LICENSING_FROM_REMOTE_ADMIN;

        //
        // make the remote admin control into a link
        //
        GetWindowRect( GetDlgItem( hDlg , idcRA ) , &rcTextCtrl );

        MapWindowPoints( NULL , hDlg , ( LPPOINT )&rcTextCtrl , 2 );

        LinkWindow_RegisterClass();

        hLW = CreateWindowEx( 0 ,
                              TEXT("Link Window") ,
                              TEXT( "" ) ,
                              WS_CLIPSIBLINGS | WS_TABSTOP | WS_CHILD | WS_VISIBLE,
                              rcTextCtrl.left ,
                              rcTextCtrl.top ,
                              RECTWIDTH( rcTextCtrl ) ,
                              RECTHEIGHT( rcTextCtrl ),
                              hDlg ,
                              ( HMENU )12,
                              NULL,
                              NULL );

        {
            TCHAR tchBuffer[ 512 ];
            GetWindowText( GetDlgItem( hDlg , idcRA ), tchBuffer , SIZE_OF_BUFFER( tchBuffer ) ) ;

            SetWindowText( hLW , tchBuffer );
        }

        hcurWait = LoadCursor( NULL , MAKEINTRESOURCE( IDC_WAIT ) ) ;
        }         
done_init:
        break;

    case WM_CONTEXTMENU:
        {
            POINT pt;

            pt.x = LOWORD( lp );

            pt.y = HIWORD( lp );

            if( hDlg == GetParent( ( HWND )wp ) )
            {
                OnContextMenu( ( HWND )wp , pt );
            }
        }

        break;


    case WM_HELP:

        OnHelp( hDlg , ( LPHELPINFO )lp );

        break;

    case WM_COMMAND:

        if ( LOWORD( wp ) == IDOK )
        {
            pNode = ( CSettingNode *)GetWindowLongPtr( hDlg , DWLP_USER );

            if( pNode == NULL )
            {
                break;
            }            

            LRESULT nCurSel = SendMessage(GetDlgItem( hDlg ,
                                                      IDC_LICENSING_MODE),
                                          CB_GETCURSEL,
                                          0,
                                          0);

            if ( ulOldSelection != (ULONG) nCurSel )
            {
                if( FAILED( pNode->SetAttributeValue( ( DWORD )rgulModes[nCurSel] , &dwStatus ) ) )
                {
                    SnodeErrorHandler( hDlg ,
                                       pNode->GetObjectId( ),
                                       dwStatus );
                }
            }
        }

        if (( LOWORD( wp ) == IDCANCEL ) || ( LOWORD( wp ) == IDOK ))
        {
            LinkWindow_UnregisterClass( _Module.GetModuleInstance() );

            if (NULL != rgszNames)
            {
                CoTaskMemFree(rgszNames);
                rgszNames = NULL;
            }

            if (NULL != rgszDescriptions)
            {
                CoTaskMemFree(rgszDescriptions);
                rgszDescriptions = NULL;
            }

            EndDialog( hDlg , 0 );
        }
        else if (HIWORD( wp ) == CBN_SELCHANGE)
        {
            LRESULT nCurSel = SendMessage((HWND) lp,
                                          CB_GETCURSEL,
                                          0,
                                          0);
            
            ASSERT((ULONG)nCurSel < cModes);

            SetWindowText( GetDlgItem( hDlg , IDC_LICENSING_DESCRIPTION ),
                           rgszDescriptions[nCurSel] );
        }

        break;
    case WM_NOTIFY:

        switch (((LPNMHDR)lp)->code)
        {
            case NM_CHAR:
			
				if( ( ( LPNMCHAR )lp )->ch != VK_SPACE )
				{
					break;
				}

				// else fall through

            case NM_RETURN:	
            case NM_CLICK:
			{                
                TCHAR szFile[MAX_PATH];

                TCHAR szParam[MAX_PATH];

                SHELLEXECUTEINFO sei;

                ZeroMemory( &sei , sizeof( SHELLEXECUTEINFO ) );

                if ( GetSystemDirectory( szFile , SIZE_OF_BUFFER( szFile ) ) )
                {
                    lstrcpy( szParam , TEXT( ",2" ) );

                    lstrcpy( szFile , TEXT( "appwiz.cpl" ) );

                    sei.cbSize = sizeof( SHELLEXECUTEINFO );

                    sei.fMask = SEE_MASK_NOCLOSEPROCESS;

                    sei.lpFile = szFile;

                    sei.lpParameters = szParam;
                 
                    if( ShellExecuteEx( &sei ) )
                    {
                        EndDialog( hDlg, IDCANCEL );                        
                    }
                }
            }

            break;
        }

        break;
    }

    return 0;
}

//--------------------------------------------------------------------------------------
INT_PTR CALLBACK ConfigActiveDesktop( HWND hDlg , UINT msg , WPARAM wp , LPARAM lp )
{
	CSettingNode *pNode;

    //TCHAR tchNewName[ 128 ];
    
    BOOL bVal = FALSE;

	static nOldSelection;

    switch( msg )
    {

    case WM_INITDIALOG :

        pNode = ( CSettingNode *)lp;

        ASSERT( pNode != NULL );
               
        // ok to store null -- it's initializing DWLP_USER area

        SetWindowLongPtr( hDlg , DWLP_USER , ( LONG_PTR )pNode );

        if( pNode->GetObjectId( ) == ACTIVE_DESK )
        {
            
            bVal = ( BOOL )pNode->xx_GetValue( );

        }
        
		// control converted into a checkbox if the chkbx is checked it means disable
		// unchecked, well you've guest it.

        if( bVal )
        {
			
            SendMessage( GetDlgItem( hDlg , IDC_RADIO_AD_ENABLE ) , BM_SETCHECK , ( WPARAM )FALSE , 0 );
        }
        else
        {
			SendMessage( GetDlgItem( hDlg , IDC_RADIO_AD_ENABLE ) , BM_SETCHECK , ( WPARAM )TRUE , 0 );
            //SendMessage( GetDlgItem( hDlg , IDC_RADIO_ADP_DISABLE ) , BM_SETCHECK , ( WPARAM )TRUE , 0 );
        }

        nOldSelection = bVal;
        
        break;

    case WM_CONTEXTMENU:
        {
            POINT pt;

            pt.x = LOWORD( lp );

            pt.y = HIWORD( lp );

            if( hDlg == GetParent( ( HWND )wp ) )
            {
                OnContextMenu( ( HWND )wp , pt );
            }
        }

        break;

    case WM_HELP:

        OnHelp( hDlg , ( LPHELPINFO )lp );

        break;

    case WM_COMMAND:

        if( LOWORD( wp ) == IDOK )
        {
            pNode = ( CSettingNode *)GetWindowLongPtr( hDlg , DWLP_USER );

            if( pNode == NULL )
            {
                break;
            }

            INT nCurrent = IsDlgButtonChecked( hDlg , IDC_RADIO_AD_ENABLE ) == BST_CHECKED ? 0 : 1;

            if( nOldSelection != nCurrent )
            {
                DWORD dwStatus;

                if( FAILED( pNode->SetAttributeValue( ( DWORD )nCurrent , &dwStatus ) ) )
                {
                    SnodeErrorHandler( hDlg , pNode->GetObjectId( ) , dwStatus );
                }
            }
            
            EndDialog( hDlg , 0 );

        }

        else if( LOWORD( wp ) == IDCANCEL )
        {
            EndDialog( hDlg , 0 );
        }

        break;
    }

    return 0;
}


//--------------------------------------------------------------------------------------
INT_PTR CALLBACK ConfigSingleSession( HWND hDlg , UINT msg , WPARAM wp , LPARAM lp )
{
	CSettingNode *pNode;

    //TCHAR tchNewName[ 128 ];
    
    BOOL bVal = FALSE;

	static nOldSelection;

    switch( msg )
    {

    case WM_INITDIALOG :

        pNode = ( CSettingNode *)lp;

        ASSERT( pNode != NULL );
               
        // ok to store null -- it's initializing DWLP_USER area

        SetWindowLongPtr( hDlg , DWLP_USER , ( LONG_PTR )pNode );

        if( pNode->GetObjectId( ) == SINGLE_SESSION )
        {
            
            bVal = ( BOOL )pNode->xx_GetValue( );

        }
        
		// control converted into a checkbox if the chkbx is checked it means enable
		// unchecked, well you've guest it.

			
        SendMessage( GetDlgItem( hDlg , IDC_RADIO_SINGLE_SESSION_ENABLE ) , BM_SETCHECK , ( WPARAM )bVal , 0 );

        POLICY_TS_MACHINE p;
        RegGetMachinePolicy(&p);
        EnableWindow(GetDlgItem(hDlg,IDC_RADIO_SINGLE_SESSION_ENABLE), !p.fPolicySingleSessionPerUser);

        nOldSelection = bVal;
        
        break;

    case WM_CONTEXTMENU:
        {
            POINT pt;

            pt.x = LOWORD( lp );

            pt.y = HIWORD( lp );

            if( hDlg == GetParent( ( HWND )wp ) )
            {
                OnContextMenu( ( HWND )wp , pt );
            }
        }

        break;

    case WM_HELP:

        OnHelp( hDlg , ( LPHELPINFO )lp );

        break;

    case WM_COMMAND:

        if( LOWORD( wp ) == IDOK )
        {
            pNode = ( CSettingNode *)GetWindowLongPtr( hDlg , DWLP_USER );

            if( pNode == NULL )
            {
                break;
            }

            INT nCurrent = IsDlgButtonChecked( hDlg , IDC_RADIO_SINGLE_SESSION_ENABLE ) == BST_CHECKED ? 1 : 0;

            if( nOldSelection != nCurrent )
            {
                DWORD dwStatus;

                if( FAILED( pNode->SetAttributeValue( ( DWORD )nCurrent , &dwStatus ) ) )
                {
                    SnodeErrorHandler( hDlg , pNode->GetObjectId( ) , dwStatus );
                }
            }
            
            EndDialog( hDlg , 0 );

        }

        else if( LOWORD( wp ) == IDCANCEL )
        {
            EndDialog( hDlg , 0 );
        }

        break;
    }

    return 0;
}


//--------------------------------------------------------------------------------------
INT_PTR CALLBACK DeleteTempDirsDlgProc( HWND hDlg , UINT msg , WPARAM wp , LPARAM lp )
{
    CSettingNode *pNode;

    // TCHAR tchNewName[ 128 ];
    
    BOOL bVal = FALSE;

    static nOldSelection;

    switch( msg )
    {
    case WM_INITDIALOG :

        pNode = ( CSettingNode *)lp;

        ASSERT( pNode != NULL );
        
        // ok to store null -- it's initializing DWLP_USER area

        SetWindowLongPtr( hDlg , DWLP_USER , ( LONG_PTR )pNode );

        if( pNode->GetObjectId( ) == DELETED_DIRS_ONEXIT )
        {            
            bVal = ( BOOL )pNode->xx_GetValue( );
        }

        SendMessage( GetDlgItem( hDlg , IDC_RADIO_YES ) , BM_SETCHECK , ( WPARAM )bVal , 0 );
        SendMessage( GetDlgItem( hDlg , IDC_RADIO_NO ) , BM_SETCHECK , ( WPARAM )!bVal , 0 );

        POLICY_TS_MACHINE p;
        RegGetMachinePolicy(&p);
        EnableWindow(GetDlgItem(hDlg, IDC_RADIO_YES), !p.fPolicyDeleteTempFoldersOnExit);
        EnableWindow(GetDlgItem(hDlg, IDC_RADIO_NO), !p.fPolicyDeleteTempFoldersOnExit);
        
        nOldSelection = bVal;
        
        break;

    case WM_CONTEXTMENU:
        {
            POINT pt;

            pt.x = LOWORD( lp );

            pt.y = HIWORD( lp );

            if( hDlg == GetParent( ( HWND )wp ) )
            {
                OnContextMenu( ( HWND )wp , pt );
            }
        }

        break;

    case WM_HELP:

        OnHelp( hDlg , ( LPHELPINFO )lp );

        break;

    case WM_COMMAND:

        if( LOWORD( wp ) == IDOK )
        {
            pNode = ( CSettingNode *)GetWindowLongPtr( hDlg , DWLP_USER );

            if( pNode == NULL )
            {
                break;
            }

            INT nCurrent = IsDlgButtonChecked( hDlg , IDC_RADIO_YES ) == BST_CHECKED ? 1 : 0;

            if( nOldSelection != nCurrent )
            {
                DWORD dwStatus;

                if( FAILED( pNode->SetAttributeValue( ( DWORD )nCurrent , &dwStatus ) ) )
                {
                    SnodeErrorHandler( hDlg , pNode->GetObjectId( ) , dwStatus );
                }
            }
            
            EndDialog( hDlg , 0 );

        }

        else if( LOWORD( wp ) == IDCANCEL )
        {
            EndDialog( hDlg , 0 );
        }

        break;
    }

    return 0;
}

//-------------------------------------------------------------------------------
INT_PTR CALLBACK UserPermCompat( HWND hDlg , UINT msg, WPARAM wp , LPARAM lp )
{
	CSettingNode *pNode;
        
    BOOL bVal = FALSE;

    HICON hIcon;

    static nOldSelection;

    switch( msg )
    {
    case WM_INITDIALOG :

        pNode = ( CSettingNode *)lp;

        ASSERT( pNode != NULL );
        
        // ok to store null -- it's initializing DWLP_USER area

        SetWindowLongPtr( hDlg , DWLP_USER , ( LONG_PTR )pNode );

        if( pNode->GetObjectId( ) == USERSECURITY )
        {            
            bVal = ( BOOL )pNode->xx_GetValue( );
        }
        
        if( bVal )
        {
			CheckDlgButton( hDlg , IDC_RADIO_TS4PERM , BST_CHECKED );            
        }
        else
        {
            CheckDlgButton( hDlg , IDC_RADIO_WIN2KPERM , BST_CHECKED );
        }

        nOldSelection = bVal;

       hIcon = LoadIcon( _Module.GetModuleInstance( ) , MAKEINTRESOURCE( IDI_ICON_WARNING ) );

       hIcon = ( HICON )LoadImage( _Module.GetModuleInstance( ) ,
                                    MAKEINTRESOURCE( IDI_ICON_WARNING ) ,
                                    IMAGE_ICON,
                                    0,
                                    0,
                                    0 );



       SendMessage( GetDlgItem( hDlg , IDC_USERPERM_ICON ) , STM_SETICON , ( WPARAM )hIcon , 0 );

        
        break;

	 case WM_COMMAND:

        if( LOWORD( wp ) == IDOK )
        {
            pNode = ( CSettingNode *)GetWindowLongPtr( hDlg , DWLP_USER );

            if( pNode == NULL )
            {
                break;
            }

            INT nCurrent = IsDlgButtonChecked( hDlg , IDC_RADIO_TS4PERM ) == BST_CHECKED ? 1 : 0;

            if( nOldSelection != nCurrent )
            {
                DWORD dwStatus;                

                // flag error if not in appsrv mode
                // we should never get here -- unless someone mucked around with the registry.

                if( !g_bAppSrvMode )
                {
                    xxxErrMessage( hDlg , IDS_REMOTEADMIN_ONLY , IDS_WARN_TITLE , MB_OK | MB_ICONINFORMATION );

                    CheckRadioButton( hDlg ,
                                      IDC_RADIO_WIN2KPERM , 
                                      IDC_RADIO_TS4PERM,
                                      ( nOldSelection ) ? IDC_RADIO_TS4PERM : IDC_RADIO_WIN2KPERM 
                                    );
                    return 0;

                }

                else if( FAILED( pNode->SetAttributeValue( ( DWORD )nCurrent , &dwStatus ) ) )
                {
                    SnodeErrorHandler( hDlg , pNode->GetObjectId( ) , dwStatus );
                }
            }
            
            EndDialog( hDlg , 0 );

        }

        else if( LOWORD( wp ) == IDCANCEL )
        {
            EndDialog( hDlg , 0 );
        }

        break;
    }

    return 0;
}

//-------------------------------------------------------------------------------
// Each control has a helpid assign to them.  Some controls share the same topic
// check for these.
//-------------------------------------------------------------------------------
BOOL OnHelp( HWND hwnd , LPHELPINFO lphi )
{
    UNREFERENCED_PARAMETER( hwnd );

    TCHAR tchHelpFile[ MAX_PATH ];

    //
    // For the information to winhelp api
    //

    if( IsBadReadPtr( lphi , sizeof( HELPINFO ) ) )
    {
        return FALSE;
    }

    if( lphi->iCtrlId <= -1 )
    {
        return FALSE;
    }

    LoadString( _Module.GetModuleInstance( ) , IDS_HELPFILE , tchHelpFile , SIZE_OF_BUFFER( tchHelpFile ) );

    ULONG_PTR rgdw[ 2 ];

    rgdw[ 0 ] = ( ULONG_PTR )lphi->iCtrlId;

    rgdw[ 1 ] = ( ULONG_PTR )lphi->dwContextId;

    WinHelp( ( HWND )lphi->hItemHandle , tchHelpFile , HELP_WM_HELP , ( ULONG_PTR )&rgdw );//lphi->dwContextId );

    return TRUE;
}

//-------------------------------------------------------------------------------
// Used when user right clicks the item.  "What's this?" will appear
//
// The first parameter must be the control in the dialog
// because this is a helper function the caller must insure this.
//-------------------------------------------------------------------------------
BOOL OnContextMenu( HWND hwnd , POINT& pt )
{
    UNREFERENCED_PARAMETER( pt );

    TCHAR tchHelpFile[ MAX_PATH ];

    //
    // Make sure its not a dummy window
    //
    
    if( GetDlgCtrlID( hwnd ) <= ( int )-1 )
    {
        return FALSE;
    }
    
    ULONG_PTR rgdw[ 2 ];
    
    rgdw[ 0 ] = GetDlgCtrlID( hwnd );
    
    rgdw[ 1 ] = GetWindowContextHelpId( hwnd );
    
    LoadString( _Module.GetModuleInstance( ) , IDS_HELPFILE , tchHelpFile , SIZE_OF_BUFFER( tchHelpFile ) );
    
    WinHelp( hwnd , tchHelpFile , HELP_CONTEXTMENU , ( ULONG_PTR )&rgdw );
    
    return TRUE;

}