#ifndef _BROWTEST
#define _BROWTEST

#ifndef UNICODE
#define UNICODE
#endif

#include "browfunc.h"

#define  BROWTESTINFILE        "browtest.inp"
#define  BROWTESTLOGFILE       "browtest.log"
#define  BROWTESTSUMMARYFILE   "browtest.sum"
#define  MAXCHARPERLINE        256
#define  MAXTRANSPORTS         16

#define  COMMENTCHAR           ';'
#define  NEWLINECHAR           '\n'
#define  QUOTECHAR             '"'
#define  SPACECHAR             ' '

#define  COMMASTR              ","
#define  NEWLINESTR            "\n"
#define  QUOTESTR              "\""
#define  SPACETABSTR           " \t"

#define  SUBNET1               1
#define  SUBNET2               2

#define  BROWSER               TEXT("BROWSER")
#define  NETLOGON              TEXT("NETLOGON")
#define  WORKSTATION           TEXT("LanmanWorkstation")

#define  CNSLASHLEN            CNLEN+2               // ComputerName with "\\"

#define  BASESLEEPTIME         (40*1000)             // 40 sec's
#define  UPDATESLEEPTIME       (15*60*1000)          // 15 minutes

#define  TOSCREEN              0x1UL
#define  TOLOGFILE             0x2UL
#define  TOSUMMARYFILE         0x4UL

#define  TOSCREENANDLOG        (TOSCREEN  | TOLOGFILE)
#define  TOLOGANDSUMMARY       (TOLOGFILE | TOSUMMARYFILE)
#define  TOALL                 (TOSCREEN | TOLOGFILE | TOSUMMARYFILE)


#define  MAXPROTOCOLS          5
#define  MAXOSTYPES            8
#define  MAXTESTEDDOMAINS      5

typedef struct  _OSProp{
     CHAR   *Type;
     INT    iPreference;
   }OSPROP;


typedef struct _MACHINEINFO{
   TCHAR   wcDomainName[DNLEN+1];
   TCHAR   wcMachineName[CNLEN+1];
   INT     iOsType;
   INT     iOsPreference;
   DWORD   dwServerBits;
   INT     iSubnet;
   INT     Protocols[MAXPROTOCOLS];
   BOOL    BrowserServiceStarted;
   struct _MACHINEINFO *Next;
   }MACHINEINFO, *LPMACHINEINFO;

//
// Heads of the lists for the 2 subnets
//

typedef struct _XportInfo{
    UNICODE_STRING  Transport;
    INT             index;
    }XPORTINFO;



typedef struct _DOMAININFO{
   TCHAR          wcDomainName[DNLEN+1];
   LPMACHINEINFO  lpMInfo;
  }DOMAININFO, *LPDOMAININFO;



#define VALUETYPE_INTEGER   1
#define VALUETYPE_ULONG     2
#define VALUETYPE_STRING    3
#define VALUETYPE_IGNORE    4
#define VALUETYPE_HELP      5
#define VALUETYPE_BOOL      6

typedef struct _COMMANDTABLE {
    CHAR Command[10];
    INT  ValueType  ;
    VOID *Value     ;
} COMMAND_TABLE;


#define  SHUTSVCPATH   TEXT("%SystemRoot%\\shutsvc.exe")
#define  SHUTSVCNAME   TEXT("BrShut_serv")

#define  STOPANDSTARTRDR   0
#define  REBOOTMACHINE     1


#define NTOSTYPESBASE  4
#define ASOSTYPESBASE  6
#define IsNTMachine(a)((a->iOsType >= NTOSTYPESBASE) ? TRUE : FALSE)
#define IsASMachine(a)((a->iOsType >= ASOSTYPESBASE) ? TRUE : FALSE)


#define PrintString(FLAG, PrintStr)  {                                                                         \
                                         if(WaitForSingleObject(ConsoleMutex, INFINITE) != WAIT_FAILED) {      \
                                            if(FLAG & TOSCREEN)      printf("%s", PrintStr);                   \
                                            if(FLAG & TOLOGFILE)     fprintf(fplog,"%s", PrintStr);            \
                                            if(FLAG & TOSUMMARYFILE) fprintf(fpsum,"%s", PrintStr);            \
                                            fflush(NULL);                                                      \
                                            ReleaseMutex( ConsoleMutex );                                      \
                                         }                                                                     \
                                      }


VOID           AddToList(LPMACHINEINFO, LPMACHINEINFO);
BOOL           CheckAccessPermissionOnAllMachines();
VOID           CheckBrowseListsOfMasterAndBackUps(XPORTINFO, LPTSTR, LPTSTR, TCHAR [MAXBACKUPS][CNSLASHLEN+1], ULONG, BOOL);
BOOL           CheckBrServiceOnMachinesInList();
VOID           CleanMem();
BOOL           DoesMachineHaveThisTransport(LPTSTR, XPORTINFO, LPMACHINEINFO);
VOID           DomSpanningMulSubNetsTests(XPORTINFO *, INT);
BOOL           DoSingleDomainTests(XPORTINFO *, INT);
BOOL           FindAllTransports(UNICODE_STRING *, DWORD *);
VOID           ForceElectionAndFindWhoWins(XPORTINFO *, INT, LPTSTR, TCHAR [MAXPROTOCOLS][CNLEN+1], INT);
VOID           Initialize(UNICODE_STRING *, INT *);
BOOL           LocalMachineIsMultihomed(UNICODE_STRING *, INT);
BOOL           NewMasterIsCorrect(TCHAR [MAXPROTOCOLS][CNLEN+1], INT, LPTSTR, XPORTINFO, LPMACHINEINFO);
VOID           ParseCommandLine(INT, CHAR **);
VOID           PrintList(MACHINEINFO);

BOOL           StartBrowserFunctionalTest(UNICODE_STRING *, INT);
BOOL           StopBrowserOnCurrentMaster(LPTSTR, LPTSTR, XPORTINFO *,
                                                           INT, TCHAR [MAXPROTOCOLS][CNLEN+1]);
BOOL           StopBrowsersAndFindWhoBecomesMaster(LPTSTR, LPTSTR, XPORTINFO *,
                                                           INT, TCHAR [MAXPROTOCOLS][CNLEN+1]);
VOID           Usage(CHAR *);

#endif