extern "C" {
#include "ntddndis.h"
#include "wzcsapi.h"
}

#pragma once

////////////////////////////////////////////////////////////////////////
// CWZCConfigPage related stuff
//
// flags used for CWZCConfigProps::m_dwFlags
#define     WZCDLG_PROPS_RWALL      0x000000ff    // enable all settings for writing
#define     WZCDLG_PROPS_RWSSID     0x00000001    // enable SSID for writing
#define     WZCDLG_PROPS_RWINFR     0x00000002    // enable Infrastructure Mode for writing
#define     WZCDLG_PROPS_RWAUTH     0x00000004    // enable Authentication Mode for writing
#define     WZCDLG_PROPS_RWWEP      0x00000010    // enable the WEP entry for selecting
#define     WZCDLG_PROPS_ONEX_CHECK 0x00000100    // correlate the 802.1X state with the existence of the key

#define     WZCDLG_PROPS_DEFOK      0x00002000    // "OK" = defpushbutton (otherwise, "Cancel"=defpushbutton)

// utility macro to convert a hexa digit into its value
#define HEX(c)  ((c)<='9'?(c)-'0':(c)<='F'?(c)-'A'+0xA:(c)-'a'+0xA)

// defines used for the valid WEP Key indices
#define WZC_WEPKIDX_NDIGITS 16  // more than we ever need
#define WZC_WEPKIDX_MIN     1
#define WZC_WEPKIDX_MAX     4

// defines legal lengths for the WEP Key material
#define WZC_WEPKMAT_40_ASC  5
#define WZC_WEPKMAT_40_HEX  10
#define WZC_WEPKMAT_104_ASC 13
#define WZC_WEPKMAT_104_HEX 26
#define WZC_WEPKMAT_128_ASC 16
#define WZC_WEPKMAT_128_HEX 32

class CEapolConfig;
class CWZCConfig;

class CWZCConfigPage:
    public CPropSheetPage
{
protected:
    BEGIN_MSG_MAP(CWZCConfigPage)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
        MESSAGE_HANDLER(WM_HELP, OnHelp)
        NOTIFY_CODE_HANDLER(PSN_APPLY, OnOK)
        COMMAND_ID_HANDLER(IDC_SHAREDMODE, OnUsePW)
        COMMAND_ID_HANDLER(IDC_USEPW, OnUsePW)
        COMMAND_ID_HANDLER(IDC_USEHARDWAREPW, OnUseHWPassword)
        COMMAND_ID_HANDLER(IDC_WZC_EDIT_KMat, OnWepKMatCmd)
        COMMAND_ID_HANDLER(IDC_ADHOC, OnCheckEapolAllowed)
    END_MSG_MAP()

    BOOL m_bKMatTouched; // indicator whether the wep key material has been touched

    // handle to the dialog
    HWND        m_hwndDlg;
    // Handles to all the UI controls managed
    // by this class (all related to Wireless
    // Zero Configuration)
    HWND        m_hwndEdSSID;   // "Service Set Identifier:" edit
    HWND        m_hwndChkAdhoc; // "Adhoc" vs "Infra" checkbox
    HWND        m_hwndChkShared; // "Use shared auth mode" checkbox
    HWND        m_hwndUsePW;    // "Use Password" checkbox
    // wep key related controls
    HWND        m_hwndUseHardwarePW; // "Use password from network hardware" check box
    HWND        m_hwndLblKMat;  // "Key material" label
    HWND        m_hwndLblKMat2; // "Confirm Key material" label
    HWND        m_hwndEdKMat;   // "Key material" edit
    HWND        m_hwndEdKMat2;  // "Confirm Key material" edit
    HWND        m_hwndLblKIdx;  // "Key index" label
    HWND        m_hwndEdKIdx;   // "Key index" edit

    // Internal members
    DWORD       m_dwFlags;

    // Pointer to the EAPOL configuration for this network
    CEapolConfig    *m_pEapolConfig;

    // automatically enable/disable state for all the WepK related controls
    DWORD EnableWepKControls();

    // initializes WEP controls
    DWORD InitWepKControls();

    // checks the validity of the WEP Key material
    DWORD CheckWepKMaterial(LPSTR *ppszKMat, DWORD *pdwKeyFlags);

    // parses & copies the WEP Key material from the parameter into the m_wzcConfig object
    DWORD CopyWepKMaterial(LPSTR szKMat);

    // sets the EAPOL Locked bit
    DWORD SetEapolAllowedState();

public:
    // wzc configuration settings
    WZC_WLAN_CONFIG m_wzcConfig;
    // class constructor
    CWZCConfigPage(DWORD dwFlags = 0);
    // initialize the wzc config data
    DWORD UploadWzcConfig(CWZCConfig *pwzcConfig);
    // copy a reference to the EAPOL configuration object
    DWORD UploadEapolConfig(CEapolConfig *pEapolConfig);
    // Sets the dialog flags
    DWORD SetFlags(DWORD dwMask, DWORD dwNewFlags);
    // Dialog related members
    LRESULT OnInitDialog (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnOK(UINT idCtrl, LPNMHDR pnmh, BOOL& bHandled);
    LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnUsePW(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
    LRESULT OnUseHWPassword(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
    LRESULT OnWepKMatCmd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
    LRESULT OnCheckEapolAllowed(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
};