|
Main Page
Class Hierarchy
Alphabetical List
Compound List
File List
Compound Members
|
00001 /********************************************************************************
00002 * *
00003 * Binary log file reader *
00004 * *
00005 *********************************************************************************
00006 * Copyright (C) 2003 by Mathew Robertson. All Rights Reserved. *
00007 *********************************************************************************
00008 * This library is free software; you can redistribute it and/or *
00009 * modify it under the terms of the GNU Lesser General Public *
00010 * License as published by the Free Software Foundation; either *
00011 * version 2.1 of the License, or (at your option) any later version. *
00012 * *
00013 * This library is distributed in the hope that it will be useful, *
00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
00016 * Lesser General Public License for more details. *
00017 * *
00018 * You should have received a copy of the GNU Lesser General Public *
00019 * License along with this library; if not, write to the Free Software *
00020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
00021 *********************************************************************************/
00022 #ifndef FXBINARYLOGREADER_H
00023 #define FXBINARYLOGREADER_H
00024
00025 namespace FXEX {
00026
00027 /// Container data structure for a log entry
00028 struct FXBinaryLogData {
00029 FXbool subsecond; // does the log contain valid subsecond resolution
00030 FXTime seconds; // current time, seconds resolution
00031 FXint microseconds; // current time, microseconds resolution
00032 FXshort code; // status code of log entry
00033 FXshort value; // status value of log entry
00034 };
00035
00036 /// Binary Log Reader options
00037 enum {
00038 BINARYLOGREADER_TRUNCATE=0x02 // Truncate the file on opening ? FIXME...
00039 };
00040
00041 /**
00042 * A binary log file allows applications to log entries to a file, faster and more compact
00043 * than a normal log file.
00044 *
00045 * How this differs from a normal log file is that, up to 1000% of the speed of a log file
00046 * is consumed in the printf style parsing of the input string. By using numbers only,
00047 * no parsing is necessary. As an added bonus, you dont log many bytes per log entry so
00048 * the disk I/O time is reduced.
00049 *
00050 * The upshot is that a binary logger can run many times quicker than a text file logger,
00051 * and that the storage of that information is more compact. The downside is that you need
00052 * a custom program to read the file (see FXBinaryLogReader).
00053 *
00054 * File format:
00055 * - file header (2 bytes)
00056 * - 1 byte version code
00057 * - 1 byte options value
00058 * - written per log entry (8-12 bytes)
00059 * - 32bit date stamp
00060 * - 1 second resolution
00061 * - 32bit subsecond date stamp
00062 * - microsecond resolution
00063 * - optional
00064 * - 32bit log entry
00065 * - upper 16bits are used for indicating error severity
00066 * - lower 16bits are used for indicating enumerated value
00067 *
00068 * Notes:
00069 * 1. The log file stores the endian-ness of the CPU architecture so that the log file
00070 * can later be read back on any type of CPU.
00071 * 2. Log entries are automatically written on file open/close (as debug entries)
00072 *
00073 * It is envisaged that you could use this logger in an embedded application. You would
00074 * log the values you need, when you identify a condition that needs to be logged. You
00075 * should create a specific enumerated value, for all possible log cases.
00076 */
00077 class FXAPI FXBinaryLogReader {
00078 private:
00079 FXFileIO *fileio; // file IO object
00080 FXBinaryLogData logentry; // holding variable for a log entry
00081 FXuchar options;
00082
00083 protected:
00084 /// opens the log file for writing
00085 FXbool open();
00086
00087 /// closes the log file
00088 void close();
00089
00090 public:
00091 /// Give me a log file
00092 FXBinaryLogReader(const FXString& file="",FXuint opts=0);
00093
00094 /// Change the location of the log file - change is immediate
00095 FXbool name(const FXString& file);
00096
00097 /// get the current filename
00098 FXString name();
00099
00100 /// indicates whether the log file can/will be read from
00101 FXbool opened();
00102
00103 /// read log entries from the file
00104 FXBinaryLogData* read();
00105
00106 /// Save to stream
00107 friend FXAPI FXStream& operator<<(FXStream& store,const FXBinaryLogReader& b);
00108
00109 /// load from stream
00110 friend FXAPI FXStream& operator>>(FXStream& store,FXBinaryLogReader& b);
00111
00112 /// done
00113 virtual ~FXBinaryLogReader();
00114 };
00115
00116 } // namespace FXEX
00117 #endif // FXBINARYLOGREADER_H