/////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 1997-2001 Microsoft Corporation
//
//  Module Name:
//      ClusWrap.h
//
//  Description:
//      Wrapper functions for Cluster APIs.
//
//  Author:
//      Galen Barbee    (galenb)    15-Aug-1998
//
//  Notes:
//
/////////////////////////////////////////////////////////////////////////////
#ifndef __CLUSWRAP_H
#define __CLUSWRAP_H

#include "clusapi.h"

#define CLUS_DEFAULT_TIMEOUT    10000

//////////////////////////////////////////////////////////////////////////
// Standard cluster API wrappers.
//////////////////////////////////////////////////////////////////////////

DWORD WINAPI WrapGetClusterInformation(
    IN HCLUSTER                         hCluster,
    OUT LPWSTR *                        ppwszClusterName,
    OUT OPTIONAL LPCLUSTERVERSIONINFO   pClusterInfo
    );

DWORD WINAPI WrapGetClusterQuorumResource(
    IN HCLUSTER     hCluster,
    OUT LPWSTR *    ppwszResourceName,
    OUT LPWSTR *    ppwszDeviceName,
    OUT LPDWORD     pdwMaxQuorumLogSize
    );

DWORD WINAPI WrapClusterEnum(
    IN HCLUSENUM    hEnum,
    IN DWORD        dwIndex,
    OUT LPDWORD     pdwType,
    OUT LPWSTR *    plpwszName
    );

DWORD WINAPI WrapGetClusterNodeId(
    IN HNODE        hNode,
    OUT LPWSTR *    ppwszNodeId
    );

CLUSTER_GROUP_STATE WINAPI WrapGetClusterGroupState(
    IN HGROUP                   hGroup,
    OUT OPTIONAL    LPWSTR *    ppwszNodeName = NULL
    );

DWORD WINAPI WrapClusterGroupEnum(
    IN HGROUPENUM   hGroupEnum,
    IN DWORD        dwIndex,
    OUT LPDWORD     pdwType,
    OUT LPWSTR *    ppwszGroupName
    );

DWORD WINAPI WrapClusterNodeEnum(
    IN HNODEENUM    hEnum,
    IN DWORD        dwIndex,
    OUT LPDWORD     pdwType,
    OUT LPWSTR *    ppwszNodeName
    );

DWORD WINAPI WrapClusterNetworkEnum(
    IN HNETWORKENUM hEnum,
    IN DWORD        dwIndex,
    OUT LPDWORD     pdwType,
    OUT LPWSTR *    ppwszNetworkName
    );

CLUSTER_RESOURCE_STATE WINAPI WrapGetClusterResourceState(
    IN HRESOURCE            hResource,
    OUT OPTIONAL LPWSTR *   ppwszNodeName,
    OUT OPTIONAL LPWSTR *   ppwszGroupName
    );

DWORD WINAPI WrapClusterResourceEnum(
    IN HRESENUM     hResEnum,
    IN DWORD        dwIndex,
    OUT LPDWORD     pdwType,
    OUT LPWSTR *    ppwszResourceName
    );

DWORD WINAPI WrapClusterResourceTypeEnum(
    IN HRESTYPEENUM hResEnum,
    IN DWORD        dwIndex,
    OUT LPDWORD     pdwType,
    OUT LPWSTR *    ppwszResTyoeName
    );

HRESULT HrWrapOnlineClusterResource(
    HCLUSTER    hCluster,
    HRESOURCE   hResource,
    DWORD       nWait = 0,
    long *      pbPending = NULL
    );

DWORD ScWrapOnlineClusterResource(
    IN  HCLUSTER    hCluster,
    IN  HRESOURCE   hResource,
    IN  DWORD       nWait = 0,
    OUT long *      pbPending = NULL
    );


HRESULT HrWrapOfflineClusterResource(
    HCLUSTER    hCluster,
    HRESOURCE   hResource,
    DWORD       nWait = 0,
    long *      pbPending = NULL
    );

DWORD ScWrapOfflineClusterResource(
    IN  HCLUSTER    hCluster,
    IN  HRESOURCE   hResource,
    IN  DWORD       nWait = 0,
    OUT long *      pbPending = NULL
    );


HRESULT HrWrapOnlineClusterGroup(
    IN  HCLUSTER    hCluster,
    IN  HGROUP      hGroup,
    IN  HNODE       hNode = NULL,
    IN  DWORD       nWait = 0,
    OUT long *      pbPending = NULL
    );

DWORD ScWrapOnlineClusterGroup(
    IN  HCLUSTER    hCluster,
    IN  HGROUP      hGroup,
    IN  HNODE       hNode = NULL,
    IN  DWORD       nWait = 0,
    OUT long *      pbPending = NULL
    );


HRESULT HrWrapOfflineClusterGroup(
    IN  HCLUSTER    hCluster,
    IN  HGROUP      hGroup,
    IN  DWORD       nWait = 0,
    OUT long *      pbPending = NULL
    );

DWORD ScWrapOfflineClusterGroup(
    IN  HCLUSTER    hCluster,
    IN  HGROUP      hGroup,
    IN  DWORD       nWait = 0,
    OUT long *      pbPending = NULL
    );


HRESULT HrWrapMoveClusterGroup(
    IN  HCLUSTER    hCluster,
    IN  HGROUP      hGroup,
    IN  HNODE       hNode = NULL,
    IN  DWORD       nWait = 0,
    OUT long *      pbPending = NULL
    );

DWORD ScWrapMoveClusterGroup(
    IN  HCLUSTER    hCluster,
    IN  HGROUP      hGroup,
    IN  HNODE       hNode = NULL,
    IN  DWORD       nWait = 0,
    OUT long *      pbPending = NULL
    );

////////////////////////////////////////////////////////////////////
// Custom helper functions/classes/etc.
////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
//++
//
//  class CClusterNotifyPort
//
//  Description:
//      This class is a wrapper for the cluster notify port
//
//  Inheritance:
//      CObjectProperty
//
//--
/////////////////////////////////////////////////////////////////////////////
class CClusterNotifyPort
{
public:
    CClusterNotifyPort();
    ~CClusterNotifyPort();

    DWORD Create(
            HCHANGE     hChange = (HCHANGE) INVALID_HANDLE_VALUE,
            HCLUSTER    hCluster = (HCLUSTER) INVALID_HANDLE_VALUE,
            DWORD       dwFilter = 0,
            DWORD_PTR   dwNotifyKey = 0
            );

    DWORD Close();

    DWORD Register( DWORD dwFilterType, HANDLE hObject, DWORD_PTR dwNotifyKey = 0 );

    DWORD GetNotify();

    DWORD_PTR   m_dwNotifyKey;
    DWORD       m_dwFilterType;
    WCHAR*      m_szName;
    DWORD       m_cchName;

protected:
    HCHANGE m_hChange;

}; //*** class CClusterNotifyPort

#endif __CLUSWRAP_H