/*++

Copyright (c) Microsoft Corporation

Module Name:

    FxFileObjectCallbacks.h

Abstract:

    This module implements the I/O package queue object callbacks

Author:




Environment:

    Both kernel and user mode

Revision History:

--*/

#ifndef _FXFILEOBJECTCALLBACKS_H
#define _FXFILEOBJECTCALLBACKS_H


//
// EvtDeviceFileCreate callback delegate
//
class FxFileObjectFileCreate : public FxLockedCallback {

public:
    PFN_WDF_DEVICE_FILE_CREATE Method;

    FxFileObjectFileCreate(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    VOID
    Invoke(
        __in WDFDEVICE Device,
        __in WDFREQUEST Request,
        __in_opt WDFFILEOBJECT FileObject
        )
    {

        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(Device, Request, FileObject);
            CallbackEnd(irql);
        }
    }
};

//
// EvtFileCleanup callback delegate
//
class FxFileObjectFileCleanup : public FxLockedCallback {

public:
    PFN_WDF_FILE_CLEANUP Method;

    FxFileObjectFileCleanup(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in_opt WDFFILEOBJECT FileObject
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(FileObject);
            CallbackEnd(irql);
        }
    }
};

//
// EvtFileClose callback delegate
//
class FxFileObjectFileClose : public FxLockedCallback {

public:
    PFN_WDF_FILE_CLOSE Method;

    FxFileObjectFileClose(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    void
    Invoke(
        __in_opt WDFFILEOBJECT FileObject
        )
    {
        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            Method(FileObject);
            CallbackEnd(irql);
        }
    }
};

//
// EvtDeviceFileCreate callback delegate
//
class FxCxFileObjectFileCreate : public FxLockedCallback {

public:
    PFN_WDFCX_DEVICE_FILE_CREATE Method;

    FxCxFileObjectFileCreate(
        VOID
        ) :
        FxLockedCallback()
    {
        Method = NULL;
    }

    BOOLEAN
    Invoke(
        __in WDFDEVICE Device,
        __in WDFREQUEST Request,
        __in_opt WDFFILEOBJECT FileObject
        )
    {
        BOOLEAN claimed = FALSE;

        if (Method != NULL) {
            KIRQL irql = 0;

            CallbackStart(&irql);
            claimed = Method(Device, Request, FileObject);
            CallbackEnd(irql);
        }

        return claimed;
    }
};

//
// Collection of file-object callbacks.
//
struct FxFileObjectInfo : public FxStump {

    FxFileObjectInfo() :
        FileObjectClass(WdfFileObjectInvalid),
        AutoForwardCleanupClose(WdfUseDefault),
        ClassExtension(FALSE),
        CxDeviceInfo(NULL)
    {
        InitializeListHead(&ListEntry);
        RtlZeroMemory(&Attributes, sizeof(Attributes));
    }

    ~FxFileObjectInfo()
    {
        ASSERT(IsListEmpty(&ListEntry));
    }

    LIST_ENTRY                      ListEntry;

    FxFileObjectFileCreate          EvtFileCreate;
    FxCxFileObjectFileCreate        EvtCxFileCreate;
    FxFileObjectFileCleanup         EvtFileCleanup;
    FxFileObjectFileClose           EvtFileClose;

    WDF_FILEOBJECT_CLASS            FileObjectClass;
    WDF_OBJECT_ATTRIBUTES           Attributes;
    WDF_TRI_STATE                   AutoForwardCleanupClose;

    BOOLEAN                         ClassExtension;

    FxCxDeviceInfo*                 CxDeviceInfo;
};

#endif // _FXFILEOBJECTCALLBACKS_H