578 lines
11 KiB
C++
578 lines
11 KiB
C++
|
/*++
|
||
|
|
||
|
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;
|
||
|
}
|