#if !defined CONVLOG_H
#define CONVLOG_H

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <io.h>
#include <winsock2.h>
#include <strings.h>
#include <mbstring.h>           // Bug # 101690
#include <locale.h>

#define CONVLOG_BASE            (120)
#define NUM_SERVICES            (4)

#define DAILY                   (CONVLOG_BASE + 0)
#define MONTHLY                 (CONVLOG_BASE + 1)
#define ONE_BIG_FILE            (CONVLOG_BASE + 2)

#define NCSA                    (CONVLOG_BASE + 3)
#define NOFORMAT                (CONVLOG_BASE + 4)

#define ILLEGAL_COMMAND_LINE    (CONVLOG_BASE + 5)
#define COMMAND_LINE_OK         (CONVLOG_BASE + 6)
#define OUT_DIR_NOT_OK          (CONVLOG_BASE + 7)
#define ERROR_BAD_NONE          (CONVLOG_BASE + 8)


#define MAXWINSOCKVERSION       2

#define MAXASCIIIPLEN           16

#define ISWHITE( ch )       ((ch) == ' ' || (ch) == '\t' || (ch) == '\r' || (ch) == '\n')

#define MAXMACHINELEN   260

#define GREATEROF(p1,p2)      ((p1)>(p2)) ? (p1) : (p2)


typedef enum _DATEFORMATS {
    DateFormatUsa = 0,          // MM/DD/YY
    DateFormatJapan = 1,        // YY/MM/DD
    DateFormatGermany = 2,      // MM.DD.YY
    DateFormatMax

} DATEFORMAT;

typedef struct _HASHENTRY {
   ULONG uIPAddr;
   ULONG NextPtr;
   char     szMachineName[MAXMACHINELEN];
}  HASHENTRY, *PHASHENTRY;


typedef struct  _INLOGLINE
{
        DWORD   dwFieldMask;
        LPSTR   szClientIP;            //client ip address
        LPSTR   szUserName;            //client user name (not put in https log)
        LPSTR   szDate;                //date string in format DD/MM/YY
        LPSTR   szTime;                //time string in format HH:MM:SS 24 hour format
        LPSTR   szService;             //Service name (not put in https log)
        LPSTR   szServerName;          //netbios name of Server
        LPSTR   szServerIP;            //Server ip address
        LPSTR   szProcTime;            //time taken to process request (not put in https log)
        LPSTR   szBytesRec;            //number of bytes received (not put in https log)
        LPSTR   szBytesSent;           //number of bytes sent (not put in https log)
        LPSTR   szServiceStatus;       //HTTP status code (not put in https log)
        LPSTR   szWin32Status;         //win32 status code (not put in https log)
        LPSTR   szOperation;           //one of GET, POST, or HEAD
        LPSTR   szTargetURL;           //URL as requested by the client
        LPSTR   szUserAgent;           //only logged (by W3SVC) if NewLog.dll installed
        LPSTR   szReferer;             //only logged (by W3SVC) if NewLog.dll installed
        LPSTR   szParameters;          //any parameters passed with the URL
        LPSTR   szVersion;             //protocol version
} *LPINLOGLINE, INLOGLINE;


typedef struct  _DOSDATE
{
        WORD    wDOSDate;                       //holds the DOS Date packed word
        WORD    wDOSTime;                       //holds teh DOS Time packed word
} *LPDOSDATE, DOSDATE;

typedef struct _OUTFILESTATUS {
        FILE            *fpOutFile;
        CHAR            szLastDate[10];
        CHAR            szLastTime[10];
        CHAR            szOutFileName[MAX_PATH];
        CHAR            szTmpFileName[MAX_PATH];
        SYSTEMTIME      SystemTime;
        FILETIME        FileTime;
        DOSDATE         DosDate;
        CHAR            szAscTime[25];

} OUTFILESTATUS, *LPOUTFILESTATUS;

enum {
  GETLOG_SUCCESS = 0,
  GETLOG_ERROR,
  GETLOG_ERROR_PARSE_NCSA,
  GETLOG_ERROR_PARSE_MSINET,
  GETLOG_ERROR_PARSE_EXTENDED
};

char    * FindComma (char *);
char    * SkipWhite (char *);

DWORD
GetLogLine (
    FILE *,
    PCHAR szBuf,
    DWORD cbBuf,
    LPINLOGLINE
    );

WORD    DateStringToDOSDate(char *);
WORD    TimeStringToDOSTime(char *, LPWORD);
char    * SystemTimeToAscTime(LPSYSTEMTIME, char *);
char    * AscDay (WORD, char *);
char    * AscMonth (WORD, char *);

void    CombineFiles(LPTSTR, LPTSTR);
void    Usage (char*);
int     ParseArgs (int, char **);
char * FindChar (char *, char);

VOID
ProcessNoConvertLine(
    IN LPINLOGLINE lpLogLine,
    IN LPCSTR szInFileName,
    IN LPTSTR pszBuf,
    IN LPOUTFILESTATUS lpOutFile,
    BOOL *lpbNCFileOpen
    );

BOOL
ProcessWebLine(
        LPINLOGLINE,
        LPCSTR,
        LPOUTFILESTATUS
        );

VOID
printfids(
    DWORD ids,
    ...
    );

VOID InitHashTable (ULONG);
ULONG GetHashEntry();
ULONG GetElementFromCache(ULONG uIPAddr);
VOID AddEntryToCache(ULONG uIPAddr, char *szMachineName);
char *GetMachineName(char *szClientIP);
VOID PrintCacheTotals();

BOOL
InitDateStrings(
    VOID
    );

VOID
AddLocalMachineToCache(
    VOID
    );

FILE *
StartNewOutputDumpLog (
        IN LPOUTFILESTATUS  pOutFile,
        IN LPCSTR   pszInputFileName,
        IN LPCSTR   pszExt
        );

FILE *
StartNewOutputLog (
        IN LPOUTFILESTATUS  pOutFile,
        IN LPCSTR           pszInputFileName,
        IN PCHAR szDate
        );

//
// defines
//

#define LOGFILE_INVALID      0
#define LOGFILE_NCSA         2
#define LOGFILE_MSINET       3
#define LOGFILE_CUSTOM       4

#define NEW_DATETIME        "New"

//
// Globals
//

extern BOOL                 DoDNSConversion;
extern BOOL                 SaveFTPEntries;
extern CHAR                 FTPSaveFile[];
extern CHAR                 NCSAGMTOffset[];
extern DWORD                LogFileFormat;
extern CHAR                 InputFileName[];
extern CHAR                 OutputDir[];
extern CHAR                 TempDir[];
extern DWORD                nWebLineCount;
extern BOOL                 NoFormatConversion;
extern BOOL                ExtendedFieldsDefined;
extern CHAR                 szGlobalDate[];
extern DATEFORMAT           dwDateFormat;
extern BOOL                 bOnErrorContinue;

#endif //CONVLOG_H