294 lines
6.3 KiB
C
294 lines
6.3 KiB
C
/*++
|
||
|
||
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
|
||
|