Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

1161 lines
38 KiB

/***************************** MODULE HEADER ********************************
* regdata.c
* Functions dealing with the registry: read/write data as required.
*
* Copyright (C) 1992 Microsoft Corporation.
*
****************************************************************************/
#include "rasuipch.h"
#pragma hdrstop("rasuipch.h")
#define GLOBAL_MACS
#include "gblmac.h"
#undef GLOBAL_MACS
#include "fontfile.h"
#include "regkeys.h"
/*
* Global variables we use/need.
*/
extern HANDLE hHeap; /* Heap Handle */
extern DWORD gdwPrinterUpgrade ; /* Global Upgrade Flag */
#define BF_NM_SZ 128 /* Size of buffers for registry data */
#define BUFFER_SIZE 1024 /* Size of Working Buffer */
/****************************** Function Header *****************************
* bGetRegData
* Read in the data from the registry (if available), verify it and
* either accept it or generate new default values.
*
* RETURNS:
* TRUE/FALSE, FALSE for no data, or not for this printer.
*
* HISTORY:
* 11:13 on Tue 12 Jan 1993 -by- Lindsay Harris [lindsayh]
* Amend to return TRUE/FALSE, so as to force write of default data.
*
* 16:19 on Thu 02 Apr 1992 -by- Lindsay Harris [lindsayh]
* Convert to store EXTDEVMODE in registry
*
* 11:42 on Tue 17 Mar 1992 -by- Lindsay Harris [lindsayh]
* Moved from rasddui.c + switch to REG_DATA data structure.
*
* Originally written by SteveCat
*
****************************************************************************/
BOOL
bGetRegData(
HANDLE hPrinter, /* Handle for access to printer data */
EXTDEVMODE *pEDM, /* EXTDEVMODE to fill in. */
PWSTR pwstrModel, /* Model name, for validation */
PRASDDUIINFO pRasdduiInfo /* Rasddui common data */
)
{
int iI; /* Loop index */
int cForms; /* Count number of forms we found */
DWORD dwType; /* Registry access information */
DWORD cbNeeded; /* Extra parameter to GetPrinterData */
BOOL bRet = TRUE; /* Return code */
FORM_DATA *pForms;
WCHAR achBuf[ BF_NM_SZ ]; /* Read the form name from registry */
dwType = REG_SZ;
if( GetPrinterData( hPrinter, PP_MODELNAME, &dwType, (BYTE *)achBuf,
sizeof( achBuf ), &cbNeeded ) ||
wcscmp( achBuf, pwstrModel ) )
{
/*
* Bad news: either there is no model name, or it is wrong!
* Either way, drop this data and start from scratch.
*/
vDXDefault( &pEDM->dx, pdh, iModelNum );
return FALSE;
}
/*
* Obtain the what forms are in what bin information. The registry
* stores the form name of the form installed in each bin. So read
* the name, then match it to the forms data we have acquired
* from the spooler. Fill in the pfdForm array with the address
* of the FORM_DATA array for this particular form.
*/
// Read the old Keys only in case of Upgrade
if (( !bNewkeys(hPrinter) ) && ( gdwPrinterUpgrade == PPUPGRADE_OLD_DRIVER ) )
{
cForms = 0; /* Count them as we go */
for( iI = 0; iI < NumPaperBins; ++iI )
{
WCHAR achName[ 32 ];
wsprintf( achName, PP_PAP_SRC, iI );
achBuf[ 0 ] = '\0';
if( !GetPrinterData( hPrinter, achName, &dwType, (BYTE *)achBuf,
sizeof( achBuf ), &cbNeeded ) )
{
/* Got a name, so scan the forms data for this one. */
if( achBuf[ 0 ] )
{
/* Something there, so go look for it! */
for( pForms = pFD; pForms->pFI; ++pForms )
{
if( wcscmp( pForms->pFI->pName, achBuf ) == 0 )
{
/* Bingo! Remember it & skip the rest */
aFMBin[ iI ].pfd = pForms;
++cForms;
break;
}
}
}
}
}
/* If no forms, return FALSE, as being not setup */
bRet = cForms != 0;
/*
* The bulk of the data is stored in the EXTDEVMODE data which
* is stored in the registry. So, all we need to is retrieve
* it, and we have what we need. Of course, we need to verify
* that it is still legitimate for the driver!
*/
dwType = REG_BINARY; /* EXTDEVMODE is binary data */
if( GetPrinterData( hPrinter, PP_MAIN, &dwType,
(BYTE *)pEDM, sizeof( EXTDEVMODE ), &cbNeeded) ||
cbNeeded < sizeof( EXTDEVMODE ) )
{
/*
* Failed, so generate the default values for this particular
* printer.
*/
vDXDefault( &pEDM->dx, pdh, iModelNum );
bRet = FALSE;
}
else
{
/* Verify that the data is reasonable: set defaults if NBG */
if( pEDM->dx.sVer != DXF_VER )
{
vDXDefault( &pEDM->dx, pdh, iModelNum );
bRet = FALSE;
}
}
}
else if ( !bNewkeys(hPrinter) ) /* New Keys not present, generate default */
{
/*
* Failed, so generate the default values for this particular
* printer.
*/
vDXDefault( &pEDM->dx, pdh, iModelNum );
bRet = FALSE;
}
else /* New Keys Present */
{
/* Read Memory, Rasdd Flags and Font Carts */
if ( (bRet = ( bRegReadTrayFormTable (hPrinter, pRasdduiInfo) &&
bRegReadMemory (hPrinter, pEDM, pdh,pModel ) &&
bRegReadRasddFlags (hPrinter, pEDM) &&
bRegReadFontCarts (hPrinter, pEDM, hHeap, NumAllCartridges,
pFontCartMap) ) ) )
;
/* If any of the above calls return false setdefaults and return false */
if (!bRet)
{
vDXDefault( &pEDM->dx, pdh, iModelNum );
}
}
return bRet;
}
/**************************** Function Header *******************************
* bRegUpdate
* Write the changed data back into the registry.
*
* RETURNS:
* TRUE/FALSE, FALSE being a failure of the registry operations.
*
* HISTORY:
* 10:23 on Wed 13 Jan 1993 -by- Lindsay Harris [lindsayh]
* Add printer model name for detecting change of model.
*
* 16:20 on Thu 02 Apr 1992 -by- Lindsay Harris [lindsayh]
* Switch to storing EXTDEVMODE in the registry.
*
* 09:54 on Mon 16 Mar 1992 -by- Lindsay Harris [lindsayh]
* Moved from PrtPropDlgProc
*
****************************************************************************/
BOOL
bRegUpdate(
HANDLE hPrinter, /* Access to registry */
EXTDEVMODE *pEDM, /* The stuff to go */
PWSTR pwstrModel, /* Model name, if not NULL */
PRASDDUIINFO pRasdduiInfo /* Global data access */
)
{
/*
* Nothing especially exciting. Simply rummage through the various
* boxes and extract whatever information is there. Then save this
* data away in the registry.
*/
int iI; /* Loop index */
DWORD dwRet = TRUE;
BOOL bRet; /* Returns TRUE only for success */
DWORD dwErrCode = 0; /* Error Code from SetPrinterData */
bRet = TRUE;
/* Start with model name, if this is present */
if( pwstrModel )
{
/* The model name is used for validity checking */
if( dwErrCode = SetPrinterData( hPrinter, PP_MODELNAME, REG_SZ, (BYTE *)pwstrModel,
sizeof( WCHAR ) * (1 + wcslen( pwstrModel )) ) )
{
#if DBG
DbgPrint( "rasddui!SetPrinterData (model name) fails, error code = %ld\n", dwErrCode );
#endif
return FALSE;
}
}
/* Write the new Keys. */
if ( ( bRet = ((bRegUpdateTrayFormTable (hPrinter, pRasdduiInfo)) &&
(bRegUpdateMemory (hPrinter, pEDM, pRasdduiInfo)) &&
(bRegUpdateRasddFlags (hPrinter, pEDM))&&
(bRegUpdateFontCarts (hPrinter, pEDM, pRasdduiInfo)) ) ) )
;
return bRet ; /* TRUE for success */
}
/****************************** Function Header ****************************
* bCanUpdate
* Determine whether we can write data to the registry. Basically try
* writing, and if it fails, return FALSE!
*
* RETURNS:
* TRUE/FALSE, TRUE meaning we have permission to write data
*
* HISTORY:
* 12:54 on Thu 29 Apr 1993 -by- Lindsay Harris [lindsayh]
* First version.
*
****************************************************************************/
BOOL
bCanUpdate( hPrinter )
HANDLE hPrinter; /* Acces to printer data */
{
DWORD dwType; /* Type of data in registry */
DWORD cbNeeded; /* Room needed for name */
WCHAR awchName[ 128 ]; /* Model name - read then write */
dwType = REG_SZ;
if( GetPrinterData( hPrinter, PP_MODELNAME, &dwType, (BYTE *)awchName,
sizeof( awchName ), &cbNeeded ) ||
SetPrinterData( hPrinter, PP_MODELNAME, REG_SZ, (BYTE *)awchName,
sizeof( WCHAR ) * (1 + wcslen( awchName )) ) )
{
/* Something failed, so return FALSE */
return FALSE;
}
return TRUE; /* Must be OK to get here */
}
/**************************** Function Header ******************************
* iSetCountry
* Called to store the user's country code in the registry. This is
* used by the driver to decide upon the default form to use.
*
* RETURNS:
* Country code for the invoking user.
*
* HISTORY:
* 10:37 on Wed 02 Jun 1993 -by- Lindsay Harris [lindsayh]
* First incarnation.
*
***************************************************************************/
int
iSetCountry( hPrinter )
HANDLE hPrinter;
{
DWORD dwCountry; /* The country code */
#define USA_COUNTRYCODE 1
dwCountry = (DWORD)GetProfileInt( L"intl", L"icountry", USA_COUNTRYCODE );
/*
* This will mostly fail, as users don't have permission to change it.
* However, that is not important, so we make no comment about
* any errors that arise.
*/
SetPrinterData( hPrinter, PP_COUNTRY, REG_DWORD, (BYTE *)&dwCountry,
sizeof( dwCountry ) );
return (int)dwCountry;
}
/****************************** Function Header *****************************
* iAddtoBuffer
* Parameters : PWSTR, PWSTR, WORD;
*
* This function add the input string to a multi string buffer
* RETURNS:
* Ruturns the number of Unicode Chars copied,
* Zero in case of Failure.
* HISTORY:
*
* 6:30 on Mon 13 March 95 by Ganesh Pandey [ganeshp]
*
****************************************************************************/
int
iAddtoBuffer(pwstrDest,pwstrSrc,wRemBuffSize)
PWSTR pwstrDest; /* Destination */
PWSTR pwstrSrc; /* Source */
WORD wRemBuffSize; /* Remaining Buffer size in WCHAR */
{
int iRet = 0;
if ( (wRemBuffSize + wcslen(pwstrSrc)) < BUFFER_SIZE )
{
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!iAddtoBuffer : Source Length is %d\n",wcslen(pwstrSrc)) );
/* The return Count Doesn't include '/0' */
iRet = wsprintf((LPWSTR)pwstrDest,L"%s", pwstrSrc) + 1 ;
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!iAddtoBuffer : %d chars written\n",iRet) );
}
else
{
#if DBG
DbgPrint("Rasddui!iAddtoBuffer : Not Enough Buffer\n");
DbgBreakPoint();
#endif
iRet = 0; /* Shouldn't Happen */
}
return(iRet) ;
}
/****************************** Function Header *****************************
* bRegUpdateTrayFormTable
* Parameters : HANDLE hPrinter;
*
* Update the TrayFormTable data in the registry (if available).
*
* RETURNS:
* TRUE/FALSE, FALSE if can't update the registry,
* TRUE if registry is successfuly updated
*
* HISTORY:
*
* 6:30 on Mon 13 March 95 by Ganesh Pandey [ganeshp]
*
****************************************************************************/
BOOL
bRegUpdateTrayFormTable (
HANDLE hPrinter,
PRASDDUIINFO pRasdduiInfo /* Global data access */
)
{
int iRemBuffSize = 0 ; /* Used size of the Buffer */
int iI ; /* Index Variable */
WCHAR * pwchBuffPtr ; /* Current buffer Pointer */
WCHAR awchBuffer[BUFFER_SIZE] ; /* Working Buffer for Reading and Writing
from/in Registry */
DWORD dwErrCode = 0; /* Error Code from SetPrinterData */
ZeroMemory(awchBuffer,BUFFER_SIZE * sizeof(WCHAR) );
pwchBuffPtr = awchBuffer;
for( iI = 0; iI < NumPaperBins; iI++ )
{
PWSTR cpName;
WORD wIncr = 0; /*Increment Value */
if( aFMBin[ iI ].pfd )
{
/* Have a form selected, so write it out */
cpName = aFMBin[ iI ].pfd->pFI->pName;
}
else
cpName = PP_NOFORM ;/* No form selected */
if(!(wIncr = iAddtoBuffer(pwchBuffPtr,
&(aFMBin[iI].awchPaperSrcName),iRemBuffSize) ) )
return(FALSE);
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!bRegUpdateTrayFormTable:PaperSrcName = %ws\n",pwchBuffPtr));
//iAddtoBuffer returns number of chars written, not number of bytes.
iRemBuffSize += wIncr ;
pwchBuffPtr += wIncr ;
if(!(wIncr = iAddtoBuffer(pwchBuffPtr,cpName,iRemBuffSize) ) )
return(FALSE);
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!bRegUpdateTrayFormTable:FormName = %ws\n",pwchBuffPtr));
iRemBuffSize += wIncr ;
pwchBuffPtr += wIncr ;
if(!(wIncr = iAddtoBuffer(pwchBuffPtr,PP_MULTIFORMTRAYSELECT0,iRemBuffSize) ) )
return(FALSE);
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!bRegUpdateTrayFormTable:Select String = %ws\n",pwchBuffPtr));
iRemBuffSize += wIncr ;
pwchBuffPtr += wIncr ;
}
*pwchBuffPtr++ = UNICODE_NULL;
iRemBuffSize++;
if( dwErrCode = SetPrinterData( hPrinter,PP_TRAYFORMTABLE, REG_MULTI_SZ,
(BYTE *)awchBuffer,
(sizeof( WCHAR )* iRemBuffSize) ) )
{
RASUIDBGP(DEBUG_ERROR,( "Rasddui!SetPrinterData(forms) fails: errcode = %ld\n",dwErrCode ) );
SetLastError(dwErrCode);
return(FALSE);
}
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!bRegUpdateTrayFormTable:Size of buffer written = %d\n",(sizeof( WCHAR )* iRemBuffSize)) );
return(TRUE);
}
/****************************** Function Header *****************************
* bRegReadTrayFormTable
* Parameters : HANDLE hPrinter;
*
* Read the TrayFormTable data from the registry (if available),
*
* RETURNS:
* TRUE/FALSE, FALSE if not able to read from registry,
* TRUE if able to read from registry
*
* HISTORY:
*
* 6:30 on Mon 13 March 95 by Ganesh Pandey [ganeshp]
*
****************************************************************************/
BOOL
bRegReadTrayFormTable (
HANDLE hPrinter,
PRASDDUIINFO pRasdduiInfo /* Global data access */
)
{
int iI; /* Loop index */
int cForms; /* Count number of forms we found */
DWORD dwType; /* Registry access information */
DWORD cbNeeded; /* Extra parameter to GetPrinterData */
BOOL bRet; /* Return code */
FORM_DATA *pForms;
int iRemBuffSize = 0 ; /* Used size of the Buffer */
WCHAR * pwchBuffPtr ; /* buffer Pointer */
WCHAR * pwchHeapPtr = NULL; /*Heap Pointer,Needed for Freeing */
DWORD dwErrCode = 0; /* Error Code from GetPrinterData */
WCHAR awchBuffer[BUFFER_SIZE] ; /* Working Buffer for Reading and Writing
from/in Registry */
ZeroMemory(awchBuffer,BUFFER_SIZE * sizeof(WCHAR) );
pwchBuffPtr = awchBuffer;
/*
* Obtain the what forms are in what bin information. The registry
* stores the form name of the form installed in each bin. So read
* the name, then match it to the forms data we have acquired
* from the spooler. Fill in the pfdForm array with the address
* of the FORM_DATA array for this particular form.
*/
dwType = REG_MULTI_SZ;
cForms = 0; /* Count them as we go */
if( ( dwErrCode = GetPrinterData( hPrinter, PP_TRAYFORMTABLE, &dwType, (BYTE *)pwchBuffPtr,
sizeof(awchBuffer), &cbNeeded ) ) != ERROR_SUCCESS )
{
if( (dwErrCode != ERROR_INSUFFICIENT_BUFFER) &&
(dwErrCode != ERROR_MORE_DATA) )
{
RASUIDBGP(DEBUG_ERROR,( "Rasddui!bRegReadTrayFormTable:GetPrinterData(Trayforms First Call) fails: errcode = %ld\n",dwErrCode) );
SetLastError(dwErrCode);
return(FALSE);
}
else if(!(pwchHeapPtr = pwchBuffPtr = (WCHAR *)HeapAlloc( hHeap, HEAP_ZERO_MEMORY, cbNeeded )) )
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!HeapAlloc(Trayforms) failed\n") );
return(FALSE);
}
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!ReadTrayFormTable:Size of buffer needed = %d\n",cbNeeded));
if( ( dwErrCode = GetPrinterData( hPrinter, PP_TRAYFORMTABLE, &dwType, (BYTE *)pwchBuffPtr,
cbNeeded, &cbNeeded ) ) != ERROR_SUCCESS )
{
RASUIDBGP(DEBUG_ERROR,( "Rasddui!bRegReadTrayFormTable:GetPrinterData(Trayforms Second Call) fails: errcode = %ld\n",dwErrCode) );
SetLastError(dwErrCode);
/* Free the Heap */
if( pwchHeapPtr )
HeapFree( hHeap, 0, (LPSTR)pwchHeapPtr );
return(FALSE);
}
}
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!ReadTrayFormTable:Size of buffer read = %d\n",cbNeeded));
/* iRemBuffSize is number of WCHAR */
iRemBuffSize = cbNeeded / sizeof(WCHAR);
for( iI = 0; iI < NumPaperBins; ++iI )
{
WCHAR awchFormName[ MAXFORMNAMELEN ]; /* Form Name */
WCHAR awchTrayName[ MAXPAPSRCNAMELEN ]; /* Local Buffer for Tray name */
WCHAR awchSelectStr[ MAXSELSTRLEN ] ; /* Select String */
ZeroMemory(awchFormName,sizeof(awchFormName) );
ZeroMemory(awchTrayName,sizeof(awchTrayName) );
ZeroMemory(awchSelectStr,sizeof(awchSelectStr) );
if( iRemBuffSize)
{
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!ReadTrayFormTable:PaperSrcName in buffer = %ws\n",pwchBuffPtr));
vGetFromBuffer(awchTrayName,&pwchBuffPtr,&iRemBuffSize);
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!ReadTrayFormTable:Retrieved PaperSrcName = %ws\n",awchTrayName));
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!ReadTrayFormTable:FormName in buffer = %ws\n",pwchBuffPtr));
vGetFromBuffer(awchFormName,&pwchBuffPtr,&iRemBuffSize);
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!ReadTrayFormTable:Retrieved FormName = %ws\n",awchFormName));
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!ReadTrayFormTable:Select string in buffer = %ws\n",pwchBuffPtr));
vGetFromBuffer(awchSelectStr,&pwchBuffPtr,&iRemBuffSize);
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!ReadTrayFormTable:Retrieved Select String is %ws\n",awchSelectStr));
}
else
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!bRegReadTrayFormTable: Unexpected End of TrayFormTable, size was %d bytes\n", cbNeeded) );
/* Free the buffer */
if( pwchHeapPtr )
HeapFree( hHeap, 0, (LPSTR)pwchHeapPtr );
return(FALSE);
}
/* Got a name, so scan the forms data for this one.
* Check if there is a valid form name. we store L"0" if form is
* not installed for the papersource.
*/
if( (wcscmp((PCWSTR)(&(aFMBin[iI].awchPaperSrcName)), (PCWSTR)awchTrayName ) == 0) &&
(wcscmp((PCWSTR)awchFormName, PP_NOFORM ) != 0) )
{
/* Something there, so go look for it! */
for( pForms = pFD; pForms->pFI; ++pForms )
{
if( (wcscmp((PCWSTR) pForms->pFI->pName, (PCWSTR)awchFormName ) == 0) )
{
/* Bingo! Remember it & skip the rest */
aFMBin[ iI ].pfd = pForms;
++cForms;
break;
}
}
}
}
/* If no forms, return FALSE, as being not setup */
bRet = (cForms != 0) ;
/* Free the Heap */
if( pwchHeapPtr )
HeapFree( hHeap, 0, (LPSTR)pwchHeapPtr );
return(bRet);
}
/****************************** Function Header *****************************
* bRegUpdateMemory
* Parameters : HANDLE hPrinter; PEDM *pEDM;
*
* Update the FreeMem data in the registry (if available),
*
* RETURNS:
* TRUE/FALSE, FALSE if can't update the registry,
* TRUE if registry is successfuly updated
*
* HISTORY:
*
* 6:30 on Mon 13 March 95 by Ganesh Pandey [ganeshp]
*
****************************************************************************/
BOOL
bRegUpdateMemory (
HANDLE hPrinter,
PEDM pEDM,
PRASDDUIINFO pRasdduiInfo /* Global data access */
)
{
/*
* Scan through the pairs of memory data stored in the GPC heap.
* The second of each pair is the amount of memory to display, while
* the first represents the amount to use internally. The list is
* zero terminated; -1 represents a value of 0Kb.
*/
int cMem; /* Count number of entries */
DWORD tmp1;
INT dmMemory = -1; /* default value to set, if model doesn't
* have memory list */
WORD iSel;
WORD *pw;
DWORD *pdw;
BOOL G2; //GPC Version 2 ?
DWORD dwErrCode = 0; /* Error Code from SetPrinterData */
/* Number conversion */
iSel = pEDM->dx.dmMemory;
G2 = pdh->wVersion < GPC_VERSION3;
pdw = (DWORD *)((BYTE *)pdh + pdh->loHeap +
pModel->rgoi[ MD_OI_MEMCONFIG ] );
pw = (WORD *)pdw; //for GPC2 types
for( cMem = 0; tmp1 = (DWORD)(G2 ? *pw:DWFETCH(pdw)) ; pw += 2, pdw +=2, ++cMem )
{
DWORD tmp2 ;
tmp2 = (DWORD)(G2 ? *(pw +1):DWFETCH(pdw+1));
if( tmp1 == -1 || tmp1 == 1 ||tmp2 == -1 )
dmMemory = 0;
if( cMem == iSel )
{
dmMemory = tmp1;
}
}
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!bRegUpdateMemory:dmMemory = %d\n",dmMemory));
if( dwErrCode = SetPrinterData( hPrinter,PP_MEMORY, REG_BINARY,(BYTE *)&dmMemory, sizeof( dmMemory ) ) )
{
RASUIDBGP(DEBUG_ERROR,( "Rasddui!SetPrinterData(PP_MEMORY) fails: errcode = %ld\n", dwErrCode ));
SetLastError(dwErrCode);
return(FALSE);
}
return(TRUE);
}
/****************************** Function Header *****************************
* bRegUpdateRasddFlags
* Parameters : HANDLE hPrinter; PEDM *pEDM;
*
* Update the RasddFlags data in the registry (if available),
*
* RETURNS:
* TRUE/FALSE, FALSE if can't update the registry,
* TRUE if registry is successfuly updated
*
* HISTORY:
*
* 6:30 on Mon 13 March 95 by Ganesh Pandey [ganeshp]
*
****************************************************************************/
BOOL
bRegUpdateRasddFlags (hPrinter, pEDM)
HANDLE hPrinter;
PEDM pEDM;
{
short sRasddFlags = 0; /* default value to set */
DWORD dwErrCode = 0; /* Error Code from SetPrinterData */
sRasddFlags = pEDM->dx.sFlags;
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!bRegUpdateRasddFlags:pEDM->dx.sFlags = %x\n",
pEDM->dx.sFlags));
if(dwErrCode = SetPrinterData( hPrinter,PP_RASDD_SFLAGS, REG_BINARY,(BYTE *)&sRasddFlags,
sizeof( sRasddFlags ) ) )
{
RASUIDBGP(DEBUG_ERROR,( "Rasddui!SetPrinterData(PP_RASDD_SFLAGS) fails: errcode = %ld\n",dwErrCode ));
SetLastError(dwErrCode);
return(FALSE);
}
return(TRUE);
}
/****************************** Function Header *****************************
* bRegUpdateFontCarts
* Parameters : HANDLE hPrinter; PEDM *pEDM;
*
* Update the FontCart data in the registry (if available),
*
* RETURNS:
* TRUE/FALSE, FALSE if can't update the registry,
* TRUE if registry is successfuly updated
*
* HISTORY:
*
* 6:30 on Mon 13 March 95 by Ganesh Pandey [ganeshp]
*
****************************************************************************/
BOOL
bRegUpdateFontCarts (
HANDLE hPrinter,
PEDM pEDM,
PRASDDUIINFO pRasdduiInfo /* Global data access */
)
{
int iRemBuffSize = 0 ; /* Used size of the Buffer */
int iI, iJ ; /* Index Variable */
WCHAR * pwchBuffPtr ; /* Current buffer Pointer */
WORD wIncr = 0; /*Increment Value */
FONTCARTMAP *pTmpFontCartMap ; /* Temp Pointer */
DWORD dwErrCode = 0; /* Error Code from SetPrinterData */
WCHAR awchBuffer[BUFFER_SIZE] ; /* Working Buffer for Reading and Writing
from/in Registry */
ZeroMemory(awchBuffer,BUFFER_SIZE * sizeof(WCHAR) );
pwchBuffPtr = awchBuffer;
RASUIDBGP(DEBUG_TRACE_PP,("\nRasddui!bRegUpdateFontCarts:pEDM->dx.dmNumCarts = %d\n",pEDM->dx.dmNumCarts));
if(pEDM->dx.dmNumCarts)
{
for( iI = 0; iI < pEDM->dx.dmNumCarts ; iI++ )
{
pTmpFontCartMap = pFontCartMap;
for( iJ = 0; iJ < NumAllCartridges ; iJ++,pTmpFontCartMap++ )
{
if (pTmpFontCartMap->iFontCrtIndex == pEDM ->dx.rgFontCarts[iI])
break;
}
if(!(wIncr = iAddtoBuffer(pwchBuffPtr,
(PWSTR)(&(pTmpFontCartMap->awchFontCartName)),iRemBuffSize) ) )
return(FALSE);
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!bRegUpdateFontCarts:FontCartName = %ws\n",pwchBuffPtr));
//iAddtoBuffer returns number of chars written, not number of bytes.
iRemBuffSize += wIncr ;
pwchBuffPtr += wIncr ;
}
}
else
{
if(!(wIncr = iAddtoBuffer(pwchBuffPtr, PP_NOCART,iRemBuffSize) ) )
return(FALSE);
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!bRegUpdateFontCarts:FontCartName = %ws\n",pwchBuffPtr));
//iAddtoBuffer returns number of chars written, not number of bytes.
iRemBuffSize += wIncr ;
pwchBuffPtr += wIncr ;
}
/* The Buffer ends with Two Nulls */
*pwchBuffPtr++ = UNICODE_NULL;
iRemBuffSize++;
if( dwErrCode = SetPrinterData( hPrinter,PP_FONTCART, REG_MULTI_SZ,
(BYTE *)awchBuffer,
(sizeof( WCHAR )* iRemBuffSize) ) )
{
RASUIDBGP(DEBUG_ERROR,( "Rasddui!SetPrinterData(FontCart) fails: errcode = %ld\n", dwErrCode ));
SetLastError(dwErrCode);
return(FALSE);
}
RASUIDBGP(DEBUG_TRACE_PP,("Rasddui!bRegUpdateFontCarts:Size of buffer written = %d\n",(sizeof( WCHAR )* iRemBuffSize)) );
return(TRUE);
}
/****************************** Function Header *****************************
* bRegUpdateDefaultsOrCache
* Parameters :
* pPrinterName : Remote Printer Name
* DriverEvent : Driver event.
* RETURNS:
* TRUE/FALSE, FALSE if can't update the registry,
* TRUE if registry is successfuly updated
*
* HISTORY:
*
* 17:57:59 on 5/6/1996 -by- Ganesh Pandey [ganeshp]
* Created it.
*
*
****************************************************************************/
BOOL
bRegUpdateDefaultsOrCache(
LPWSTR pPrinterName,
int DriverEvent
)
{
BOOL bRet = FALSE;
HANDLE hPrinter = NULL;
PRINTER_DEFAULTS PrinterDefault = {NULL, NULL,PRINTER_ACCESS_ADMINISTER};
PRASDDUIINFO pRasdduiInfo = NULL; /* Common UI Data */
/* For Cache update don't open the printer as Admin */
if (DriverEvent == PRINTER_EVENT_CACHE_REFRESH)
PrinterDefault.DesiredAccess = 0;
/* Open the printer */
if ( OpenPrinter(pPrinterName, &hPrinter , &PrinterDefault) )
{
/* Allocate the global data structure */
if ((pRasdduiInfo = pGetRasdduiInfo()) )
{
/*
* The spooler gives us the data we need. This basically amounts
* to the printer's name, model and the filename of the data file
* containing printer characterisation data.
*/
if ( (bPIGet( &(pRasdduiInfo->PI), hHeap, hPrinter)) &&
(InitReadRes( hHeap, &(pRasdduiInfo->PI), pRasdduiInfo) ) &&
(GetResPtrs(pRasdduiInfo)) )
{
if (DriverEvent == PRINTER_EVENT_INITIALIZE)
{
/* Check if there is any PrinterData or not. For model name change
* there will be printerdata in the registry.
*/
if ( bNewkeys(hPrinter) )
{
/* Delete The Halftone info Key, as for default this is not set */
//if ( DeletePrinterData(hPrinter, REGKEY_CUR_DEVHTINFO) != ERROR_SUCCESS )
{
/* Set a NULL halftone in the registry as default. No need to
* to check the return value.
*/
SetPrinterData( hPrinter, REGKEY_CUR_DEVHTINFO, REG_BINARY,
(LPBYTE)&(pRasdduiInfo->dhtiDef), sizeof(DWORD) ) ;
}
}
/*
* There can be some data or no data. In either case, we wish to
* write out valid default data for this model,including default
* forms data etc. Now is the time to do that.
*/
if ( bAddMiniForms( hPrinter, FALSE, pRasdduiInfo ) &&
bInitForms( hPrinter , pRasdduiInfo) )
{
iSetCountry( hPrinter ); /* Set country code for later */
/*
* Set the default forms info into the various data fields we
* are using.
*/
vSetDefaultForms( pRasdduiInfo->pEDM, hPrinter, pRasdduiInfo );
bRet = bRegUpdate( hPrinter, pRasdduiInfo->pEDM, pRasdduiInfo->PI.pwstrModel,
pRasdduiInfo );
}
}
#if DO_LATER //case PRINTER_EVENT_CACHE_REFRESH
else if ( DriverEvent == PRINTER_EVENT_CACHE_REFRESH )
{
PWSTR pwstrDataFileName; /* Minidriver dll name */
PWSTR pwstrSourceFileName; /* Local Buffer for Qualified Source name*/
PWSTR pwstrFontFile; /* Font File name */
DWORD dwSize; /* Size of buffer */
PWSTR pwLocalDir = L"c:\rasddfiles";
WCHAR awchDestFileName[MAX_PATH] ;
int iPtOff; /* Location of '.' */
pwstrDataFileName = pRasdduiInfo->PI.pwstrDataFileName;
TRACE(PRINTER_EVENT_CACHE_REFRESH);
PRINTVAL(pwstrDataFileName, %ws);
/*
* We do need firstly to generate the file name of interest.
* This is based on the data file name for this type of
* printer. Allocate more storage than is indicated: we MAY
* want to add a prefix to the file name rather than replace
* the existing one.
*/
dwSize = sizeof( WCHAR ) * (wcslen( pwstrDataFileName ) + 1 + 4);
if( pwstrSourceFileName = (PWSTR)HeapAlloc( hHeap, 0, dwSize ) )
{
/* Got the memory, so fiddle the file name to our standard */
int iPtOff; /* Location of '.' */
wcscpy( pwstrSourceFileName, pwstrDataFileName );
/*
* Go looking for a '.' - if not found, append to string.
*/
iPtOff = wcslen( pwstrSourceFileName );
while( --iPtOff > 0 )
{
if( *(pwstrSourceFileName + iPtOff) == (WCHAR)'.' )
break;
}
++iPtOff; /* Skip the period */
/* Generate the name and map the file */
wcscpy( pwstrSourceFileName + iPtOff, FILE_FONTS );
PRINTVAL(pwstrSourceFileName, %ws);
pwstrFontFile = wcsrchr( pwstrSourceFileName, L'\\' );
PRINTVAL(pwstrFontFile, %ws);
wcscpy(awchDestFileName,pwLocalDir);
PRINTVAL(awchDestFileName, %ws);
wcscat(awchDestFileName,pwstrFontFile);
PRINTVAL(awchDestFileName, %ws);
/* Check if the Font file exist */
if ( GetFileAttributes(pwstrSourceFileName) != 0xffffffff )
{
TRACE(\nFont File on Server Exist);
/* check if the local dir exist */
if (GetFileAttributes(pwLocalDir) != 0xffffffff )
{
if ( CreateDirectory(pwLocalDir,NULL) )
{
TRACE(Directory Created);
}
else
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!bRegUpdateDefaultsOrCache: CreateDirectory Failed with error code %d\n",GetLastError()) );
}
}
else
TRACE(Directory already exist);
if ( !CopyFile(pwstrSourceFileName, awchDestFileName, FALSE) )
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!bRegUpdateDefaultsOrCache: CopyFile Failed with error code %d\n",GetLastError()) );
}
/* Directory exist, copy the file */
}
/* Do Nothing */
bRet = TRUE;
}
else
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!bRegUpdateDefaultsOrCache: Allocation failed; pwstrSourceFileName is NULL\n") );
}
}
#endif //DO_LATER
}
}
else
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!bRegUpdateDefaultsOrCache: Allocation failed; pRasdduiInfo is NULL\n") );
ClosePrinter(hPrinter);
return FALSE;
}
}
else
{
RASUIDBGP(DEBUG_ERROR,("Rasddui!bRegUpdateDefaultsOrCache:OpenPrinter Failed Error is %d\n",GetLastError()) );
hPrinter = NULL;
return FALSE;
}
TermReadRes(pRasdduiInfo); /* Unload the DLL etc */
vEndForms(pRasdduiInfo);
bPIFree( &(pRasdduiInfo->PI), hHeap,pRasdduiInfo );
HeapFree(hHeap,0, pRasdduiInfo);
ClosePrinter(hPrinter);
return bRet;
}
/****************************** Function Header *****************************
* DrvPrinterEvent
* Parameters :
* pPrinterName: Printer Name
* DriverEvent : Driver Event.
* Flags : UI or no UI.
* lParam : For future use.
* RETURNS:
* TRUE/FALSE, FALSE if can't update the registry,
* TRUE if registry is successfuly updated
*
* HISTORY:
*
* 17:57:59 on 5/6/1996 -by- Ganesh Pandey [ganeshp]
* Created it.
*
*
****************************************************************************/
BOOL
DrvPrinterEvent(
LPWSTR pPrinterName,
int DriverEvent,
DWORD Flags,
LPARAM lParam
)
{
BOOL bRet = FALSE;
HANDLE hPrinter = NULL;
PRINTER_DEFAULTS PrinterDefault = {NULL, NULL,PRINTER_ACCESS_ADMINISTER};
switch ( DriverEvent )
{
case PRINTER_EVENT_INITIALIZE:
//DO_LATER case PRINTER_EVENT_CACHE_REFRESH:
bRet = bRegUpdateDefaultsOrCache(pPrinterName, DriverEvent);
break;
case PRINTER_EVENT_CACHE_REFRESH:
case PRINTER_EVENT_ADD_CONNECTION:
case PRINTER_EVENT_DELETE_CONNECTION:
case PRINTER_EVENT_DELETE:
case PRINTER_EVENT_CACHE_DELETE:
bRet = TRUE;
break;
}
return bRet;
}