Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

181 lines
5.7 KiB

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) Microsoft Corp. All rights reserved.
//
// FILE
//
// logfile.h
//
// SYNOPSIS
//
// Declares the class LogFile.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef LOGFILE_H
#define LOGFILE_H
#pragma once
#include "guard.h"
#include "iaspolcy.h"
#include "sdoias.h"
// Assumes ownership of a string pointer allocated with operator new[] and
// frees the string in its destructor.
class StringSentry
{
public:
explicit StringSentry(wchar_t* p = 0) throw ();
~StringSentry() throw ();
const wchar_t* Get() const throw ();
bool IsNull() const throw ();
operator const wchar_t*() const throw ();
operator wchar_t*() throw ();
void Swap(StringSentry& other) throw ();
StringSentry& operator=(wchar_t* p) throw ();
private:
wchar_t* sz;
// Not implemented.
StringSentry(const StringSentry&);
StringSentry& operator=(const StringSentry&);
};
// Maintains a generic logfile that is periodically rolled over either when a
// specified interval has elapsed or the logfile reaches a certain size.
class LogFile : private Guardable
{
public:
LogFile() throw ();
~LogFile() throw ();
// Various properties supported by the logfile.
void SetDeleteIfFull(bool newVal) throw ();
DWORD SetDirectory(const wchar_t* newVal) throw ();
void SetMaxSize(const ULONGLONG& newVal) throw ();
DWORD SetPeriod(NEW_LOG_FILE_FREQUENCY newVal) throw ();
// Write a record to the logfile.
bool Write(
IASPROTOCOL protocol,
const SYSTEMTIME& st,
const BYTE* buf,
DWORD buflen,
bool allowRetry = true
) throw ();
// Close the logfile.
void Close() throw ();
private:
// Checks the state of the current file handle and opens a new file if
// necessary.
void CheckFileHandle(
IASPROTOCOL protocol,
const SYSTEMTIME& st,
DWORD buflen
) throw ();
// Create a new file including the directory if necessary. The caller is
// responsible for closing the returned handle.
HANDLE CreateDirectoryAndFile() throw ();
// Delete the oldest file in the logfile directory. Returns true if
// successful.
bool DeleteOldestFile(IASPROTOCOL protocol, const SYSTEMTIME& st) throw ();
// Extends the file number to include the century if necessary.
unsigned int ExtendFileNumber(
const SYSTEMTIME& st,
unsigned int narrow
) const throw ();
// Finds the lowest or highest log file number.
DWORD FindFileNumber(
const SYSTEMTIME& st,
bool findLowest,
unsigned int& result
) const throw ();
// Returns the formatted logfile name. The caller is responsible for
// deleting the returned string.
wchar_t* FormatFileName(unsigned int number) const throw ();
// Returns the filter used to search for the file name.
const wchar_t* GetFileNameFilter() const throw ();
// Returns the format string used to create the file name.
const wchar_t* GetFileNameFormat() const throw ();
// Returns the numeric portion of the file name.
unsigned int GetFileNumber(const SYSTEMTIME& st) const throw ();
// Returns the 1-based week within the month for the given SYSTEMTIME.
DWORD GetWeekOfMonth(const SYSTEMTIME& st) const throw ();
// Tests the validity of a file number. len is the length in characters of
// the file name containing the number -- useful for width tests.
bool IsValidFileNumber(size_t len, unsigned int num) const throw ();
// Releases the current file (if any) and opens a new one.
void OpenFile(IASPROTOCOL protocol, const SYSTEMTIME& st) throw ();
// Scans the logfile directory to determine the next sequence number.
DWORD UpdateSequence() throw ();
// Functions that report the result of deleting an old log file to free up
// disk space.
void ReportOldFileDeleteError(
IASPROTOCOL protocol,
const wchar_t* oldfile,
DWORD error
) const throw ();
void ReportOldFileDeleted(
IASPROTOCOL protocol,
const wchar_t* oldfile
) const throw ();
void ReportOldFileNotFound(
IASPROTOCOL protocol
) const throw ();
// The logfile directory; does not have a trailing backslash.
StringSentry directory;
// true if old logfiles should be deleted if the disk is full.
bool deleteIfFull;
// The max size in bytes that the logfile will be allowed to reach.
ULARGE_INTEGER maxSize;
// The period at which new log files are opened.
NEW_LOG_FILE_FREQUENCY period;
// The current sequence number used for sized log files.
unsigned int seqNum;
// Handle to the log file; may be invalid.
HANDLE file;
// Current log file name; may be null.
StringSentry filename;
// Time at which we last opened or tried to open the logfile.
SYSTEMTIME whenOpened;
// Week at which we last opened or tried to open the logfile.
DWORD weekOpened;
// Current size of the log file in bytes. Zero if no file is open.
ULARGE_INTEGER currentSize;
// First day of the week for our locale.
DWORD firstDayOfWeek;
// Handle used for reporting IAS events.
HANDLE iasEventSource;
// Handle used for reporting RemoteAccess events.
HANDLE rasEventSource;
// Not implemented.
LogFile(const LogFile&);
LogFile& operator=(const LogFile&);
};
#endif // LOGFILE_H