|
|
/*++
Copyright (c) 1996-1997 Microsoft Corporation
Module Name:
formtray.c
Abstract:
Unidrv form-to-tray assignent
Environment:
Windows NT printer drivers
Revision History:
01/07/97 -amandan- Created it.
--*/
#include "lib.h"
#include "unilib.h"
FORM_TRAY_TABLE PGetAndConvertOldVersionFormTrayTable( IN HANDLE hPrinter, OUT PDWORD pdwSize )
/*++
Routine Description:
Retrieve the old Unidrv form-to-tray assignment table from registry and convert it to the new format for the caller
Arguments:
hPrinter - Handle to the printer object pdwSize - Returns the form-to-tray assignment table size
Return Value:
Pointer to form-to-tray assignment table read from the registry NULL if there is an error
--*/ {
PWSTR pwstrNewTable; PWSTR pwstrOld, pwstrEnd, pwstrNew; DWORD dwTableSize, dwNewTableSize, dwTrayName, dwFormName; FORM_TRAY_TABLE pFormTrayTable;
//
// Read unidrv form-tray-assignment table, kludgy since unidrv
// table does not include a size
//
if ((pFormTrayTable = PtstrGetPrinterDataString(hPrinter, REGVAL_TRAYFORM_TABLE_RASDD, &dwTableSize)) == NULL) return NULL;
//
// Convert the old format form-to-tray assignment table to new format
// OLD NEW
// Tray Name Tray Name
// Form Name Form Name
// SelectStr
//
pwstrOld = pFormTrayTable; pwstrEnd = pwstrOld + (dwTableSize / sizeof(WCHAR) - 1);
//
// Figuring out the size of new table,
// the last field in the table must be a NUL so add count for it here first
//
dwNewTableSize = 1;
while (pwstrOld < pwstrEnd && *pwstrOld != NUL) { dwTrayName = wcslen(pwstrOld) + 1; pwstrOld += dwTrayName; dwFormName = wcslen(pwstrOld) + 1; pwstrOld += dwFormName;
//
// New format contain only TrayName and FormName
//
dwNewTableSize += dwTrayName + dwFormName;
//
// Skip SelectStr
//
pwstrOld += wcslen(pwstrOld) + 1;
}
dwNewTableSize *= sizeof(WCHAR);
if ((pwstrOld != pwstrEnd) || (pwstrNewTable = MemAlloc(dwNewTableSize)) == NULL) { ERR(( "Couldn't convert form-to-tray assignment table.\n")); MemFree(pFormTrayTable); return FALSE; }
pwstrOld = pFormTrayTable ; pwstrNew = pwstrNewTable;
while (pwstrOld < pwstrEnd) { //
// Copy slot name, form name
//
PWSTR pwstrSave = pwstrOld;
pwstrOld += wcslen(pwstrOld) + 1; pwstrOld += wcslen(pwstrOld) + 1;
memcpy(pwstrNew, pwstrSave, (DWORD)(pwstrOld - pwstrSave) * sizeof(WCHAR)); pwstrNew += (pwstrOld - pwstrSave);
//
// skip SelectStr
//
pwstrOld += wcslen(pwstrOld) + 1;
}
*pwstrNew = NUL;
if (pdwSize) *pdwSize = dwNewTableSize;
MemFree(pFormTrayTable);
return(pwstrNewTable); }
#ifndef KERNEL_MODE
BOOL BSaveAsOldVersionFormTrayTable( IN HANDLE hPrinter, IN FORM_TRAY_TABLE pwstrTable, IN DWORD dwTableSize )
/*++
Routine Description:
Save form-to-tray assignment table in NT 4.0 compatible format
Arguments:
hPrinter - Handle to the current printer pwstrTable - Points to new format form-tray table dwTableSize - Size of form-tray table to be saved, in bytes
Return Value:
TRUE if successful, FALSE if there is an error
--*/
{ DWORD dwOldTableSize; PWSTR pwstrNew, pwstrOld, pwstrOldTable; DWORD dwStatus;
//
// Find out how much memory to allocate for old format table
//
ASSERT(dwTableSize % sizeof(WCHAR) == 0 && dwTableSize >= sizeof(WCHAR)); pwstrNew = pwstrTable; dwOldTableSize = dwTableSize;
while (*pwstrNew != NUL) { //
// Skip tray name, form name
//
pwstrNew += wcslen(pwstrNew) + 1;
//
// If form name is "Not Available", NT4 drivers writes L"0" to
// the buffer so we do the same.
//
if (*pwstrNew == NUL) { dwOldTableSize += sizeof(WCHAR); pwstrNew++; } else pwstrNew += wcslen(pwstrNew) + 1;
//
// Extra 2 characters per entry for SelectStr
//
dwOldTableSize += 2*sizeof(WCHAR); }
if ((pwstrOldTable = MemAllocZ(dwOldTableSize)) == NULL) { ERR(( "Memory allocation failed\n")); return FALSE; }
//
// Copy the new tray, form to old format table
//
pwstrNew = pwstrTable; pwstrOld = pwstrOldTable;
while (*pwstrNew != NUL) { //
// Copy slot name, form name
//
PWSTR pwstrSave = pwstrNew;
pwstrNew += wcslen(pwstrNew) + 1;
memcpy(pwstrOld, pwstrSave, (DWORD)(pwstrNew - pwstrSave) * sizeof(WCHAR)); pwstrOld += (pwstrNew - pwstrSave);
//
// If form name is "Not Available", NT4 drivers writes L"0" to
// the buffer so we do the same.
//
if (*pwstrNew == NUL) { *pwstrOld++ = L'0'; *pwstrOld++ = NUL; pwstrNew++; } else { pwstrSave = pwstrNew; pwstrNew += wcslen(pwstrNew) + 1; memcpy(pwstrOld, pwstrSave, (DWORD)(pwstrNew - pwstrSave) * sizeof(WCHAR)); pwstrOld += (pwstrNew - pwstrSave); }
//
// Set SelectStr to be NUL
//
*pwstrOld++ = L'0'; *pwstrOld++ = NUL; }
*pwstrOld = NUL;
//
// Save to registry under old key
//
dwStatus = SetPrinterData(hPrinter, REGVAL_TRAYFORM_TABLE_RASDD, REG_MULTI_SZ, (PBYTE) pwstrOldTable, dwOldTableSize);
MemFree(pwstrOldTable); return (dwStatus == ERROR_SUCCESS); }
#endif // !KERNEL_MODE
|