//=============================================================================
// Copyright (c) 2000 Microsoft Corporation
//
// dialogs.hpp
//
// Credential manager user interface classes used to get credentials.
//
// Created 02/29/2000 johnstep (John Stephens)
//=============================================================================

#ifndef __DIALOGS_HPP__
#define __DIALOGS_HPP__

//-----------------------------------------------------------------------------

#include "controls.hpp"

//-----------------------------------------------------------------------------
// Types
//-----------------------------------------------------------------------------

struct CREDUI_CHANGE_PASSWORD_INFO
{
    CONST WCHAR *UserName;
    WCHAR *Password;
    ULONG PasswordMaxChars;
    CreduiBalloonTip BalloonTip;
    CreduiPasswordBox OldPasswordBox;
    CreduiPasswordBox NewPasswordBox;
    CreduiPasswordBox ConfirmPasswordBox;
};

//-----------------------------------------------------------------------------
// Functions
//-----------------------------------------------------------------------------

static
INT_PTR
CALLBACK
CreduiChangePasswordCallback(
    HWND changePasswordWindow,
    UINT message,
    WPARAM wParam,
    LPARAM lParam
    );

extern
BOOL
CreduiChangeDomainPassword(
    HWND parentWindow,
    CONST WCHAR *userName,
    WCHAR *password,
    ULONG passwordMaxChars
    );

//-----------------------------------------------------------------------------
// CreduiPasswordDialog Class
//-----------------------------------------------------------------------------

class CreduiPasswordDialog
{
public:

    CreduiPasswordDialog(
        IN BOOL DoingCommandLine,
        IN BOOL DelayCredentialWrite,
        IN DWORD credCategory,
        CREDUI_INFO *uiInfo,
        CONST WCHAR *targetName,
        WCHAR *userName,
        ULONG userNameMaxChars,
        WCHAR *password,
        ULONG passwordMaxChars,
        BOOL *save,
        DWORD flags,
        CtxtHandle *securityContext,
        DWORD authError,
        DWORD *result
        );
    ~CreduiPasswordDialog();

private:

    // Variables:

    DWORD Result;
    DWORD AuthError;

    HWND DialogWindow;

    HWND CredControlWindow;
    DWORD CredControlStyle;

    // User interface control state flags:

    enum
    {
        DISABLED_DIALOG             = 0x0001,
        DISABLED_CONTROL_CRED       = 0x0002,
        DISABLED_CONTROL_OK         = 0x0004,
    };

    BOOL DisabledControlMask;

    BOOL DelayCredentialWrite;
    BOOL EncryptedVisiblePassword;

    DWORD Flags;

    //
    // CredCategory defines the type of the credential
    //
    DWORD CredCategory;
#define DOMAIN_CATEGORY 0
#define USERNAME_TARGET_CATEGORY CREDUI_FLAGS_USERNAME_TARGET_CREDENTIALS
#define GENERIC_CATEGORY CREDUI_FLAGS_GENERIC_CREDENTIALS


    BOOL Save;
    WCHAR *TargetName;
    WCHAR *UserOrTargetName;
    CtxtHandle *SecurityContext;
    CREDUI_INFO UiInfo;
    WCHAR *UserName;
    ULONG UserNameMaxChars;
    WCHAR *Password;
    ULONG PasswordMaxChars;

    BOOL fInitialSaveState; // initial state of the Save checkbox
    BOOL fPassedUsername;
    BOOL fPasswordOnly;

    BOOL FirstPaint;
    CONST CREDUI_BALLOON *CredBalloon;

    enum
    {
        PASSWORD_UNINIT     = 0,
        PASSWORD_INIT       = 1,
        PASSWORD_CHANGED    = 2
    };

    DWORD PasswordState;

    LONG ResizeTop;
    LONG ResizeDelta;

    // Functions:

    BOOL InitWindow(HWND dialogWindow);
    VOID SelectAndSetWindowCaption();
    VOID SelectAndSetWindowMessage();

    VOID Enable(BOOL enable = TRUE);

    DWORD HandleOk();
    void    SetCredTargetFromInfo();
    DWORD UsernameHandleOk();
    DWORD FinishHandleOk();

    static LRESULT CALLBACK CmdLineMessageHandlerCallback(
        HWND window,
        UINT message,
        WPARAM wParam,
        LPARAM lParam
        );
    LRESULT
    CreduiPasswordDialog::CmdLineMessageHandler(
        UINT message,
        WPARAM wParam,
        LPARAM lParam
        );

    static INT_PTR CALLBACK DialogMessageHandlerCallback(
        HWND dialogWindow,
        UINT message,
        WPARAM wParam,
        LPARAM lParam
        );
    INT_PTR DialogMessageHandler(
        UINT message,
        WPARAM wParam,
        LPARAM lParam
        );

    static BOOL CALLBACK ResizeDialogCallback(
        HWND childWindow,
        LPARAM lParam);

    CREDENTIAL_TARGET_INFORMATION *TargetInfo;
    CREDENTIAL *PasswordCredential;
    CREDENTIAL *OldCredential;
    CREDENTIAL NewCredential;
    WCHAR OldUserName[CRED_MAX_USERNAME_LENGTH + 1];
    WCHAR NewTargetName[CRED_MAX_STRING_LENGTH + 1];
    WCHAR NewTargetAlias[CRED_MAX_STRING_LENGTH + 1];

    SSOPACKAGE SSOPackage;
    DWORD dwIDDResource;
    RECT rcBrand;
    HBITMAP hBrandBmp;

    DWORD MaximumPersist;
    DWORD MaximumPersistSso;

    //
    // Data specific to command line
    //

    DWORD
    CmdLineDialog(
        VOID
        );

    HWND CmdLineWindow;
    BOOL DoingCommandLine;
    static LONG Registered;

    DWORD
    CmdlinePasswordPrompt(
        VOID
        );



    // Functions:

    BOOL CompleteUserName();
    VOID SelectBestTargetName(BOOL serverOnly);
};

//-----------------------------------------------------------------------------

#endif // __DIALOGS_HPP__