/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _INC_CLFS
#define _INC_CLFS
#if (_WIN32_WINNT >= 0x0600)
#ifdef __cplusplus
extern "C" {
#endif

typedef enum  {
  ClfsContextNone       = 0x00,
  ClfsContextUndoNext,
  ClfsContextPrevious,
  ClfsContextForward 
} CLFS_CONTEXT_MODE, *PCLFS_CONTEXT_MODE, **PPCLFS_CONTEXT_MODE;

typedef enum _CLFS_IOSTATS_CLASS {
  ClfsIoStatsDefault   = 0x0000,
  ClfsIoStatsMax       = 0xFFFF 
} CLFS_IOSTATS_CLASS, *PCLFS_IOSTATS_CLASS, **PPCLFS_IOSTATS_CLASS;

typedef enum _CLFS_LOG_ARCHIVE_MODE {
  ClfsLogArchiveEnabled    = 0x01,
  ClfsLogArchiveDisabled   = 0x02 
} CLFS_LOG_ARCHIVE_MODE, *PCLFS_LOG_ARCHIVE_MODE;

typedef enum _CLFS_RECORD_TYPE {
  ClfsDataRecord = 0x01,
  ClfsRestartRecord = 0x02,
  ClfsClientRecord = 0x3F 
} CLFS_RECORD_TYPE, *PCLFS_RECORD_TYPE;

typedef union _CLFS_LSN {
  ULONGLONG Internal;
} CLFS_LSN, *PCLFS_LSN;

/*http://msdn.microsoft.com/en-us/library/bb540355%28VS.85%29.aspx*/
typedef enum _CLFS_SCAN_MODE {
  CLFS_SCAN_INIT = 0x01,
  CLFS_SCAN_FORWARD = 0x02,
  CLFS_SCAN_BACKWARD = 0x04,
  CLFS_SCAN_CLOSE = 0x08,
  CLFS_SCAN_INITIALIZED = 0x10,
  CLFS_SCAN_BUFFERED = 0x20
} CLFS_SCAN_MODE;

/* enum guessed from http://msdn.microsoft.com/en-us/library/bb540336%28VS.85%29.aspx */
typedef enum _CLFS_CONTAINER_STATE {
  ClfsContainerInitializing = 0x01,
  ClfsContainerInactive = 0x02,
  ClfsContainerActive = 0x04,
  ClfsContainerActivePendingDelete = 0x08,
  ClfsContainerPendingArchive = 0x10,
  ClfsContainerPendingArchiveAndDelete = 0x20
} CLFS_CONTAINER_STATE;

typedef DWORD CLFS_CONTAINER_ID;

/* Goes in wdm.h */
typedef struct _CLFS_CONTAINER_INFORMATION {
  ULONG                FileAttributes;
  ULONGLONG            CreationTime;
  ULONGLONG            LastAccessTime;
  ULONGLONG            LastWriteTime;
  LONGLONG             ContainerSize;
  ULONG                FileNameActualLength;
  ULONG                FileNameLength;
  WCHAR                FileName[MAX_PATH];
  CLFS_CONTAINER_STATE State;
  CLFS_CONTAINER_ID    PhysicalContainerId;
  CLFS_CONTAINER_ID    LogicalContainerId;
} CLFS_CONTAINER_INFORMATION, *PCLFS_CONTAINER_INFORMATION, **PPCLFS_CONTAINER_INFORMATION;
/**/

typedef struct _CLFS_IO_STATISTICS_HEADER {
  UCHAR              ubMajorVersion;
  UCHAR              ubMinorVersion;
  CLFS_IOSTATS_CLASS eStatsClass;
  USHORT             cbLength;
  ULONG              coffData;
} CLFS_IO_STATISTICS_HEADER, *PCLFS_IO_STATISTICS_HEADER, **PPCLFS_IO_STATISTICS_HEADER;

typedef struct _CLFS_ARCHIVE_DESCRIPTOR {
  ULONGLONG                  coffLow;
  ULONGLONG                  coffHigh;
  CLFS_CONTAINER_INFORMATION infoContainer;
} CLFS_ARCHIVE_DESCRIPTOR, *PCLFS_ARCHIVE_DESCRIPTOR, **PPCLFS_ARCHIVE_DESCRIPTOR;

typedef struct _CLFS_INFORMATION {
  LONGLONG  TotalAvailable;
  LONGLONG  CurrentAvailable;
  LONGLONG  TotalReservation;
  ULONGLONG BaseFileSize;
  ULONGLONG ContainerSize;
  ULONG     TotalContainers;
  ULONG     FreeContainers;
  ULONG     TotalClients;
  ULONG     Attributes;
  ULONG     FlushThreshold;
  ULONG     SectorSize;
  CLFS_LSN  MinArchiveTailLsn;
  CLFS_LSN  BaseLsn;
  CLFS_LSN  LastFlushedLsn;
  CLFS_LSN  LastLsn;
  CLFS_LSN  RestartLsn;
  GUID      Identity;
} CLFS_INFORMATION, *PCLFS_INFORMATION, **PPCLFS_INFORMATION;

typedef struct _CLFS_IO_STATISTICS {
  CLFS_IO_STATISTICS_HEADER hdrIoStats;
  ULONGLONG                 cFlush;
  ULONGLONG                 cbFlush;
  ULONGLONG                 cMetaFlush;
  ULONGLONG                 cbMetaFlush;
} CLFS_IO_STATISTICS, *PCLFS_IO_STATISTICS, **PPCLFS_IO_STATISTICS;

typedef struct _CLFS_NODE_ID {
  ULONG cType;
  ULONG cbNode;
} CLFS_NODE_ID, *PCLFS_NODE_ID;

typedef struct _CLFS_SCAN_CONTEXT {
  CLFS_NODE_ID                cidNode;
  HANDLE                      hLog;
  ULONG                       cIndex;
  ULONG                       cContainers;
  ULONG                       cContainersReturned;
  CLFS_SCAN_MODE              eScanMode;
  PCLFS_CONTAINER_INFORMATION pinfoContainer;
} CLFS_SCAN_CONTEXT, *PCLFS_SCAN_CONTEXT;

typedef struct _CLFS_WRITE_ENTRY {
  PVOID Buffer;
  ULONG ByteLength;
} CLFS_WRITE_ENTRY, *PCLFS_WRITE_ENTRY;

WINBOOL WINAPI LsnEqual(
  const CLFS_LSN *plsn1,
  const CLFS_LSN *plsn2
);

WINBOOL WINAPI LsnGreater(
  const CLFS_LSN *plsn1,
  const CLFS_LSN *plsn2
);

WINBOOL WINAPI LsnLess(
  const CLFS_LSN *plsn1,
  const CLFS_LSN *plsn2
);

WINBOOL WINAPI LsnNull(
  const CLFS_LSN *plsn
);

#ifdef __cplusplus
}
#endif
#endif /*(_WIN32_WINNT >= 0x0600)*/
#endif /*_INC_CLFS*/