Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

363 lines
11 KiB

/******************************Module*Header*******************************\
* Module Name: cpanel.cxx
*
* Control panel private entry point(s).
*
* Created: 21-Apr-1992 16:49:18
* Author: Gilman Wong [gilmanw]
*
* Copyright (c) 1992-1999 Microsoft Corporation
*
\**************************************************************************/
#include "precomp.hxx"
/******************************Public*Routine******************************\
* GetFontResourceInfoW
*
* The GetFontResourceInfo copies LOGFONTs, IFIMETRICs, or description
* strings into a return buffer for all the fonts in the specified font
* resource file.
*
* Parameters:
*
* lpFilename
*
* Specifies the filename of the font resource being queried. It
* must be a NULL-terminated ANSI string.
*
* lpBytes
* If lpBytes is 0 upon entry to the function, then the number of
* BYTE's required for the requested information is returned via
* this parameter. The lpBuffer is ignored for this case.
*
* If lpBytes is not 0 upon entry, then it specifies the size of
* the buffer pointed to by lpBuffer. The number of bytes copied
* to the buffer is returned via this parameter upon exit.
*
* lpBuffer
*
* The return buffer into which the requested information is copied.
* If lpBytes is 0, then this parameter is ignored.
*
* iType
*
* Must be one of the following:
*
* GFRI_NUMFONTS
*
* Copy into the return buffer a ULONG containing the
* number of fonts in the font resource file. Caller
* should pass in the address of a ULONG for lpBuffer
* and sizeof(ULONG) for *lpBytes.
*
* GFRI_DESCRIPTION
*
* Copy the font resource's description string into the
* return buffer. This may be a empty string.
*
* GFRI_LOGFONTS
*
* Copy an array of LOGFONTs corresponding to each of the
* fonts in the font resource. Note that the LOGFONTs
* must be returned in the font's NOTIONAL COORDINATES
* since there is no DC specified.
*
* GFRI_ISTRUETYPE
*
* Returns TRUE via lpBuffer if font resource is TrueType.
* FALSE otherwise. All other parameters are ignored.
* Caller should pass in the address of a BOOL for lpBuffer
* and sizeof(BOOL) for *lpBytes.
*
* GFRI_TTFILENAME
*
* Returns the .TTF filename imbedded as a string resource
* in .FOT 16-bit TrueType font files. The filename is
* copied into the lpBuffer. The function returns FALSE
* if a filename could not be extracted.
*
* GFRI_ISREMOVED
*
* Returns TRUE via lpBuffer if the font file is no longer
* in the engine font table (or was never there). FALSE is
* returned via lpBuffer if the font file is still in the
* font table. Caller should pass in the address of a BOOL
* for lpBuffer and sizeof(BOOL for *lpBytes.
*
* Returns:
* TRUE if the function is successful, FALSE otherwise.
*
* Comments:
* This function is intended as a private entry point for Control Panel.
*
* History:
* 2-Sep-1993 -by- Gerrit van Wingerden [gerritv]
* Turned it into a "W" function.
*
* 15-Jul-1991 -by- Gilman Wong [gilmanw]
* Wrote it.
\**************************************************************************/
BOOL GetFontResourceInfoInternalW(
LPWSTR lpFilename,
ULONG cwc,
ULONG cFiles,
UINT cjIn,
PSIZE_T lpBytes,
LPVOID lpBuffer,
DWORD iType)
{
BOOL bRet = FALSE;
PFF *pPFF;
// Stabilize public PFT.
SEMOBJ so(ghsemPublicPFT);
// Create and validate user object for public PFT.
PUBLIC_PFTOBJ pfto;
ASSERTGDI(pfto.bValid(), "How could it not be valid");
// Find the correct PFF.
if (pPFF = pfto.pPFFGet(lpFilename, cwc, cFiles, NULL, 0))
{
PFFOBJ pffo(pPFF);
ASSERTGDI (
pffo.bValid(),
"gdisrv!GetFontResourceInfoInternal(): bad HPFF handle\n"
);
{
// What info is requested?
switch (iType)
{
case GFRI_NUMFONTS:
// Is there a buffer?
if (cjIn)
{
// If buffer big enough, return the count of fonts.
if ( cjIn >= sizeof(ULONG) )
*((PULONG) lpBuffer) = pffo.cFonts();
else
return bRet;
}
// In either case, return size of ULONG.
*((SIZE_T *) lpBytes) = sizeof(ULONG);
bRet = TRUE;
break;
case GFRI_DESCRIPTION:
{
ULONG cjRet;
PDEVOBJ pdo(pPFF->hdev);
cjRet = pdo.QueryFontFile(
(ULONG_PTR) pPFF->hff,
QFF_DESCRIPTION,
0,
(PULONG) NULL);
if (cjRet != FD_ERROR )
{
//
// If buffer exists, we need to copy into it.
//
if (cjIn)
{
//
// Get description string in UNICODE.
//
if (cjRet <= cjIn)
{
cjRet = pdo.QueryFontFile(
(ULONG_PTR) pPFF->hff,
QFF_DESCRIPTION,
cjIn,
(PULONG) lpBuffer);
}
else
{
// the buffer passed in is not big enough to contain the description for that font
cjRet = FD_ERROR;
}
}
}
if (cjRet != FD_ERROR )
{
//
// Return size (byte count) of description string.
//
*((SIZE_T *) lpBytes) = (SIZE_T) cjRet;
bRet = TRUE;
}
}
break;
case GFRI_LOGFONTS:
if (cjIn == 0)
*((SIZE_T *) lpBytes) = (SIZE_T) pffo.cFonts() * sizeof(LOGFONTW);
else
{
PLOGFONTW plf = (PLOGFONTW) lpBuffer; // LOGFONTW ptr into lpBuffer
ULONG iFont; // index to font
SIZE_T cjCopy = 0; // bytes copied
// Make sure buffer is big enough.
if (cjIn < (pffo.cFonts() * sizeof(LOGFONTW)))
{
WARNING("gdisrv!GetFontResourceInfoInternal(): buffer too small\n");
return bRet;
}
// Run the list of PFEs.
for (iFont=0; iFont<pffo.cFonts(); iFont++)
{
PFEOBJ pfeo(pffo.ppfe(iFont));
ASSERTGDI (
pfeo.bValid(),
"gdisrv!GetFontResourceInfoInternal(): bad HPFE handle\n"
);
// If data converted to LOGFONTW, increment size and
// move pointer to next.
vIFIMetricsToLogFontW(plf, pfeo.pifi());
cjCopy += sizeof(*plf);
plf++;
}
*((SIZE_T *) lpBytes) = (SIZE_T) cjCopy;
}
bRet = TRUE;
break;
case GFRI_ISTRUETYPE:
// Is there a buffer?
if (cjIn)
{
// If buffer not NULL, return the BOOL.
if ( (lpBuffer != (LPVOID) NULL) && (cjIn >= sizeof(BOOL)) )
*((BOOL *) lpBuffer) = (pffo.hdev() == (HDEV) gppdevTrueType);
else
return bRet;
}
// In either case, return size of ULONG.
*((SIZE_T *) lpBytes) = sizeof(BOOL);
bRet = TRUE;
break;
case GFRI_ISREMOVED:
// We found the font file and we are in GFRI_ISREMOVED mode, that
// means we should return a FALSE boolean signifying that the font
// is still present in the system (i.e., the load count is still
// non-zero for this font file).
// Is there a buffer?
if (cjIn)
{
// If buffer not NULL, return the BOOL.
if ( (lpBuffer != (LPVOID) NULL) && (cjIn >= sizeof(BOOL)) )
*((BOOL *) lpBuffer) = FALSE;
else
return bRet;
}
// In either case, return size of ULONG.
*((SIZE_T *) lpBytes) = sizeof(BOOL);
bRet = TRUE;
break;
default:
WARNING("gdisrv!GetFontResourceInfoInternal(): unknown query type\n");
SAVE_ERROR_CODE(ERROR_INVALID_PARAMETER);
break; // bRet is FALSE
} /* switch */
// Ich bin "outahere"!
return bRet;
} /* if */
} /* for */
// Couldn't find the font file in the public PFT. If we are in GFRI_ISREMOVED
// mode, that means we should return a TRUE boolean signifying that the font
// if no longer (or was never) added to the system.
if ( iType == GFRI_ISREMOVED )
{
// Is there a buffer?
if (cjIn)
{
// If buffer not NULL, return the BOOL.
if ( (lpBuffer != (LPVOID) NULL) && (cjIn >= sizeof(BOOL)) )
*((BOOL *) lpBuffer) = TRUE;
else
return bRet;
}
// In either case, return size of ULONG.
*((SIZE_T *) lpBytes) = sizeof(BOOL);
bRet = TRUE;
}
#if DBG
// If not in GFRI_ISREMOVED mode, then this is a problem. Why were we not able
// to find the font in the table. Lets alert the debugger.
if ( iType != GFRI_ISREMOVED )
{
DbgPrint("gdisrv!GetFontResourceInfoInternal(): no entry found for %s\n", lpFilename);
}
#endif
// Ich bin "outahere"!
return bRet;
}