windows-nt/Source/XPSP1/NT/admin/netui/llsmgr/llsmgr.cpp

578 lines
11 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1994-95 Microsoft Corporation
Module Name:
llsmgr.cpp
Abstract:
Application object implementation.
Author:
Don Ryan (donryan) 12-Feb-1995
Environment:
User Mode - Win32
Revision History:
Jeff Parham (jeffparh) 16-Jan-1996
Added SetLastTargetServer() to OpenDocumentFile() to help isolate
server connection problems. (Bug #2993.)
--*/
#include "stdafx.h"
#include "llsmgr.h"
#include "mainfrm.h"
#include "llsdoc.h"
#include "llsview.h"
#include "sdomdlg.h"
#include "shellapi.h"
#include <afxpriv.h>
#include <htmlhelp.h>
#include <sbs_res.h>
BOOL IsRestrictedSmallBusSrv( void );
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
CLlsmgrApp theApp; // The one and only CLlsmgrApp object
BEGIN_MESSAGE_MAP(CLlsmgrApp, CWinApp)
//{{AFX_MSG_MAP(CLlsmgrApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CLlsmgrApp::CLlsmgrApp()
/*++
Routine Description:
Constructor for application object.
Arguments:
None.
Return Values:
None.
--*/
{
m_pApplication = NULL;
m_bIsAutomated = FALSE;
#ifdef _DEBUG_VERBOSE
afxMemDF |= checkAlwaysMemDF;
#endif
}
int CLlsmgrApp::ExitInstance()
/*++
Routine Description:
Called by framework to exit this instance of an application.
Arguments:
None.
Return Values:
Application's exit code.
--*/
{
if (m_pApplication && !m_bIsAutomated)
m_pApplication->InternalRelease();
#ifdef _DEBUG
CMemoryState exitMem;
CMemoryState diffMem;
exitMem.Checkpoint();
if (!diffMem.Difference(m_initMem, exitMem))
{
diffMem.DumpStatistics();
m_initMem.DumpAllObjectsSince();
}
#endif
return CWinApp::ExitInstance();
}
BOOL CLlsmgrApp::InitInstance()
/*++
Routine Description:
Called by framework to initialize a new instance of an application.
Arguments:
None.
Return Values:
TRUE if initialization succeeds.
--*/
{
#ifdef _DEBUG
m_initMem.Checkpoint();
#endif
//
// Check if this server is a restricted small business server.
// If so, disallow further use of the license manager.
//
if (IsRestrictedSmallBusSrv())
{
//
// Let the user know of the restriction.
//
HINSTANCE hSbsLib = NULL;
if ( hSbsLib = LoadLibrary( SBS_RESOURCE_DLL ) )
{
TCHAR pszText[512+1];
LoadString ( hSbsLib, SBS_License_Error, pszText, 512 );
AfxMessageBox( pszText );
}
else
{
AfxMessageBox(IDP_SBS_RESTRICTED);
}
return FALSE;
}
//
// Initialize OLE libraries
//
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
//
// If the application was launched as an OLE server (run with
// /Embedding or /Automation) then register all OLE server factories
// as running and don't show main window.
//
if (RunEmbedded() || RunAutomated())
{
COleTemplateServer::RegisterAll();
return m_bIsAutomated = TRUE;
}
//
// Create image list for common controls
//
m_smallImages.Create(IDB_SMALL_CTRLS, BMPI_SMALL_SIZE, 0, BMPI_RGB_BKGND);
m_largeImages.Create(IDB_LARGE_CTRLS, BMPI_LARGE_SIZE, 0, BMPI_RGB_BKGND);
//
// Create document template
//
m_pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CLlsmgrDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CLlsmgrView)
);
AddDocTemplate(m_pDocTemplate);
//
// Create OLE-createable application object. This object
// will save itself in m_pApplication so there should only
// be one and only one. If the application was launched as
// an OLE server then this object is created automatically
// via CreateObject() or GetObject().
//
CApplication* pApplication = new CApplication;
if (pApplication && !pApplication->GetLastStatus())
{
OnFileNew(); // display empty frame ...
m_pMainWnd->PostMessage(WM_COMMAND, ID_APP_STARTUP);
}
else
{
AfxMessageBox(IDP_APP_INIT_FAILED);
return FALSE;
}
return TRUE;
}
void CLlsmgrApp::DisplayStatus(long Status)
/*++
Routine Description:
Retrieves status string and displays.
Arguments:
Status - status code.
Return Values:
None.
--*/
{
m_pApplication->SetLastStatus(Status);
DisplayLastStatus();
}
void CLlsmgrApp::DisplayLastStatus()
/*++
Routine Description:
Retrieves status string and displays.
Arguments:
None.
Return Values:
None.
--*/
{
BSTR LastErrorString = m_pApplication->GetLastErrorString();
AfxMessageBox(LastErrorString);
SysFreeString(LastErrorString);
}
void CLlsmgrApp::OnAppAbout()
/*++
Routine Description:
Message handler for ID_APP_ABOUT.
Arguments:
None.
Return Values:
None.
--*/
{
BSTR AppName = LlsGetApp()->GetName();
::ShellAbout(m_pMainWnd->GetSafeHwnd(), AppName, AppName, LoadIcon(IDR_MAINFRAME));
SysFreeString(AppName);
}
CDocument* CLlsmgrApp::OpenDocumentFile(LPCTSTR lpszFileName)
/*++
Routine Description:
Message handler for ID_FILE_OPEN.
Arguments:
lpszFileName - file name (actually domain name).
Return Values:
Pointer to object is successful.
--*/
{
BOOL bFocusChanged = FALSE;
VARIANT va;
VariantInit(&va);
BeginWaitCursor();
if (lpszFileName)
{
va.vt = VT_BSTR;
va.bstrVal = SysAllocStringLen(lpszFileName, lstrlen(lpszFileName));
bFocusChanged = LlsGetApp()->SelectDomain(va);
}
else
{
bFocusChanged = LlsGetApp()->SelectEnterprise();
CString eTitle;
eTitle.LoadString(IDS_ENTERPRISE);
lpszFileName = MKSTR(eTitle);
}
EndWaitCursor();
VariantClear(&va); // free system string if necessary...
if (!bFocusChanged)
{
LPTSTR pszLastTargetServer;
if (LlsGetLastStatus() == STATUS_ACCESS_DENIED)
{
AfxMessageBox(IDP_ERROR_NO_PRIVILEGES);
}
else if ( ( ( LlsGetLastStatus() == RPC_S_SERVER_UNAVAILABLE )
|| ( LlsGetLastStatus() == RPC_NT_SERVER_UNAVAILABLE ) )
&& ( NULL != ( pszLastTargetServer = LlsGetLastTargetServer() ) ) )
{
CString strMessage;
AfxFormatString1( strMessage, IDP_ERROR_NO_RPC_SERVER_FORMAT, pszLastTargetServer );
SysFreeString( pszLastTargetServer );
AfxMessageBox( strMessage );
}
else
{
DisplayLastStatus();
}
return FALSE;
}
//
// Notify framework that focus changed....
//
return m_pDocTemplate->OpenDocumentFile(lpszFileName);
}
BOOL CLlsmgrApp::OnAppStartup()
/*++
Routine Description:
Message handler for ID_APP_STARTUP.
Arguments:
None.
Return Values:
Returns true if successful.
--*/
{
CString strStartingPoint;
//
// Update registry in case it has been damaged
//
COleObjectFactory::UpdateRegistryAll();
//
// Select domain using command line or machine name
//
if (m_lpCmdLine && *m_lpCmdLine)
{
LPCTSTR pszStartingPoint;
pszStartingPoint = m_lpCmdLine;
while (_istspace(*pszStartingPoint))
pszStartingPoint = _tcsinc(pszStartingPoint);
strStartingPoint = pszStartingPoint;
strStartingPoint.TrimRight();
}
else
{
TCHAR szComputerName[MAX_PATH+1];
DWORD cchComputerName = sizeof(szComputerName) / sizeof(TCHAR);
if (::GetComputerName(szComputerName, &cchComputerName))
{
strStartingPoint = _T("\\\\");
strStartingPoint += szComputerName;
}
else
{
DisplayStatus(::GetLastError());
m_pMainWnd->PostMessage(WM_CLOSE);
return FALSE;
}
}
if (!OpenDocumentFile(strStartingPoint))
{
CSelectDomainDialog sdomDlg;
if (sdomDlg.DoModal() != IDOK)
{
m_pMainWnd->PostMessage(WM_CLOSE);
return FALSE;
}
}
return TRUE;
}
void CLlsmgrApp::WinHelp( DWORD_PTR dwData, UINT nCmd )
/*++
Routine Description:
Same as CWinApp::WinHelp with the exception that we trap HELP_CONTEXT on
IDR_MAINFRAME and translate it to a HELP_FINDER call.
Arguments:
None.
Return Values:
None.
--*/
{
UNREFERENCED_PARAMETER( dwData );
UNREFERENCED_PARAMETER( nCmd );
CWnd* pMainWnd = AfxGetMainWnd();
ASSERT_VALID( pMainWnd );
::HtmlHelp(pMainWnd->m_hWnd, L"liceconcepts.chm", HH_DISPLAY_TOPIC,0);
}
const WCHAR wszProductOptions[] =
L"System\\CurrentControlSet\\Control\\ProductOptions";
const WCHAR wszProductSuite[] =
L"ProductSuite";
const WCHAR wszSBSRestricted[] =
L"Small Business(Restricted)";
BOOL IsRestrictedSmallBusSrv( void )
/*++
Routine Description:
Check if this server is a Microsoft small business restricted server.
Arguments:
None.
Return Values:
TRUE -- This server is a restricted small business server.
FALSE -- No such restriction.
--*/
{
WCHAR wszBuffer[1024] = L"";
DWORD cbBuffer = sizeof(wszBuffer);
DWORD dwType;
LPWSTR pwszSuite;
HKEY hKey;
BOOL bRet = FALSE;
//
// Check if this server is a Microsoft small business restricted server.
// Do so by checking for the existence of the string
// "Small Business(Restricted)"
// in the MULTI_SZ "ProductSuite" value under
// HKLM\CurrentCcntrolSet\Control\ProductOptions.
//
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
wszProductOptions,
0,
KEY_READ,
&hKey) == ERROR_SUCCESS)
{
if (RegQueryValueEx(hKey,
wszProductSuite,
NULL,
&dwType,
(LPBYTE)wszBuffer,
&cbBuffer) == ERROR_SUCCESS)
{
if (dwType == REG_MULTI_SZ && *wszBuffer)
{
pwszSuite = wszBuffer;
while (*pwszSuite)
{
if (lstrcmpi(pwszSuite, wszSBSRestricted) == 0)
{
bRet = TRUE;
break;
}
pwszSuite += wcslen(pwszSuite) + 1;
}
}
}
RegCloseKey(hKey);
}
return bRet;
}