windows-nt/Source/XPSP1/NT/printscan/print/spooler/inetpp2/clientui/xcvdlg.cpp
2020-09-26 16:20:57 +08:00

180 lines
4.4 KiB
C++

/*****************************************************************************\
* MODULE: configdlg.cxx
*
* The module contains routines for handling the authentication dialog
* for internet priting
*
* Copyright (C) 1996-1998 Microsoft Corporation
*
* History:
* 07/31/98 WeihaiC Created
* 04/10/00 WeihaiC Moved it to client side
*
\*****************************************************************************/
#include "precomp.h"
#include "priv.h"
TXcvDlg::TXcvDlg (
LPCWSTR pServerName,
HWND hWnd,
LPCWSTR pszPortName):
m_pServerName (pServerName),
m_hWnd (hWnd),
m_pszPortName (pszPortName),
m_pXcvName (NULL),
m_hXcvPort (NULL),
m_bAdmin (FALSE),
m_hInst (NULL),
m_dwLE (ERROR_SUCCESS),
m_bValid (FALSE)
{
DWORD cbNeeded, dwStatus;
PRINTER_DEFAULTS pd = {NULL, NULL, SERVER_ALL_ACCESS};
HANDLE hServer;
BOOL bRet = FALSE;
if (OpenPrinter (NULL, &hServer, &pd)) {
ClosePrinter (hServer);
m_bAdmin = TRUE;
}
if (m_pXcvName = ConstructXcvName (m_pServerName, m_pszPortName, L"XcvPort")) {
if (OpenPrinter (m_pXcvName, &m_hXcvPort, NULL)) {
m_bValid = TRUE;
}
}
}
TXcvDlg::~TXcvDlg ()
{
if (m_pXcvName) {
LocalFree (m_pXcvName);
}
if (m_hXcvPort) {
ClosePrinter (m_hXcvPort);
}
}
PWSTR
TXcvDlg::ConstructXcvName(
PCWSTR pServerName,
PCWSTR pObjectName,
PCWSTR pObjectType
)
{
DWORD cbOutput;
PWSTR pOut;
cbOutput = pServerName ? (wcslen(pServerName) + 2)*sizeof(WCHAR) : sizeof(WCHAR); /* "\\Server\," */
cbOutput += (wcslen(pObjectType) + 2)*sizeof(WCHAR); /* "\\Server\,XcvPort _" */
cbOutput += pObjectName ? (wcslen(pObjectName))*sizeof(WCHAR) : 0; /* "\\Server\,XcvPort Object_" */
//
// For some reason, new crashes explorer, so we use LocalAlloc instead - weihaic
//
if (pOut = (PWSTR) LocalAlloc (LPTR, sizeof (WCHAR) * cbOutput)) { //new WCHAR [cbOutput]) {
if (pServerName) {
wcscpy(pOut,pServerName);
wcscat(pOut, L"\\");
}
wcscat(pOut,L",");
wcscat(pOut,pObjectType);
wcscat(pOut,L" ");
if (pObjectName)
wcscat(pOut,pObjectName);
}
return pOut;
}
VOID
TXcvDlg::DisplayLastError (
HWND hWnd,
UINT iTitle)
{
DisplayErrorMsg (m_hInst, hWnd, iTitle, GetLastError ());
}
VOID
TXcvDlg::DisplayErrorMsg (
HINSTANCE hInst,
HWND hWnd,
UINT iTitle,
DWORD dwLE)
{
TCHAR szBuf[MAX_BUF_SIZE];
TCHAR szMsgBuf[MAX_BUF_SIZE];
UINT iMsg;
LPTSTR lpMsgBuf = NULL;
BOOL bFound = TRUE;
switch (dwLE) {
case ERROR_ACCESS_DENIED:
iMsg = IDS_ACCESS_DENIED;
break;
case ERROR_INVALID_NAME:
case ERROR_INVALID_PRINTER_NAME:
iMsg = IDS_INVALID_PRINTER_NAME;
break;
case ERROR_INTERNET_TIMEOUT:
iMsg = IDS_NETWORK_TIMEOUT;
break;
case ERROR_DEVICE_REINITIALIZATION_NEEDED:
iMsg = IDS_INITIALIZATION_ERROR;
break;
case ERROR_NOT_FOUND:
iMsg = IDS_PORT_DELETED;
break;
default:
bFound = FALSE;
break;
}
if (LoadString (hInst, iTitle, szBuf, MAX_BUF_SIZE)) {
if (bFound) {
if (LoadString (hInst, iMsg, szMsgBuf, MAX_BUF_SIZE))
MessageBox( hWnd, szMsgBuf, szBuf, MB_OK | MB_ICONERROR);
}
else {
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL) && lpMsgBuf) {
MessageBox( hWnd, (LPCTSTR)lpMsgBuf, szBuf, MB_OK | MB_ICONERROR );
// Free the buffer.
LocalFree( lpMsgBuf );
}
else {
//
// Most likely it is because we've got an error code from wininet, where
// we can not locate the resource file
//
if (LoadString (hInst, IDS_INVALID_SETTING, szMsgBuf, MAX_BUF_SIZE))
MessageBox( hWnd, szMsgBuf, szBuf, MB_OK | MB_ICONERROR);
}
}
}
}