|
|
/*++
Copyright (c) 1998-2000 Microsoft Corporation
Module Name:
w32drprn Abstract:
This module defines the parent for the Win32 client-side RDP printer redirection "device" class hierarchy, W32DrPRN.
Author:
Tad Brockway 3/23/99
Revision History:
--*/
#ifndef __W32DRPRN_H__
#define __W32DRPRN_H__
#include "drprn.h"
#include "drdevasc.h"
///////////////////////////////////////////////////////////////
//
// Defines
//
#define REG_RDPDR_PRINTER_CACHE_DATA _T("PrinterCacheData")
#define REG_RDPDR_AUTO_PRN_CACHE_DATA _T("AutoPrinterCacheData")
#define REG_RDPDR_CACHED_PRINTERS \
_T("Software\\Microsoft\\Terminal Server Client\\Default\\AddIns\\RDPDR") #define REG_TERMINALSERVERCLIENT \
_T("Software\\Microsoft\\Terminal Server Client") #define REG_RDPDR_PRINTER_MAXCACHELEN _T("MaxPrinterCacheLength")
#define DEFAULT_MAXCACHELEN 500 //500K bytes
#ifdef OS_WINCE
#define REG_RDPDR_WINCE_DEFAULT_PRN _T("WBT\\Printers\\Default")
#endif
///////////////////////////////////////////////////////////////
//
// W32DrPRN
//
//
class W32DrPRN : public W32DrDeviceAsync, public DrPRN { protected:
//
// Port Name
//
TCHAR _portName[MAX_PATH]; //
// Maximum cache data length.
// This will be the same for all printers
//
static DWORD _maxCacheDataSize;
//
// IO Processing Functions
//
// This subclass of DrDevice handles the following IO requests. These
// functions may be overridden in a subclass.
//
// pIoRequestPacket - Request packet received from server.
// packetLen - Length of the packet
//
virtual VOID MsgIrpDeviceControl( IN PRDPDR_IOREQUEST_PACKET pIoRequestPacket, IN UINT32 packetLen ){ // We just fail IOCTL's. That's okay for now because the
// server-side print drivers don't expect us to succeed them
// anyway.
DefaultIORequestMsgHandle(pIoRequestPacket, STATUS_UNSUCCESSFUL); };
//
// Printer Caching Functions. These are currently static
// because printer caching wasn't designed around a device
// object in the original design for RDPDR client-side device
// redirection.
//
static W32DrPRN *ResolveCachedPrinter( ProcObj *procObj, DrDeviceMgr *deviceMgr, HKEY hParentKey, LPTSTR printerName );
static ULONG AddPrinterCacheInfo( PRDPDR_PRINTER_ADD_CACHEDATA pAddPrinterData, UINT32 maxDataLen );
static ULONG DeletePrinterCacheInfo( PRDPDR_PRINTER_DELETE_CACHEDATA pDeletePrinterData, UINT32 maxDataLen );
static ULONG UpdatePrinterCacheInfo( PRDPDR_PRINTER_UPDATE_CACHEDATA pUpdatePrinterData, UINT32 maxDataLen );
static ULONG RenamePrinterCacheInfo( PRDPDR_PRINTER_RENAME_CACHEDATA pRenamePrinterData, UINT32 maxDataLen );
static VOID RenamePrinter(LPTSTR pwszOldname, LPTSTR pwszNewname);
static DWORD GetMaxCacheDataSize() {return _maxCacheDataSize;}
#ifdef OS_WINCE
static ULONG GetCachedDataSize( HKEY hPrinterKey ); static ULONG ReadCachedData( HKEY hPrinterKey, UCHAR *pBuf, ULONG *pulSize ); static ULONG WriteCachedData( HKEY hPrinterKey, UCHAR *pBuf, ULONG ulSize ); #endif
public:
//
// Constructor/Destructor
//
W32DrPRN(ProcObj *processObject, const DRSTRING printerName, const DRSTRING driverName, const DRSTRING portName, const DRSTRING pnpName, BOOL isDefaultPrinter, ULONG id, const TCHAR *devicePath=TEXT(""));
//
// Process device cache info packet.
//
static VOID ProcessPrinterCacheInfo( PRDPDR_PRINTER_CACHEDATA_PACKET pCachePacket, UINT32 maxDataLen );
//
// Return the object name.
//
virtual DRSTRING GetName() { DC_BEGIN_FN("W32DrPRN::GetName"); ASSERT(IsValid()); DC_END_FN(); return GetPrinterName(); }
//
// Return the size (in bytes) of a device announce packet for
// this device.
//
virtual ULONG GetDevAnnounceDataSize();
//
// Add a device announce packet for this device to the input
// buffer.
//
virtual VOID GetDevAnnounceData(IN PRDPDR_DEVICE_ANNOUNCE buf);
//
// Return whether this class instance is valid.
//
virtual BOOL IsValid() { return(W32DrDevice::IsValid() && DrPRN::IsValid()); }
//
// Get/set the printer port name.
//
virtual BOOL SetPortName(const LPTSTR name); virtual const LPTSTR GetPortName();
//
// Return the class name.
//
virtual DRSTRING ClassName() { return TEXT("W32DrPRN"); } };
///////////////////////////////////////////////////////////////
//
// W32DrPRN Inline Members
//
inline BOOL W32DrPRN::SetPortName(const LPTSTR name) { memset(_portName, 0, sizeof(_portName)); _tcsncpy(_portName, name, MAX_PATH-1); return TRUE; }
inline const LPTSTR W32DrPRN::GetPortName() { return _portName; }
#endif
|