Click here to Skip to main content
15,894,646 members
Articles / Desktop Programming / MFC

A real time log file viewer

Rate me:
Please Sign up or sign in to vote.
4.81/5 (19 votes)
17 May 20042 min read 172.7K   4.5K   58  
A real time log file viewer.
/* Written By and � 2004 Amleth Ojalen (amleth@amleth.com)

Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met:


1. Redistributions of source code must retain the above copyright notice, this list 
of conditions and the following disclaimer. 

2. Redistributions in binary form must reproduce the above copyright notice, this list 
of conditions and the following disclaimer in the documentation and/or other 
materials provided with the distribution. 

3. The name of the author may not be used to endorse or promote products derived 
from this software without specific prior written permission. 

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/



#pragma once
#define		_MAX_SECTIONS		0x20
class CABLogBuffer
{
public:
	CABLogBuffer(void);
	~CABLogBuffer(void);

	long GetDataSize() { return m_lDataLength;};

	typedef struct ABLogSect
	{
		int			m_iFadeStep;			// the current fade step
		long		m_lSectionOffset;		// the starting offset in m_pDataBuffer
		long		m_lSectionLength;		// the length of the section in bytes
	} S_ABLogSect;
	
	typedef struct ABLogLine
	{
		long		m_lLineLength;			// the Length of the line in bytes
		BYTE *		m_pLinePointer;			// a pointer to the first character
		long		m_lLineOffset;			// the starting offset from m_pDataBuffer;
		DWORD		m_dFlags;				// Flags for the line.
		long		m_lLineIndex;			// the index of the line in the array;
	} S_ABLogLine;


	bool			AddData(BYTE * pData, long lData);
	long			GetLineCount() { return m_lLineCount;};
	S_ABLogLine	*	GetLine(long lLine) { return &m_pLineBuffer[lLine];};

	bool			SetSelection(long lSelectionStart, long lSelectionLength);
	bool			GetSelection(long *lSelectionStart, long *lSelectionLength);
	bool			AddLineFlag(int iLine, DWORD dFlag);
	bool			HitTest(long lLine, long lOffset, bool * pbSelection, int * iFadeStep);
	bool			FadeSections();
	long			FindText(CString strFind, DWORD dFlags, long *pChar);
	long			GetMaxLineSize() {return m_lLineBiggest;};
	ABLogLine *		GetLineFromOffset(long lOffset);
	bool			RemoveLineFlags(DWORD dFlag);
	long			GetLineFlagCount(DWORD dFlag);
	bool			SetSectionFadeStep(long lSection, int iStep);
	bool			LineToggleFlag(long lLine, DWORD dFlag);
	DWORD			m_dNewColor;
private:
	// Data Buffer
	long			m_lDataLength;		// The Amount of data stored in Buffer
	long			m_lDataSize;		// Buffer Allocated Size
	BYTE *			m_pDataBuffer;		// Data Buffer

	// Line Buffer
	long			m_lLineLength;		// The Amount of data stored in the buffer
	long			m_lLineSize;		// Line Allocated Size
	S_ABLogLine*	m_pLineBuffer;		// Line Buffer
	long			m_lLineCount;		// The number of Lines in the Buffer
	long			m_lLineBiggest;		// The Biggest line

	long			m_lSelectionStart;	// the starting offset in m_pDataBuffer;
	long			m_lSelectionLength;	// the length of the selection in bytes

	S_ABLogSect *	m_LineSections[_MAX_SECTIONS];
	long			m_lSectionCount;	// the number of sections;

	BYTE *			m_LineDelim;
	int				m_iLineDelimLength;

	bool			CheckByte(BYTE pByte);
	bool			FindDelim(BYTE * pData, long lLength);
	BYTE *			DelimSearch(BYTE * pData, long lLength);
	bool			CheckDataBufferSize(long lMinSize);		// Will Grow m_pDatabuffer if required
	bool			CheckLineBufferSize(long lMinSize);		// Will Grow m_pLineBuffer if required
	bool			ProcessBuffer(BYTE * pData, long lStartOffset, long lEndOffset); // will create lines baised on pData
	S_ABLogLine *	AddLine(BYTE * pLineStart, long lLineEnd);
	bool			AddSection(long lStart, long lLength);

};

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer (Senior)
Australia Australia
Started programming many many years ago, now a full time C++ developer writing medical software. I have also been known to dabble in electronics. Currently looking to go back to university to study electronic engineering.

Comments and Discussions