config.c
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:12k
源码类别:

打印编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1990-2003  Microsoft Corporation
  3. All rights reserved
  4. Module Name:
  5.     config.c
  6. Abstract:
  7.     Handles spooler entry points for adding, deleting, and configuring
  8.     localui ports.
  9. --*/
  10. #include "precomp.h"
  11. #pragma hdrstop
  12. #include "localui.h"
  13. #include "lmon.h"
  14. #include "mem.h"
  15. BOOL
  16. ConfigLPTPort(
  17.     HWND    hWnd,
  18.     HANDLE  hXcv
  19.     );
  20. BOOL
  21. ConfigCOMPort(
  22.     HWND    hWnd,
  23.     HANDLE  hXcv,
  24.     PCWSTR  pszServer,
  25.     PCWSTR  pszPortName
  26.     );
  27. LPWSTR
  28. GetPortName(
  29.     HWND    hWnd,
  30.     HANDLE  hXcv
  31.     );
  32. BOOL
  33. AddPortUI(
  34.                 __in PCWSTR pszServer,
  35.     __in        HWND   hWnd,
  36.                 __in PCWSTR pszMonitorNameIn,
  37.     __out_opt   PWSTR  *ppszPortNameOut
  38.     )
  39. {
  40.     PWSTR  pszPortName = NULL;
  41.     PWSTR  pszServerName = NULL;
  42.     BOOL   rc = TRUE;
  43.     WCHAR  szLocalMonitor[MAX_PATH+1];
  44.     DWORD  dwReturn, dwStatus;
  45.     DWORD  cbNeeded;
  46.     PRINTER_DEFAULTS Default;
  47.     HANDLE  hXcv = NULL;
  48.     DWORD dwLastError = ERROR_SUCCESS;
  49.     //
  50.     //
  51.     //
  52.     if (hWnd && !IsWindow (hWnd))
  53.     {
  54.         //
  55.         // Invalid parent window handle causes problems in function with DialogBoxParam call.
  56.         // That function when the handle is bad returns ZERO, the same value as ERROR_SUCCEED.
  57.         // PortNameDlg function calls EndDialog (ERROR_SUCCEES) if everything is alright.
  58.         //
  59.         SetLastError (ERROR_INVALID_WINDOW_HANDLE);
  60.         if (ppszPortNameOut)
  61.         {
  62.             *ppszPortNameOut = NULL;
  63.         }
  64.         return FALSE;
  65.     }
  66.     //
  67.     //
  68.     //
  69.     /* Get the user to enter a port name:
  70.      */
  71.     if (!(pszServerName = ConstructXcvName(pszServer, pszMonitorNameIn, L"XcvMonitor"))) {
  72.         rc = FALSE;
  73.         goto Done;
  74.     }
  75.     Default.pDatatype = NULL;
  76.     Default.pDevMode = NULL;
  77.     Default.DesiredAccess = SERVER_ACCESS_ADMINISTER;
  78.     if (!(rc = OpenPrinter((PWSTR) pszServerName, &hXcv, &Default))) {
  79.         rc = FALSE;
  80.         goto Done;
  81.     }
  82.     if (!(pszPortName = GetPortName(hWnd, hXcv))) {
  83.         rc = FALSE;
  84.         goto Done;
  85.     }
  86.     // We can't Add, Configure, or Delete Remote COM ports
  87.     if (IS_COM_PORT(pszPortName) || IS_LPT_PORT(pszPortName)) {
  88.         SetLastError(ERROR_NOT_SUPPORTED);
  89.         rc = FALSE;
  90.         goto Done;
  91.     }
  92.     if(IS_COM_PORT(pszPortName))
  93.         CharUpperBuff(pszPortName, 3);
  94.     else if(IS_LPT_PORT(pszPortName))
  95.         CharUpperBuff(pszPortName, 3);
  96.     rc = XcvData(   hXcv,
  97.                     L"AddPort",
  98.                     (PBYTE) pszPortName,
  99.                     (wcslen(pszPortName) + 1)*sizeof(WCHAR),
  100.                     (PBYTE) &dwReturn,
  101.                     0,
  102.                     &cbNeeded,
  103.                     &dwStatus);
  104.     if (rc) {
  105.         if(dwStatus == ERROR_SUCCESS) {
  106.             if(ppszPortNameOut)
  107.                 *ppszPortNameOut = AllocSplStr(pszPortName);
  108.             if(IS_LPT_PORT(pszPortName))
  109.                 rc = ConfigLPTPort(hWnd, hXcv);
  110.             else if(IS_COM_PORT(pszPortName))
  111.                 rc = ConfigCOMPort(hWnd, hXcv, pszServer, pszPortName);
  112.         } else if (dwStatus == ERROR_ALREADY_EXISTS) {
  113.             Message( hWnd, MSG_ERROR, IDS_LOCALMONITOR, IDS_PORTALREADYEXISTS_S, pszPortName );
  114.         } else {
  115.             SetLastError(dwStatus);
  116.             rc = FALSE;
  117.         }
  118.     }
  119. Done:
  120.     dwLastError = GetLastError ();
  121.     if (pszPortName)
  122.         FreeSplStr(pszPortName);
  123.     if (pszServerName)
  124.         FreeSplMem(pszServerName);
  125.     if (hXcv)
  126.         ClosePrinter(hXcv);
  127.     SetLastError (dwLastError);
  128.     return rc;
  129. }
  130. BOOL
  131. DeletePortUI(
  132.           __in PCWSTR pszServer,
  133.     __in  HWND   hWnd,
  134.           __in PCWSTR pszPortName
  135.     )
  136. {
  137.     PRINTER_DEFAULTS Default;
  138.     PWSTR   pszServerName = NULL;
  139.     DWORD   dwOutput;
  140.     DWORD   cbNeeded;
  141.     BOOL    bRet;
  142.     HANDLE  hXcv = NULL;
  143.     DWORD   dwStatus;
  144.     DWORD   dwLastError = ERROR_SUCCESS;
  145.     //
  146.     //
  147.     //
  148.     if (hWnd && !IsWindow (hWnd))
  149.     {
  150.         SetLastError (ERROR_INVALID_WINDOW_HANDLE);
  151.         return FALSE;
  152.     }
  153.     //
  154.     //
  155.     //
  156.     if (!(pszServerName = ConstructXcvName(pszServer, pszPortName, L"XcvPort"))) {
  157.         bRet = FALSE;
  158.         goto Done;
  159.     }
  160.     Default.pDatatype = NULL;
  161.     Default.pDevMode = NULL;
  162.     Default.DesiredAccess = SERVER_ACCESS_ADMINISTER;
  163.     if (!(bRet = OpenPrinter((PWSTR) pszServerName, &hXcv, &Default)))
  164.         goto Done;
  165.     // Since we can't Add or Configure Remote COM ports, let's not allow deletion either
  166.     if (IS_COM_PORT(pszPortName) || IS_LPT_PORT(pszPortName)) {
  167.         SetLastError(ERROR_NOT_SUPPORTED);
  168.         bRet = FALSE;
  169.     } else {
  170.         bRet = XcvData( hXcv,
  171.                         L"DeletePort",
  172.                         (PBYTE) pszPortName,
  173.                         (wcslen(pszPortName) + 1)*sizeof(WCHAR),
  174.                         (PBYTE) &dwOutput,
  175.                         0,
  176.                         &cbNeeded,
  177.                         &dwStatus);
  178.         if (!bRet && (ERROR_BUSY == dwStatus))
  179.         {
  180.             //
  181.             // Port cannot be deleted cause it is in use.
  182.             //
  183.             ErrorMessage (
  184.                 hWnd,
  185.                 dwStatus
  186.                 );
  187.             //
  188.             // Error is handled here and caller does not need to do anything
  189.             //
  190.             SetLastError (ERROR_CANCELLED);
  191.         }
  192.         else if (bRet && (ERROR_SUCCESS != dwStatus))
  193.         {
  194.             SetLastError(dwStatus);
  195.             bRet = FALSE;
  196.         }
  197.     }
  198. Done:
  199.     dwLastError = GetLastError ();
  200.     if (hXcv)
  201.         ClosePrinter(hXcv);
  202.     if (pszServerName)
  203.         FreeSplMem(pszServerName);
  204.     SetLastError (dwLastError);
  205.     return bRet;
  206. }
  207. /* ConfigurePortUI
  208.  *
  209.  */
  210. BOOL
  211. ConfigurePortUI(
  212.           __in PCWSTR pName,
  213.     __in  HWND   hWnd,
  214.           __in PCWSTR pPortName
  215.     )
  216. {
  217.     BOOL   bRet;
  218.     PRINTER_DEFAULTS Default;
  219.     PWSTR  pServerName = NULL;
  220.     HANDLE hXcv = NULL;
  221.     DWORD  dwLastError = ERROR_SUCCESS;
  222.     //
  223.     //
  224.     //
  225.     if (hWnd && !IsWindow (hWnd))
  226.     {
  227.         SetLastError (ERROR_INVALID_WINDOW_HANDLE);
  228.         return FALSE;
  229.     }
  230.     //
  231.     //
  232.     //
  233.     if (!(pServerName = ConstructXcvName(pName, pPortName, L"XcvPort"))) {
  234.         bRet = FALSE;
  235.         goto Done;
  236.     }
  237.     Default.pDatatype = NULL;
  238.     Default.pDevMode = NULL;
  239.     Default.DesiredAccess = SERVER_ACCESS_ADMINISTER;
  240.     if (!(bRet = OpenPrinter((PWSTR) pServerName, &hXcv, &Default)))
  241.         goto Done;
  242.     if( IS_LPT_PORT( (PWSTR) pPortName ) )
  243.         bRet = ConfigLPTPort(hWnd, hXcv);
  244.     else if( IS_COM_PORT( (PWSTR) pPortName ) )
  245.         bRet = ConfigCOMPort(hWnd, hXcv, pName, pPortName);
  246.     else {
  247.         Message( hWnd, MSG_INFORMATION, IDS_LOCALMONITOR,
  248.                  IDS_NOTHING_TO_CONFIGURE );
  249.         SetLastError(ERROR_CANCELLED);
  250.         bRet = FALSE;
  251.     }
  252. Done:
  253.     dwLastError = GetLastError ();
  254.     if (pServerName)
  255.         FreeSplMem(pServerName);
  256.     if (hXcv) {
  257.         ClosePrinter(hXcv);
  258.         hXcv = NULL;
  259.     }
  260.     SetLastError (dwLastError);
  261.     return bRet;
  262. }
  263. /* ConfigLPTPort
  264.  *
  265.  * Calls a dialog box which prompts the user to enter timeout and retry
  266.  * values for the port concerned.
  267.  * The dialog writes the information to the registry (win.ini for now).
  268.  */
  269. BOOL
  270. ConfigLPTPort(
  271.     HWND    hWnd,
  272.     HANDLE  hXcv
  273. )
  274. {
  275.     PORTDIALOG  Port;
  276.     INT         iRet;
  277.     //
  278.     //
  279.     ZeroMemory (&Port, sizeof (Port));
  280.     iRet = -1;
  281.     //
  282.     //
  283.     Port.hXcv = hXcv;
  284.     iRet = (INT)DialogBoxParam(hInst, MAKEINTRESOURCE( DLG_CONFIGURE_LPT ),
  285.                                hWnd, (DLGPROC)ConfigureLPTPortDlg, (LPARAM) &Port);
  286.     if (iRet == ERROR_SUCCESS)
  287.     {
  288.         //
  289.         // DialogBoxParam returns zero if hWnd is invalid.
  290.         // ERROR_SUCCESS is equal to zero.
  291.         // => We need to check LastError too.
  292.         //
  293.         return ERROR_SUCCESS == GetLastError ();
  294.     }
  295.     if (iRet == -1)
  296.         return FALSE;
  297.     SetLastError(iRet);
  298.     return FALSE;
  299. }
  300. /*
  301.  * ConfigCOMPort
  302.  */
  303. BOOL
  304. ConfigCOMPort(
  305.     HWND    hWnd,
  306.     HANDLE  hXcv,
  307.     PCWSTR  pszServer,
  308.     PCWSTR  pszPortName
  309.     )
  310. {
  311.     DWORD       dwStatus;
  312.     BOOL        bRet = FALSE;
  313.     COMMCONFIG  CommConfig = {0};
  314.     COMMCONFIG  *pCommConfig = &CommConfig;
  315.     COMMCONFIG  *pCC = NULL;
  316.     PWSTR       pszPort = NULL;
  317.     DWORD       cbNeeded;
  318.     // GetDefaultCommConfig can't handle trailing :, so remove it!
  319.     if (!(pszPort = (PWSTR) AllocSplStr(pszPortName)))
  320.         goto Done;
  321.     pszPort[wcslen(pszPort) - 1] = L'';
  322.     cbNeeded = sizeof CommConfig;
  323.     if (!XcvData(   hXcv,
  324.                     L"GetDefaultCommConfig",
  325.                     (PBYTE) pszPort,
  326.                     (wcslen(pszPort) + 1)*sizeof *pszPort,
  327.                     (PBYTE) pCommConfig,
  328.                     cbNeeded,
  329.                     &cbNeeded,
  330.                     &dwStatus))
  331.         goto Done;
  332.     if (dwStatus != ERROR_SUCCESS) {
  333.         if (dwStatus != ERROR_INSUFFICIENT_BUFFER) {
  334.             SetLastError(dwStatus);
  335.             goto Done;
  336.         }
  337.         if (!(pCommConfig = pCC = (COMMCONFIG *)AllocSplMem(cbNeeded)))
  338.             goto Done;
  339.         if (!XcvData(   hXcv,
  340.                         L"GetDefaultCommConfig",
  341.                         (PBYTE) pszPort,
  342.                         (wcslen(pszPort) + 1)*sizeof *pszPort,
  343.                         (PBYTE) pCommConfig,
  344.                         cbNeeded,
  345.                         &cbNeeded,
  346.                         &dwStatus))
  347.             goto Done;
  348.         if (dwStatus != ERROR_SUCCESS) {
  349.             SetLastError(dwStatus);
  350.             goto Done;
  351.         }
  352.     }
  353.     if (CommConfigDialog(pszPort, hWnd, pCommConfig)) {
  354.         if (!XcvData(   hXcv,
  355.                         L"SetDefaultCommConfig",
  356.                         (PBYTE) pCommConfig,
  357.                         pCommConfig->dwSize,
  358.                         (PBYTE) NULL,
  359.                         0,
  360.                         &cbNeeded,
  361.                         &dwStatus))
  362.             goto Done;
  363.         if (dwStatus != ERROR_SUCCESS) {
  364.             SetLastError(dwStatus);
  365.             goto Done;
  366.         }
  367.         bRet = TRUE;
  368.     }
  369. Done:
  370.     if (pCC)
  371.         FreeSplMem(pCC);
  372.     if (pszPort)
  373.         FreeSplStr(pszPort);
  374.     return bRet;
  375. }
  376. /* GetPortName
  377.  *
  378.  * Puts up a dialog containing a free entry field.
  379.  * The dialog allocates a string for the name, if a selection is made.
  380.  */
  381. LPWSTR
  382. GetPortName(
  383.     HWND    hWnd,
  384.     HANDLE  hXcv
  385.     )
  386. {
  387.     PORTDIALOG Port;
  388.     INT        Result;
  389.     LPWSTR     pszPort = NULL;
  390.     //
  391.     //
  392.     ZeroMemory (&Port, sizeof (Port));
  393.     Result = -1;
  394.     //
  395.     //
  396.     Port.hXcv = hXcv;
  397.     Port.dwRet = ERROR_INVALID_HANDLE;
  398.     Result = (INT)DialogBoxParam(hInst,
  399.                                  MAKEINTRESOURCE(DLG_PORTNAME),
  400.                                  hWnd,
  401.                                  (DLGPROC)PortNameDlg,
  402.                                  (LPARAM)&Port);
  403.     if (Result == ERROR_SUCCESS)
  404.     {
  405.         //
  406.         // DialogBoxParam returns zero if hWnd is invalid.
  407.         // ERROR_SUCCESS is equal to zero.
  408.         // => We need to check LastError too.
  409.         //
  410.         if (Port.dwRet == ERROR_SUCCESS)
  411.         {
  412.             //
  413.             // DialogBoxParam executed successfully and a port name was retrieved
  414.             //
  415.             pszPort = Port.pszPortName;
  416.         }
  417.     }
  418.     else if (Result != -1)
  419.     {
  420.         //
  421.         // DialogBoxParam executed successfully, but the user canceled the dialog
  422.         //
  423.         SetLastError(Result);
  424.     }
  425.     return pszPort;
  426. }