/*++

Copyright (c) 1995  Microsoft Corporation
All rights reserved.

Module Name:

    prop.hxx

Abstract:

    Printer properties header.

Author:

    Albert Ting (AlbertT)  17-Aug-1995

Revision History:

--*/

#ifndef _PRTPROP_HXX
#define _PRTPROP_HXX

extern "C" {
#ifdef SECURITY
#include <sedapi.h>
#endif
}

/********************************************************************

    Forward references.

********************************************************************/
class TPrinterPropertySheetManager;
class TPrtShare;

/********************************************************************

    Printer property sheet data.

********************************************************************/

class TPrinterData : public MSingletonWin {

    SIGNATURE( 'prtp' )
    SAFE_NEW

public:

    VAR( BOOL, bValid );
    VAR( INT, iStartPage );

    VAR( BOOL, bNoAccess );
    VAR( BOOL, bErrorSaving );
    VAR( BOOL, bRefreshArch );
    VAR( BOOL, bRefreshBidi );

    VAR( TString, strServerName );
    VAR( LPCTSTR, pszServerName );
    VAR( TString, strShareName );
    VAR( TString, strDriverName );
    VAR( TString, strComment );
    VAR( TString, strLocation );

    VAR( TString, strPortName );
    VAR( TString, strSepFile );
    VAR( TString, strPrintProcessor );
    VAR( TString, strDatatype );

    VAR( HANDLE, hPrinter );
    VAR( HICON, hIcon );
    VAR( HICON, hDefaultIcon );
    VAR( HICON, hDefaultSmallIcon );
    VAR( DWORD, dwAccess );

    VAR( PDEVMODE, pDevMode );

    VAR( DWORD, dwAttributes );
    VAR( DWORD, dwPriority );
    VAR( DWORD, dwStartTime );
    VAR( DWORD, dwUntilTime );
    VAR( DWORD, dwStatus );

    VAR( TPrinterPropertySheetManager *, pPrinterPropertySheetManager );

    TPrinterData(
        LPCTSTR pszPrinterName,
        INT nCmdShow,
        LPARAM lParam
        );

    ~TPrinterData(
        VOID
        );

    BOOL
    bChangeDriver(
        IN HWND hDlg,
        IN LPCTSTR pszDriverName,
        IN LPCTSTR pszPrinterName
        );

    BOOL
    bLoad(
        VOID
        );

    VOID
    vUnload(
        VOID
        );

    BOOL
    bSave(
        VOID
        );

    BOOL
    bAdministrator(
        VOID
        );

    BOOL
    bSupportBidi(
        VOID
        );
private:

    //
    // Prevent copying and assignment.
    //
    TPrinterData::
    TPrinterData(
        const TPrinterData &
        );

    TPrinterData &
    TPrinterData::
    operator =(
        const TPrinterData &
        );
        
};

/********************************************************************

    PrinterProp.

    Base class for printer property sheets.  This class should not
    not contain any information/services that is not generic to all
    derived classes.

    The printer property sheets should inherit from this class.
    bHandleMessage (which is not overriden here) should be
    defined in derived classes.

********************************************************************/

class TPrinterProp : public MGenericProp {

    SIGNATURE( 'prpr' )
    ALWAYS_VALID
    SAFE_NEW

public:

    enum _CONSTANTS {
        kPropGeneral = 0,
        kPropPorts = 1,
        kPropJobScheduling = 2,
        kPropSharing = 3,
#ifdef SECURITY
        kPropSecurity = 4,
        kPropMax = 5
#else
        kPropMax = 4
#endif
    };

    //
    // Serves as the thread start routine.
    //
    static
    INT
    iPrinterPropPagesProc(
        TPrinterData* pPrinterData
        );

protected:

    VAR( TPrinterData*, pPrinterData );

    TPrinterProp(
        TPrinterData* pPrinterData
        );

    TPrinterProp &
    operator = (
        const TPrinterProp &
        );

    VOID
    vSetIcon(
        VOID
        );

    VOID
    vFreeIcon(
        VOID
        );

    VOID
    vSetIconName(
        VOID
        );

    VOID
    vReloadPages(
        VOID
        );

};


/********************************************************************

    General printer property page.

********************************************************************/

class TPrinterGeneral : public TPrinterProp {

    SIGNATURE( 'gepr' )
    SAFE_NEW

public:

    enum _CONSTANTS {
        kInitialDriverHint      = 0x400,
        kCurrentDriverVersion   = 2
    };

    TPrinterGeneral(
        TPrinterData* pPrinterData
        );

    ~TPrinterGeneral(
        VOID
        );

    BOOL
    bValid(
        VOID
        );

private:

    /********************************************************************

        Virtual override.

    ********************************************************************/

    BOOL
    bHandleMessage(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
        );

    BOOL
    bSetUI(
        VOID
        );

    VOID
    vReadUI(
        VOID
        );

    BOOL
    bFillAndSelectDrivers(
        VOID
        );

    VOID
    vChangeDriver(
        IN BOOL bUseSelection
        );

    VOID
    TPrinterGeneral::
    vSeparatorPage(
        VOID
        );

    VOID
    TPrinterGeneral::
    vPrintProcessor(
        VOID
        );

    VOID
    TPrinterGeneral::
    vHandleDriverSelectionChange( 
        IN WPARAM wParam, 
        IN LPARAM lParam 
        );

    BOOL _bDropDownState;

};


/********************************************************************

    Ports Property Page.

********************************************************************/

class TPrinterPorts : public TPrinterProp {

    SIGNATURE( 'popr' )
    SAFE_NEW

public:

    TPrinterPorts(
        TPrinterData *pPrinterData
        );

    ~TPrinterPorts(
        VOID
        );

    BOOL
    bValid(
        VOID
        );

private:

    TPortsLV _PortsLV;

    /********************************************************************

        Virtual override.

    ********************************************************************/

    BOOL
    bHandleMessage(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
        );

    BOOL
    bSetUI(
        VOID
        );

    VOID
    vReadUI(
        VOID
        );

    VOID
    vSetActive(
        VOID
        );
    BOOL
    bKillActive(
        VOID
        );
};


/********************************************************************

    Job Scheduling Property Page.

********************************************************************/

class TPrinterJobScheduling : public TPrinterProp {

    SIGNATURE( 'jspr' )
    SAFE_NEW

public:

    TPrinterJobScheduling(
        TPrinterData *pPrinterData
        );

    ~TPrinterJobScheduling(
        VOID
        );

    BOOL
    bValid(
        VOID
        );

private:

    enum _CONSTANTS {
        kPriorityMin                = 1,
        kPriorityMax                = 99,
        kPriorityNumberStringMax    = 10
    };

    HWND _hwndSlider;
    TTime _StartTime;
    TTime _UntilTime;

    /********************************************************************

        Virtual override.

    ********************************************************************/

    BOOL
    bHandleMessage(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
        );

    BOOL
    bSetUI(
        VOID
        );

    VOID
    vReadUI(
        VOID
        );

    VOID
    vEnableAvailable(
        BOOL bEnable
        );

    VOID
    vUpdatePriorityNumber(
        DWORD dwPriority
        );
};


/********************************************************************

    Sharing Property Page.

********************************************************************/

class TPrinterSharing : public TPrinterProp {

    SIGNATURE( 'sepr' )
    SAFE_NEW

public:

    TPrinterSharing::
    TPrinterSharing(
        TPrinterData *pPrinterData
        );

    TPrinterSharing::
    ~TPrinterSharing(
        VOID
        );

    BOOL
    TPrinterSharing::
    bValid(
        VOID
        );

private:

    TInstallArchitecture _Architecture;
    TPrtShare *_pPrtShare;

    BOOL
    TPrinterSharing::
    bApply(
        VOID
        );

    VOID
    TPrinterSharing::
    vSetActive(
        VOID
        );

    VOID
    TPrinterSharing::
    vSharePrinter(
        VOID
        );

    VOID
    TPrinterSharing::
    vSetDefaultShareName(
        VOID
        );

    VOID
    TPrinterSharing::
    vUnsharePrinter(
        VOID
        );

    BOOL
    TPrinterSharing::
    bKillActive(
        VOID
        );

    /********************************************************************

        Virtual override.

    ********************************************************************/

    BOOL
    TPrinterSharing::
    bHandleMessage(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
        );

    BOOL
    TPrinterSharing::
    bSetUI(
        VOID
        );

    VOID
    TPrinterSharing::
    vReadUI(
        VOID
        );

};

/********************************************************************

    Security Property Page.

********************************************************************/

#ifdef SECURITY

class TPrinterSecurity : public TPrinterProp {

    SIGNATURE( 'sepr' )
    SAFE_NEW

public:

    enum SED {
        ID_PERMS,
        ID_AUDIT,
        ID_OWNER
    };

    enum PERMS {
        PERMS_NOACC,
        PERMS_PRINT,
        PERMS_DOCAD,
        PERMS_ADMIN,
        PERMS_COUNT
    };

    enum PERMS_AUDIT {
        PERMS_AUDIT_PRINT,
        PERMS_AUDIT_ADMINISTER,
        PERMS_AUDIT_DELETE,
        PERMS_AUDIT_CHANGE_PERMISSIONS,
        PERMS_AUDIT_TAKE_OWNERSHIP,
        PERMS_AUDIT_COUNT
    };

    typedef struct SECURITY_CONTEXT {
        SECURITY_INFORMATION SecurityInformation;
        TPrinterSecurity* pPrinterSecurity;
        HANDLE hPrinter;
    } *PSECURITY_CONTEXT;

    TPrinterSecurity(
        TPrinterData *pPrinterData
        ) : TPrinterProp( pPrinterData )
    {   }

    BOOL
    bValid(
        VOID
        )
    {
        return TPrinterProp::bValid();
    }


private:

    typedef DWORD (WINAPI *PFNSED_DISCRETIONARY_ACL_EDITOR)(
        HWND                         Owner,
        HANDLE                       Instance,
        LPWSTR                       Server,
        PSED_OBJECT_TYPE_DESCRIPTOR  ObjectType,
        PSED_APPLICATION_ACCESSES    ApplicationAccesses,
        LPWSTR                       ObjectName,
        PSED_FUNC_APPLY_SEC_CALLBACK ApplySecurityCallbackRoutine,
        ULONG                        CallbackContext,
        PSECURITY_DESCRIPTOR         SecurityDescriptor,
        BOOLEAN                      CouldntReadDacl,
        BOOLEAN                      CantWriteDacl,
        LPDWORD                      SEDStatusReturn,
        DWORD                        Flags
        );

    typedef DWORD (WINAPI *PFNSED_SYSTEM_ACL_EDITOR )(
        HWND                 Owner,
        HANDLE               Instance,
        LPWSTR               Server,
        PSED_OBJECT_TYPE_DESCRIPTOR  ObjectType,
        PSED_APPLICATION_ACCESSES    ApplicationAccesses,
        LPWSTR               ObjectName,
        PSED_FUNC_APPLY_SEC_CALLBACK ApplySecurityCallbackRoutine,
        ULONG                CallbackContext,
        PSECURITY_DESCRIPTOR SecurityDescriptor,
        BOOLEAN              CouldntEditSacl,
        LPDWORD              SEDStatusReturn,
        DWORD                Flags
        );

    typedef DWORD (WINAPI *PFNSED_TAKE_OWNERSHIP)(
        HWND                 Owner,
        HANDLE               Instance,
        LPWSTR               Server,
        LPWSTR               ObjectTypeName,
        LPWSTR               ObjectName,
        UINT                 CountOfObjects,
        PSED_FUNC_APPLY_SEC_CALLBACK ApplySecurityCallbackRoutine,
        ULONG                CallbackContext,
        PSECURITY_DESCRIPTOR SecurityDescriptor,
        BOOLEAN              CouldntReadOwner,
        BOOLEAN              CantWriteOwner,
        LPDWORD              SEDStatusReturn,
        PSED_HELP_INFO       HelpInfo,
        DWORD                Flags
        );

    /********************************************************************

        Virtual override.

    ********************************************************************/

    BOOL
    bHandleMessage(
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam
        );

    /********************************************************************

        Data retrievers.

    ********************************************************************/

    BOOL
    bInitStrings(
        VOID
        );

    VOID
    vCallDiscretionaryAclEditor(
        VOID
        );

    VOID
    vCallSystemAclEditor(
        VOID
        );

    VOID
    vCallTakeOwnershipDialog(
        VOID
        );

    static TString strPrinter;

    static HINSTANCE ghLibraryAcledit;

    static TString gstrPrinter;
    static GENERIC_MAPPING gGenericMappingPrinters;
    static GENERIC_MAPPING gGenericMappingDocuments;

    static SED_HELP_INFO gHelpInfoPermissions;
    static SED_HELP_INFO gHelpInfoAuditing;
    static SED_HELP_INFO gHelpInfoTakeOwnership;

    static SED_OBJECT_TYPE_DESCRIPTOR gObjectTypeDescriptor;
    static SED_APPLICATION_ACCESS gpDiscretionaryAccessGroup[PERMS_COUNT];
    static SED_APPLICATION_ACCESS gpSystemAccessGroup[PERMS_AUDIT_COUNT];

    /********************************************************************

        Function pointers to acledit entrypoints.

    ********************************************************************/

    static PFNSED_DISCRETIONARY_ACL_EDITOR gpfnSedDiscretionaryAclEditor;
    static PFNSED_SYSTEM_ACL_EDITOR gpfnSedSystemAclEditor;
    static PFNSED_TAKE_OWNERSHIP gpfnSedTakeOwnership;

    static
    BOOL
    bLoadAcledit(
        VOID
        );

    static
    DWORD
    SedCallback2(
        HWND                 hwndParent,
        HANDLE               hInstance,
        DWORD                CallBackContext,
        PSECURITY_DESCRIPTOR pSecurityDescriptorUpdated,
        PSECURITY_DESCRIPTOR pSecDescNewObjects,
        BOOLEAN              bApplyToSubContainers,
        BOOLEAN              bApplyToSubObjects,
        LPDWORD              pdwStatusReturn
        );

    static
    BOOL
    BuildNewSecurityDescriptor(
        PSECURITY_DESCRIPTOR pSecurityDescriptorNew,
        SECURITY_INFORMATION SecurityInformation,
        PSECURITY_DESCRIPTOR pSecurityDescriptorUpdated
        );

    static
    PSECURITY_DESCRIPTOR
    AllocCopySecurityDescriptor(
        PSECURITY_DESCRIPTOR pSecurityDescriptor,
        PDWORD               pdwLength
        );
};

#endif // def SECURITY

/********************************************************************

    Global scoped functions.

********************************************************************/

VOID
vPrinterPropPages(
    IN HWND hwnd,
    IN LPCTSTR pszPrinterName,
    IN INT nCmdShow,
    IN LPARAM lParam
    );


#endif // def _PRTPROP_HXX