|
|
/*++
Copyright (c) 2000-2001, Microsoft Corporation All rights reserved.
Module Name:
callback.c
Abstract:
This file contains functions that wrap various enumeratation procedures and callback functions
Functions found in this file: EnumCalendarInfoProc EnumCalendarInfoProcEx EnumDateFormatsProc EnumDateFormatsProcEx EnumFontFamExProc EnumFontFamProc EnumICMProfilesProcCallback EnumLocalesProc EnumTimeFormatsProc PropEnumProc PropEnumProcEx GrayStringProc
Revision History:
7 Nov 2000 v-michka Created.
--*/
#include "precomp.h"
/*-------------------------------
EnumCalendarInfoProc -------------------------------*/ BOOL CALLBACK EnumCalendarInfoProc(LPSTR lpCalendarInfoString) { BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; CALINFO_ENUMPROCW lpfn; size_t cb = lstrlenA(lpCalendarInfoString); LPWSTR lpsz = GodotHeapAlloc(cb * sizeof(WCHAR));
if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return(FALSE); }
lpgti = GetThreadInfoSafe(TRUE); // No TLS info means no way to know what proc to call
if(lpgti) { lpfn = lpgti->pfnCalendarInfo; MultiByteToWideChar(g_acp, 0, lpCalendarInfoString, -1, lpsz, cb); // Chain to the original callback function
RetVal = (* lpfn)(lpsz); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
/*-------------------------------
EnumCalendarInfoProcEx -------------------------------*/ BOOL CALLBACK EnumCalendarInfoProcEx (LPSTR lpCalendarInfoString, CALID Calendar) { BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; CALINFO_ENUMPROCEXW lpfn; size_t cb = lstrlenA(lpCalendarInfoString); LPWSTR lpsz = GodotHeapAlloc(cb * sizeof(WCHAR));
if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return(FALSE); }
lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfn = lpgti->pfnCalendarInfoEx; MultiByteToWideChar(g_acp, 0, lpCalendarInfoString, -1, lpsz, cb); // Chain to the original callback function
RetVal = (* lpfn)(lpsz, Calendar); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
/*-------------------------------
EnumDateFormatsProc -------------------------------*/ BOOL CALLBACK EnumDateFormatsProc(LPSTR lpDateFormatString) { BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; DATEFMT_ENUMPROCW lpfn; size_t cb = lstrlenA(lpDateFormatString); LPWSTR lpsz = GodotHeapAlloc(cb * sizeof(WCHAR));
if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return(FALSE); }
lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfn = lpgti->pfnDateFormats; MultiByteToWideChar(g_acp, 0, lpDateFormatString, -1, lpsz, cb); // Chain to the original callback function
RetVal = (* lpfn)(lpsz); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
/*-------------------------------
EnumDateFormatsProcEx -------------------------------*/ BOOL CALLBACK EnumDateFormatsProcEx(LPSTR lpDateFormatString, CALID CalendarID) { BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; DATEFMT_ENUMPROCEXW lpfn; size_t cb = lstrlenA(lpDateFormatString); LPWSTR lpsz = GodotHeapAlloc(cb * sizeof(WCHAR));
if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return(FALSE); }
lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfn = lpgti->pfnDateFormatsEx; MultiByteToWideChar(g_acp, 0, lpDateFormatString, -1, lpsz, cb); // Chain to the original callback function
RetVal = (* lpfn)(lpsz, CalendarID); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
/*-------------------------------
EnumLocalesProc -------------------------------*/ BOOL CALLBACK EnumLocalesProc(LPSTR lpLocaleString) { BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; LOCALE_ENUMPROCW lpfn; size_t cb = lstrlenA(lpLocaleString); LPWSTR lpsz = GodotHeapAlloc(cb * sizeof(WCHAR));
if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return(FALSE); }
lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfn = lpgti->pfnLocales; MultiByteToWideChar(g_acp, 0, lpLocaleString, -1, lpsz, cb); RetVal = (* lpfn)(lpsz); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
/*-------------------------------
EnumTimeFormatsProc -------------------------------*/ BOOL CALLBACK EnumTimeFormatsProc(LPSTR lpTimeFormatString) { BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; TIMEFMT_ENUMPROCW lpfn; size_t cb = lstrlenA(lpTimeFormatString); LPWSTR lpsz = GodotHeapAlloc(cb * sizeof(WCHAR));
if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return(FALSE); }
lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfn = lpgti->pfnTimeFormats; MultiByteToWideChar(g_acp, 0, lpTimeFormatString, -1, lpsz, cb); // Chain to the original callback function
RetVal = (* lpfn)(lpsz); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
/*-------------------------------
PropEnumProcA -------------------------------*/ BOOL CALLBACK PropEnumProcA(HWND hwnd, LPCSTR lpszString, HANDLE hData) { BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; PROPENUMPROCA lpfn;
if(IsInternalWindowProperty((LPWSTR)lpszString, FALSE)) return(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti = GetThreadInfoSafe(TRUE)) { lpfn = lpgti->pfnPropA; RetVal = (* lpfn)(hwnd, lpszString, hData); }
return(RetVal); }
/*-------------------------------
PropEnumProc -------------------------------*/ BOOL CALLBACK PropEnumProc(HWND hwnd, LPCSTR lpszString, HANDLE hData) { BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; PROPENUMPROCW lpfn; size_t cb; LPWSTR lpsz;
if(IsInternalWindowProperty((LPWSTR)lpszString, FALSE)) return(TRUE);
cb = lstrlenA(lpszString); lpsz = GodotHeapAlloc(cb * sizeof(WCHAR)); if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return(FALSE); }
// No TLS info means no way to know what proc to call
if(lpgti = GetThreadInfoSafe(TRUE)) { lpfn = lpgti->pfnProp; MultiByteToWideChar(g_acp, 0, lpszString, -1, lpsz, cb); RetVal = (* lpfn)(hwnd, lpsz, hData); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
/*-------------------------------
PropEnumProcEx -------------------------------*/ BOOL CALLBACK PropEnumProcExA(HWND hwnd, LPSTR lpszString, HANDLE hData, ULONG_PTR dwData) { // begin locals
BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; PROPENUMPROCEXA lpfn;
if(IsInternalWindowProperty((LPWSTR)lpszString, FALSE)) return(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti = GetThreadInfoSafe(TRUE)) { lpfn = lpgti->pfnPropExA;
// Chain to the original callback function
RetVal = (*lpfn)(hwnd, lpszString, hData, dwData); }
return(RetVal); }
/*-------------------------------
PropEnumProcEx -------------------------------*/ BOOL CALLBACK PropEnumProcEx(HWND hwnd, LPSTR lpszString, HANDLE hData, ULONG_PTR dwData) { // begin locals
BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; PROPENUMPROCEXW lpfn; size_t cb; LPWSTR lpsz;
if(IsInternalWindowProperty((LPWSTR)lpszString, FALSE)) return(TRUE);
cb = lstrlenA(lpszString); lpsz = GodotHeapAlloc(cb * sizeof(WCHAR));
if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return(FALSE); }
lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfn = lpgti->pfnPropEx; MultiByteToWideChar(g_acp, 0, lpszString, -1, lpsz, (cb * sizeof(WCHAR)));
// Chain to the original callback function
RetVal = (*lpfn)(hwnd, lpsz, hData, dwData); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
/*-------------------------------
EnumFontFamExProc -------------------------------*/ int CALLBACK EnumFontFamExProc(ENUMLOGFONTEXA *lpelfe, NEWTEXTMETRICEXA *lpntme, DWORD FontType, LPARAM lParam) { // begin locals
int RetVal = 0; LPGODOTTLSINFO lpgti; FONTENUMPROCW lpfnFEP; LOGFONTW lfW;
lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfnFEP = lpgti->pfnFontFamiliesEx; LogFontWfromA(&lfW, (LOGFONTA *)lpelfe);
if (FontType & TRUETYPE_FONTTYPE) { NEWTEXTMETRICEXW ntmeW;
NewTextMetricExWfromA(&ntmeW, lpntme);
// Chain to the original callback function
RetVal = (*lpfnFEP)(&lfW, (LPTEXTMETRICW)&ntmeW, FontType, lParam); } else { TEXTMETRICW tmW;
TextMetricWfromA(&tmW, (LPTEXTMETRICA)lpntme);
// Chain to the original callback function
RetVal = (*lpfnFEP)(&lfW, &tmW, FontType, lParam); } }
// Cleanup and get out
return(RetVal); }
/*-------------------------------
EnumFontFamProc -------------------------------*/ int CALLBACK EnumFontFamProc(ENUMLOGFONTA *lpelf, LPNEWTEXTMETRICA lpntm, DWORD FontType, LPARAM lParam) { // begin locals
int RetVal = 0; LPGODOTTLSINFO lpgti; FONTENUMPROCW lpfnFEP; LOGFONTW lfW;
lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfnFEP = lpgti->pfnFontFamilies; LogFontWfromA(&lfW, (LOGFONTA *)lpelf);
if (FontType & TRUETYPE_FONTTYPE) { NEWTEXTMETRICW ntmW;
NewTextMetricWfromA(&ntmW, lpntm);
// Chain to the original callback function
RetVal = (*lpfnFEP)(&lfW, (LPTEXTMETRICW)&ntmW, FontType, lParam); } else { TEXTMETRICW tmW;
TextMetricWfromA(&tmW, (LPTEXTMETRICA)lpntm);
// Chain to the original callback function
RetVal = (*lpfnFEP)(&lfW, &tmW, FontType, lParam); } }
return(RetVal); }
/*-------------------------------
EnumFontsProc -------------------------------*/ int CALLBACK EnumFontsProc(CONST LOGFONTA *lplf, CONST TEXTMETRICA *lptm, DWORD dwType, LPARAM lpData) { // begin locals
int RetVal = 0; LPGODOTTLSINFO lpgti; FONTENUMPROCW lpfnFEP; TEXTMETRICW tmW; LOGFONTW lfW; lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfnFEP = lpgti->pfnFonts; LogFontWfromA(&lfW, (LOGFONTA *)lplf); TextMetricWfromA(&tmW, (TEXTMETRICA *)lptm);
// Chain to the original callback function
RetVal = (*lpfnFEP)(&lfW, &tmW, dwType, lpData); }
return(RetVal); }
/*-------------------------------
EnumICMProfilesProcCallback -------------------------------*/ int CALLBACK EnumICMProfilesProcCallback(LPSTR lpszFilename, LPARAM lParam) { // begin locals
BOOL RetVal = FALSE; LPGODOTTLSINFO lpgti; ICMENUMPROCW lpfnIEP; size_t cb = lstrlenA(lpszFilename); LPWSTR lpsz = GodotHeapAlloc(cb * sizeof(WCHAR));
if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return (FALSE); }
lpgti = GetThreadInfoSafe(TRUE);
// No TLS info means no way to know what proc to call
if(lpgti) { lpfnIEP = lpgti->pfnICMProfiles; MultiByteToWideChar(g_acp, 0, lpszFilename, -1, lpsz, (cb * sizeof(WCHAR)));
// Chain to the original callback function
RetVal = (*lpfnIEP)(lpsz, lParam); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
/*-------------------------------
GrayStringProc -------------------------------*/ BOOL CALLBACK GrayStringProc(HDC hdc, LPARAM lpData, int cchData) { LPGODOTTLSINFO lpgti; BOOL RetVal = FALSE; GRAYSTRINGPROC lpfn; LPWSTR lpsz = GodotHeapAlloc(cchData * sizeof(WCHAR));
if(!lpsz) { SetLastError(ERROR_OUTOFMEMORY); return (FALSE); }
// No TLS info means no way to know what proc to call
if(lpgti = GetThreadInfoSafe(TRUE)) { lpfn = lpgti->pfnGrayString; MultiByteToWideChar(lpgti->cpgGrayString, 0, (LPSTR)lpData, -1, lpsz, (cchData * sizeof(WCHAR)));
// Chain to the original callback function
RetVal = (*lpfn)(hdc, (LPARAM)lpsz, gwcslen(lpsz)); }
// Cleanup and get out
GodotHeapFree(lpsz); return(RetVal); }
|