Leaked source code of windows server 2003
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.

634 lines
16 KiB

  1. /*++
  2. Copyright (C) Microsoft Corporation, 1990 - 1999
  3. All rights reserved
  4. Module Name:
  5. browse.hxx
  6. Abstract:
  7. Header file for browse for pinter dialog
  8. Author:
  9. Dave Snipp (DaveSn) 15 Mar 1991
  10. Steve Kiraly (SteveKi) 1 May 1998
  11. Environment:
  12. User Mode Win32
  13. Revision History:
  14. 1 May 1998 move from winspoo.drv to printui.dll
  15. --*/
  16. #ifndef _BROWSE_HXX_
  17. #define _BROWSE_HXX_
  18. /*
  19. * IDs passed to WinHelp:
  20. */
  21. #define IDH_PRT_CTP_PRINTER 76000 // Printer
  22. #define IDH_PRT_CTP_SHARED_PRINTERS 76010 // Shared Printers
  23. #define IDH_PRT_CTP_EXPAND_DEFAULT 76020 // Expand by Default checkbox
  24. #define IDH_PRT_CTP_DESCRIPTION 76030 // Printer Info group--Description
  25. #define IDH_PRT_CTP_STATUS 76040 // Printer Info group--Status
  26. #define IDH_PRT_CTP_DOCS_WAITING 76050 // Printer Info group--Documents Waiting
  27. #define IDH_NOHELP ((DWORD)-1) // Disables Help for a control (for help compiles)
  28. /* Space for 21x16 status bitmaps:
  29. */
  30. #define STATUS_BITMAP_WIDTH 21
  31. #define STATUS_BITMAP_HEIGHT 16
  32. #define STATUS_BITMAP_MARGIN 4 /* (either side) */
  33. #define STATUS_BITMAP_SPACE ( STATUS_BITMAP_WIDTH + ( 2 * STATUS_BITMAP_MARGIN ) )
  34. #define PRINTER_STATUS_UNKNOWN 8000
  35. #define BM_IND_CONNECTTO_DOMPLUS 0
  36. #define BM_IND_CONNECTTO_DOMEXPAND ( 2 * STATUS_BITMAP_HEIGHT )
  37. #define BROWSE_THREAD_ENUM_OBJECTS 1
  38. #define BROWSE_THREAD_GET_PRINTER 2
  39. #define BROWSE_THREAD_TERMINATE 4
  40. #define BROWSE_THREAD_DELETE 8
  41. #define WM_ENUM_OBJECTS_COMPLETE WM_APP+0x10
  42. #define WM_GET_PRINTER_COMPLETE WM_APP+0x11
  43. #define WM_GET_PRINTER_ERROR WM_APP+0x12
  44. #define WM_QUIT_BROWSE WM_APP+0x14
  45. #define EMPTY_CONTAINER (PCONNECTTO_OBJECT)(-1)
  46. #define BACKGROUND 0x0000FF00 // bright green
  47. #define BACKGROUNDSEL 0x00FF00FF // bright magenta
  48. #define BUTTONFACE 0x00C0C0C0 // bright grey
  49. #define BUTTONSHADOW 0x00808080 // dark grey
  50. #define SPOOLER_VERSION 3
  51. //
  52. // Define some constants to make parameters to CreateEvent a tad less obscure:
  53. //
  54. #define EVENT_RESET_MANUAL TRUE
  55. #define EVENT_RESET_AUTOMATIC FALSE
  56. #define EVENT_INITIAL_STATE_SIGNALED TRUE
  57. #define EVENT_INITIAL_STATE_NOT_SIGNALED FALSE
  58. #define OUTPUT_BUFFER_LENGTH 512
  59. #define COLUMN_SEPARATOR_WIDTH 4
  60. #define COLUMN_WIDTH 180
  61. #define BROWSE_STATUS_INITIAL 0x00000001
  62. #define BROWSE_STATUS_EXPAND 0x00000002
  63. #define GET_BROWSE_DLG_DATA(hwnd) \
  64. reinterpret_cast<PBROWSE_DLG_DATA>(GetWindowLongPtr(hwnd, GWLP_USERDATA))
  65. #define SET_BROWSE_DLG_DATA(hwnd, pBrowseDlgData) \
  66. SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<ULONG_PTR>(pBrowseDlgData))
  67. #define GET_CONNECTTO_DATA( hwnd ) (GET_BROWSE_DLG_DATA( hwnd ))->pConnectToData
  68. #define SETLISTCOUNT(hwnd, Count) \
  69. SendDlgItemMessage(hwnd, IDD_BROWSE_SELECT_LB, LB_SETCOUNT, Count, 0)
  70. #define SETLISTSEL(hwnd, Sel) \
  71. SendDlgItemMessage(hwnd, IDD_BROWSE_SELECT_LB, LB_SETCURSEL, Sel, 0)
  72. #define GETLISTSEL(hwnd) \
  73. SendDlgItemMessage(hwnd, IDD_BROWSE_SELECT_LB, LB_GETCURSEL, 0, 0)
  74. #define ENABLE_LIST(hwnd) \
  75. EnableWindow( GetDlgItem( hwnd, IDD_BROWSE_SELECT_LB ), TRUE )
  76. #define DISABLE_LIST(hwnd) \
  77. EnableWindow( GetDlgItem( hwnd, IDD_BROWSE_SELECT_LB ), FALSE )
  78. #define ENTER_CRITICAL( pBrowseDlgData ) \
  79. pBrowseDlgData->csLock.Lock()
  80. #define LEAVE_CRITICAL( pBrowseDlgData ) \
  81. pBrowseDlgData->csLock.Unlock()
  82. /* The following macros are used for communication between the main GUI thread
  83. * and the browsing thread.
  84. * They are implemented as macros and defined here for ease of comprehension.
  85. */
  86. /* SEND_BROWSE_THREAD_REQUEST
  87. *
  88. * The main thread calls this when it wants the browse thread to do browse
  89. * for something. If the browse thread is currently browsing, it will not
  90. * fulfil this request until it returns and waits on the Event again by
  91. * calling RECEIVE_BROWSE_THREAD_REQUEST.
  92. */
  93. #if DBG
  94. #define SEND_BROWSE_THREAD_REQUEST(pBrowseDlgData, ReqId, pEnumName, pEnumObj) \
  95. ASSERT( pBrowseDlgData->csLock.bInside() ); \
  96. (pBrowseDlgData)->RequestId = ReqId; \
  97. (pBrowseDlgData)->pEnumerateName = pEnumName; \
  98. (pBrowseDlgData)->pEnumerateObject = pEnumObj; \
  99. SetEvent( (pBrowseDlgData)->Request )
  100. #else
  101. #define SEND_BROWSE_THREAD_REQUEST(pBrowseDlgData, ReqId, pEnumName, pEnumObj) \
  102. (pBrowseDlgData)->RequestId = ReqId; \
  103. (pBrowseDlgData)->pEnumerateName = pEnumName; \
  104. (pBrowseDlgData)->pEnumerateObject = pEnumObj; \
  105. SetEvent( (pBrowseDlgData)->Request )
  106. #endif /* DBG */
  107. /* RECEIVE_BROWSE_THREAD_REQUEST
  108. *
  109. * The browse thread calls this when it is idle and waiting for a request.
  110. */
  111. #define RECEIVE_BROWSE_THREAD_REQUEST(pBrowseDlgData, ReqId, pEnumName, pEnumObj) \
  112. WaitForSingleObject( (pBrowseDlgData)->Request, INFINITE ), \
  113. ENTER_CRITICAL( pBrowseDlgData ), \
  114. ReqId = (pBrowseDlgData)->RequestId, \
  115. pEnumName = (pBrowseDlgData)->pEnumerateName, \
  116. pEnumObj = (pBrowseDlgData)->pEnumerateObject, \
  117. LEAVE_CRITICAL( pBrowseDlgData )
  118. /* SEND_BROWSE_THREAD_REQUEST_COMPLETE
  119. *
  120. * When the browse thread returns with the browse data, it sets the
  121. * RequestComplete event. This is waited on by the main window thread
  122. * when it calls MsgWaitForMultipleObjects in its main message loop.
  123. */
  124. #define SEND_BROWSE_THREAD_REQUEST_COMPLETE(pBrowseDlgData, message, wP, lP) \
  125. (pBrowseDlgData)->Message = message, \
  126. (pBrowseDlgData)->wParam = (WPARAM)wP, \
  127. (pBrowseDlgData)->lParam = (LPARAM)lP, \
  128. SetEvent( (pBrowseDlgData)->RequestComplete ); \
  129. PostMessage( pBrowseDlgData->hwndDialog, pBrowseDlgData->Message, 0, (LPARAM)pBrowseDlgData)
  130. typedef struct _CONNECTTO_OBJECT
  131. {
  132. PPRINTER_INFO_1 pPrinterInfo; // Points to an array returned by EnumPrinters
  133. struct _CONNECTTO_OBJECT *pSubObject; // Result of enumerating on this object
  134. DWORD cSubObjects; // Number of objects found
  135. DWORD cbPrinterInfo; // Size of buffer containing enumerated objects
  136. } CONNECTTO_OBJECT, *PCONNECTTO_OBJECT;
  137. struct BROWSE_DLG_DATA : public MRefCom
  138. {
  139. /* These fields are referenced only by the main thread:
  140. */
  141. DWORD Status;
  142. DWORD cExpandObjects;
  143. DWORD ExpandSelection;
  144. DWORD dwExtent;
  145. /* These fields may be referenced by either thread,
  146. * so access must be serialized by the critical section:
  147. */
  148. PCONNECTTO_OBJECT pConnectToData;
  149. HANDLE Request; /* Set when main thread has written request */
  150. DWORD RequestId; /* BROWSE_THREAD_* */
  151. LPTSTR pEnumerateName; /* Name of object to get, if appropriate */
  152. PVOID pEnumerateObject; /* Buffer appropriate to RequestId */
  153. HANDLE RequestComplete; /* Set when browse thread has returned data */
  154. DWORD Message; /* Message to post to main dialog windows */
  155. WPARAM wParam;
  156. LPARAM lParam;
  157. /* This is for printer info, and will be freed by the browse thread:
  158. */
  159. LPPRINTER_INFO_2 pPrinterInfo;
  160. DWORD cbPrinterInfo;
  161. // critical section lock
  162. CCSLock csLock;
  163. HWND hwndParent;
  164. HANDLE hPrinter;
  165. DWORD Flags;
  166. HWND hwndDialog;
  167. BOOL _bValid;
  168. HCURSOR hcursorArrow;
  169. HCURSOR hcursorWait;
  170. /*
  171. * For leveraging the code to be used with
  172. * property page
  173. */
  174. IPageSwitch *pPageSwitchController;
  175. BOOL bInPropertyPage;
  176. BROWSE_DLG_DATA(
  177. VOID
  178. );
  179. ~BROWSE_DLG_DATA(
  180. VOID
  181. );
  182. BOOL
  183. bValid(
  184. VOID
  185. );
  186. VOID
  187. vRefZeroed(
  188. VOID
  189. );
  190. BOOL
  191. bInitializeBrowseThread(
  192. HWND hWnd
  193. );
  194. };
  195. typedef BROWSE_DLG_DATA *PBROWSE_DLG_DATA;
  196. struct SPLSETUP_DATA
  197. {
  198. // ntprint.dll module
  199. HINSTANCE hModule;
  200. // driver info
  201. HDEVINFO hDevInfo;
  202. PPSETUP_LOCAL_DATA pSetupLocalData;
  203. // ntprint.dll exported functions
  204. pfPSetupCreatePrinterDeviceInfoList pfnCreatePrinterDeviceInfoList;
  205. pfPSetupDestroyPrinterDeviceInfoList pfnDestroyPrinterDeviceInfoList;
  206. pfPSetupSelectDriver pfnSelectDriver;
  207. pfPSetupGetSelectedDriverInfo pfnGetSelectedDriverInfo;
  208. pfPSetupDestroySelectedDriverInfo pfnDestroySelectedDriverInfo;
  209. pfPSetupInstallPrinterDriver pfnInstallPrinterDriver;
  210. pfPSetupThisPlatform pfnThisPlatform;
  211. pfPSetupDriverInfoFromName pfnDriverInfoFromName;
  212. pfPSetupGetPathToSearch pfnGetPathToSearch;
  213. pfPSetupBuildDriversFromPath pfnBuildDriversFromPath;
  214. pfPSetupIsDriverInstalled pfnIsDriverInstalled;
  215. pfPSetupGetLocalDataField pfnGetLocalDataField;
  216. pfPSetupFreeDrvField pfnFreeDrvField;
  217. pfPSetupProcessPrinterAdded pfnProcessPrinterAdded;
  218. pfPSetupFindMappedDriver pfnFindMappedDriver;
  219. pfPSetupInstallInboxDriverSilently pfnInstallInboxDriverSilently;
  220. pfPSetupFreeMem pfnFreeMem;
  221. // is the structure valid
  222. BOOL bValid;
  223. BOOL bDriverAdded;
  224. DWORD dwLastError;
  225. SPLSETUP_DATA(
  226. VOID
  227. );
  228. ~SPLSETUP_DATA(
  229. VOID
  230. );
  231. VOID
  232. FreeDriverInfo(
  233. VOID
  234. );
  235. BOOL
  236. LoadDriverInfo(
  237. IN HWND hwnd,
  238. IN LPWSTR pszDriver
  239. );
  240. BOOL
  241. LoadKnownDriverInfo(
  242. IN HWND hwnd,
  243. IN LPWSTR pszDriver
  244. );
  245. VOID
  246. ReportErrorMessage(
  247. IN HWND hwnd
  248. );
  249. };
  250. DWORD
  251. EnumConnectToObjects(
  252. PBROWSE_DLG_DATA pBrowseDlgData,
  253. PCONNECTTO_OBJECT pConnectToParent,
  254. LPTSTR pParentName
  255. );
  256. DWORD
  257. FreeConnectToObjects(
  258. IN PCONNECTTO_OBJECT pFirstConnectToObject,
  259. IN DWORD cThisLevelObjects,
  260. IN DWORD cbPrinterInfo
  261. );
  262. VOID
  263. BrowseThread(
  264. PBROWSE_DLG_DATA pBrowseDlgData
  265. );
  266. BOOL APIENTRY
  267. InstallDriverDialog(
  268. HWND hWnd,
  269. UINT usMsg,
  270. WPARAM wParam,
  271. LONG lParam
  272. );
  273. BOOL APIENTRY
  274. NetworkPasswordDialog(
  275. HWND hWnd,
  276. UINT usMsg,
  277. WPARAM wParam,
  278. LONG lParam
  279. );
  280. LPTSTR
  281. AllocDlgItemText(
  282. HWND hwnd,
  283. INT id
  284. );
  285. LPTSTR
  286. GetErrorString(
  287. DWORD Error
  288. );
  289. DWORD
  290. ReportFailure(
  291. HWND hwndParent,
  292. DWORD idTitle,
  293. DWORD idDefaultError
  294. );
  295. HANDLE
  296. AddPrinterConnectionUI(
  297. HWND hwnd,
  298. LPCTSTR pszPrinter,
  299. PBOOL pbAdded
  300. );
  301. LPTSTR
  302. AllocSplStr(
  303. LPCTSTR pStr
  304. );
  305. BOOL
  306. FreeSplStr(
  307. LPTSTR pStr
  308. );
  309. LPVOID
  310. AllocSplMem(
  311. DWORD cb
  312. );
  313. BOOL
  314. FreeSplMem(
  315. LPVOID pMem
  316. );
  317. LPVOID
  318. ReallocSplMem(
  319. LPVOID pOldMem,
  320. DWORD cbOld,
  321. DWORD cbNew
  322. );
  323. BOOL
  324. PreDialog(
  325. HWND hwndDialog,
  326. PBROWSE_DLG_DATA pBrowseDlgData
  327. );
  328. VOID
  329. PostDialog(
  330. PBROWSE_DLG_DATA pBrowseDlgData
  331. );
  332. BOOL
  333. SetDevMode(
  334. HANDLE hPrinter
  335. );
  336. BOOL
  337. ConnectToInitDialog(
  338. HWND hWnd,
  339. PBROWSE_DLG_DATA pBrowseDlgData
  340. );
  341. VOID ConnectToMeasureItem( HWND hwnd, LPMEASUREITEMSTRUCT pmis );
  342. BOOL ConnectToDrawItem( HWND hwnd, LPDRAWITEMSTRUCT pdis );
  343. LONG ConnectToCharToItem( HWND hWnd, WORD Key );
  344. VOID ConnectToSysColorChange( );
  345. VOID ConnectToDestroy( HWND hWnd );
  346. VOID ConnectToSelectLbSelChange( HWND hWnd );
  347. VOID ConnectToSelectLbDblClk( HWND hwnd, HWND hwndListbox );
  348. VOID ConnectToMouseMove( HWND hWnd, LONG x, LONG y );
  349. BOOL ConnectToSetCursor( HWND hWnd );
  350. VOID ConnectToEnumObjectsComplete( HWND hWnd, PCONNECTTO_OBJECT pConnectToObject );
  351. VOID ConnectToGetPrinterComplete( HWND hWnd, LPTSTR pPrinterName,
  352. PPRINTER_INFO_2 pPrinter, DWORD Error );
  353. BOOL ConnectToOK( HWND hWnd, BOOL ForceClose );
  354. BOOL ConnectToCancel( HWND hWnd );
  355. VOID SetCursorShape( HWND hWnd );
  356. BOOL
  357. PrinterExists(
  358. IN HANDLE hPrinter,
  359. OUT PDWORD pAttributes,
  360. OUT LPWSTR *ppszDriver,
  361. OUT LPWSTR *ppszPrinterName
  362. );
  363. HANDLE
  364. CreateLocalPrinter(
  365. IN LPCTSTR pPrinterName,
  366. IN LPCTSTR pDriverName,
  367. IN LPCTSTR pPortName,
  368. IN BOOL bMasqPrinter,
  369. IN DEVMODE *pDevMode OPTIONAL
  370. );
  371. BOOL
  372. AddKnownDriver(
  373. IN SPLSETUP_DATA *pSplSetupData,
  374. IN HWND hwnd,
  375. IN LPWSTR pszDriver,
  376. IN BOOL bSamePlatform
  377. );
  378. BOOL
  379. AddDriver(
  380. IN SPLSETUP_DATA *pSplSetupData,
  381. IN HWND hwnd,
  382. IN LPWSTR pszDriver,
  383. IN BOOL bPromptUser,
  384. OUT LPWSTR *ppszDriverOut
  385. );
  386. PCONNECTTO_OBJECT
  387. GetConnectToObject(
  388. IN PCONNECTTO_OBJECT pFirstConnectToObject,
  389. IN DWORD cThisLevelObjects,
  390. IN DWORD Index,
  391. IN PCONNECTTO_OBJECT pFindObject,
  392. OUT PDWORD pObjectsFound,
  393. OUT PDWORD pDepth
  394. );
  395. PCONNECTTO_OBJECT
  396. GetDefaultExpand(
  397. IN PCONNECTTO_OBJECT pFirstConnectToObject,
  398. IN DWORD cThisLevelObjects,
  399. OUT PDWORD pIndex
  400. );
  401. BOOL
  402. ToggleExpandConnectToObject(
  403. HWND hwnd,
  404. PCONNECTTO_OBJECT pConnectToObject
  405. );
  406. BOOL
  407. UpdateList(
  408. HWND hwnd,
  409. INT Increment
  410. );
  411. LPBYTE
  412. GetPrinterInfo(
  413. IN DWORD Flags,
  414. IN LPTSTR Name,
  415. IN DWORD Level,
  416. IN LPBYTE pPrinters,
  417. OUT LPDWORD pcbPrinters,
  418. OUT LPDWORD pcReturned,
  419. OUT LPDWORD pcbNeeded OPTIONAL,
  420. OUT LPDWORD pError OPTIONAL
  421. );
  422. BOOL
  423. SetInfoFields(
  424. HWND hWnd,
  425. LPPRINTER_INFO_2 pPrinter
  426. );
  427. VOID DrawLine( HDC hDC, LPRECT pRect, LPTSTR pStr, BOOL bInvert );
  428. VOID DrawLineWithTabs( HDC hDC, LPRECT pRect, LPTSTR pStr, BOOL bInvert );
  429. BOOL DisplayStatusIcon( HDC hdc, PRECT prect, int xBase, int yBase, BOOL Highlight );
  430. BOOL LoadBitmaps();
  431. BOOL FixupBitmapColours( );
  432. VOID FreeBitmaps();
  433. BOOL GetRegShowLogonDomainFlag( );
  434. BOOL SetRegShowLogonDomainFlag( BOOL ShowLogonDomain );
  435. VOID
  436. UpdateError(
  437. HWND hwnd,
  438. DWORD Error
  439. );
  440. INT_PTR
  441. CALLBACK
  442. ConnectToDlg(
  443. HWND hWnd,
  444. UINT usMsg,
  445. WPARAM wParam,
  446. LPARAM lParam
  447. );
  448. /******************************************************
  449. * *
  450. * Browse for printer property page stuff *
  451. * *
  452. ******************************************************/
  453. //
  454. // The dialog procedure for the property page created above
  455. //
  456. INT_PTR
  457. CALLBACK
  458. ConnectToPropertyPage(
  459. IN HWND hWnd,
  460. IN UINT usMsg,
  461. IN WPARAM wParam,
  462. IN LPARAM lParam
  463. );
  464. //
  465. // Handle wizard back notification
  466. //
  467. BOOL
  468. PropertyPageWizardBack(
  469. IN HWND hWnd
  470. );
  471. //
  472. // Handle successful printer connection page
  473. //
  474. BOOL
  475. HandleSuccessfulPrinterConnection(
  476. IN HWND hWnd,
  477. IN PBROWSE_DLG_DATA pBrowseDlgData
  478. );
  479. LPWSTR
  480. GetArch(
  481. IN HANDLE hServer
  482. );
  483. HANDLE
  484. CreateRedirectedPrinter(
  485. IN PCWSTR pszPrinterIn
  486. );
  487. VOID
  488. BuildMasqPrinterName(
  489. IN PPRINTER_INFO_2 pPrinter,
  490. OUT PWSTR *ppszPrinterName
  491. );
  492. BOOL
  493. BuildNTPrinterName(
  494. IN PRINTER_INFO_2 *pPrinter,
  495. OUT PWSTR *ppszPrinterName
  496. );
  497. HRESULT
  498. IsNTServer(
  499. IN PCWSTR pszServerName
  500. );
  501. BOOL
  502. CreateLocalPort(
  503. IN PCWSTR pszPortName
  504. );
  505. BOOL
  506. AddPrinterConnectionAndPrompt(
  507. IN HWND hWnd,
  508. IN PCWSTR pszPrinterName,
  509. OUT BOOL *pbUserDenied,
  510. OUT TString *pstrNewName
  511. );
  512. #endif // _BROWSE_HXX_