windows-nt/Source/XPSP1/NT/printscan/ui/printui/browse.hxx
2020-09-26 16:20:57 +08:00

646 lines
16 KiB
C++

/*++
Copyright (C) Microsoft Corporation, 1990 - 1999
All rights reserved
Module Name:
browse.hxx
Abstract:
Header file for browse for pinter dialog
Author:
Dave Snipp (DaveSn) 15 Mar 1991
Steve Kiraly (SteveKi) 1 May 1998
Environment:
User Mode Win32
Revision History:
1 May 1998 move from winspoo.drv to printui.dll
--*/
#ifndef _BROWSE_HXX_
#define _BROWSE_HXX_
/*
* IDs passed to WinHelp:
*/
#define IDH_PRT_CTP_PRINTER 76000 // Printer
#define IDH_PRT_CTP_SHARED_PRINTERS 76010 // Shared Printers
#define IDH_PRT_CTP_EXPAND_DEFAULT 76020 // Expand by Default checkbox
#define IDH_PRT_CTP_DESCRIPTION 76030 // Printer Info group--Description
#define IDH_PRT_CTP_STATUS 76040 // Printer Info group--Status
#define IDH_PRT_CTP_DOCS_WAITING 76050 // Printer Info group--Documents Waiting
#define IDH_NOHELP ((DWORD)-1) // Disables Help for a control (for help compiles)
/* Space for 21x16 status bitmaps:
*/
#define STATUS_BITMAP_WIDTH 21
#define STATUS_BITMAP_HEIGHT 16
#define STATUS_BITMAP_MARGIN 4 /* (either side) */
#define STATUS_BITMAP_SPACE ( STATUS_BITMAP_WIDTH + ( 2 * STATUS_BITMAP_MARGIN ) )
#define PRINTER_STATUS_UNKNOWN 8000
#define BM_IND_CONNECTTO_DOMPLUS 0
#define BM_IND_CONNECTTO_DOMEXPAND ( 2 * STATUS_BITMAP_HEIGHT )
#define BROWSE_THREAD_ENUM_OBJECTS 1
#define BROWSE_THREAD_GET_PRINTER 2
#define BROWSE_THREAD_TERMINATE 4
#define BROWSE_THREAD_DELETE 8
#define WM_ENUM_OBJECTS_COMPLETE WM_APP+0x10
#define WM_GET_PRINTER_COMPLETE WM_APP+0x11
#define WM_GET_PRINTER_ERROR WM_APP+0x12
#define WM_QUIT_BROWSE WM_APP+0x14
#define EMPTY_CONTAINER (PCONNECTTO_OBJECT)(-1)
#define BACKGROUND 0x0000FF00 // bright green
#define BACKGROUNDSEL 0x00FF00FF // bright magenta
#define BUTTONFACE 0x00C0C0C0 // bright grey
#define BUTTONSHADOW 0x00808080 // dark grey
#define SPOOLER_VERSION 3
//
// Define some constants to make parameters to CreateEvent a tad less obscure:
//
#define EVENT_RESET_MANUAL TRUE
#define EVENT_RESET_AUTOMATIC FALSE
#define EVENT_INITIAL_STATE_SIGNALED TRUE
#define EVENT_INITIAL_STATE_NOT_SIGNALED FALSE
#define OUTPUT_BUFFER_LENGTH 512
#define COLUMN_SEPARATOR_WIDTH 4
#define COLUMN_WIDTH 180
#define BROWSE_STATUS_INITIAL 0x00000001
#define BROWSE_STATUS_EXPAND 0x00000002
#define GET_BROWSE_DLG_DATA(hwnd) \
reinterpret_cast<PBROWSE_DLG_DATA>(GetWindowLongPtr(hwnd, GWLP_USERDATA))
#define SET_BROWSE_DLG_DATA(hwnd, pBrowseDlgData) \
SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<ULONG_PTR>(pBrowseDlgData))
#define GET_CONNECTTO_DATA( hwnd ) (GET_BROWSE_DLG_DATA( hwnd ))->pConnectToData
#define ADDCOMBOSTRING(hwnd, id, string) \
SendDlgItemMessage(hwnd, id, CB_ADDSTRING, 0, (LONG)string)
#define INSERTCOMBOSTRING(hwnd, id, i, string) \
SendDlgItemMessage(hwnd, id, CB_INSERTSTRING, i, (LONG)string)
#define SETCOMBOSELECT(hwnd, id, i) \
SendDlgItemMessage(hwnd, id, CB_SETCURSEL, (WPARAM)i, 0L)
#define GETCOMBOSELECT(hwnd, id) \
SendDlgItemMessage(hwnd, id, CB_GETCURSEL, 0, 0L)
#define GETCOMBOTEXT(hwnd, id, i, string) \
SendDlgItemMessage(hwnd, id, CB_GETLBTEXT, (WPARAM)i, (LONG)string)
#define SETLISTCOUNT(hwnd, Count) \
SendDlgItemMessage(hwnd, IDD_BROWSE_SELECT_LB, LB_SETCOUNT, Count, 0)
#define GETLISTCOUNT(hwnd) \
SendDlgItemMessage(hwnd, IDD_BROWSE_SELECT_LB, LB_GETCOUNT, 0, 0)
#define SETLISTSEL(hwnd, Sel) \
SendDlgItemMessage(hwnd, IDD_BROWSE_SELECT_LB, LB_SETCURSEL, Sel, 0)
#define GETLISTSEL(hwnd) \
SendDlgItemMessage(hwnd, IDD_BROWSE_SELECT_LB, LB_GETCURSEL, 0, 0)
#define ENABLE_LIST(hwnd) \
EnableWindow( GetDlgItem( hwnd, IDD_BROWSE_SELECT_LB ), TRUE )
#define DISABLE_LIST(hwnd) \
EnableWindow( GetDlgItem( hwnd, IDD_BROWSE_SELECT_LB ), FALSE )
#define ENTER_CRITICAL( pBrowseDlgData ) \
pBrowseDlgData->csLock.Lock()
#define LEAVE_CRITICAL( pBrowseDlgData ) \
pBrowseDlgData->csLock.Unlock()
/* The following macros are used for communication between the main GUI thread
* and the browsing thread.
* They are implemented as macros and defined here for ease of comprehension.
*/
/* SEND_BROWSE_THREAD_REQUEST
*
* The main thread calls this when it wants the browse thread to do browse
* for something. If the browse thread is currently browsing, it will not
* fulfil this request until it returns and waits on the Event again by
* calling RECEIVE_BROWSE_THREAD_REQUEST.
*/
#if DBG
#define SEND_BROWSE_THREAD_REQUEST(pBrowseDlgData, ReqId, pEnumName, pEnumObj) \
ASSERT( pBrowseDlgData->csLock.bInside() ); \
(pBrowseDlgData)->RequestId = ReqId; \
(pBrowseDlgData)->pEnumerateName = pEnumName; \
(pBrowseDlgData)->pEnumerateObject = pEnumObj; \
SetEvent( (pBrowseDlgData)->Request )
#else
#define SEND_BROWSE_THREAD_REQUEST(pBrowseDlgData, ReqId, pEnumName, pEnumObj) \
(pBrowseDlgData)->RequestId = ReqId; \
(pBrowseDlgData)->pEnumerateName = pEnumName; \
(pBrowseDlgData)->pEnumerateObject = pEnumObj; \
SetEvent( (pBrowseDlgData)->Request )
#endif /* DBG */
/* RECEIVE_BROWSE_THREAD_REQUEST
*
* The browse thread calls this when it is idle and waiting for a request.
*/
#define RECEIVE_BROWSE_THREAD_REQUEST(pBrowseDlgData, ReqId, pEnumName, pEnumObj) \
WaitForSingleObject( (pBrowseDlgData)->Request, INFINITE ), \
ENTER_CRITICAL( pBrowseDlgData ), \
ReqId = (pBrowseDlgData)->RequestId, \
pEnumName = (pBrowseDlgData)->pEnumerateName, \
pEnumObj = (pBrowseDlgData)->pEnumerateObject, \
LEAVE_CRITICAL( pBrowseDlgData )
/* SEND_BROWSE_THREAD_REQUEST_COMPLETE
*
* When the browse thread returns with the browse data, it sets the
* RequestComplete event. This is waited on by the main window thread
* when it calls MsgWaitForMultipleObjects in its main message loop.
*/
#define SEND_BROWSE_THREAD_REQUEST_COMPLETE(pBrowseDlgData, message, wP, lP) \
(pBrowseDlgData)->Message = message, \
(pBrowseDlgData)->wParam = (WPARAM)wP, \
(pBrowseDlgData)->lParam = (LPARAM)lP, \
SetEvent( (pBrowseDlgData)->RequestComplete ); \
PostMessage( pBrowseDlgData->hwndDialog, pBrowseDlgData->Message, 0, (LPARAM)pBrowseDlgData)
typedef struct _CONNECTTO_OBJECT
{
PPRINTER_INFO_1 pPrinterInfo; // Points to an array returned by EnumPrinters
struct _CONNECTTO_OBJECT *pSubObject; // Result of enumerating on this object
DWORD cSubObjects; // Number of objects found
DWORD cbPrinterInfo; // Size of buffer containing enumerated objects
} CONNECTTO_OBJECT, *PCONNECTTO_OBJECT;
struct BROWSE_DLG_DATA : public MRefCom
{
/* These fields are referenced only by the main thread:
*/
DWORD Status;
DWORD cExpandObjects;
DWORD ExpandSelection;
DWORD dwExtent;
/* These fields may be referenced by either thread,
* so access must be serialized by the critical section:
*/
PCONNECTTO_OBJECT pConnectToData;
HANDLE Request; /* Set when main thread has written request */
DWORD RequestId; /* BROWSE_THREAD_* */
LPTSTR pEnumerateName; /* Name of object to get, if appropriate */
PVOID pEnumerateObject; /* Buffer appropriate to RequestId */
HANDLE RequestComplete; /* Set when browse thread has returned data */
DWORD Message; /* Message to post to main dialog windows */
WPARAM wParam;
LPARAM lParam;
/* This is for printer info, and will be freed by the browse thread:
*/
LPPRINTER_INFO_2 pPrinterInfo;
DWORD cbPrinterInfo;
// critical section lock
CCSLock csLock;
HWND hwndParent;
HANDLE hPrinter;
DWORD Flags;
HWND hwndDialog;
BOOL _bValid;
HCURSOR hcursorArrow;
HCURSOR hcursorWait;
/*
* For leveraging the code to be used with
* property page
*/
IPageSwitch *pPageSwitchController;
BOOL bInPropertyPage;
BROWSE_DLG_DATA(
VOID
);
~BROWSE_DLG_DATA(
VOID
);
BOOL
bValid(
VOID
);
VOID
vRefZeroed(
VOID
);
BOOL
bInitializeBrowseThread(
HWND hWnd
);
};
typedef BROWSE_DLG_DATA *PBROWSE_DLG_DATA;
struct SPLSETUP_DATA
{
// ntprint.dll module
HINSTANCE hModule;
// driver info
HDEVINFO hDevInfo;
PPSETUP_LOCAL_DATA pSetupLocalData;
// ntprint.dll exported functions
pfPSetupCreatePrinterDeviceInfoList pfnCreatePrinterDeviceInfoList;
pfPSetupDestroyPrinterDeviceInfoList pfnDestroyPrinterDeviceInfoList;
pfPSetupSelectDriver pfnSelectDriver;
pfPSetupGetSelectedDriverInfo pfnGetSelectedDriverInfo;
pfPSetupDestroySelectedDriverInfo pfnDestroySelectedDriverInfo;
pfPSetupInstallPrinterDriver pfnInstallPrinterDriver;
pfPSetupThisPlatform pfnThisPlatform;
pfPSetupDriverInfoFromName pfnDriverInfoFromName;
pfPSetupGetPathToSearch pfnGetPathToSearch;
pfPSetupBuildDriversFromPath pfnBuildDriversFromPath;
pfPSetupIsDriverInstalled pfnIsDriverInstalled;
pfPSetupGetLocalDataField pfnGetLocalDataField;
pfPSetupFreeDrvField pfnFreeDrvField;
pfPSetupProcessPrinterAdded pfnProcessPrinterAdded;
pfPSetupFindMappedDriver pfnFindMappedDriver;
pfPSetupInstallInboxDriverSilently pfnInstallInboxDriverSilently;
pfPSetupFreeMem pfnFreeMem;
// is the structure valid
BOOL bValid;
BOOL bDriverAdded;
DWORD dwLastError;
SPLSETUP_DATA(
VOID
);
~SPLSETUP_DATA(
VOID
);
VOID
FreeDriverInfo(
VOID
);
BOOL
LoadDriverInfo(
IN HWND hwnd,
IN LPWSTR pszDriver
);
BOOL
LoadKnownDriverInfo(
IN HWND hwnd,
IN LPWSTR pszDriver
);
VOID
ReportErrorMessage(
IN HWND hwnd
);
};
DWORD
EnumConnectToObjects(
PBROWSE_DLG_DATA pBrowseDlgData,
PCONNECTTO_OBJECT pConnectToParent,
LPTSTR pParentName
);
DWORD
FreeConnectToObjects(
IN PCONNECTTO_OBJECT pFirstConnectToObject,
IN DWORD cThisLevelObjects,
IN DWORD cbPrinterInfo
);
VOID
BrowseThread(
PBROWSE_DLG_DATA pBrowseDlgData
);
BOOL APIENTRY
InstallDriverDialog(
HWND hWnd,
UINT usMsg,
WPARAM wParam,
LONG lParam
);
BOOL APIENTRY
NetworkPasswordDialog(
HWND hWnd,
UINT usMsg,
WPARAM wParam,
LONG lParam
);
LPTSTR
AllocDlgItemText(
HWND hwnd,
INT id
);
LPTSTR
GetErrorString(
DWORD Error
);
DWORD
ReportFailure(
HWND hwndParent,
DWORD idTitle,
DWORD idDefaultError
);
HANDLE
AddPrinterConnectionUI(
HWND hwnd,
LPCTSTR pszPrinter,
PBOOL pbAdded
);
LPTSTR
AllocSplStr(
LPCTSTR pStr
);
BOOL
FreeSplStr(
LPTSTR pStr
);
LPVOID
AllocSplMem(
DWORD cb
);
BOOL
FreeSplMem(
LPVOID pMem
);
LPVOID
ReallocSplMem(
LPVOID pOldMem,
DWORD cbOld,
DWORD cbNew
);
BOOL
PreDialog(
HWND hwndDialog,
PBROWSE_DLG_DATA pBrowseDlgData
);
VOID
PostDialog(
PBROWSE_DLG_DATA pBrowseDlgData
);
BOOL
SetDevMode(
HANDLE hPrinter
);
BOOL
ConnectToInitDialog(
HWND hWnd,
PBROWSE_DLG_DATA pBrowseDlgData
);
VOID ConnectToMeasureItem( HWND hwnd, LPMEASUREITEMSTRUCT pmis );
BOOL ConnectToDrawItem( HWND hwnd, LPDRAWITEMSTRUCT pdis );
LONG ConnectToCharToItem( HWND hWnd, WORD Key );
VOID ConnectToSysColorChange( );
VOID ConnectToDestroy( HWND hWnd );
VOID ConnectToSelectLbSelChange( HWND hWnd );
VOID ConnectToSelectLbDblClk( HWND hwnd, HWND hwndListbox );
VOID ConnectToMouseMove( HWND hWnd, LONG x, LONG y );
BOOL ConnectToSetCursor( HWND hWnd );
VOID ConnectToEnumObjectsComplete( HWND hWnd, PCONNECTTO_OBJECT pConnectToObject );
VOID ConnectToGetPrinterComplete( HWND hWnd, LPTSTR pPrinterName,
PPRINTER_INFO_2 pPrinter, DWORD Error );
BOOL ConnectToOK( HWND hWnd, BOOL ForceClose );
BOOL ConnectToCancel( HWND hWnd );
VOID SetCursorShape( HWND hWnd );
BOOL PrinterExists( HANDLE hPrinter, PDWORD pAttributes, LPWSTR* ppszDriver, LPWSTR* ppszPrinterName );
HANDLE
CreateLocalPrinter(
IN LPCTSTR pPrinterName,
IN LPCTSTR pDriverName,
IN LPCTSTR pPortName,
IN BOOL bMasqPrinter,
IN DEVMODE *pDevMode OPTIONAL
);
BOOL
AddKnownDriver(
IN SPLSETUP_DATA *pSplSetupData,
IN HWND hwnd,
IN LPWSTR pszDriver,
IN BOOL bSamePlatform
);
BOOL
AddDriver(
IN SPLSETUP_DATA *pSplSetupData,
IN HWND hwnd,
IN LPWSTR pszDriver,
IN BOOL bPromptUser,
OUT LPWSTR *ppszDriverOut
);
PCONNECTTO_OBJECT
GetConnectToObject(
IN PCONNECTTO_OBJECT pFirstConnectToObject,
IN DWORD cThisLevelObjects,
IN DWORD Index,
IN PCONNECTTO_OBJECT pFindObject,
OUT PDWORD pObjectsFound,
OUT PDWORD pDepth
);
PCONNECTTO_OBJECT
GetDefaultExpand(
IN PCONNECTTO_OBJECT pFirstConnectToObject,
IN DWORD cThisLevelObjects,
OUT PDWORD pIndex
);
BOOL
ToggleExpandConnectToObject(
HWND hwnd,
PCONNECTTO_OBJECT pConnectToObject
);
BOOL
UpdateList(
HWND hwnd,
INT Increment
);
LPBYTE
GetPrinterInfo(
IN DWORD Flags,
IN LPTSTR Name,
IN DWORD Level,
IN LPBYTE pPrinters,
OUT LPDWORD pcbPrinters,
OUT LPDWORD pcReturned,
OUT LPDWORD pcbNeeded OPTIONAL,
OUT LPDWORD pError OPTIONAL
);
BOOL
SetInfoFields(
HWND hWnd,
LPPRINTER_INFO_2 pPrinter
);
VOID DrawLine( HDC hDC, LPRECT pRect, LPTSTR pStr, BOOL bInvert );
VOID DrawLineWithTabs( HDC hDC, LPRECT pRect, LPTSTR pStr, BOOL bInvert );
BOOL DisplayStatusIcon( HDC hdc, PRECT prect, int xBase, int yBase, BOOL Highlight );
BOOL LoadBitmaps();
BOOL FixupBitmapColours( );
VOID FreeBitmaps();
BOOL GetRegShowLogonDomainFlag( );
BOOL SetRegShowLogonDomainFlag( BOOL ShowLogonDomain );
VOID
UpdateError(
HWND hwnd,
DWORD Error
);
LRESULT
WINAPI
ConnectToDlg(
HWND hWnd,
UINT usMsg,
WPARAM wParam,
LPARAM lParam
);
/******************************************************
* *
* Browse for printer property page stuff *
* *
******************************************************/
//
// The dialog procedure for the property page created above
//
LRESULT
WINAPI
ConnectToPropertyPage(
IN HWND hWnd,
IN UINT usMsg,
IN WPARAM wParam,
IN LPARAM lParam
);
//
// Handle wizard back notification
//
BOOL
PropertyPageWizardBack(
IN HWND hWnd
);
//
// Handle successful printer connection page
//
BOOL
HandleSuccessfulPrinterConnection(
IN HWND hWnd,
IN PBROWSE_DLG_DATA pBrowseDlgData
);
LPWSTR
GetArch(
IN HANDLE hServer
);
HANDLE
CreateRedirectedPrinter(
IN PCWSTR pszPrinterIn
);
VOID
BuildMasqPrinterName(
IN PPRINTER_INFO_2 pPrinter,
OUT PWSTR *ppszPrinterName
);
BOOL
BuildNTPrinterName(
IN PRINTER_INFO_2 *pPrinter,
OUT PWSTR *ppszPrinterName
);
HRESULT
IsNTServer(
IN PCWSTR pszServerName
);
BOOL
CreateLocalPort(
IN PCWSTR pszPortName
);
BOOL
AddPrinterConnectionAndPrompt(
IN HWND hWnd,
IN PCWSTR pszPrinterName,
OUT BOOL *pbUserDenied,
OUT TString *pstrNewName
);
#endif // _BROWSE_HXX_