mirror of https://github.com/lianthony/NT4.0
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.
1847 lines
42 KiB
1847 lines
42 KiB
//
|
|
// inetprop.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "comprop.h"
|
|
#ifdef _INET_ACCESS
|
|
#include "inetcom.h"
|
|
#else
|
|
#include "inetinfo.h"
|
|
#endif
|
|
#include "svcloc.h"
|
|
#include "inetprop.h"
|
|
|
|
#define DLL_BASED // Not interested in prototypes
|
|
#include "svrinfo.h"
|
|
|
|
extern "C"
|
|
{
|
|
#include <lm.h>
|
|
|
|
#ifndef _COMSTATIC
|
|
COMDLL BOOL WINAPI LibMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved);
|
|
#endif
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
//
|
|
// Period to sleep while waiting for service to attain desired state
|
|
//
|
|
#define SLEEP_INTERVAL 500L
|
|
|
|
//
|
|
// Maximum time to wait for service to attain desired state
|
|
//
|
|
#define MAX_SLEEP 180000L
|
|
|
|
HINSTANCE hDLLInstance; // Calling instance
|
|
|
|
//===========================================================================
|
|
//
|
|
// Utility Functions
|
|
//
|
|
//===========================================================================
|
|
|
|
NET_API_STATUS
|
|
GetInetComment(
|
|
LPCTSTR lpstrServer, // Server whose comment is to be queried.
|
|
DWORD dwServiceMask, // INet service mask
|
|
int cchComment, // Size of comment buffer in characters
|
|
LPTSTR lpstrComment // Comment buffer.
|
|
)
|
|
{
|
|
ASSERT(dwServiceMask != 0);
|
|
|
|
INETA_CONFIG_INFO * pInfo = NULL;
|
|
NET_API_STATUS err;
|
|
|
|
TRY
|
|
{
|
|
TRACEEOLID(_T("Attempting to get comment"));
|
|
err = ::INetAGetAdminInformation( TWSTRREF(lpstrServer),
|
|
dwServiceMask, &pInfo);
|
|
TRACEEOLID(_T("INetAGetAdminInformation returned ") << err);
|
|
if (err == ERROR_SUCCESS)
|
|
{
|
|
ASSERT(pInfo != NULL);
|
|
if (lstrlenW(pInfo->CommonConfigInfo.lpszServerComment) < cchComment)
|
|
{
|
|
WTSTRCPY(lpstrComment, pInfo->CommonConfigInfo.lpszServerComment,
|
|
cchComment);
|
|
}
|
|
else
|
|
{
|
|
err = ERROR_INSUFFICIENT_BUFFER;
|
|
}
|
|
}
|
|
}
|
|
CATCH_ALL(e)
|
|
{
|
|
err = GetLastError();
|
|
}
|
|
END_CATCH_ALL
|
|
|
|
if ( pInfo != NULL )
|
|
{
|
|
NETAPIBUFFERFREE( pInfo );
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
//
|
|
// Determine the status of the given service on the given machine.
|
|
//
|
|
NET_API_STATUS
|
|
QueryInetServiceStatus(
|
|
LPCTSTR lpszServer,
|
|
LPCTSTR lpszService,
|
|
int * pnState
|
|
)
|
|
{
|
|
|
|
#ifdef NO_SERVICE_CONTROLLER
|
|
|
|
*pnState = INetServiceUnknown;
|
|
|
|
return ERROR_SUCCESS;
|
|
|
|
#else
|
|
|
|
SC_HANDLE hScManager;
|
|
NET_API_STATUS err = ERROR_SUCCESS;
|
|
|
|
hScManager = ::OpenSCManager(lpszServer, NULL, SC_MANAGER_ENUMERATE_SERVICE);
|
|
|
|
if (hScManager == NULL)
|
|
{
|
|
return ::GetLastError();
|
|
}
|
|
|
|
SC_HANDLE hService = ::OpenService(hScManager,
|
|
lpszService, SERVICE_QUERY_STATUS);
|
|
|
|
if (hService == NULL)
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
else
|
|
{
|
|
SERVICE_STATUS ss;
|
|
|
|
VERIFY(::QueryServiceStatus(hService, &ss));
|
|
|
|
switch(ss.dwCurrentState)
|
|
{
|
|
case SERVICE_STOPPED:
|
|
case SERVICE_STOP_PENDING:
|
|
*pnState = INetServiceStopped;
|
|
break;
|
|
|
|
case SERVICE_RUNNING:
|
|
case SERVICE_START_PENDING:
|
|
case SERVICE_CONTINUE_PENDING:
|
|
*pnState = INetServiceRunning;
|
|
break;
|
|
|
|
case SERVICE_PAUSE_PENDING:
|
|
case SERVICE_PAUSED:
|
|
*pnState = INetServicePaused;
|
|
break;
|
|
|
|
default:
|
|
*pnState = INetServiceUnknown;
|
|
}
|
|
|
|
//
|
|
// Make sure this is a controllable service
|
|
//
|
|
if ( (*pnState == INetServiceRunning || *pnState == INetServicePaused)
|
|
&& !(ss.dwControlsAccepted & SERVICE_ACCEPT_SHUTDOWN))
|
|
{
|
|
TRACEEOLID(_T("Service not controllable -- ignored"));
|
|
::CloseServiceHandle(hService);
|
|
::CloseServiceHandle(hScManager);
|
|
|
|
return ERROR_SERVICE_START_HANG;
|
|
}
|
|
|
|
::CloseServiceHandle(hService);
|
|
}
|
|
|
|
::CloseServiceHandle(hScManager);
|
|
|
|
return err;
|
|
|
|
#endif // NO_SERVICE_CONTROLLER
|
|
}
|
|
|
|
//
|
|
// Start/stop/pause or continue the service
|
|
//
|
|
NET_API_STATUS
|
|
ChangeInetServiceState(
|
|
LPCTSTR lpszServer, // Server name
|
|
LPCTSTR lpszService, // Service name
|
|
int nNewState, // INetService* definition.
|
|
int * pnCurrentState // Ptr to current state (will be changed)
|
|
)
|
|
{
|
|
#ifdef NO_SERVICE_CONTROLLER
|
|
|
|
*pnCurrentState = INetServiceUnknown;
|
|
|
|
return ERROR_SERVICE_REQUEST_TIMEOUT;
|
|
|
|
#else
|
|
|
|
SC_HANDLE hService = NULL;
|
|
SC_HANDLE hScManager = NULL;
|
|
NET_API_STATUS err = ERROR_SUCCESS;
|
|
|
|
do
|
|
{
|
|
hScManager = ::OpenSCManager(lpszServer, NULL, SC_MANAGER_ALL_ACCESS);
|
|
|
|
if (hScManager == NULL)
|
|
{
|
|
err = ::GetLastError();
|
|
break;
|
|
}
|
|
|
|
hService = ::OpenService(hScManager, lpszService, SERVICE_ALL_ACCESS);
|
|
if (hService == NULL)
|
|
{
|
|
err = ::GetLastError();
|
|
break;
|
|
}
|
|
|
|
BOOL fSuccess = FALSE;
|
|
DWORD dwTargetState;
|
|
DWORD dwPendingState;
|
|
SERVICE_STATUS ss;
|
|
|
|
switch(nNewState)
|
|
{
|
|
case INetServiceStopped:
|
|
dwTargetState = SERVICE_STOPPED;
|
|
dwPendingState = SERVICE_STOP_PENDING;
|
|
fSuccess = ::ControlService(hService, SERVICE_CONTROL_STOP, &ss);
|
|
break;
|
|
|
|
case INetServiceRunning:
|
|
dwTargetState = SERVICE_RUNNING;
|
|
if (*pnCurrentState == INetServicePaused)
|
|
{
|
|
dwPendingState = SERVICE_CONTINUE_PENDING;
|
|
fSuccess = ::ControlService(hService, SERVICE_CONTROL_CONTINUE, &ss);
|
|
}
|
|
else
|
|
{
|
|
dwPendingState = SERVICE_START_PENDING;
|
|
fSuccess = ::StartService(hService, 0, NULL);
|
|
}
|
|
break;
|
|
|
|
case INetServicePaused:
|
|
dwTargetState = SERVICE_PAUSED;
|
|
dwPendingState = SERVICE_PAUSE_PENDING;
|
|
fSuccess = ::ControlService(hService, SERVICE_CONTROL_PAUSE, &ss);
|
|
break;
|
|
|
|
default:
|
|
ASSERT(0 && "Invalid service state requested");
|
|
err = ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (!fSuccess && err == ERROR_SUCCESS)
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Wait for the service to attain desired state, timeout
|
|
// after 3 minutes.
|
|
//
|
|
DWORD dwSleepTotal = 0L;
|
|
|
|
while (dwSleepTotal < MAX_SLEEP)
|
|
{
|
|
if (!::QueryServiceStatus(hService, &ss))
|
|
{
|
|
err = ::GetLastError();
|
|
break;
|
|
}
|
|
|
|
if (ss.dwCurrentState != dwPendingState)
|
|
{
|
|
//
|
|
// Done one way or another
|
|
//
|
|
if (dwTargetState != ss.dwCurrentState)
|
|
{
|
|
//
|
|
// Did not achieve desired result. Something went
|
|
// wrong.
|
|
//
|
|
err = ss.dwWin32ExitCode;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Still pending...
|
|
//
|
|
::Sleep(SLEEP_INTERVAL);
|
|
|
|
dwSleepTotal += SLEEP_INTERVAL;
|
|
}
|
|
|
|
if (dwSleepTotal >= MAX_SLEEP)
|
|
{
|
|
err = ERROR_SERVICE_REQUEST_TIMEOUT;
|
|
}
|
|
|
|
//
|
|
// Update state information
|
|
//
|
|
switch(ss.dwCurrentState)
|
|
{
|
|
case SERVICE_STOPPED:
|
|
case SERVICE_STOP_PENDING:
|
|
*pnCurrentState = INetServiceStopped;
|
|
break;
|
|
|
|
case SERVICE_RUNNING:
|
|
case SERVICE_START_PENDING:
|
|
case SERVICE_CONTINUE_PENDING:
|
|
*pnCurrentState = INetServiceRunning;
|
|
break;
|
|
|
|
case SERVICE_PAUSE_PENDING:
|
|
case SERVICE_PAUSED:
|
|
*pnCurrentState = INetServicePaused;
|
|
break;
|
|
|
|
default:
|
|
*pnCurrentState = INetServiceUnknown;
|
|
}
|
|
}
|
|
while(FALSE);
|
|
|
|
if (hService)
|
|
{
|
|
::CloseServiceHandle(hService);
|
|
}
|
|
|
|
if (hScManager)
|
|
{
|
|
::CloseServiceHandle(hScManager);
|
|
}
|
|
|
|
return err;
|
|
|
|
#endif // NO_SERVICE_CONTROLLER
|
|
}
|
|
|
|
//
|
|
// Modal dialogproc to replace the semi-modal MFC 4.0
|
|
// implementation. Using this requires DoModal to be
|
|
// overridden.
|
|
//
|
|
LRESULT CALLBACK
|
|
MfcModalDlgProc(
|
|
IN HWND hWnd,
|
|
IN UINT message,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
{
|
|
//
|
|
// test for special case (Win 3.0 will call dialog proc instead
|
|
// of SendMessage for these two messages).
|
|
//
|
|
if (message != WM_SETFONT && message != WM_INITDIALOG)
|
|
{
|
|
return 0L; // normal handler
|
|
}
|
|
|
|
//
|
|
// the hWnd passed can be a child of the real dialog
|
|
//
|
|
CDialog * pDlg = (CDialog *)CWnd::FromHandlePermanent(hWnd);
|
|
if (pDlg == NULL && (::GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD))
|
|
{
|
|
pDlg = (CDialog *)CWnd::FromHandlePermanent(::GetParent(hWnd));
|
|
}
|
|
|
|
ASSERT(pDlg != NULL);
|
|
ASSERT(pDlg->IsKindOf(RUNTIME_CLASS(CDialog)));
|
|
|
|
//
|
|
// prepare for callback, make it look like message map call
|
|
//
|
|
LONG lResult = 0;
|
|
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
|
|
MSG oldState = pThreadState->m_lastSentMsg; // save for nesting
|
|
|
|
pThreadState->m_lastSentMsg.hwnd = hWnd;
|
|
pThreadState->m_lastSentMsg.message = message;
|
|
pThreadState->m_lastSentMsg.wParam = wParam;
|
|
pThreadState->m_lastSentMsg.lParam = lParam;
|
|
|
|
TRY
|
|
{
|
|
if (message == WM_SETFONT)
|
|
{
|
|
pDlg->OnSetFont(CFont::FromHandle((HFONT)wParam));
|
|
}
|
|
else // WM_INITDIALOG
|
|
{
|
|
lResult = pDlg->OnInitDialog();
|
|
}
|
|
}
|
|
CATCH_ALL(e)
|
|
{
|
|
//
|
|
// fall through
|
|
//
|
|
TRACEEOLID("Warning: something went wrong in dialog init.");
|
|
pDlg->EndDialog(IDABORT); // something went wrong
|
|
}
|
|
END_CATCH_ALL
|
|
|
|
pThreadState->m_lastSentMsg = oldState;
|
|
|
|
return lResult;
|
|
}
|
|
|
|
//===========================================================================
|
|
//
|
|
// Utility classes
|
|
//
|
|
//===========================================================================
|
|
|
|
//
|
|
// Pure virtual base class for INetApi objects
|
|
//
|
|
CInetConfig::CInetConfig(
|
|
DWORD dwServiceMask,
|
|
CStringList * pServerList,
|
|
CWnd * pParent
|
|
)
|
|
: m_pServerList(pServerList),
|
|
m_dwServiceMask(dwServiceMask),
|
|
m_fAllocatedByAPI(FALSE),
|
|
m_err(0L),
|
|
m_pInfo(NULL),
|
|
m_pParent(pParent)
|
|
{
|
|
ASSERT(m_pServerList != NULL);
|
|
}
|
|
|
|
//
|
|
// Copy constructor
|
|
//
|
|
CInetConfig::CInetConfig(
|
|
const CInetConfig & inetConfig
|
|
)
|
|
: m_pServerList(inetConfig.m_pServerList),
|
|
m_dwServiceMask(inetConfig.m_dwServiceMask),
|
|
m_pParent(inetConfig.m_pParent),
|
|
m_fAllocatedByAPI(FALSE),
|
|
m_err(0L),
|
|
m_pInfo(NULL)
|
|
{
|
|
ASSERT(m_pServerList != NULL);
|
|
}
|
|
|
|
CInetConfig::~CInetConfig()
|
|
{
|
|
DestroyContents();
|
|
}
|
|
|
|
void
|
|
CInetConfig::DestroyContents()
|
|
{
|
|
if (m_pInfo == NULL)
|
|
{
|
|
TRACEEOLID(_T("No Contents to Destroy"));
|
|
return;
|
|
}
|
|
|
|
if (m_fAllocatedByAPI)
|
|
{
|
|
TRACEEOLID(_T("Destroying API allocated structure"));
|
|
NETAPIBUFFERFREE( m_pInfo );
|
|
m_fAllocatedByAPI = FALSE;
|
|
}
|
|
else
|
|
{
|
|
TRACEEOLID(_T("Destroying privately allocated structure"));
|
|
delete m_pInfo;
|
|
}
|
|
|
|
m_pInfo = NULL;
|
|
}
|
|
|
|
//
|
|
// Prepare object to receive new values
|
|
//
|
|
void
|
|
CInetConfig::Initialize()
|
|
{
|
|
TRACEEOLID(_T("CInetConfig::Initialize()"));
|
|
|
|
//
|
|
// Clean up if necessary
|
|
//
|
|
DestroyContents();
|
|
ASSERT(m_pInfo == NULL);
|
|
ASSERT(!m_fAllocatedByAPI);
|
|
}
|
|
|
|
//
|
|
// Initialize data by having the derived
|
|
// class call the API
|
|
//
|
|
NET_API_STATUS
|
|
CInetConfig::GetInfo()
|
|
{
|
|
//
|
|
// Should be fully initialized by now
|
|
//
|
|
ASSERT( m_pServerList != NULL);
|
|
ASSERT( m_dwServiceMask != 0);
|
|
|
|
if ( m_pServerList->GetCount() == 1)
|
|
{
|
|
//
|
|
// Clean up if necessary
|
|
//
|
|
DestroyContents();
|
|
|
|
//
|
|
// We only fetch data when only one server is
|
|
// selected.
|
|
//
|
|
if (m_pParent != NULL)
|
|
{
|
|
m_pParent->BeginWaitCursor();
|
|
}
|
|
|
|
m_fAllocatedByAPI = TRUE;
|
|
//
|
|
// Call the derived class
|
|
//
|
|
m_err = GetApiStructure(GetPrimaryServer());
|
|
|
|
TRACEEOLID(_T("GetInfo() returned ") << m_err);
|
|
|
|
if (m_pParent != NULL)
|
|
{
|
|
m_pParent->EndWaitCursor();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TRACEEOLID(_T("More than 1 server selected --> GetInfo() ignored"));
|
|
}
|
|
|
|
return m_err;
|
|
}
|
|
|
|
//
|
|
// As above, but in reverse
|
|
//
|
|
NET_API_STATUS
|
|
CInetConfig::SetInfo(
|
|
BOOL fCommon // If TRUE, applies to all services
|
|
)
|
|
{
|
|
//
|
|
// Make sure there's data to be saved
|
|
//
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
//
|
|
// Save the information for each selected server
|
|
//
|
|
for (POSITION pos = m_pServerList->GetHeadPosition(); pos != NULL; )
|
|
{
|
|
CString str = m_pServerList->GetNext( pos );
|
|
|
|
if (m_pParent != NULL)
|
|
{
|
|
m_pParent->BeginWaitCursor();
|
|
}
|
|
|
|
//
|
|
// Call the derived class
|
|
//
|
|
m_err = SetApiStructure(str, fCommon);
|
|
TRACEEOLID(_T("SetInfo() returned ") << m_err);
|
|
|
|
if (m_pParent != NULL)
|
|
{
|
|
m_pParent->EndWaitCursor();
|
|
}
|
|
}
|
|
|
|
return m_err;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// InetAGlobalConfigInfo API wrapper
|
|
//
|
|
CInetAGlobalConfigInfo::CInetAGlobalConfigInfo(
|
|
DWORD dwServiceMask,
|
|
CStringList * pServerList,
|
|
CWnd * pParent
|
|
)
|
|
: CInetConfig(dwServiceMask, pServerList, pParent)
|
|
{
|
|
}
|
|
|
|
//
|
|
// Prepare object to receive new values
|
|
//
|
|
void
|
|
CInetAGlobalConfigInfo::Initialize()
|
|
{
|
|
TRACEEOLID(_T("CInetAGlobalConfigInfo::Initialize()"));
|
|
CInetConfig::Initialize();
|
|
|
|
m_pInfo = new INETA_GLOBAL_CONFIG_INFO;
|
|
::memset(m_pInfo, 0, sizeof(INETA_GLOBAL_CONFIG_INFO));
|
|
}
|
|
|
|
//
|
|
// Set bandwidth level value. Value is in bytes
|
|
//
|
|
void
|
|
CInetAGlobalConfigInfo::SetValues(
|
|
DWORD dwMaxNetworkUse
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Mem cache SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_GLOBAL_CONFIG_INFO lp = (LPINETA_GLOBAL_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl, FC_GINETA_BANDWIDTH_LEVEL);
|
|
lp->BandwidthLevel = dwMaxNetworkUse;
|
|
}
|
|
|
|
#ifdef _INET_ACCESS
|
|
|
|
void
|
|
CInetAGlobalConfigInfo::SetValues(
|
|
BOOL fEnableFiltering,
|
|
int nGrantedDenied,
|
|
LPINET_ACCS_DOMAIN_FILTER_LIST GrantList,
|
|
LPINET_ACCS_DOMAIN_FILTER_LIST DenyList
|
|
)
|
|
{
|
|
TRACEEOLID(_T("filter SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_GLOBAL_CONFIG_INFO lp = (LPINETA_GLOBAL_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl, FC_GINET_ACCS_DOMAIN_FILTER_CONFIG);
|
|
|
|
if (fEnableFiltering)
|
|
{
|
|
lp->DomainFilterType = nGrantedDenied == 0
|
|
? INET_ACCS_DOMAIN_FILTER_DENIED
|
|
: INET_ACCS_DOMAIN_FILTER_GRANT;
|
|
}
|
|
else
|
|
{
|
|
lp->DomainFilterType = INET_ACCS_DOMAIN_FILTER_DISABLED;
|
|
}
|
|
|
|
lp->GrantFilterList = GrantList;
|
|
lp->DenyFilterList = DenyList;
|
|
}
|
|
|
|
void
|
|
CInetAGlobalConfigInfo::SetValues(
|
|
LPINETA_DISK_CACHE_LOC_LIST lpCacheEntries
|
|
)
|
|
{
|
|
TRACEEOLID(_T("directory cache SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_GLOBAL_CONFIG_INFO lp = (LPINETA_GLOBAL_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl, FC_GINETA_DISK_CACHE_LOCATION);
|
|
|
|
lp->DiskCacheList = lpCacheEntries;
|
|
}
|
|
|
|
#endif // _INET_ACCESS
|
|
|
|
NET_API_STATUS
|
|
CInetAGlobalConfigInfo::GetApiStructure(
|
|
LPCTSTR lpstrServer
|
|
)
|
|
{
|
|
ASSERT(m_dwServiceMask != 0);
|
|
ASSERT(m_pInfo == NULL); // Should be clean
|
|
|
|
NET_API_STATUS err;
|
|
|
|
TRY
|
|
{
|
|
err = ::INetAGetGlobalAdminInformation( TWSTRREF(lpstrServer),
|
|
m_dwServiceMask, (LPINETA_GLOBAL_CONFIG_INFO *)&m_pInfo );
|
|
TRACEEOLID(_T("INetAGetGlobalAdminInformation returned ") << err);
|
|
}
|
|
CATCH_ALL(e)
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
END_CATCH_ALL
|
|
|
|
return err;
|
|
}
|
|
|
|
NET_API_STATUS
|
|
CInetAGlobalConfigInfo::SetApiStructure(
|
|
LPCTSTR lpstrServer,
|
|
BOOL fCommon
|
|
)
|
|
{
|
|
ASSERT(m_pInfo != NULL);
|
|
NET_API_STATUS err;
|
|
|
|
TRY
|
|
{
|
|
//
|
|
// If this information is common to all services,
|
|
// use 0xffff for the service mask
|
|
//
|
|
err = ::INetASetGlobalAdminInformation( TWSTRREF(lpstrServer), fCommon
|
|
? 0xFFFF
|
|
: m_dwServiceMask,
|
|
(LPINETA_GLOBAL_CONFIG_INFO)m_pInfo );
|
|
|
|
TRACEEOLID(_T("INetASetGlobalAdminInformation returned ") << err);
|
|
}
|
|
CATCH_ALL(e)
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
END_CATCH_ALL
|
|
|
|
return err;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// InetAConfigInfo API wrapper
|
|
//
|
|
CInetAConfigInfo::CInetAConfigInfo(
|
|
DWORD dwServiceMask,
|
|
CStringList * pServerList,
|
|
CWnd * pParent
|
|
)
|
|
: CInetConfig(dwServiceMask, pServerList, pParent)
|
|
{
|
|
}
|
|
|
|
void
|
|
CInetAConfigInfo::Initialize()
|
|
{
|
|
TRACEEOLID(_T("CInetAConfigInfo::Initialize()"));
|
|
CInetConfig::Initialize();
|
|
m_pInfo = new INETA_CONFIG_INFO;
|
|
::memset(m_pInfo, 0, sizeof(INETA_CONFIG_INFO));
|
|
}
|
|
|
|
#ifdef _INET_INFO
|
|
//
|
|
// Set virtual roots
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPINETA_VIRTUAL_ROOT_LIST lpVirtualRoots
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Virtual Roots SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl, FC_INETA_VIRTUAL_ROOTS);
|
|
lp->VirtualRoots = lpVirtualRoots;
|
|
}
|
|
|
|
//
|
|
// Set site security
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPINETA_IP_SEC_LIST GrantList,
|
|
LPINETA_IP_SEC_LIST DenyList
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Site Security SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl, FC_INETA_SITE_SECURITY);
|
|
lp->DenyIPList = DenyList;
|
|
lp->GrantIPList = GrantList;
|
|
}
|
|
#endif // _INET_INFO
|
|
|
|
//
|
|
// Set logging information
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPINETA_LOG_CONFIGURATION lpLogInfo
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Logging SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl, FC_INETA_LOG_CONFIG);
|
|
lp->CommonConfigInfo.lpLogConfig = lpLogInfo;
|
|
}
|
|
|
|
//
|
|
// Set service information
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment,
|
|
LPWSTR lpszAdminEmail,
|
|
LPWSTR lpszAdminName
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Service Info SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_ADMIN_NAME |
|
|
FC_INETA_SERVER_COMMENT |
|
|
FC_INETA_ADMIN_EMAIL);
|
|
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
lp->CommonConfigInfo.lpszAdminEmail = lpszAdminEmail;
|
|
lp->CommonConfigInfo.lpszAdminName = lpszAdminName;
|
|
}
|
|
|
|
#ifdef _INET_INFO
|
|
//
|
|
// Set service information (Gopher Service Page)
|
|
//
|
|
#ifdef NO_LSA
|
|
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment,
|
|
LPWSTR lpszAdminEmail,
|
|
LPWSTR lpszAdminName,
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Service Info SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_ADMIN_NAME |
|
|
FC_INETA_SERVER_COMMENT |
|
|
FC_INETA_ADMIN_EMAIL |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
lp->CommonConfigInfo.lpszAdminEmail = lpszAdminEmail;
|
|
lp->CommonConfigInfo.lpszAdminName = lpszAdminName;
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
lp->sPort = nTCPPort;
|
|
}
|
|
|
|
//
|
|
// Set sessions info
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment,
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_SERVER_COMMENT |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
lp->sPort = nTCPPort;
|
|
}
|
|
|
|
//
|
|
// Set sessions info
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment,
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut,
|
|
DWORD dwAuthentication
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_AUTHENTICATION |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_SERVER_COMMENT |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
lp->dwAuthentication = dwAuthentication;
|
|
lp->sPort = nTCPPort;
|
|
|
|
}
|
|
|
|
//
|
|
// Set sessions info
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment,
|
|
int nConnectionTimeOut,
|
|
DWORD dwAuthentication
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_AUTHENTICATION |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_SERVER_COMMENT);
|
|
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
lp->dwAuthentication = dwAuthentication;
|
|
}
|
|
|
|
//
|
|
// Set sessions info
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut,
|
|
DWORD dwAuthentication
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_AUTHENTICATION |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
lp->dwAuthentication = dwAuthentication;
|
|
lp->sPort = nTCPPort;
|
|
}
|
|
|
|
//
|
|
// Set sessions info w/o authentication
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
lp->sPort = nTCPPort;
|
|
}
|
|
|
|
#else
|
|
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment,
|
|
LPWSTR lpszAdminEmail,
|
|
LPWSTR lpszAdminName,
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut,
|
|
LPWSTR lpszAnonUserName,
|
|
LPCTSTR lpszPassword
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Service Info SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_ADMIN_NAME |
|
|
FC_INETA_SERVER_COMMENT |
|
|
FC_INETA_ADMIN_EMAIL |
|
|
FC_INETA_ANON_USER_NAME |
|
|
FC_INETA_ANON_PASSWORD |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
lp->CommonConfigInfo.lpszAdminEmail = lpszAdminEmail;
|
|
lp->CommonConfigInfo.lpszAdminName = lpszAdminName;
|
|
lp->lpszAnonUserName = lpszAnonUserName;
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
TWSTRCPY(lp->szAnonPassword, lpszPassword, STRSIZE(lp->szAnonPassword));
|
|
lp->sPort = nTCPPort;
|
|
}
|
|
|
|
//
|
|
// Set sessions info
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment,
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut,
|
|
LPWSTR lpszAnonUserName,
|
|
LPCTSTR lpszPassword
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_ANON_USER_NAME |
|
|
FC_INETA_ANON_PASSWORD |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_SERVER_COMMENT |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->lpszAnonUserName = lpszAnonUserName;
|
|
TWSTRCPY(lp->szAnonPassword, lpszPassword, STRSIZE(lp->szAnonPassword));
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
lp->sPort = nTCPPort;
|
|
}
|
|
|
|
//
|
|
// Set sessions info
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment,
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut,
|
|
DWORD dwAuthentication,
|
|
LPWSTR lpszAnonUserName,
|
|
LPCTSTR lpszPassword
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_AUTHENTICATION |
|
|
FC_INETA_ANON_USER_NAME |
|
|
FC_INETA_ANON_PASSWORD |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_SERVER_COMMENT |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
TWSTRCPY(lp->szAnonPassword, lpszPassword, STRSIZE(lp->szAnonPassword));
|
|
lp->lpszAnonUserName = lpszAnonUserName;
|
|
lp->dwAuthentication = dwAuthentication;
|
|
lp->sPort = nTCPPort;
|
|
}
|
|
|
|
//
|
|
// Set sessions info
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment,
|
|
int nConnectionTimeOut,
|
|
DWORD dwAuthentication,
|
|
LPWSTR lpszAnonUserName,
|
|
LPCTSTR lpszPassword
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_AUTHENTICATION |
|
|
FC_INETA_ANON_USER_NAME |
|
|
FC_INETA_ANON_PASSWORD |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_SERVER_COMMENT);
|
|
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
TWSTRCPY(lp->szAnonPassword, lpszPassword, STRSIZE(lp->szAnonPassword));
|
|
lp->lpszAnonUserName = lpszAnonUserName;
|
|
lp->dwAuthentication = dwAuthentication;
|
|
}
|
|
|
|
//
|
|
// Set sessions info
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut,
|
|
DWORD dwAuthentication,
|
|
LPWSTR lpszAnonUserName,
|
|
LPCTSTR lpszPassword
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_AUTHENTICATION |
|
|
FC_INETA_ANON_USER_NAME |
|
|
FC_INETA_ANON_PASSWORD |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->lpszAnonUserName = lpszAnonUserName;
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
TWSTRCPY(lp->szAnonPassword, lpszPassword, STRSIZE(lp->szAnonPassword));
|
|
lp->dwAuthentication = dwAuthentication;
|
|
lp->sPort = nTCPPort;
|
|
}
|
|
|
|
//
|
|
// Set sessions info w/o authentication
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
UINT nTCPPort,
|
|
int nMaxConnections,
|
|
int nConnectionTimeOut,
|
|
LPWSTR lpszAnonUserName,
|
|
LPCTSTR lpszPassword
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Sessions SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_ANON_USER_NAME |
|
|
FC_INETA_ANON_PASSWORD |
|
|
FC_INETA_CONNECTION_TIMEOUT |
|
|
FC_INETA_PORT_NUMBER |
|
|
FC_INETA_MAX_CONNECTIONS);
|
|
|
|
lp->lpszAnonUserName = lpszAnonUserName;
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
lp->CommonConfigInfo.dwConnectionTimeout = nConnectionTimeOut;
|
|
TWSTRCPY(lp->szAnonPassword, lpszPassword, STRSIZE(lp->szAnonPassword));
|
|
lp->sPort = nTCPPort;
|
|
}
|
|
|
|
#endif // NO_LSA
|
|
|
|
#endif // _INET_INFO
|
|
|
|
//
|
|
// Set service comment
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
LPWSTR lpszServerComment
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Service Info SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl, FC_INETA_SERVER_COMMENT );
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
}
|
|
|
|
#ifdef _INET_ACCESS
|
|
//
|
|
// This one is used in Catapult only
|
|
//
|
|
void
|
|
CInetAConfigInfo::SetValues(
|
|
int nMaxConnections,
|
|
LPWSTR lpszServerComment,
|
|
LPWSTR lpszAdminEmail,
|
|
LPWSTR lpszAdminName
|
|
)
|
|
{
|
|
TRACEEOLID(_T("Catapult flavour Service Info SetValues() called"));
|
|
|
|
Initialize();
|
|
ASSERT(m_pInfo != NULL);
|
|
|
|
LPINETA_CONFIG_INFO lp = (LPINETA_CONFIG_INFO)m_pInfo;
|
|
SetField( lp->FieldControl,
|
|
FC_INETA_ADMIN_NAME |
|
|
FC_INETA_SERVER_COMMENT |
|
|
FC_INETA_MAX_CONNECTIONS |
|
|
FC_INETA_ADMIN_EMAIL);
|
|
|
|
lp->CommonConfigInfo.lpszServerComment = lpszServerComment;
|
|
lp->CommonConfigInfo.lpszAdminEmail = lpszAdminEmail;
|
|
lp->CommonConfigInfo.lpszAdminName = lpszAdminName;
|
|
lp->CommonConfigInfo.dwMaxConnections = nMaxConnections;
|
|
}
|
|
|
|
#endif // _INET_ACCESS
|
|
|
|
NET_API_STATUS
|
|
CInetAConfigInfo::GetApiStructure(
|
|
LPCTSTR lpstrServer
|
|
)
|
|
{
|
|
ASSERT(m_dwServiceMask != 0);
|
|
ASSERT(m_pInfo == NULL); // Should be clean
|
|
NET_API_STATUS err;
|
|
|
|
TRY
|
|
{
|
|
err = ::INetAGetAdminInformation( TWSTRREF(lpstrServer), m_dwServiceMask,
|
|
(LPINETA_CONFIG_INFO *)&m_pInfo );
|
|
|
|
TRACEEOLID(_T("INetAGetAdminInformation returned ") << err);
|
|
}
|
|
CATCH_ALL(e)
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
END_CATCH_ALL
|
|
|
|
return err;
|
|
}
|
|
|
|
NET_API_STATUS
|
|
CInetAConfigInfo::SetApiStructure(
|
|
LPCTSTR lpstrServer,
|
|
BOOL fCommon
|
|
)
|
|
{
|
|
ASSERT(m_pInfo != NULL);
|
|
NET_API_STATUS err;
|
|
|
|
TRY
|
|
{
|
|
//
|
|
// If this information is common to all services,
|
|
// use 0xffff for the service mask
|
|
//
|
|
err = ::INetASetAdminInformation( TWSTRREF(lpstrServer), fCommon
|
|
? 0xFFFF
|
|
: m_dwServiceMask,
|
|
(LPINETA_CONFIG_INFO)m_pInfo
|
|
);
|
|
|
|
TRACEEOLID(_T("INetASetAdminInformation returned ") << err);
|
|
}
|
|
CATCH_ALL(e)
|
|
{
|
|
err = ::GetLastError();
|
|
}
|
|
END_CATCH_ALL
|
|
|
|
return err;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// InetInfoGetServerCapabilities API wrapper
|
|
//
|
|
CInetServiceCap::CInetServiceCap (
|
|
CStringList * pServerList
|
|
)
|
|
//
|
|
// Build defaults matching the 1.0 Gibraltar Server
|
|
// because the Service Cap api is not available
|
|
// there.
|
|
//
|
|
: m_CapVersion(0L), // Cap version Server
|
|
m_ProductType(1L), // Server
|
|
m_MajorVersion(3L), // OS Version 3.51.1057
|
|
m_MinorVersion(51L), //
|
|
m_BuildNumber(1057L), //
|
|
m_Flag(0xFFFFFFFF), // Everything enabled
|
|
m_Mask(0xFFFFFFFF), //
|
|
m_pServerList(pServerList),
|
|
m_err(0L)
|
|
{
|
|
ASSERT(m_pServerList != NULL);
|
|
}
|
|
|
|
NET_API_STATUS
|
|
CInetServiceCap::GetInfo()
|
|
{
|
|
#if defined(_INET_INFO) && !defined(WIN95)
|
|
|
|
LPINET_CAPABILITIES lpInfo;
|
|
LPCTSTR lpstrServer = m_pServerList->GetHead();
|
|
|
|
TRY
|
|
{
|
|
m_err = ::INetAGetServerCapabilities(TWSTRREF(lpstrServer), 0L, &lpInfo);
|
|
TRACEEOLID(_T("INetAGetServerCapabilities returned ") << m_err);
|
|
|
|
if (m_err == ERROR_SUCCESS)
|
|
{
|
|
m_CapVersion = lpInfo->CapVersion;
|
|
m_ProductType = lpInfo->ProductType;
|
|
m_MajorVersion = lpInfo->MajorVersion;
|
|
m_MinorVersion = lpInfo->MinorVersion;
|
|
m_BuildNumber = lpInfo->BuildNumber;
|
|
ASSERT(lpInfo->NumCapFlags > 0);
|
|
if (lpInfo->NumCapFlags > 0)
|
|
{
|
|
m_Flag = lpInfo->CapFlags->Flag;
|
|
m_Mask = lpInfo->CapFlags->Mask;
|
|
}
|
|
|
|
NETAPIBUFFERFREE( lpInfo );
|
|
}
|
|
else
|
|
{
|
|
TRACEEOLID(_T("Failed to get Service Capabilities.")
|
|
<< _T("Synthesizing 1.0 Cap object"));
|
|
m_err = ERROR_SUCCESS;
|
|
}
|
|
}
|
|
CATCH_ALL(e)
|
|
{
|
|
m_err = ::GetLastError();
|
|
}
|
|
END_CATCH_ALL
|
|
#else
|
|
|
|
//
|
|
// VersionCap api not yet available in catapult
|
|
//
|
|
TRACEEOLID(_T("Synthesizing Catapult Cap object"));
|
|
|
|
m_err = ERROR_SUCCESS;
|
|
|
|
#endif // _INET_INFO
|
|
|
|
return m_err;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// INetPropertySheet constructor using UINT Caption ID
|
|
//
|
|
IMPLEMENT_DYNAMIC(INetPropertySheet, CPropertySheet)
|
|
|
|
INetPropertySheet::INetPropertySheet(
|
|
UINT nIDCaption,
|
|
DWORD dwServiceMask,
|
|
CStringList * pServerList,
|
|
CWnd * pParentWnd,
|
|
UINT iSelectPage
|
|
)
|
|
: CPropertySheet(nIDCaption, pParentWnd, iSelectPage),
|
|
m_inetGlobal(dwServiceMask, pServerList, pParentWnd),
|
|
m_inetConfig(dwServiceMask, pServerList, pParentWnd),
|
|
m_inetCap(pServerList),
|
|
m_fSingleServerSelected(pServerList->GetCount() == 1)
|
|
{
|
|
m_fLocal = IsCurrentServerLocal(pServerList);
|
|
m_dwServiceMask = dwServiceMask;
|
|
}
|
|
|
|
//
|
|
// INetPropertySheet constructor using LPCTSTR Caption ID
|
|
//
|
|
INetPropertySheet::INetPropertySheet(
|
|
LPCTSTR pszCaption,
|
|
DWORD dwServiceMask,
|
|
CStringList * pServerList,
|
|
CWnd * pParentWnd,
|
|
UINT iSelectPage
|
|
)
|
|
: CPropertySheet(pszCaption, pParentWnd, iSelectPage),
|
|
m_inetGlobal(dwServiceMask, pServerList, pParentWnd),
|
|
m_inetConfig(dwServiceMask, pServerList, pParentWnd),
|
|
m_inetCap(pServerList),
|
|
m_fSingleServerSelected(pServerList->GetCount() == 1)
|
|
{
|
|
m_fLocal = IsCurrentServerLocal(pServerList);
|
|
m_dwServiceMask = dwServiceMask;
|
|
}
|
|
|
|
INetPropertySheet::~INetPropertySheet()
|
|
{
|
|
//
|
|
// The Inet objects will clean themselves up
|
|
//
|
|
}
|
|
|
|
|
|
//
|
|
// Return the first non-zero error code. Return zero
|
|
// if all objects have zero error codes.
|
|
//
|
|
NET_API_STATUS
|
|
INetPropertySheet::QueryError() const
|
|
{
|
|
NET_API_STATUS err = m_inetGlobal.QueryError();
|
|
if (err != ERROR_SUCCESS)
|
|
{
|
|
return err;
|
|
}
|
|
|
|
err = m_inetConfig.QueryError();
|
|
|
|
return err;
|
|
}
|
|
|
|
//
|
|
// Check to see if we're connected to the local machine
|
|
//
|
|
BOOL
|
|
INetPropertySheet::IsCurrentServerLocal(
|
|
CStringList * pServerList
|
|
)
|
|
{
|
|
if (pServerList->GetCount() == 1)
|
|
{
|
|
TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
|
|
DWORD dwSize = sizeof(szComputerName);
|
|
LPCTSTR lpstrServer = pServerList->GetHead();
|
|
if (*lpstrServer == _T('\\'))
|
|
{
|
|
//
|
|
// Assumed to be \\computername format
|
|
//
|
|
lpstrServer += 2;
|
|
}
|
|
|
|
//
|
|
// BUGBUG: Do something different for binding over
|
|
// IP!
|
|
if (GetComputerName(szComputerName, &dwSize)
|
|
&& !lstrcmpi(szComputerName, lpstrServer))
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Initialize the INet objects by calling the
|
|
// APIs
|
|
//
|
|
void
|
|
INetPropertySheet::Initialize()
|
|
{
|
|
m_inetGlobal.GetInfo();
|
|
|
|
if (m_inetGlobal.QueryError() == NO_ERROR)
|
|
{
|
|
m_inetConfig.GetInfo();
|
|
}
|
|
|
|
//
|
|
// Attempt to determine the capabilities of the
|
|
// server
|
|
//
|
|
// Issue: How will we deal with this later when
|
|
// multi-selection may be involved?
|
|
//
|
|
ASSERT(SingleServerSelected());
|
|
m_inetCap.GetInfo();
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(INetPropertySheet, CPropertySheet)
|
|
//{{AFX_MSG_MAP(INetPropertySheet)
|
|
//}}AFX_MSG_MAP
|
|
|
|
ON_COMMAND(ID_APPLY_NOW, OnApplyNow)
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
//
|
|
// Save information on each page that
|
|
// is marked dirty.
|
|
//
|
|
NET_API_STATUS
|
|
INetPropertySheet::SavePages(
|
|
BOOL fUpdateData
|
|
)
|
|
{
|
|
INetPropertyPage * pPage = NULL;
|
|
NET_API_STATUS err = 0;
|
|
|
|
for (int i = 0; i < GetPageCount(); ++i)
|
|
{
|
|
pPage = (INetPropertyPage *)GetPage(i);
|
|
ASSERT(pPage != NULL);
|
|
//
|
|
// Update the data in each page and save
|
|
//
|
|
err = pPage->SaveInfo(fUpdateData);
|
|
|
|
if (err != NO_ERROR)
|
|
{
|
|
//
|
|
// Stop after one error...
|
|
//
|
|
break;
|
|
}
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
//
|
|
// Apply button has been pressed.
|
|
// This message comes before the data
|
|
// has been update with the ddx process
|
|
// so we call SavePages with TRUE
|
|
//
|
|
void
|
|
INetPropertySheet::OnApplyNow()
|
|
{
|
|
NET_API_STATUS err = SavePages(TRUE);
|
|
if (err != NO_ERROR)
|
|
{
|
|
DisplayMessage(err);
|
|
}
|
|
|
|
#if (_MFC_VER < 0x0320)
|
|
//
|
|
// If apply is pressed, then the apply
|
|
// button becomes disabled, and no control
|
|
// will have focus. This was fixed in
|
|
// MFC 3.2, but we're still using MFC 3.1
|
|
// in the SDK build
|
|
//
|
|
GetDlgItem(IDOK)->SetFocus();
|
|
#endif // _MFC_VER
|
|
}
|
|
|
|
//
|
|
// INetPropertyPage property page
|
|
//
|
|
IMPLEMENT_DYNAMIC(INetPropertyPage, CPropertyPage)
|
|
|
|
INetPropertyPage::INetPropertyPage(
|
|
UINT nIDTemplate,
|
|
INetPropertySheet * pSheet,
|
|
HINSTANCE hSelfHandle,
|
|
UINT nIDCaption
|
|
)
|
|
: CPropertyPage( nIDTemplate, nIDCaption ),
|
|
m_pSheet(pSheet),
|
|
|
|
#if _MFC_VER >= 0x0400
|
|
|
|
m_bChanged(FALSE),
|
|
|
|
#endif // _MFC_VER >= 0x0400
|
|
|
|
m_hSelfHandle(hSelfHandle)
|
|
{
|
|
//{{AFX_DATA_INIT(INetPropertyPage)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
|
|
ASSERT(m_pSheet != NULL);
|
|
|
|
#ifndef _COMSTATIC
|
|
ASSERT(m_hSelfHandle != NULL);
|
|
#endif // _COMSTATIC
|
|
}
|
|
|
|
INetPropertyPage::INetPropertyPage(
|
|
LPCTSTR lpszTemplateName,
|
|
INetPropertySheet * pSheet,
|
|
HINSTANCE hSelfHandle,
|
|
UINT nIDCaption
|
|
)
|
|
: CPropertyPage( lpszTemplateName, nIDCaption ),
|
|
m_pSheet(pSheet),
|
|
|
|
#if _MFC_VER >= 0x0400
|
|
|
|
m_bChanged(FALSE),
|
|
|
|
#endif // _MFC_VER >= 0x0400
|
|
|
|
m_hSelfHandle(hSelfHandle)
|
|
{
|
|
//{{AFX_DATA_INIT(INetPropertyPage)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
|
|
ASSERT(m_pSheet != NULL);
|
|
|
|
#ifndef _COMSTATIC
|
|
ASSERT(m_hSelfHandle != NULL);
|
|
#endif // _COMSTATIC
|
|
}
|
|
|
|
INetPropertyPage::~INetPropertyPage()
|
|
{
|
|
}
|
|
|
|
void
|
|
INetPropertyPage::DoDataExchange(
|
|
CDataExchange* pDX
|
|
)
|
|
{
|
|
CPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(INetPropertyPage)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(INetPropertyPage, CPropertyPage)
|
|
//{{AFX_MSG_MAP(INetPropertyPage)
|
|
// NOTE: the ClassWizard will add message map macros here
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//
|
|
// Reset changed status (sometimes gets set by e.g. spinboxes when
|
|
// the dialog is constructed
|
|
//
|
|
/* virtual */
|
|
BOOL
|
|
INetPropertyPage::OnInitDialog()
|
|
{
|
|
m_bChanged = FALSE;
|
|
return CPropertyPage::OnInitDialog();
|
|
}
|
|
|
|
//
|
|
// Override OnOK because default implementation will
|
|
// mark the sheet as clean
|
|
//
|
|
void
|
|
INetPropertyPage::OnOK()
|
|
{
|
|
ASSERT_VALID(this);
|
|
Default(); // do not call CDialog::OnOK as it will call EndDialog
|
|
}
|
|
|
|
#if _MFC_VER >= 0x0400
|
|
|
|
//
|
|
// Keep private check on dirty state of the property page.
|
|
//
|
|
void
|
|
INetPropertyPage::SetModified(
|
|
BOOL bChanged
|
|
)
|
|
{
|
|
CPropertyPage::SetModified(bChanged);
|
|
m_bChanged = bChanged;
|
|
}
|
|
|
|
#endif // _MFC_VER >= 0x0400
|
|
|
|
//
|
|
// This function is called when the page becomes
|
|
// active. Since this page resides in a DLL, we
|
|
// should set the resource handle to the current DLL
|
|
// at this point.
|
|
//
|
|
#ifndef _COMSTATIC
|
|
BOOL
|
|
INetPropertyPage::OnSetActive( )
|
|
{
|
|
//
|
|
// Store the old resource handle
|
|
//
|
|
m_hOldInstance = ::AfxGetResourceHandle();
|
|
ASSERT(m_hOldInstance != NULL);
|
|
ASSERT(m_hSelfHandle != NULL);
|
|
::AfxSetResourceHandle ( m_hSelfHandle );
|
|
|
|
return CPropertyPage::OnSetActive();
|
|
}
|
|
|
|
//
|
|
// Function called when the current page is no
|
|
// longer active
|
|
//
|
|
BOOL
|
|
INetPropertyPage::OnKillActive( )
|
|
{
|
|
/*
|
|
//
|
|
// Restore the old resource handle
|
|
//
|
|
ASSERT(m_hOldInstance != NULL);
|
|
ASSERT(m_hSelfHandle != NULL);
|
|
::AfxSetResourceHandle ( m_hOldInstance );
|
|
*/
|
|
return CPropertyPage::OnKillActive();
|
|
}
|
|
#endif // !_COMSTATIC
|
|
|
|
//
|
|
// INetPropertyPage message handlers
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// DLL Main entry point
|
|
//
|
|
|
|
#ifndef _COMSTATIC
|
|
|
|
COMDLL BOOL WINAPI LibMain(
|
|
HINSTANCE hDll,
|
|
DWORD dwReason,
|
|
LPVOID lpReserved
|
|
)
|
|
{
|
|
switch ( dwReason )
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
case DLL_THREAD_ATTACH:
|
|
ASSERT( hDll != NULL );
|
|
hDLLInstance = hDll;
|
|
break ;
|
|
|
|
case DLL_THREAD_DETACH:
|
|
case DLL_PROCESS_DETACH:
|
|
|
|
//
|
|
// termination
|
|
//
|
|
break ;
|
|
}
|
|
|
|
ASSERT( hDLLInstance != NULL );
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif // _COMSTATIC
|