#include <windows.h>
#include <commdlg.h>
#include "rc_ids.h"
#include "dialogs.h"
#include "msg.h"


//
// Define enumeration type for product type.
// The user can override the product type on the command line
// (ie, if we are on a workstation normally we look for worksttion
// books, but user can override this).
//
typedef enum {
    ForceNone,
    ForceServer,
    ForceWorkstation
} ForceProduct;


//
// module handle
//
extern HANDLE hInst;

//
// Handle of main icon.
//
extern HICON MainIcon;

//
// Command line parameters
//
extern ForceProduct CmdLineForce;

//
// Fixed name of the help file. This is dependent on whether
// this is server or workstation and is set in FixupNames().
//
extern PWSTR HelpFileName;

//
// Path on CD-ROM where online books files are located.
// We "just know" this value.
//
extern PWSTR PathOfBooksFilesOnCd;

//
// Name of profile value that stores the last known location
// of the online books helpfile. This value varies depending
// on the product (workstation/server).
//
extern PWSTR BooksProfileLocation;

//
// Profile routines. These actually operate on registry data.
// See bkprof.c.
//
PWSTR
MyGetProfileValue(
    IN PWSTR ValueName,
    IN PWSTR DefaultValue
    );

BOOL
MySetProfileValue(
    IN  PWSTR ValueName,
    OUT PWSTR Value
    );


//
// Routines to manipulate help files and help file names.
// See bkhlpfil.c.
//
VOID
FormHelpfilePaths(
    IN  WCHAR Drive,            OPTIONAL
    IN  PWSTR Path,
    IN  PWSTR FilenamePrepend,  OPTIONAL
    OUT PWSTR Filename,
    OUT PWSTR Directory         OPTIONAL
    );

BOOL
CheckHelpfilePresent(
    IN PWSTR Path
    );

VOID
FireUpWinhelp(
    IN WCHAR Drive, OPTIONAL
    IN PWSTR Path
    );


//
// Memory manipulation routines. Note that MyMalloc always
// succeeds (it does not return if it fails).
// See bkmem.c.
//
VOID
OutOfMemory(
    VOID
    );

PVOID
MyMalloc(
    IN DWORD Size
    );

VOID
MyFree(
    IN PVOID Block
    );


//
// Resource manipulation routines.
// See bkres.c.
//
PWSTR
MyLoadString(
    IN UINT StringId
    );

PWSTR
RetreiveMessage(
    IN UINT MessageId,
    ...
    );

int
MessageBoxFromMessage(
    IN HWND Owner,
    IN UINT MessageId,
    IN UINT CaptionStringId,
    IN UINT Style,
    ...
    );


//
// Routine to install the on-line books to a local hard drive.
// See bkinst.c.
//
BOOL
DoInstall(
    IN OUT PWSTR *Location
    );


//
// Routine to carry out an action with a billboard
// telling the user what is going on.
// See bkthrdlg.c.
//
DWORD
ActionWithBillboard(
    IN PTHREAD_START_ROUTINE ThreadEntry,
    IN HWND                  OwnerWindow,
    IN UINT                  CaptionStringId,
    IN UINT                  TextStringId,
    IN PVOID                 UserData
    );

//
// Structure that is passed to ThreadEntry.
//
typedef struct _ACTIONTHREADPARAMS {
    HWND hdlg;
    PVOID UserData;
} ACTIONTHREADPARAMS, *PACTIONTHREADPARAMS;


//
// Miscellaneous utility routines.
// See bkutils.c.
//
WCHAR
LocateCdRomDrive(
    VOID
    );

BOOL
IsCdRomInDrive(
    IN WCHAR Drive,
    IN PWSTR TagFile
    );

UINT
MyGetDriveType(
    IN WCHAR Drive
    );

BOOL
DoesFileExist(
    IN PWSTR File
    );

PWSTR
DupString(
    IN PWSTR String
    );

VOID
CenterDialogOnScreen(
    IN HWND hdlg
    );

VOID
CenterDialogInWindow(
    IN HWND hdlg,
    IN HWND hwnd
    );

VOID
MyError(
    IN HWND Owner,
    IN UINT StringId,
    IN BOOL Fatal
    );