windows-nt/Source/XPSP1/NT/windows/richedit/re41/_rtflog.h
2020-09-26 16:20:57 +08:00

227 lines
4.8 KiB
C++

/*
* @doc INTERNAL
*
* @module _RTFLOG.H -- RichEdit RTF Log Class Definition |
*
* This file contains the class declarations for an RTF log class
* which can be used to track the hit counts of RTF tags encountered
* by the RTF reader
*
* Authors:<nl>
* Created for RichEdit 2.0: Brad Olenick
*
* Copyright (c) 1995-1996, Microsoft Corporation. All rights reserved.
*/
#ifndef __RTFLOG_H
#define __RTFLOG_H
#include "tokens.h"
extern INT cKeywords;
class CRTFLog
{
public:
typedef size_t INDEX;
typedef INDEX *PINDEX;
typedef DWORD ELEMENT;
typedef ELEMENT *PELEMENT;
CRTFLog(); //@cmember CRTFLog constructor
inline ~CRTFLog(); //@cmember CRTFLog destructor
BOOL FInit() const
{ return _rgdwHits ? TRUE : FALSE; } //@cmember Determines whether object is init'd
INDEX ISize() const
{ return cKeywords; } //@cmember Number of elements in log
inline BOOL AddAt(INDEX i); //@cmember Increment hit count for element at index i
inline BOOL AddAt(LPCSTR lpcstrKeyword); //@cmember Increment hit count for RTF keyword
inline BOOL AddAt(TOKEN token); //@cmember Increment hit count for RTF token
inline ELEMENT GetAt(INDEX i) const
{ return (*this)[i]; } //@cmember Get hit count for element i
inline BOOL GetAt(LPCSTR lpcstrKeyword, PELEMENT pelemCount) const; //@cmember Get hit count for RTF keyword
inline BOOL GetAt(TOKEN token, PELEMENT pelemCount) const; //@cmember Get hit count for RTF token
void Reset(); //@cmember Reset all hit count values to 0
UINT UGetWindowMsg() const; //@cmember Get window msg ID used for log change notifications
private:
// we manage all updates through AddAt to
// facilitate change notifications
ELEMENT &operator[](INDEX); //@cmember Access element i for l-value
const ELEMENT &operator[](INDEX) const; //@cmember Access element i for r-value
LPCSTR LpcstrLogFilename() const; //@cmember Get name of log filename
BOOL IIndexOfKeyword(LPCSTR lpcstrKeyword, PINDEX pi) const; //@cmember Get log index for keyword
BOOL IIndexOfToken(TOKEN token, PINDEX pi) const; //@cmember Get log index for token
void ChangeNotify(INDEX i) const
{
PostMessage(HWND_BROADCAST, UGetWindowMsg(), i, 0);
} //@cmember Notify clients of change to element i
void ChangeNotifyAll() const
{ ChangeNotify(ISize() + 1); } //@cmember Notify clients of log refresh
HANDLE _hfm; //@cmember Handle to file mapping
HANDLE _hfile; //@cmember Handle to file behind file mapping
PELEMENT _rgdwHits; //@cmember Handle to view of file mapping
UINT _uMsg; //@cmember Window msg ID for change notifications
};
/*
* CRTFLog::~CRTFLog
*
* @mfunc
* Destructor - cleans up memory-mapped file and underlying resources
*
*/
inline CRTFLog::~CRTFLog()
{
if(_rgdwHits)
{
UnmapViewOfFile(_rgdwHits);
}
if(_hfm)
{
CloseHandle(_hfm);
}
if(_hfile)
{
CloseHandle(_hfile);
}
}
/*
* CRTFLog::AddAt(INDEX i)
*
* @mfunc
* Increments the hit count for log element, i, and
* notifies clients of the change
*
* @rdesc
* BOOL whether the increment was successful
*/
inline BOOL CRTFLog::AddAt(INDEX i)
{
(*this)[i]++;
// change notification
ChangeNotify(i);
return TRUE;
}
/*
* CRTFLog::AddAt(LPCSTR lpcstrKeyword)
*
* @mfunc
* Increments the hit count for log element corresponding
* to the RTF keyword, lpcstrKeyword, and
* notifies clients of the change
*
* @rdesc
* BOOL whether the increment was successful
*/
inline BOOL CRTFLog::AddAt(LPCSTR lpcstrKeyword)
{
INDEX i;
if(!IIndexOfKeyword(lpcstrKeyword, &i))
{
return FALSE;
}
return AddAt(i);
}
/*
* CRTFLog::AddAt(TOKEN token)
*
* @mfunc
* Increments the hit count for log element corresponding
* to the RTF token, token, and
* notifies clients of the change
*
* @rdesc
* BOOL whether the increment was successful
*/
inline BOOL CRTFLog::AddAt(TOKEN token)
{
INDEX i;
if(!IIndexOfToken(token, &i))
{
return FALSE;
}
return AddAt((INDEX)i);
}
/*
* CRTFLog::GetAt(LPCSTR lpcstKeyword, PELEMENT pelemCount)
*
* @mfunc
* Gets the hit count for log element corresponding to the
* RTF keyword, lpcstrKeywor
*
* @rdesc
* BOOL indicates whether a hit count was found for the element
*/
inline BOOL CRTFLog::GetAt(LPCSTR lpcstrKeyword, PELEMENT pelemCount) const
{
INDEX i;
if(!IIndexOfKeyword(lpcstrKeyword, &i))
{
return FALSE;
}
if(pelemCount)
{
*pelemCount = (*this)[i];
}
return TRUE;
}
/*
* CRTFLog::GetAt(LPCSTR lpcstKeyword, PELEMENT pelemCount)
*
* @mfunc
* Gets the hit count for log element corresponding to the
* RTF token, token
*
* @rdesc
* BOOL indicates whether a hit count was found for the element
*/
inline BOOL CRTFLog::GetAt(TOKEN token, PELEMENT pelemCount) const
{
INDEX i;
if(!IIndexOfToken(token, &i))
{
return FALSE;
}
if(pelemCount)
{
*pelemCount = (*this)[i];
}
return TRUE;
}
#endif