windows-nt/Source/XPSP1/NT/printscan/fax/print/faxprint/lib/registry.c
2020-09-26 16:20:57 +08:00

294 lines
5.9 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
registry.c
Abstract:
Functions for accessing registry information under:
HKEY_CURRENT_USER and HKEY_LOCAL_MACHINE
Environment:
Windows NT fax driver user interface
Revision History:
01/29/96 -davidx-
Created it.
mm/dd/yy -author-
description
--*/
#include "faxlib.h"
#include "registry.h"
LPTSTR
GetRegistryExpandStr(
HKEY hRootKey,
LPTSTR pKeyName,
LPTSTR pValueName
)
/*++
Routine Description:
Get a EXPAND_SZ value from the registry
Arguments:
hRootKey - Specifies a handle to the root registry key
pKeyName - Specifies the name of the sub registry key
pValueName - Specifies the name of the registry value
Return Value:
Pointer to an expanded string, NULL if there is an error
--*/
{
DWORD size, type;
LONG status;
HKEY hRegKey;
LPTSTR pRegStr = NULL, pExpandedStr;
//
// Get a handle to the user info registry key
//
if (! (hRegKey = OpenRegistryKey(hRootKey, pKeyName, FALSE, REG_READONLY)))
return NULL;
//
// Figure out how much memory to allocate
//
size = 0;
status = RegQueryValueEx(hRegKey, pValueName, NULL, &type, NULL, &size);
if ((status == ERROR_SUCCESS) &&
(type == REG_EXPAND_SZ || type == REG_SZ) &&
(pRegStr = MemAlloc(size)))
{
//
// Read the registry value
//
status = RegQueryValueEx(hRegKey, pValueName, NULL, NULL, (PBYTE) pRegStr, &size);
if (status != ERROR_SUCCESS || IsEmptyString(pRegStr)) {
MemFree(pRegStr);
pRegStr = NULL;
} else if (type == REG_EXPAND_SZ) {
//
// Substitute any environment variables
//
if ((size = ExpandEnvironmentStrings(pRegStr, NULL, 0)) == 0 ||
(pExpandedStr = MemAlloc(sizeof(TCHAR) * size)) == NULL)
{
MemFree(pRegStr);
pRegStr = NULL;
} else {
if (ExpandEnvironmentStrings(pRegStr, pExpandedStr, size) == 0)
*pExpandedStr = NUL;
MemFree(pRegStr);
pRegStr = pExpandedStr;
}
}
}
RegCloseKey(hRegKey);
return pRegStr;
}
PDEVMODE
GetPerUserDevmode(
LPTSTR pPrinterName
)
/*++
Routine Description:
Get per-user devmode information for the specified printer
Arguments:
pPrinterName - Specifies the name of the printer we're interested in
Return Value:
Pointer to per-user devmode information read from the registry
--*/
{
PVOID pDevmode = NULL;
HANDLE hPrinter;
PPRINTER_INFO_9 pPrinterInfo;
TCHAR PrinterBuffer[64];
//
// Make sure the printer name is valid
//
if (pPrinterName == NULL) {
_tcscpy(PrinterBuffer,L"Fax");
} else {
_tcscpy(PrinterBuffer,pPrinterName);
}
//
// Open the printer
//
if (!OpenPrinter(PrinterBuffer,&hPrinter,NULL) ) {
return NULL;
}
pPrinterInfo = MyGetPrinter(hPrinter,9);
if (!pPrinterInfo || !pPrinterInfo->pDevMode) {
ClosePrinter(hPrinter);
return NULL;
}
pDevmode = MemAlloc(sizeof(DRVDEVMODE) );
if (!pDevmode) {
MemFree(pPrinterInfo);
ClosePrinter(hPrinter);
return NULL;
}
CopyMemory((PVOID) pDevmode,
(PVOID) pPrinterInfo->pDevMode,
sizeof(DRVDEVMODE) );
MemFree( pPrinterInfo );
ClosePrinter( hPrinter );
return pDevmode;
}
VOID
SavePerUserDevmode(
LPTSTR pPrinterName,
PDEVMODE pDevmode
)
/*++
Routine Description:
Save per-user devmode information for the specified printer
Arguments:
pPrinterName - Specifies the name of the printer we're interested in
pDevmode - Points to the devmode to be saved
Return Value:
NONE
--*/
{
HKEY hRegKey;
INT size;
//
// Make sure the printer name is valid
//
if (pPrinterName == NULL) {
Error(("Bad printer name\n"));
return;
}
//
// Open the registry key for write access
//
if (! (hRegKey = GetUserInfoRegKey(REGKEY_FAX_DEVMODE, REG_READWRITE)))
return;
//
// Save the devmode information as binary data
//
size = pDevmode->dmSize + pDevmode->dmDriverExtra;
RegSetValueEx(hRegKey, pPrinterName, 0, REG_BINARY, (PBYTE) pDevmode, size);
RegCloseKey(hRegKey);
}
LPTSTR
GetUserCoverPageDir(
VOID
)
{
LPTSTR CpDirTmp = NULL;
LPTSTR CpDir = MemAlloc(MAX_PATH*sizeof(TCHAR));
SHGetSpecialFolderPath(NULL, CpDir , CSIDL_PERSONAL, FALSE);
CpDirTmp = GetRegistryExpandStr(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, REGVAL_CP_LOCATION);
if (CpDirTmp == NULL) {
HKEY hKey = OpenRegistryKey(HKEY_CURRENT_USER,REGKEY_FAX_SETUP,FALSE, REG_READONLY);
if (hKey) {
SetRegistryStringExpand(hKey,REGVAL_CP_LOCATION,DEFAULT_COVERPAGE_DIR);
RegCloseKey(hKey);
CpDirTmp = GetRegistryExpandStr(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, REGVAL_CP_LOCATION);
}
}
if (CpDir && CpDirTmp) {
_tcscat( CpDir, TEXT("\\") );
_tcscat( CpDir, CpDirTmp );
}
if (CpDirTmp) {
MemFree(CpDirTmp);
}
return CpDir;
}
LPTSTR
GetCoverPageEditor(
VOID
)
{
LPTSTR CpEd = GetRegistryStringExpand(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, REGVAL_CP_EDITOR);
if (CpEd == NULL) {
HKEY hKey = OpenRegistryKey(HKEY_CURRENT_USER,REGKEY_FAX_SETUP,FALSE, REG_READWRITE);
if (hKey) {
SetRegistryStringExpand(hKey,REGVAL_CP_EDITOR,DEFAULT_COVERPAGE_EDITOR);
RegCloseKey(hKey);
return GetRegistryExpandStr(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, REGVAL_CP_EDITOR);
}
}
return CpEd;
}