#ifndef __PCONTROL_H__
#define __PCONTROL_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "fvscodes.h"    // FVS_xxxxxx (font validation status) codes & macros.
                         // \nt\private\windows\shell\control\t1instal\fvscodes.h

//
//  Global definitions
//
//
// Note for file macros below.
// The LZxxx functions are no longer used in the macro substitutions.
// The need to use LZxxx implementations is a function of the file type, not
// the target platform.  Wherever LZxxx functions are required, they
// are now used explicitely.
//

#ifdef WINNT

#define FOPEN( sz, lpsz )        MyOpenFile( sz, lpsz, OF_READ )
#define FREAD( fh, buf, len )    MyAnsiReadFile( fh, CP_ACP, buf, len )
#define FWRITE( fh, buf, len )   MyAnsiWriteFile( fh, CP_ACP, buf, len )
#define FREADBYTES(fh,buf,len)   MyByteReadFile( fh, buf, len )
#define FWRITEBYTES(fh,buf,len)  MyByteWriteFile( fh, buf, len )

#define FSEEK( fh, off, i )      MyFileSeek( fh, (DWORD) off, i )
#define FCLOSE( fh )             MyCloseFile( fh )
#define FCREATE( sz )            MyOpenFile( sz, NULL, OF_READWRITE | OF_CREATE )

#else

#define FOPEN( sz )              _lopen( sz, OF_READ )
#define FCLOSE( fh )             _lclose( fh )
#define FREAD( fh, buf, len )    _lread( fh, buf, len )
#define FREADBYTES(fh, buf, len) _lread( fh, buf, len )
#define FSEEK( fh, off, i )      _llseek( fh, (DWORD) off, i )

#define FCREATE( sz )            _lcreat( sz, 0 )
#define FWRITE( fh, buf, len )   _lwrite( fh, buf, len )
#define FWRITEBYTES(fh, buf, len) _lwrite( fh, buf, len )

#endif  //  WINNT



//
//  Global variables
//

extern  FullPathName_t e_szDirOfSrc;
extern  UINT s_wBrowseDoneMsg;


//
//  Flags for ReadLine
//

#define  RL_MORE_MEM       -1
#define  RL_SECTION_END    -2

#define  SEEK_BEG           0
#define  SEEK_CUR           1
#define  SEEK_END           2

#define  PRN               148
#define  MON_OF_YR         276
#define  MOUSE           MON_OF_YR+48
#define  INSTALL         MOUSE+16


//
//  Font file types used in Fonts applet - installation
//

#define NOT_TT_OR_T1        0       //  Neither TrueType or Type 1 font (FALSE)
#define TRUETYPE_FONT       1       //  This is a TrueType font (TRUE)
#define TYPE1_FONT          2       //  This is an Adobe Type1 font
#define TYPE1_FONT_NC       3       //  Type1 font that cannot be converted to TT
#define OPENTYPE_FONT       4       //  Font is OpenType.

//
//  Font file types used in Fonts applet - Main dlg "Installed Fonts" lbox
//

#define IF_OTHER            0       //  TrueType or Bitmap 1 font (FALSE)
#define IF_TYPE1            1       //  Adobe Type1 font
#define IF_TYPE1_TT         2       //  Matching TT font for Adobe Type1 font

#define T1_MAX_DATA     (2 * PATHMAX + 6)

//
//  Return codes from InstallT1Font routine
//

#define TYPE1_INSTALL_IDOK       IDOK        //  User pressed OK from MessageBox error
#define TYPE1_INSTALL_IDYES      IDYES       //  Same as IDOK
#define TYPE1_INSTALL_IDNO       IDNO        //  Font not installed - user pressed NO
#define TYPE1_INSTALL_IDCANCEL   IDCANCEL    //  Entire installation cancelled
#define TYPE1_INSTALL_PS_ONLY     10         //  Only the PS Font installed.
#define TYPE1_INSTALL_PS_AND_MTT  11         //  PostScript Font installed and matching
                                             //   TT font already installed.
#define TYPE1_INSTALL_TT_AND_PS   12         //  PS Font installed and converted to TT.
#define TYPE1_INSTALL_TT_ONLY     13         //  PS Font converted to TT only.
#define TYPE1_INSTALL_TT_AND_MPS  14         //  PS Font converted to TT and matching
                                             //   PS font already installed.
//
//  Global functions
//

//
//  append.cpp
//

BOOL FAR PASCAL fnAppendSplitFiles( LPTSTR FAR *, LPTSTR, int );

//
//  instfls.c
//

typedef int (FAR PASCAL *INSTALL_PROC)(HWND hDlg, WORD wMsg, int i,
             LPTSTR FAR *pszFiles, LPTSTR lpszDir );

#define IFF_CHECKINI  0x0001
#define IFF_SRCANDDST 0x0002

#define IF_ALREADY_INSTALLED    1
#define IF_ALREADY_RUNNING      2
#define IF_JUST_INSTALLED       3

PTSTR  FAR PASCAL CopyString( LPTSTR szStr );
PTSTR  FAR PASCAL MyLoadString( WORD wId );
LPTSTR FAR PASCAL CpyToChr( LPTSTR pDest, LPTSTR pSrc, TCHAR cChr, int iMax );

VOID FAR PASCAL GetDiskAndFile( LPTSTR pszInf,
                                short /* int */ FAR *nDsk,
                                LPTSTR pszDriver,
                                WORD wSize );

DWORD FAR PASCAL InstallFiles( HWND hwnd, LPTSTR FAR *pszFiles, int nCount,
                               INSTALL_PROC lpfnNewFile, WORD wFlags );

//
//  PFONT.CPP
//

extern VOID NEAR PASCAL vConvertExtension( LPTSTR pszFile,  LPTSTR szExt );

class CFontManager;
extern BOOL FAR PASCAL bCPAddFonts( HWND ma );

#define CPDI_CANCEL  -1
#define CPDI_FAIL     0
#define CPDI_SUCCESS  1

extern int FAR PASCAL CPDropInstall( HWND hwndParent,
                                     LPTSTR szFile,
                                     DWORD  dwEffect,
                                     LPTSTR lpszDestName = NULL,
                                     int    iCount = 0 );

extern VOID FAR  PASCAL vCPDeleteFromSharedDir( LPTSTR pszFileOnly );
extern VOID FAR  PASCAL vCPFilesToDescs( );
extern BOOL NEAR PASCAL bUniqueOnSharedDir( LPTSTR lpszDst,  LPTSTR lpszSrc );
extern VOID NEAR PASCAL vHashToNulls( LPTSTR lpStr );
extern BOOL FAR  PASCAL bUniqueFilename (LPTSTR lpszDst, LPTSTR lpszSrc, LPTSTR lpszDir);

//
//  cpsetup.c
//

typedef WORD (*LPSETUPINFPROC)( LPTSTR, LPVOID );
extern DWORD ReadSetupInfSection( LPTSTR pszInfPath,
                                  LPTSTR pszSection,
                                  LPTSTR *ppszSectionItems );


extern WORD ReadSetupInfCB( LPTSTR pszInfPath,
                            LPTSTR pszSection,
                            LPSETUPINFPROC,
                            LPVOID pData);

extern int    FAR PASCAL ReadSetupInfIntoLBs( HWND hLBName,
                                              HWND hLBDBase,
                                              WORD wAddMsg,
                                              LPTSTR pszSection,
                                              WORD (FAR PASCAL *lpfnGetName)(LPTSTR, LPTSTR) );

//
//  PINSTALL.CPP
//

extern BOOL FAR PASCAL bCPInstallFile( HWND hwndParent,
                                       LPTSTR lpDir,
                                       LPTSTR lpFrom,
                                       LPTSTR lpTo );

//
//  PFILES.CPP
//

extern BOOL FAR PASCAL bCPValidFontFile( LPTSTR lpszFile,
                                         LPTSTR lpszDesc = NULL,
                                         WORD FAR *lpwType = NULL,
                                         BOOL bFOTOK = FALSE,
                                         LPDWORD lpdwStatus = NULL);
//
//  PUTIL.CPP
//

extern BOOL FAR PASCAL bCPSetupFromSource( );
extern BOOL FAR PASCAL bCPIsHelp( WORD message );
extern BOOL FAR PASCAL bCPIsBrowseDone( WORD message );
extern RC   FAR PASCAL rcCPLoadFontList( );
extern VOID FAR PASCAL vCPHelp( HWND );
extern VOID FAR PASCAL vCPStripBlanks( LPTSTR lpszString );
extern VOID FAR PASCAL vCPUpdateSourceDir( );
extern VOID FAR PASCAL vCPWinIniFontChange( );
extern VOID FAR PASCAL vCPPanelInit( );
extern LPTSTR FAR PASCAL lpCPBackSlashTerm( LPTSTR lpszPath );
extern BOOL bFileIsInFontsDirectory(LPCTSTR lpszPath);
extern int FAR PASCAL DoDialogBoxParam( int nDlg,
                                        HWND hParent,
                                        DLGPROC lpProc,
                                        DWORD dwHelpContext,
                                        LPARAM dwParam);

#ifdef WINNT
extern HANDLE PASCAL wCPOpenFileWithShare( LPTSTR, LPTSTR, WORD );
#else
extern WORD FAR PASCAL wCPOpenFileWithShare( LPTSTR, LPOFSTRUCT, WORD );
#endif  //  WINNT

extern UINT MyAnsiReadFile( HANDLE  hFile,
                            UINT uCodePage,
                            LPVOID  lpUnicode,
                            DWORD  cchUnicode );

extern UINT MyAnsiWriteFile( HANDLE  hFile,
                             UINT uCodePage,
                             LPVOID lpUnicode,
                             DWORD cchUnicode );

extern UINT   MyByteReadFile( HANDLE  hFile, LPVOID lpBuffer, DWORD nBytes );
extern UINT   MyByteWriteFile( HANDLE hFile, LPVOID lpBuffer, DWORD nBytes );
extern BOOL   MyCloseFile( HANDLE  hFile );
extern LONG   MyFileSeek( HANDLE hFile, LONG lDistanceToMove, DWORD dwMoveMethod );
extern HANDLE MyOpenFile( LPTSTR lpszFile, TCHAR * lpszPath, DWORD fuMode );

VOID  CentreWindow( HWND hwnd );


typedef struct _StringObject {
   HANDLE   h;
   DWORD    dwLen;
} StringObject;

extern BOOL FAR PASCAL AddStringToObject( StringObject&, LPTSTR, WORD );

#define ASO_GLOBAL  0x0001
#define ASO_FIXED   0x0002
#define ASO_EXACT   0x0004
#define ASO_COMPACT 0x0008


#ifdef ROM
extern HANDLE FAR PASCAL IsROMModule( LPTSTR lpName, BOOL fSelector );
#endif


LPVOID AllocMem( DWORD cb );
BOOL   FreeMem( LPVOID pMem, DWORD  cb );
LPVOID ReallocMem( LPVOID lpOldMem, DWORD cbOld, DWORD cbNew );
LPTSTR AllocStr( LPTSTR lpStr );
BOOL   FreeStr( LPTSTR lpStr );
BOOL   ReallocStr( LPTSTR *plpStr, LPTSTR lpStr );


/* t1.cpp */

BOOL CheckT1Install( LPTSTR pszDesc, LPTSTR pszData );
BOOL DeleteT1Install( HWND hwndParent, LPTSTR pszDesc, BOOL bDeleteFiles );
BOOL EnumType1Fonts( HWND hLBox );
BOOL GetT1Install( LPTSTR pszDesc, LPTSTR pszPfmFile, LPTSTR pszPfbFile );
int  InstallT1Font( HWND hwndParent, BOOL bCopyTTFile, BOOL bCopyType1Files,
                    BOOL bInSharedDir, LPTSTR szPfmName, LPTSTR szDesc );

HWND InitProgress( HWND hwnd );
BOOL InstallCancelled(void);
void InitPSInstall( );
BOOL IsPSFont( LPTSTR lpszKey, LPTSTR lpszDesc, LPTSTR lpszPfm, LPTSTR lpszPfb,
               BOOL *pbCreatedPFM, LPDWORD lpdwStatus = NULL );

BOOL OkToConvertType1ToTrueType(LPCTSTR pszFontDesc, LPCTSTR pszPFB, HWND hwndParent);

BOOL ExtractT1Files( LPTSTR pszMulti, LPTSTR pszPfmFile, LPTSTR pszPfbFile );
void Progress2( int PercentDone, LPTSTR szDesc );
void RemoveDecoration( LPTSTR pszDesc, BOOL bDeleteTrailingSpace );
void ResetProgress( );
void TermProgress( );
void TermPSInstall( );
void UpdateProgress( int iTotalCount, int iFontInstalling, int iProgress );

BOOL WriteType1RegistryEntry( HWND hwndParent, LPTSTR szDesc, LPTSTR szPfmName,
                              LPTSTR szPfbName, BOOL bInFontsDir );

HWND GetFirstAncestor( HWND hWnd );

#ifdef WINNT
BOOL BuildType1FontResourceName(LPCTSTR pszPfm, LPCTSTR pszPfb,
                                  LPTSTR pszDest, DWORD cchDest);

#define MAX_TYPE1_FONT_RESOURCE  (MAX_PATH * 2)  // 2 paths + separator.
#endif // WINNT

#ifdef __cplusplus
}
#endif

#endif

/****************************************************************************
 * $lgb$
 * 1.0     7-Mar-94   eric Initial revision.
 * $lge$
 *
 ****************************************************************************/