// devpopg.h : header file
//

#ifndef __DEVPOPG_H__
#define __DEVPOPG_H__

/*++

Copyright (C) Microsoft Corporation

Module Name:

    devpopg.h

Abstract:

    header file for devpopg.cpp

Author:

    William Hsieh (williamh) created

Revision History:


--*/

#include "proppage.h"
#include "wmium.h"
#include "wdmguid.h"
#include "ndisguid.h"

//
// help topic ids
//
#define IDH_DISABLEHELP                     (DWORD(-1))
#define IDH_DEVMGR_PWRMGR_WAKEENABLE        2003170
#define IDH_DEVMGR_PWRMGR_MGMT_WAKEENABLE   2003185
#define IDH_DEVMGR_PWRMGR_DEVICEENABLE      2003180


typedef struct tagPowerTimeouts {
    ULONG   ConservationIdleTime;
    ULONG   PerformanceIdleTime;
} DM_POWER_DEVICE_TIMEOUTS, *PDM_POWER_DEVICE_TIMEOUTS;

class CPowerEnable {

public:
    CPowerEnable(const GUID& wmiGuid, ULONG DataBlockSize)
    : m_hWmiBlock(INVALID_HANDLE_VALUE),
    m_WmiInstDataSize(0), m_pWmiInstData(NULL),
    m_DataBlockSize(DataBlockSize)
    {
        m_wmiGuid = wmiGuid;
        m_DevInstId[0] = _T('\0');
    }

    virtual ~CPowerEnable()
    {
        Close();
    }
    BOOL IsOpened()
    {
        return INVALID_HANDLE_VALUE != m_hWmiBlock;
    }
    BOOL Get(BOOLEAN& fEnabled);
    BOOL Set(BOOLEAN fEnable);
    BOOL Open(LPCTSTR DeviceId);
    BOOL Close()
    {
        if (INVALID_HANDLE_VALUE != m_hWmiBlock) {
            WmiCloseBlock(m_hWmiBlock);
        }

        m_hWmiBlock = INVALID_HANDLE_VALUE;
        m_DevInstId[0] = _T('\0');

        if (m_pWmiInstData) {

            delete [] m_pWmiInstData;
            m_pWmiInstData = NULL;
        }

        m_WmiInstDataSize = 0;

        return TRUE;
    }
    operator GUID&()
    {
        return m_wmiGuid;
    }

protected:
    WMIHANDLE   m_hWmiBlock;
    ULONG       m_Version;
    GUID        m_wmiGuid;
    ULONG       m_WmiInstDataSize;
    BYTE*       m_pWmiInstData;
    ULONG       m_DataBlockSize;
    TCHAR       m_DevInstId[MAX_DEVICE_ID_LEN + 2];
};

class CPowerShutdownEnable : public CPowerEnable {
public:
    CPowerShutdownEnable() : CPowerEnable(GUID_POWER_DEVICE_ENABLE, sizeof(BOOLEAN))
    {}
    // override dtor is not necessary
};

class CPowerWakeEnable : public CPowerEnable {
public:
    CPowerWakeEnable() : CPowerEnable(GUID_POWER_DEVICE_WAKE_ENABLE, sizeof(BOOLEAN))
    {}
    // override dtor is not necessary
};

class CPowerWakeMgmtEnable : public CPowerEnable {
public:
    CPowerWakeMgmtEnable() : CPowerEnable(GUID_NDIS_WAKE_ON_MAGIC_PACKET_ONLY, sizeof(BOOLEAN))
    {}
    // override dtor is not necessary
};

class CDevicePowerMgmtPage : public CPropSheetPage {
public:
    CDevicePowerMgmtPage() :
    m_pDevice(NULL),
    CPropSheetPage(g_hInstance, IDD_DEVPOWER_PAGE)
    {}
    ~CDevicePowerMgmtPage()
    {}
    HPROPSHEETPAGE Create(CDevice* pDevice)
    {
        ASSERT(pDevice);
        m_pDevice = pDevice;
        // override PROPSHEETPAGE structure here...
        m_psp.lParam = (LPARAM)this;
        return CreatePage();
    }

protected:
    virtual BOOL OnInitDialog(LPPROPSHEETPAGE ppsp);
    virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
    virtual BOOL OnApply();
    virtual void UpdateControls(LPARAM lParam = 0);
    virtual BOOL OnHelp(LPHELPINFO pHelpInfo);
    virtual BOOL OnContextMenu(HWND hWnd, WORD xPos, WORD yPos);
private:
    CDevice*    m_pDevice;
    CPowerShutdownEnable m_poShutdownEnable;
    CPowerWakeEnable m_poWakeEnable;
    CPowerWakeMgmtEnable m_poWakeMgmtEnable;
};

#endif // _DEVPOPG_H__