/*++ 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(GetWindowLongPtr(hwnd, GWLP_USERDATA)) #define SET_BROWSE_DLG_DATA(hwnd, pBrowseDlgData) \ SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast(pBrowseDlgData)) #define GET_CONNECTTO_DATA( hwnd ) (GET_BROWSE_DLG_DATA( hwnd ))->pConnectToData #define SETLISTCOUNT(hwnd, Count) \ SendDlgItemMessage(hwnd, IDD_BROWSE_SELECT_LB, LB_SETCOUNT, Count, 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( IN HANDLE hPrinter, OUT PDWORD pAttributes, OUT LPWSTR *ppszDriver, OUT 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 ); INT_PTR CALLBACK ConnectToDlg( HWND hWnd, UINT usMsg, WPARAM wParam, LPARAM lParam ); /****************************************************** * * * Browse for printer property page stuff * * * ******************************************************/ // // The dialog procedure for the property page created above // INT_PTR CALLBACK 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_