|
|
// COMM MONITOR CODE
// 2/11/95 JosephJ Created
//
// The functions MonInit, MonDeInit, MonPut and MonDump may be used
// to timestamp and log all reads from/writes using the comm apis.
// MonDump creates two files, one a byte buffer, and the 2nd
// an array of MONREC structures, each structure containing a timestamp
// and an offset into the first file that points to the actual comm data.
// Following two macros to be called before each write attempt
// and after each non-zero read.
# define INMON(pTG, lpb, cb) \
(pTG->gMonInfo.fInited && MonPutComm(pTG, fMON_COMM_IN, lpb,cb)) # define OUTMON(pTG, lpb, cb) \
(pTG->gMonInfo.fInited && MonPutComm(pTG, fMON_COMM_OUT, lpb,cb)) # define PUTEVENT(pTG, wFlags, ID, SubID, dw0, dw1, lpsz)\
(pTG->gMonInfo.fInited && MonPutEvent(pTG, wFlags, ID, SubID, dw0, dw1, lpsz))
//File extensions for the mon-file
#define szMON_EXT "mon"
// Min and Max sizes of internal buffers allocated for monitoring.
// MonInit will enforce that the sizes fall within this range.
#define MIN_MRBUFSIZE (65536L>>2)
#define MIN_DATABUFSIZE 65536L
#define MAX_MRBUFSIZE 1000000L
#define MAX_DATABUFSIZE 1000000L
// Following structure records time of each call to read/write
// to comm. It also contains an offset into a circular buffer which
// contains all data writen to/read from comm port.
// wFlags is a word of information that was specified in the call to MonPut
// Currently it is a combination of the fMON_* flags above.
typedef struct { WORD wFlags; // One of fMON_* flags above. (A parameter to MonPut)
WORD wcb; // Number of bytes of variable-lenghth data
DWORD dwTickCount; // GetTickCount at time of MonPut call
DWORD dwOffset; // Offset into circular byte-buffer where data is.
} MONREC, FAR *LPMONREC;
#define MFR_COMMDATA 1
#define MFR_EVENT 2
// Following flags are specified in the wFlags param of MonPut. They
// are saved in the corresponding field of the MONREC structures.
#define fMON_COMM_RESERVED (0x1<<15) // Should never be used.
#define fMON_COMM_IN (0x1<<0) // Read operation
#define fMON_COMM_OUT (0x1<<1) // Write operation
#define fMON_COMM_CMDRESP (0x1<<3) // We believe modem is in command mode
#define fMON_COMM_DATA (0x1<<4) // We believe modem is in data mode
#define EVENT_ID_TXTMSG 1 // Generic text message.
#define EVENT_ID_MON 10 // Related to the monitoring processitself.
#define EVENT_ID_T30_BASE 100 // T30-protocol-stack related.
#define EVENT_ID_T30_CALLSTATE 100 // T30-protocol: call state related.
#define EVENT_ID_MODEM_BASE 200 // Modem-related
#define EVENT_ID_MODEM_STATE 200 // Initialize modem
#define EVENT_SubID_NULL 0 // Nothing.
#define EVENT_SubID_MON_DUMP 1 // Dump (write to file) of in-memory record
// TextID contains timestamp of start, as
// well as number of puts, and bytes written
// dwData0=dwData1=0
// SubID=0
#define EVENT_SubID_T30_CS_SEND_START 1 // Initiate T.30 Send
// Displayable phone number is embedded in
// TxtMessage.
// dwData0=dwData1=0;
#define EVENT_SubID_T30_CS_SEND_END 2 // End T.30 Send
// dwData0=result code
#define EVENT_SubID_T30_CS_RECV_START 11 // Initiate T.30 Recv
// dwData0=dwData1=0;
#define EVENT_SubID_T30_CS_RECV_END 12 // End T.30 Recv
// dwData0=result code
#define EVENT_SubID_MODEM_INIT_START 1 // About to issue commands to Init modem
#define EVENT_SubID_MODEM_INIT_END 2 // Done initing.
// dwData0=return code
#define EVENT_SubID_MODEM_DEINIT_START 11 // About to issue commands to deinit
#define EVENT_SubID_MODEM_DEINIT_END 12 // Done deiniting.
// dwData0=return code
#define EVENT_SubID_MODEM_SENDMODE_START 21 // About to issue commands to deinit
#define EVENT_SubID_MODEM_SENDMODE_END 22 // Done deiniting.
// dwData0=return code
#define EVENT_SubID_MODEM_RECVMODE_START 31 // About to issue commands to deinit
#define EVENT_SubID_MODEM_RECVMODE_END 32 // Done deiniting.
// dwData0=return code
#define EVENT_SubID_MODEM_DIAL_START 41 // About to issue commands to dial
// szTxtMsg contains dial string
// In retail, digits after first 4
// are zapped.
#define EVENT_SubID_MODEM_DIAL_END 42 // Done dialing
// dwData0=return code
#define EVENT_SubID_MODEM_ANSWER_START 51 // About to issue commands to answer
#define EVENT_SubID_MODEM_ANSWER_END 52 // Done with the answer command
// dwData0=return code
#define EVENT_SubID_MODEM_HANGUP_START 61 // About to issue commands to answer
#define EVENT_SubID_MODEM_HANGUP_END 62 // Done with the answer command
// dwData0=return code
#pragma pack(1)
typedef struct { WORD wTotalSize; WORD wHeaderSize; WORD wType; // One of the MFR_* defines
WORD wFlags; // type dependant
DWORD dwTickCount; // GetTickCount() at time of call to MonPut.
} MONFRAME_BASE, FAR *LPMONFRAME_BASE; #pragma pack()
// Following inserted in mon file to document data structure.
// Make sure it matches above structure.
#define szMONFRM_DESC001\
"struct{WORD wcbTot; WORD wcbHdr; WORD wTyp; WORD wFlg; DWORD dwTick}" // Update version when structure changes.
#define szMONFRM_VER001 "V.100"
#pragma pack(1)
typedef struct { WORD wTotalSize; WORD wHeaderSize; WORD wType; // One of the MFR_* defines
WORD wFlags; // One of the fMON_COMM_* values.
DWORD dwTickCount; // GetTickCount() at time of call to MonPut.
WORD wcb; // Count of bytes following.
BYTE rgb[]; // Actuall bytes of comm data.
} MONFRAME_COMM, FAR *LPMONFRAME_COMM; #pragma pack()
#define fEVENT_ERROR_MASK 0x111
#define fEVENT_ERROR_NONE 0x000
#define fEVENT_ERROR_FATAL 0x001
#define fEVENT_ERROR_SERIOUS 0x010
#define fEVENT_ERROR_MSGFAIL 0x011
#define fEVENT_ERROR_OTHER 0x100
#define fEVENT_ERROR_WARNING 0x101
#define fEVENT_TRACELEVEL_MASK 0x11000
#define fEVENT_TRACELEVEL_0 0x00000 // Vital: MUST display
#define fEVENT_TRACELEVEL_1 0x01000 // Important
#define fEVENT_TRACELEVEL_2 0x10000 // Less important
#define fEVENT_TRACELEVEL_3 0x11000 // Least important
#define MAX_TXTMSG_SIZE 128 // Max size of text msg in a MONFRAME_EVENT structure.
#pragma pack(1)
typedef struct { WORD wTotalSize; WORD wHeaderSize; WORD wType; // Should be MFR_EVENT
WORD wFlags; // One of the fEVENT_* flags.
DWORD dwTickCount; // GetTickCount() at time of call to MonPut.
WORD wID; // ID of event. One of the EVENT_ID_* defines
WORD wSubID; // Sub ID of event. One of the EVENT_SubID_* defines
DWORD dwInstanceID; // Instance ID of event within this file.
DWORD dwData0; // ID-specific data
DWORD dwData1; // ID-specific data
SYSTEMTIME st; // SystemTime at time of call to MonPut
WORD wTxtMsgOff;// Offset to null-terminated text message, if any
WORD wcbTxtMsg; // Size of null-terminated text message, if any
} MONFRAME_EVENT, FAR *LPMONFRAME_EVENT; #pragma pack()
// Monitor Options -- passed into MonInit
typedef struct {
// Buffer options
DWORD dwMRBufSize; // preferred size -- actual size may be different
DWORD dwDataBufSize; // preferred size -- actual size may be different
// File options
DWORD dwMaxExistingSize;// If the size of the existing file
// is > this, we will rename the existing file
// and create a new one.
char rgchDir[64]; // Directory where fax0.mon is to be created.
} MONOPTIONS, FAR * LPMONOPTIONS;
// Global monitor state
typedef struct {
SYSTEMTIME stStart; // Set by MonInit.
SYSTEMTIME stDump; // Set by MonDump.
BOOL fFreeOnExit; // TRUE iff buffers must be freed on exit.
BOOL fInited; // Set in MonInit. Cleared in MonDeInit.
DWORD dwNumPuts; // Number of calls to MonPut
DWORD dwNumBytes; // Cumulative number of bytes specified to MonPut
UINT uRefCount; // Incremented each time MonDump is called
// Used to new file for each MonDump
// Cleared in MonInit and MonDeInit
DWORD dwEventInstanceID; // ID which is supposed to uniquely identify
// each event within a file.
LPMONREC lpmrBuf; // Pointer to MONREC circular buffer
DWORD dwcmrBuf; // Size (in units of MONREC) if circular buffer
LPMONREC lpmrNext; // Pointer to next available MR
LPBYTE lpbBuf; // Pointer to circular byte buffer.
DWORD dwcbBuf; // Size (in bytes) of above buffer.
LPBYTE lpbNext; // Pointer to next place to write bytes in this buf.
MONOPTIONS mo; // Passed in to MonInit();
} MONINFO;
|