180 lines
4.4 KiB
C++
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);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|