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.
1961 lines
53 KiB
1961 lines
53 KiB
#include <stdio.h>
|
|
#include <windows.h>
|
|
#include "webservernode.h"
|
|
#include "comp.h"
|
|
#include "compdata.h"
|
|
#include "dataobj.h"
|
|
#include "globals.h"
|
|
#include "resource.h"
|
|
#include "uddi.h"
|
|
#include "uddisitenode.h"
|
|
#include "objectpicker.h"
|
|
#include <htmlhelp.h>
|
|
#include <windowsx.h>
|
|
#include <commctrl.h>
|
|
|
|
// {8ACBC688-ADDB-4298-9475-76AC4BF01FB1}
|
|
const GUID CUDDIWebServerNode::thisGuid = { 0x8acbc688, 0xaddb, 0x4298, { 0x94, 0x75, 0x76, 0xac, 0x4b, 0xf0, 0x1f, 0xb1 } };
|
|
|
|
|
|
//==============================================================
|
|
//
|
|
// CUDDIWebServerNode implementation
|
|
//
|
|
//
|
|
CUDDIWebServerNode::CUDDIWebServerNode( const _TCHAR *szName, int id, CUDDISiteNode* parent, BOOL bExtension )
|
|
: m_szName(NULL)
|
|
, m_nId( id )
|
|
, m_ppHandle( 0 )
|
|
, m_isDeleted( FALSE )
|
|
, m_pParent( parent )
|
|
, m_pToolbar( NULL )
|
|
, m_isScopeItem( TRUE )
|
|
, m_bStdSvr( TRUE )
|
|
, m_fDeleteFromScopePane( FALSE )
|
|
, m_hwndPropSheet( NULL )
|
|
{
|
|
int iLen = _tcslen( szName ) + 1;
|
|
m_szName = new _TCHAR[ iLen ];
|
|
memset( m_szName, 0, iLen * sizeof( _TCHAR ) );
|
|
_tcsncpy( m_szName, szName, iLen - 1 );
|
|
|
|
m_bIsExtension = bExtension;
|
|
|
|
GetData();
|
|
|
|
BOOL bW3SvcRunning = IsW3SvcRunning();
|
|
if( ( FALSE == bW3SvcRunning ) && IsRunning() )
|
|
{
|
|
Stop();
|
|
m_mapProperties[ UDDI_RUN ] = _T("0");
|
|
}
|
|
}
|
|
|
|
CUDDIWebServerNode::~CUDDIWebServerNode()
|
|
{
|
|
if( m_szName )
|
|
{
|
|
delete [] m_szName;
|
|
}
|
|
|
|
if( NULL != m_ppHandle )
|
|
{
|
|
MMCFreeNotifyHandle( m_ppHandle );
|
|
}
|
|
|
|
if( NULL != m_hwndPropSheet )
|
|
{
|
|
SendMessage( m_hwndPropSheet, WM_CLOSE, 0, 0 );
|
|
}
|
|
}
|
|
|
|
HRESULT CUDDIWebServerNode::GetData()
|
|
{
|
|
try
|
|
{
|
|
//
|
|
// Determine if the OS that this web server is running on is Windows Server 2003 Standard or not.
|
|
//
|
|
HRESULT hr = E_FAIL;
|
|
hr = IsStandardServer( m_szName, &m_bStdSvr );
|
|
if( FAILED(hr) )
|
|
{
|
|
THROW_UDDIEXCEPTION_ST( hr, IDS_DOT_NET_SERVER, g_hinst );
|
|
}
|
|
|
|
m_mapProperties.clear();
|
|
|
|
CUDDIRegistryKey rootkey( _T( "SOFTWARE\\Microsoft\\UDDI"), KEY_READ, m_szName );
|
|
|
|
_TCHAR szRun[ 35 ];
|
|
m_mapProperties[ UDDI_RUN ] = _itot( rootkey.GetDWORD( _T("Run"), 1 ), szRun, 10 );
|
|
m_mapProperties[ UDDI_SETUP_LOCATION ] = rootkey.GetString( _T("InstallRoot"), _T("") );
|
|
rootkey.Close();
|
|
|
|
CUDDIRegistryKey databasekey( _T( "SOFTWARE\\Microsoft\\UDDI\\Database"), KEY_READ, m_szName );
|
|
m_mapProperties[ UDDI_READER_CXN ] = databasekey.GetString( _T("ReaderConnectionString"), _T("") );
|
|
m_mapProperties[ UDDI_WRITER_CXN ] = databasekey.GetString( _T("WriterConnectionString"), _T("") );
|
|
databasekey.Close();
|
|
|
|
//
|
|
// Ensure that the UDDI Site that this web server thinks it communicates
|
|
// with is still installed.
|
|
//
|
|
tstring strDomain, strServer, strInstance;
|
|
CrackConnectionString( m_mapProperties[ UDDI_WRITER_CXN ], strDomain, strServer, strInstance );
|
|
if( !CUDDISiteNode::IsDatabaseServer( (PTCHAR)strServer.c_str() ) )
|
|
{
|
|
m_mapProperties[ UDDI_READER_CXN ] = _T( "" );
|
|
m_mapProperties[ UDDI_WRITER_CXN ] = _T( "" );
|
|
}
|
|
|
|
_TCHAR szValue[ 100 ];
|
|
|
|
_TCHAR szDefaultLogFile[ _MAX_PATH + 1 ];
|
|
memset( szDefaultLogFile, 0, ( _MAX_PATH + 1 ) * sizeof( _TCHAR ) );
|
|
GetSystemDirectory( szDefaultLogFile, _MAX_PATH );
|
|
|
|
tstring strDefaultLogFile( szDefaultLogFile );
|
|
strDefaultLogFile += _T( "\\LogFiles\\UDDI\\uddi.log" );
|
|
|
|
try
|
|
{
|
|
CUDDIRegistryKey debugkey( _T( "SOFTWARE\\Microsoft\\UDDI\\Debug"), KEY_READ, m_szName );
|
|
m_mapProperties[ UDDI_EVENTLOG_LEVEL ] = _itot( debugkey.GetDWORD( _T("EventLogLevel"), 2 ), szValue, 10 );
|
|
m_mapProperties[ UDDI_FILELOG_LEVEL ] = _itot( debugkey.GetDWORD( _T("FileLogLevel"), 0 ), szValue, 10 );
|
|
m_mapProperties[ UDDI_LOG_FILENAME ] = debugkey.GetString( _T("LogFilename"), strDefaultLogFile.c_str() );
|
|
debugkey.Close();
|
|
}
|
|
catch( ... )
|
|
{
|
|
m_mapProperties[ UDDI_EVENTLOG_LEVEL ] = _itot( 2, szValue, 10 );
|
|
m_mapProperties[ UDDI_FILELOG_LEVEL ] = _itot( 0, szValue, 10 );
|
|
m_mapProperties[ UDDI_LOG_FILENAME ] = strDefaultLogFile;
|
|
}
|
|
|
|
|
|
//
|
|
// Get the setup information
|
|
//
|
|
CUDDIRegistryKey setupkey( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup"), KEY_READ, m_szName );
|
|
m_mapProperties[ UDDI_SETUP_DB ] = _itot( setupkey.GetDWORD( _T("DBServer"), 0 ), szValue, 10 );
|
|
m_mapProperties[ UDDI_SETUP_WEB ] = _itot( setupkey.GetDWORD( _T("WebServer"), 0 ), szValue, 10 );
|
|
m_mapProperties[ UDDI_SETUP_ADMIN ] = _itot( setupkey.GetDWORD( _T("Admin"), 0 ), szValue, 10 );
|
|
setupkey.Close();
|
|
|
|
CUDDIRegistryKey webkey( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup\\WebServer"), KEY_READ, m_szName );
|
|
m_mapProperties[ UDDI_SETUP_DATE ] = webkey.GetString( _T("InstallDate"), _T("") );
|
|
m_mapProperties[ UDDI_SETUP_LANGUAGE ] = webkey.GetString( _T("ProductLanguage"), _T("") );
|
|
m_mapProperties[ UDDI_SETUP_NAME ] = webkey.GetString( _T("ProductName"), _T("") );
|
|
m_mapProperties[ UDDI_SETUP_FRAMEWORK_VERSION ] = webkey.GetString( _T("FrameworkVersion"), _T("") );
|
|
m_mapProperties[ UDDI_SETUP_MANUFACTURER ] = webkey.GetString( _T("Manufacturer"), _T("") );
|
|
m_mapProperties[ UDDI_SETUP_VERSION ] = webkey.GetString( _T("ProductVersion"), _T("") );
|
|
webkey.Close();
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
const LPCTSTR CUDDIWebServerNode::GetName()
|
|
{
|
|
return m_szName;
|
|
}
|
|
|
|
BOOL
|
|
CUDDIWebServerNode::ChildExists( const WCHAR *pwszName )
|
|
{
|
|
if( NULL == pwszName )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
wstring strWriterConn;
|
|
GetWriterConnectionString( m_szName, strWriterConn );
|
|
|
|
wstring strDomain, strServer, strInstance;
|
|
CrackConnectionString( strWriterConn, strDomain, strServer, strInstance );
|
|
|
|
return ( 0 == _wcsicmp( pwszName, strServer.c_str() ) ) ? TRUE : FALSE;
|
|
}
|
|
|
|
HRESULT CUDDIWebServerNode::SaveData()
|
|
{
|
|
try
|
|
{
|
|
//
|
|
// Save the changed values
|
|
//
|
|
for( CPropertyMap::iterator iter = m_mapChanges.begin();
|
|
iter != m_mapChanges.end(); iter++ )
|
|
{
|
|
if( _T("Database.ReaderConnectionString") == (*iter).first )
|
|
{
|
|
CUDDIRegistryKey databasekey( _T( "SOFTWARE\\Microsoft\\UDDI\\Database"), KEY_ALL_ACCESS, m_szName );
|
|
databasekey.SetValue( _T( "ReaderConnectionString" ), m_mapChanges[ _T( "Database.ReaderConnectionString" ) ].c_str() );
|
|
databasekey.Close();
|
|
}
|
|
else if( UDDI_WRITER_CXN == (*iter).first )
|
|
{
|
|
CUDDIRegistryKey databasekey( _T( "SOFTWARE\\Microsoft\\UDDI\\Database"), KEY_ALL_ACCESS, m_szName );
|
|
databasekey.SetValue( _T( "WriterConnectionString" ), m_mapChanges[ _T( "Database.WriterConnectionString" ) ].c_str() );
|
|
databasekey.Close();
|
|
}
|
|
else if(UDDI_EVENTLOG_LEVEL == (*iter).first )
|
|
{
|
|
DWORD dwValue = _ttoi( m_mapChanges[ UDDI_EVENTLOG_LEVEL ].c_str() );
|
|
UDDIASSERT( dwValue < 7 );
|
|
|
|
CUDDIRegistryKey debugkey( _T( "SOFTWARE\\Microsoft\\UDDI\\Debug"), KEY_ALL_ACCESS, m_szName );
|
|
debugkey.SetValue( _T("EventLogLevel"), dwValue );
|
|
debugkey.Close();
|
|
}
|
|
else if( (*iter).first == UDDI_FILELOG_LEVEL )
|
|
{
|
|
DWORD dwValue = _ttoi( m_mapChanges[ UDDI_FILELOG_LEVEL ].c_str() );
|
|
UDDIASSERT( dwValue < 7 );
|
|
|
|
CUDDIRegistryKey debugkey( _T( "SOFTWARE\\Microsoft\\UDDI\\Debug"), KEY_ALL_ACCESS, m_szName );
|
|
debugkey.SetValue( _T("FileLogLevel"), dwValue );
|
|
debugkey.Close();
|
|
}
|
|
}
|
|
|
|
//
|
|
// Clear the changes collection
|
|
//
|
|
m_mapChanges.clear();
|
|
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
BOOL CUDDIWebServerNode::IsWebServer( const WCHAR *pwszName )
|
|
{
|
|
if( ( NULL == pwszName ) || ( 0 == _tcslen( pwszName ) ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup" ), KEY_READ, pwszName );
|
|
DWORD dwDB = key.GetDWORD( _T( "WebServer" ) );
|
|
|
|
return TRUE;
|
|
}
|
|
catch(...)
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL CUDDIWebServerNode::Start()
|
|
{
|
|
return SetRunState( TRUE );
|
|
}
|
|
|
|
BOOL CUDDIWebServerNode::SetRunState( BOOL bStart )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI" ), KEY_ALL_ACCESS, m_szName );
|
|
key.SetValue( _T("Run"), bStart ? 1UL : 0UL );
|
|
}
|
|
catch(...)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CUDDIWebServerNode::Stop()
|
|
{
|
|
return SetRunState( FALSE );
|
|
}
|
|
|
|
const BOOL CUDDIWebServerNode::IsRunning()
|
|
{
|
|
CPropertyMap::const_iterator it = m_mapProperties.find( UDDI_RUN );
|
|
if( m_mapProperties.end() == it )
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return ( _T("0") == it->second ) ? FALSE : TRUE;
|
|
}
|
|
}
|
|
|
|
const _TCHAR *CUDDIWebServerNode::GetDisplayName( int nCol )
|
|
{
|
|
_TCHAR szRunning[ 256 ];
|
|
memset( szRunning, 0, 256 * sizeof( _TCHAR ) );
|
|
::LoadString( g_hinst, IDS_WEBSERVER_RUNNING, szRunning, ARRAYLEN(szRunning) );
|
|
|
|
_TCHAR szStopped[ 256 ];
|
|
memset( szStopped, 0, 256 * sizeof( _TCHAR ) );
|
|
::LoadString( g_hinst, IDS_WEBSERVER_STOPPED, szStopped, ARRAYLEN(szStopped) );
|
|
|
|
BOOL bIsRunning = IsRunning();
|
|
|
|
switch( nCol )
|
|
{
|
|
case 0:
|
|
{
|
|
m_strDisplayName = m_szName;
|
|
if( !bIsRunning )
|
|
{
|
|
m_strDisplayName += _T(" (");
|
|
m_strDisplayName += szStopped;
|
|
m_strDisplayName += _T(")");
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
m_strDisplayName = bIsRunning ? szRunning : szStopped;
|
|
break;
|
|
}
|
|
default:
|
|
m_strDisplayName = _T("");
|
|
}
|
|
|
|
return m_strDisplayName.c_str();
|
|
}
|
|
|
|
//
|
|
// Handle anything special when the user clicks Apply or Ok
|
|
// on the property sheet. This sample directly accesses the
|
|
// operated-on object, so there's nothing special to do...
|
|
// ...except to update all views
|
|
//
|
|
HRESULT CUDDIWebServerNode::OnPropertyChange( IConsole *pConsole, CComponent *pComponent )
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
CPropertyMap::iterator it = m_mapChanges.find( UDDI_WRITER_CXN );
|
|
BOOL fWriterChanged = ( m_mapChanges.end() == it ) ? FALSE : TRUE;
|
|
|
|
if( TRUE == fWriterChanged )
|
|
{
|
|
wstring strDomain, strServer, strInstance;
|
|
CUDDIWebServerNode::CrackConnectionString( m_mapChanges[ UDDI_WRITER_CXN ], strDomain, strServer, strInstance );
|
|
|
|
HWND hwndConsole = NULL;
|
|
pConsole->GetMainWindow( &hwndConsole );
|
|
|
|
BOOL fSuccess = CUDDISiteNode::AddWebServerToSite( strServer,
|
|
m_szName,
|
|
( NULL == m_hwndPropSheet ) ? hwndConsole : m_hwndPropSheet );
|
|
if( fSuccess )
|
|
{
|
|
m_fDeleteFromScopePane = TRUE;
|
|
|
|
//
|
|
// If our parent pointer is not NULL, then this web server node is the child of
|
|
// a UDDI Site node.
|
|
//
|
|
// If our parent pointer is NULL, then this web server node is a child of the
|
|
// UDDI Services node.
|
|
//
|
|
if( NULL != m_pParent )
|
|
{
|
|
CUDDIServicesNode *pStaticNode = m_pParent->GetStaticNode();
|
|
if( NULL != pStaticNode )
|
|
{
|
|
CUDDISiteNode *pSiteNode = reinterpret_cast<CUDDISiteNode *>( pStaticNode->FindChild( strServer.c_str() ) );
|
|
if( NULL != pSiteNode )
|
|
{
|
|
pSiteNode->AddChild( m_szName, pConsole );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
HSCOPEITEM hsiParent = GetParentScopeItem();
|
|
IConsoleNameSpace *pNS = NULL;
|
|
hr = pConsole->QueryInterface( IID_IConsoleNameSpace, reinterpret_cast<void **>( &pNS ) );
|
|
if( FAILED(hr) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
SCOPEDATAITEM sdi;
|
|
memset( &sdi, 0, sizeof( SCOPEDATAITEM ) );
|
|
|
|
sdi.ID = hsiParent;
|
|
sdi.mask = SDI_PARAM;
|
|
hr = pNS->GetItem( &sdi );
|
|
if( FAILED(hr) )
|
|
{
|
|
pNS->Release();
|
|
return hr;
|
|
}
|
|
|
|
pNS->Release();
|
|
CUDDIServicesNode *pStaticNode = (CUDDIServicesNode *)sdi.lParam;
|
|
|
|
CUDDISiteNode *pSiteNode = reinterpret_cast<CUDDISiteNode *>( pStaticNode->FindChild( strServer.c_str() ) );
|
|
if( NULL != pSiteNode )
|
|
{
|
|
pSiteNode->AddChild( m_szName, pConsole );
|
|
}
|
|
|
|
DeleteFromScopePane( pNS );
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// The SaveData() method communicates any issues.
|
|
//
|
|
hr = SaveData();
|
|
|
|
hr = pConsole->UpdateAllViews( NULL, GetScopeItemValue(), 0 );
|
|
_ASSERT( S_OK == hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDIWebServerNode::OnSelect( CComponent *pComponent, IConsole *pConsole, BOOL bScope, BOOL bSelect )
|
|
{
|
|
if( ( NULL == pComponent ) || ( NULL == pConsole ) )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
HRESULT hr = E_FAIL;
|
|
if( bSelect )
|
|
{
|
|
//
|
|
// Enable refresh, and delete verbs
|
|
//
|
|
IConsoleVerb *pConsoleVerb = NULL;
|
|
|
|
hr = pConsole->QueryConsoleVerb( &pConsoleVerb );
|
|
if( FAILED(hr) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
hr = pConsoleVerb->SetVerbState( MMC_VERB_REFRESH, ENABLED, TRUE );
|
|
|
|
if( !IsExtension() && !m_bStdSvr )
|
|
{
|
|
hr = pConsoleVerb->SetVerbState( MMC_VERB_DELETE, ENABLED, TRUE );
|
|
_ASSERT( S_OK == hr );
|
|
}
|
|
|
|
//
|
|
// Can't get to properties (via the standard methods) unless
|
|
// we tell MMC to display the Properties menu item and
|
|
// toolbar button, this will give the user a visual cue that
|
|
// there's "something" to do
|
|
//
|
|
hr = pConsoleVerb->SetVerbState( MMC_VERB_PROPERTIES, ENABLED, TRUE );
|
|
|
|
//
|
|
// Also set MMC_VERB_PROPERTIES as the default verb
|
|
//
|
|
hr = pConsoleVerb->SetDefaultVerb( MMC_VERB_PROPERTIES );
|
|
|
|
pConsoleVerb->Release();
|
|
|
|
}
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
BOOL CALLBACK CUDDIWebServerNode::GeneralDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CUDDIWebServerNode *pWebServer = NULL;
|
|
pWebServer = reinterpret_cast<CUDDIWebServerNode *>(reinterpret_cast<PROPSHEETPAGE *>(lParam)->lParam);
|
|
|
|
SetWindowLongPtr( hwndDlg, GWLP_USERDATA, (LONG_PTR)pWebServer );
|
|
|
|
CPropertyMap& m_mapProperties = pWebServer->m_mapProperties;
|
|
_TCHAR szComponentName[ 256 ];
|
|
|
|
HWND hwndParent = GetParent( hwndDlg );
|
|
pWebServer->m_hwndPropSheet = hwndParent;
|
|
|
|
SetDlgItemText( hwndDlg, IDC_GENERAL_SITE_TXT_INSTALL_DATE, LocalizedDate( m_mapProperties[ UDDI_SETUP_DATE ] ).c_str() );
|
|
SetDlgItemText( hwndDlg, IDC_GENERAL_SITE_TXT_UDDI_LANGUAGE, m_mapProperties[ UDDI_SETUP_LANGUAGE ].c_str() );
|
|
SetDlgItemText( hwndDlg, IDC_GENERAL_SITE_TXT_FRAMEWORK_VERSION, m_mapProperties[ UDDI_SETUP_FRAMEWORK_VERSION ].c_str() );
|
|
SetDlgItemText( hwndDlg, IDC_GENERAL_SITE_TXT_UDDI_VERSION, m_mapProperties[ UDDI_SETUP_VERSION ].c_str() );
|
|
SetDlgItemText( hwndDlg, IDC_GENERAL_SITE_TXT_INSTALL_LOCATION, m_mapProperties[ UDDI_SETUP_LOCATION ].c_str() );
|
|
|
|
//
|
|
// Build up "Web Server Component on <computername>" string for heading
|
|
//
|
|
LoadString( g_hinst, IDS_WEBSERVER_DISPLAYNAME_TEMPLATE, szComponentName, ARRAYLEN( szComponentName ) - 1 );
|
|
WCHAR wszBuf[ 512 ];
|
|
memset( wszBuf, 0, 512 * sizeof( WCHAR ) );
|
|
|
|
_sntprintf( wszBuf, 512, szComponentName, pWebServer->m_szName );
|
|
wszBuf[ 511 ] = 0x00;
|
|
|
|
tstring strDisplayName ( wszBuf );
|
|
SetDlgItemText( hwndDlg, IDC_GENERAL_SITE_TXT_DISPLAYNAME, strDisplayName.c_str() );
|
|
|
|
if( _T("1") == m_mapProperties[ UDDI_SETUP_WEB ] )
|
|
{
|
|
LoadString( g_hinst, IDS_WEBSERVER_COMPONENT_DESCRIPTION, szComponentName, ARRAYLEN( szComponentName ) - 1 );
|
|
ListBox_AddString( GetDlgItem( hwndDlg, IDC_GENERAL_SITE_LIST_SERVICES ), szComponentName );
|
|
}
|
|
|
|
if( _T("1") == m_mapProperties[ UDDI_SETUP_DB ] )
|
|
{
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_COMPONENT_DESCRIPTION, szComponentName, ARRAYLEN( szComponentName ) - 1 );
|
|
ListBox_AddString( GetDlgItem( hwndDlg, IDC_GENERAL_SITE_LIST_SERVICES ), szComponentName );
|
|
}
|
|
|
|
if( _T("1") == m_mapProperties[ UDDI_SETUP_ADMIN ] )
|
|
{
|
|
LoadString( g_hinst, IDS_UDDIMMC_COMPONENT_DESCRIPTION, szComponentName, ARRAYLEN( szComponentName ) - 1 );
|
|
ListBox_AddString( GetDlgItem( hwndDlg, IDC_GENERAL_SITE_LIST_SERVICES ), szComponentName );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
if( PSN_HELP == ((NMHDR *) lParam)->code )
|
|
{
|
|
CUDDIWebServerNode *pWebServer = (CUDDIWebServerNode *)GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
if( NULL != pWebServer )
|
|
{
|
|
wstring strHelp( pWebServer->GetHelpFile() );
|
|
strHelp += g_wszUddiWebGeneralPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_CLOSE:
|
|
{
|
|
CUDDIWebServerNode *pWebServer = (CUDDIWebServerNode *)GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
|
|
if( NULL != pWebServer )
|
|
{
|
|
pWebServer->m_hwndPropSheet = NULL;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case WM_HELP:
|
|
{
|
|
CUDDIWebServerNode *pWebServer = (CUDDIWebServerNode *)GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
if( NULL != pWebServer )
|
|
{
|
|
wstring strHelp( pWebServer->GetHelpFile() );
|
|
strHelp += g_wszUddiWebGeneralPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
int split( const TCHAR * pszConnection, TCHAR *pszA, TCHAR *pszB, TCHAR *pszC )
|
|
{
|
|
//
|
|
// Example: Data Source=localhost;Initial Catalog=uddi;Integrated Security=SSPI
|
|
//
|
|
TCHAR strConnection[ 512 ];
|
|
strConnection[ 0 ] = 0x00;
|
|
_tcsncpy( strConnection, pszConnection, 512 );
|
|
strConnection[ 511 ] = 0x00;
|
|
|
|
_tcslwr( strConnection );
|
|
|
|
//
|
|
// Get Data Source value
|
|
//
|
|
PTCHAR begin = _tcsstr( strConnection, _T("data source=") );
|
|
_ASSERT( begin );
|
|
|
|
begin += 12;
|
|
PTCHAR end = begin;
|
|
int n = 0;
|
|
BOOL bDone = FALSE;
|
|
|
|
while( !bDone )
|
|
{
|
|
if( _T('\\') == *end )
|
|
{
|
|
if( 0 == n )
|
|
{
|
|
_tcsncpy( pszA, begin, end - begin );
|
|
pszA[ end - begin ] = NULL;
|
|
}
|
|
else if( 1 == n )
|
|
{
|
|
_tcsncpy( pszB, begin, end - begin );
|
|
pszB[ end - begin ] = NULL;
|
|
}
|
|
else
|
|
{
|
|
_tcsncpy( pszC, begin, end - begin );
|
|
pszC[ end - begin ] = NULL;
|
|
}
|
|
begin = end + 1;
|
|
end++;
|
|
n++;
|
|
}
|
|
else if( NULL == *end || _T(';') == *end )
|
|
{
|
|
if( 0 == n )
|
|
{
|
|
_tcsncpy( pszA, begin, end - begin );
|
|
pszA[ end - begin ] = NULL;
|
|
}
|
|
else if( 1 == n )
|
|
{
|
|
_tcsncpy( pszB, begin, end - begin );
|
|
pszB[ end - begin ] = NULL;
|
|
}
|
|
else
|
|
{
|
|
_tcsncpy( pszC, begin, end - begin );
|
|
pszC[ end - begin ] = NULL;
|
|
}
|
|
bDone = TRUE;
|
|
n++;
|
|
}
|
|
else
|
|
{
|
|
end++;
|
|
}
|
|
}
|
|
|
|
return n;
|
|
}
|
|
|
|
//
|
|
// Cases:
|
|
// 1. <domain>\<machine>\<instance>
|
|
//
|
|
// 2. <domain>\<machine>
|
|
//
|
|
// 3. <machine>\<instance>
|
|
//
|
|
// 4. <machine>
|
|
//
|
|
|
|
void
|
|
CUDDIWebServerNode::CrackConnectionString( const tstring& strConnection, tstring& strDomain, tstring& strServer, tstring& strInstance )
|
|
{
|
|
if( 0 == strConnection.length() )
|
|
{
|
|
strDomain = _T( "" );
|
|
strServer = _T( "" );
|
|
strInstance = _T( "" );
|
|
|
|
return;
|
|
}
|
|
|
|
// TCHAR *pstrs[3] = { new TCHAR[ 256 ], new TCHAR[ 256 ], new TCHAR[ 256 ] };
|
|
TCHAR *pszA, *pszB, *pszC;
|
|
pszA = new TCHAR[ 256 ];
|
|
pszB = new TCHAR[ 256 ];
|
|
pszC = new TCHAR[ 256 ];
|
|
|
|
if( ( NULL == pszA ) || ( NULL == pszB ) || ( NULL == pszC ) )
|
|
{
|
|
strDomain = _T( "" );
|
|
strServer = _T( "" );
|
|
strInstance = _T( "" );
|
|
|
|
return;
|
|
}
|
|
|
|
memset( pszA, 0, 256 * sizeof( TCHAR ) );
|
|
memset( pszB, 0, 256 * sizeof( TCHAR ) );
|
|
memset( pszC, 0, 256 * sizeof( TCHAR ) );
|
|
|
|
_TCHAR szConnection[ 512 ];
|
|
memset( szConnection, 0, 512 * sizeof( TCHAR ) );
|
|
_tcscpy( szConnection, strConnection.c_str() );
|
|
|
|
int n = split( szConnection, pszA, pszB, pszC );
|
|
|
|
if( 1 == n )
|
|
{
|
|
//
|
|
// Case 4: <machine>
|
|
//
|
|
strDomain = _T("");
|
|
strServer = pszA;
|
|
strInstance = _T("");
|
|
}
|
|
else if( 3 == n )
|
|
{
|
|
//
|
|
// Case 1 <domain>\<machine>\<instancename>
|
|
//
|
|
strDomain = pszA;
|
|
strServer = pszB;
|
|
strInstance = pszC;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// TODO: Write code to determine between case 2 and case 3
|
|
//
|
|
// Assume case 3: <machine>\<instancename>
|
|
//
|
|
strDomain = _T("");
|
|
strServer = pszA;
|
|
strInstance = pszB;
|
|
}
|
|
|
|
delete [] pszA;
|
|
delete [] pszB;
|
|
delete [] pszC;
|
|
|
|
return;
|
|
}
|
|
|
|
struct DatabaseConnectionData
|
|
{
|
|
DatabaseConnectionData( CUDDIWebServerNode *pWeb )
|
|
: pWebServer( pWeb )
|
|
, bReadChanged( false )
|
|
, bWriteChanged( false ){}
|
|
|
|
bool bReadChanged;
|
|
bool bWriteChanged;
|
|
CUDDIWebServerNode *pWebServer;
|
|
};
|
|
|
|
|
|
tstring
|
|
CUDDIWebServerNode::BuildConnectionString( const wstring& strComputer )
|
|
{
|
|
try
|
|
{
|
|
tstring strInstanceName;
|
|
|
|
BOOL fSuccess = CUDDISiteNode::GetFullyQualifiedInstanceName( strComputer.c_str(), strInstanceName );
|
|
if( !fSuccess )
|
|
{
|
|
return _T( "" );
|
|
}
|
|
|
|
|
|
tstring strConnection( _T("Data Source=") );
|
|
|
|
strConnection += strInstanceName;
|
|
|
|
strConnection += _T(";Initial Catalog=uddi;Integrated Security=SSPI");
|
|
|
|
return strConnection;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return _T( "" );
|
|
}
|
|
}
|
|
|
|
BOOL CALLBACK CUDDIWebServerNode::DatabaseConnectionDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
//
|
|
// Load up the "not found" strings in case of a future failure
|
|
//
|
|
TCHAR szNoServer[ 256 ],
|
|
szNoInstance[ 256 ];
|
|
|
|
ZeroMemory( szNoServer, sizeof szNoServer );
|
|
ZeroMemory( szNoInstance, sizeof szNoInstance );
|
|
|
|
LoadString( g_hinst, IDS_UDDIMMC_NODBSERVER, szNoServer, ARRAYLEN( szNoServer ) - 1 );
|
|
LoadString( g_hinst, IDS_UDDIMMC_NOINSTANCE, szNoInstance, ARRAYLEN( szNoInstance ) - 1 );
|
|
|
|
//
|
|
// Catch the "this" pointer so we can actually operate on the object
|
|
//
|
|
CUDDIWebServerNode *pWebServer = reinterpret_cast<CUDDIWebServerNode *>(reinterpret_cast<PROPSHEETPAGE *>(lParam)->lParam);
|
|
DatabaseConnectionData* pdata = new DatabaseConnectionData( pWebServer );
|
|
SetWindowLongPtr( hwndDlg, GWLP_USERDATA, (LONG_PTR) pdata );
|
|
|
|
//
|
|
// User can select a new database to read from/write to ONLY if the machine the web server
|
|
// is running on is NOT Windows Server 2003 Standard Server.
|
|
//
|
|
// EnableWindow( GetDlgItem( hwndDlg, IDC_DB_CONNECTION_BTN_READER_SELECT ), pWebServer->m_bStdSvr ? FALSE : TRUE );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_DB_CONNECTION_BTN_WRITER_SELECT ), pWebServer->m_bStdSvr ? FALSE : TRUE );
|
|
|
|
//
|
|
// For Heartland RC2, we are removing the distinction between reader &
|
|
// writer connection strings. There can be only 1 connection string,
|
|
// so we will use just the writer.
|
|
//
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_DB_CONNECTION_BTN_READER_SELECT ), FALSE );
|
|
|
|
//
|
|
// Example: Data Source=localhost;Initial Catalog=uddi;Integrated Security=SSPI
|
|
//
|
|
tstring strDomain, strMachine, strInstance;
|
|
tstring strReaderConn = pWebServer->m_mapProperties[ UDDI_READER_CXN ];
|
|
tstring strWriterConn = pWebServer->m_mapProperties[ UDDI_WRITER_CXN ];
|
|
|
|
if( strReaderConn.empty() )
|
|
{
|
|
strMachine = szNoServer;
|
|
strInstance = szNoInstance;
|
|
}
|
|
else
|
|
{
|
|
CrackConnectionString( strReaderConn, strDomain, strMachine, strInstance );
|
|
}
|
|
|
|
tstring strServer( _T("") );
|
|
|
|
if( !strDomain.empty() )
|
|
{
|
|
strServer = strDomain;
|
|
strServer += _T("\\");
|
|
strServer += strMachine;
|
|
}
|
|
else
|
|
{
|
|
strServer = strMachine;
|
|
}
|
|
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_SERVER, strServer.c_str() );
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_INSTANCE, strInstance.empty() ? DefaultInstanceDisplayName() : strInstance.c_str() );
|
|
|
|
if( strWriterConn.empty() )
|
|
{
|
|
strMachine = szNoServer;
|
|
strInstance = szNoInstance;
|
|
}
|
|
else
|
|
{
|
|
CrackConnectionString( strWriterConn, strDomain, strMachine, strInstance );
|
|
}
|
|
|
|
if( !strDomain.empty() )
|
|
{
|
|
strServer = strDomain;
|
|
strServer += _T("\\");
|
|
strServer += strMachine;
|
|
}
|
|
else
|
|
{
|
|
strServer = strMachine;
|
|
}
|
|
|
|
CUDDISiteNode::GetFullyQualifiedInstanceName( strServer.c_str(), strInstance );
|
|
|
|
WCHAR wszServer[ 128 ];
|
|
WCHAR wszInstance[ 256 ];
|
|
memset( wszServer, 0, 128 * sizeof( WCHAR ) );
|
|
memset( wszInstance, 0, 256 * sizeof( WCHAR ) );
|
|
|
|
wcsncpy( wszServer, strServer.c_str(), strServer.length() );
|
|
wcsncpy( wszInstance, strInstance.c_str(), strInstance.length() );
|
|
|
|
ToUpper( wszServer );
|
|
ToUpper( wszInstance );
|
|
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_WRITER_SERVER, wszServer );
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_WRITER_INSTANCE, wszInstance );
|
|
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_SERVER, wszServer );
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_INSTANCE, wszInstance );
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
DatabaseConnectionData* pdata = (DatabaseConnectionData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
|
|
switch( LOWORD(wParam) )
|
|
{
|
|
case IDC_DB_CONNECTION_BTN_READER_SELECT:
|
|
{
|
|
DatabaseData data;
|
|
data.pBase = pdata->pWebServer;
|
|
INT_PTR nResult = DialogBoxParam( g_hinst, MAKEINTRESOURCE( IDD_SITE_CONNECT ), hwndDlg, CUDDISiteNode::NewDatabaseServerDialogProc, (LPARAM) &data );
|
|
|
|
if( nResult )
|
|
{
|
|
//
|
|
// The user is not allowed to point the connection strings to a database
|
|
// instance running on a Windows Server 2003 Standard machine. So, tell them so.
|
|
//
|
|
BOOL bIsStandard = TRUE;
|
|
HRESULT hr = ::IsStandardServer( data.szServerName, &bIsStandard );
|
|
if( FAILED(hr) )
|
|
{
|
|
UDDIMsgBox( hwndDlg,
|
|
IDS_DOT_NET_SERVER,
|
|
IDS_ERROR_TITLE,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
break;
|
|
}
|
|
|
|
if( TRUE == bIsStandard )
|
|
{
|
|
UDDIMsgBox( hwndDlg,
|
|
IDS_DATABASE_STANDARD_SERVER_DETAIL,
|
|
IDS_DATABASE_STANDARD_SERVER,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
}
|
|
else
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_SERVER, data.szServerName );
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_INSTANCE, InstanceDisplayName(data.szInstanceName) );
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
|
|
pdata->bReadChanged = true;
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
case IDC_DB_CONNECTION_BTN_WRITER_SELECT:
|
|
{
|
|
DatabaseData data;
|
|
data.pBase = pdata->pWebServer;
|
|
INT_PTR nResult = DialogBoxParam( g_hinst, MAKEINTRESOURCE( IDD_SITE_CONNECT ), hwndDlg, CUDDISiteNode::NewDatabaseServerDialogProc, (LPARAM) &data );
|
|
|
|
if( nResult )
|
|
{
|
|
//
|
|
// The user is not allowed to point the connection strings to a database
|
|
// instance running on a Windows Server 2003 Standard machine. So, tell them so.
|
|
//
|
|
BOOL bIsStandard = TRUE;
|
|
HRESULT hr = ::IsStandardServer( data.szServerName, &bIsStandard );
|
|
if( FAILED(hr) )
|
|
{
|
|
UDDIMsgBox( hwndDlg,
|
|
IDS_DOT_NET_SERVER,
|
|
IDS_ERROR_TITLE,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
break;
|
|
}
|
|
|
|
if( TRUE == bIsStandard )
|
|
{
|
|
UDDIMsgBox( hwndDlg,
|
|
IDS_DATABASE_STANDARD_SERVER_DETAIL,
|
|
IDS_DATABASE_STANDARD_SERVER,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
}
|
|
else
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_WRITER_SERVER, data.szServerName );
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_WRITER_INSTANCE, InstanceDisplayName(data.szInstanceName) );
|
|
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_SERVER, data.szServerName );
|
|
SetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_INSTANCE, InstanceDisplayName(data.szInstanceName) );
|
|
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
|
|
pdata->bWriteChanged = true;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
{
|
|
DatabaseConnectionData* pdata = (DatabaseConnectionData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
wstring strHelp( pdata->pWebServer->GetHelpFile() );
|
|
strHelp += g_wszUddiDatabaseConnectionPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
break;
|
|
}
|
|
|
|
case WM_DESTROY:
|
|
{
|
|
DatabaseConnectionData* pdata = (DatabaseConnectionData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
|
|
//
|
|
// Tell MMC that we're done with the property sheet (we got this
|
|
// handle in CreatePropertyPages
|
|
//
|
|
MMCFreeNotifyHandle( pdata->pWebServer->m_ppHandle );
|
|
pdata->pWebServer->m_ppHandle = NULL;
|
|
delete pdata;
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
if( PSN_APPLY == ((NMHDR *) lParam)->code )
|
|
{
|
|
DatabaseConnectionData* pdata = (DatabaseConnectionData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
|
|
if( pdata->bReadChanged )
|
|
{
|
|
_TCHAR szComputer[ 256 ];
|
|
_TCHAR szInstance[ 256 ];
|
|
GetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_SERVER, szComputer, ARRAYLEN( szComputer ) );
|
|
GetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_READER_INSTANCE, szInstance, ARRAYLEN( szInstance ) );
|
|
|
|
pdata->pWebServer->m_mapChanges[ UDDI_READER_CXN ] = BuildConnectionString( szComputer );
|
|
}
|
|
|
|
if( pdata->bWriteChanged )
|
|
{
|
|
_TCHAR szComputer[ 256 ];
|
|
_TCHAR szInstance[ 256 ];
|
|
GetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_WRITER_SERVER, szComputer, ARRAYLEN( szComputer ) );
|
|
GetDlgItemText( hwndDlg, IDC_DB_CONNECTION_TXT_WRITER_INSTANCE, szInstance, ARRAYLEN( szInstance ) );
|
|
|
|
pdata->pWebServer->m_mapChanges[ UDDI_WRITER_CXN ] = BuildConnectionString( szComputer );
|
|
}
|
|
|
|
//
|
|
// Ask MMC to send us a message (on the main thread) so
|
|
// we know the Apply button was clicked.
|
|
//
|
|
HRESULT hr = MMCPropertyChangeNotify( pdata->pWebServer->m_ppHandle, reinterpret_cast<LONG_PTR>(pdata->pWebServer) );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
|
|
//
|
|
// Reset the window data after migration to the change collection
|
|
//
|
|
pdata->bReadChanged = false;
|
|
pdata->bWriteChanged = false;
|
|
|
|
return PSNRET_NOERROR;
|
|
}
|
|
else if( PSN_HELP == ((NMHDR *) lParam)->code )
|
|
{
|
|
DatabaseConnectionData* pdata = (DatabaseConnectionData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
wstring strHelp( pdata->pWebServer->GetHelpFile() );
|
|
strHelp += g_wszUddiDatabaseConnectionPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
HRESULT CUDDIWebServerNode::HasPropertySheets()
|
|
{
|
|
//
|
|
// Say "yes" when MMC asks if we have pages
|
|
//
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CUDDIWebServerNode::CreatePropertyPages( IPropertySheetCallback *lpProvider, LONG_PTR handle )
|
|
{
|
|
|
|
if( ( NULL == lpProvider ) || ( 0 == handle ) )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//
|
|
// Reinitialize the data before we display the property pages
|
|
//
|
|
HRESULT hr = GetData();
|
|
_ASSERT( SUCCEEDED( hr ) );
|
|
|
|
PropertyPages pps[] = {
|
|
{ IDD_GENERAL_WEB_PROPPAGE, GeneralDialogProc },
|
|
{ IDD_LOGGING_PROPPAGE, LoggingDialogProc },
|
|
{ IDD_DB_CONNECTION_PROPPAGE, DatabaseConnectionDialogProc } };
|
|
|
|
PROPSHEETPAGE psp;
|
|
HPROPSHEETPAGE hPage = NULL;
|
|
|
|
//
|
|
// Cache this handle so we can call MMCPropertyChangeNotify
|
|
//
|
|
m_ppHandle = handle;
|
|
|
|
//
|
|
// Create the property page for this node.
|
|
// NOTE: if your node has multiple pages, put the following
|
|
// in a loop and create multiple pages calling
|
|
// lpProvider->AddPage() for each page.
|
|
//
|
|
psp.dwSize = sizeof(PROPSHEETPAGE);
|
|
psp.dwFlags = PSP_DEFAULT | PSP_HASHELP;
|
|
psp.hInstance = g_hinst;
|
|
psp.lParam = reinterpret_cast<LPARAM>(this);
|
|
|
|
for( int i = 0; i < ARRAYLEN( pps ); i++ )
|
|
{
|
|
psp.pszTemplate = MAKEINTRESOURCE( pps[ i ].id );
|
|
psp.pfnDlgProc = pps[ i ].dlgproc;
|
|
|
|
hPage = CreatePropertySheetPage( &psp );
|
|
_ASSERT( hPage );
|
|
|
|
hr = lpProvider->AddPage( hPage );
|
|
if( FAILED(hr) )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDIWebServerNode::GetWatermarks(HBITMAP *lphWatermark,
|
|
HBITMAP *lphHeader,
|
|
HPALETTE *lphPalette,
|
|
BOOL *bStretch)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDIWebServerNode::OnUpdateItem( IConsole *pConsole, long item, ITEM_TYPE itemtype )
|
|
{
|
|
if( NULL == pConsole )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = UpdateScopePaneItem( pConsole, GetScopeItemValue() );
|
|
_ASSERT( S_OK == hr );
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDIWebServerNode::OnRefresh( IConsole *pConsole )
|
|
{
|
|
if( TRUE == m_fDeleteFromScopePane )
|
|
{
|
|
IConsoleNameSpace *pNS = NULL;
|
|
HRESULT hr = pConsole->QueryInterface( IID_IConsoleNameSpace, reinterpret_cast<void **>( &pNS ) );
|
|
if( FAILED(hr) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
DeleteFromScopePane( pNS );
|
|
|
|
pNS->Release();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// The web server that this node represents might very well live on
|
|
// some other machine. The state of that web server might have changed
|
|
// since the last time we queried it... ie, m_mapProperties might be
|
|
// out of sync with the true state of the web server. So, re-get the
|
|
// web server's info.
|
|
//
|
|
GetData();
|
|
|
|
BOOL bW3SvcRunning = IsW3SvcRunning();
|
|
if( ( FALSE == bW3SvcRunning ) && IsRunning() )
|
|
{
|
|
Stop();
|
|
m_mapProperties[ UDDI_RUN ] = _T("0");
|
|
}
|
|
|
|
//
|
|
// Call IConsole::UpdateAllViews to redraw all views
|
|
// owned by the parent scope item
|
|
//
|
|
|
|
LPDATAOBJECT lpDataObj = new CDataObject( (MMC_COOKIE)this, CCT_SCOPE );
|
|
HRESULT hr;
|
|
|
|
UPDATE_VIEWS_HINT hint = ( TRUE == m_isScopeItem ) ? UPDATE_SCOPEITEM : UPDATE_RESULTITEM;
|
|
hr = pConsole->UpdateAllViews( lpDataObj, GetScopeItemValue(), hint );
|
|
|
|
_ASSERT( S_OK == hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CUDDIWebServerNode::OnDelete( IConsoleNameSpace *pConsoleNameSpace, IConsole *pConsoleComp )
|
|
{
|
|
DeleteFromScopePane( pConsoleNameSpace );
|
|
|
|
m_mapChanges[ UDDI_WRITER_CXN ] = _T("");
|
|
m_mapChanges[ UDDI_READER_CXN ] = _T("");
|
|
|
|
SaveData();
|
|
GetData();
|
|
|
|
//
|
|
// Now set isDeleted member so that the parent doesn't try to
|
|
// to insert it again in CUDDIServicesNode::OnShow. Admittedly, a hack...
|
|
//
|
|
m_isDeleted = TRUE;
|
|
|
|
m_pParent->OnDeleteChild( m_szName );
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDIWebServerNode::OnSetToolbar( IControlbar *pControlbar, IToolbar *pToolbar, BOOL bScope, BOOL bSelect )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if( bSelect )
|
|
{
|
|
pToolbar->SetButtonState( ID_BUTTONSTOP, BUTTONPRESSED, !IsRunning() );
|
|
pToolbar->SetButtonState( ID_BUTTONSTART, BUTTONPRESSED, IsRunning() );
|
|
|
|
pToolbar->SetButtonState( ID_BUTTONSTART, ENABLED, !IsRunning() && IsW3SvcRunning() );
|
|
pToolbar->SetButtonState( ID_BUTTONSTOP, ENABLED, IsRunning() || !IsW3SvcRunning() );
|
|
|
|
//
|
|
// Always make sure the menuButton is attached
|
|
//
|
|
hr = pControlbar->Attach( TOOLBAR, pToolbar );
|
|
|
|
m_isScopeItem = bScope;
|
|
|
|
} else
|
|
{
|
|
//
|
|
// Always make sure the toolbar is detached
|
|
//
|
|
hr = pControlbar->Detach( pToolbar );
|
|
m_pToolbar = NULL;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDIWebServerNode::OnToolbarCommand( IConsole *pConsole, MMC_CONSOLE_VERB verb, IDataObject *pDataObject )
|
|
{
|
|
CDataObject *pDO = GetOurDataObject( pDataObject );
|
|
if( NULL == pDO )
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
CDelegationBase *pBase = pDO->GetBaseNodeObject();
|
|
if( NULL == pBase )
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
CUDDIWebServerNode *pWSNode = static_cast<CUDDIWebServerNode *>( pBase );
|
|
UPDATE_VIEWS_HINT hint = ( TRUE == pWSNode->m_isScopeItem ) ? UPDATE_SCOPEITEM : UPDATE_RESULTITEM;
|
|
|
|
|
|
switch( verb )
|
|
{
|
|
case ID_BUTTONSTART:
|
|
Start();
|
|
break;
|
|
|
|
case ID_BUTTONSTOP:
|
|
Stop();
|
|
break;
|
|
}
|
|
|
|
|
|
HRESULT hr = GetData();
|
|
if( FAILED( hr ) )
|
|
return hr;
|
|
|
|
hr = pConsole->UpdateAllViews( pDataObject, GetScopeItemValue(), hint );
|
|
_ASSERT( S_OK == hr);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CUDDIWebServerNode::OnShowContextHelp( IDisplayHelp *pDisplayHelp, LPOLESTR helpFile )
|
|
{
|
|
if( ( NULL == pDisplayHelp ) || ( NULL == helpFile ) )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
wstring wstrHelpInfo = helpFile;
|
|
wstrHelpInfo += g_wszUddiWebServerNodeHelp;
|
|
|
|
LPOLESTR pszTopic = static_cast<LPOLESTR>(CoTaskMemAlloc((wstrHelpInfo.length() + 1) * sizeof(WCHAR)));
|
|
if( NULL == pszTopic )
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
wcsncpy( pszTopic, wstrHelpInfo.c_str(), wstrHelpInfo.length() );
|
|
pszTopic[ wstrHelpInfo.length() ] = NULL;
|
|
return pDisplayHelp->ShowTopic( pszTopic );
|
|
}
|
|
|
|
HRESULT CUDDIWebServerNode::OnAddMenuItems( IContextMenuCallback *pContextMenuCallback, long *pInsertionsAllowed )
|
|
{
|
|
WCHAR szStartMenuText[ MAX_PATH ];
|
|
WCHAR szStartMenuDescription[ MAX_PATH ];
|
|
|
|
WCHAR szStopMenuText[ MAX_PATH ];
|
|
WCHAR szStopMenuDescription[ MAX_PATH ];
|
|
|
|
LoadStringW( g_hinst, IDS_WEBSERVER_START, szStartMenuText, ARRAYLEN( szStartMenuText ) );
|
|
LoadStringW( g_hinst, IDS_WEBSERVER_START_DESCRIPTION, szStartMenuDescription, ARRAYLEN( szStartMenuDescription ) );
|
|
|
|
LoadStringW( g_hinst, IDS_WEBSERVER_STOP, szStopMenuText, ARRAYLEN( szStopMenuText ) );
|
|
LoadStringW( g_hinst, IDS_WEBSERVER_STOP_DESCRIPTION, szStopMenuDescription, ARRAYLEN( szStopMenuDescription ) );
|
|
|
|
HRESULT hr = S_OK;
|
|
CONTEXTMENUITEM menuItemsNew[] =
|
|
{
|
|
{
|
|
szStartMenuText, szStartMenuDescription,
|
|
IDM_WEBSERVER_START, CCM_INSERTIONPOINTID_PRIMARY_TOP, 0, 0
|
|
},
|
|
{
|
|
szStopMenuText, szStopMenuDescription,
|
|
IDM_WEBSERVER_STOP, CCM_INSERTIONPOINTID_PRIMARY_TOP, 0, 0
|
|
},
|
|
{ NULL, NULL, 0, 0, 0 }
|
|
};
|
|
|
|
menuItemsNew[ IsRunning() ? 0 : 1 ].fFlags = MF_GRAYED;
|
|
|
|
if( !IsW3SvcRunning() )
|
|
{
|
|
menuItemsNew[ 0 ].fFlags = MF_GRAYED;
|
|
}
|
|
|
|
//
|
|
// Loop through and add each of the menu items, we
|
|
// want to add to new menu, so see if it is allowed.
|
|
//
|
|
if( *pInsertionsAllowed & CCM_INSERTIONALLOWED_TOP )
|
|
{
|
|
for( LPCONTEXTMENUITEM m = menuItemsNew; m->strName; m++ )
|
|
{
|
|
hr = pContextMenuCallback->AddItem( m );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CUDDIWebServerNode::OnMenuCommand( IConsole *pConsole, IConsoleNameSpace *pConsoleNameSpace, long lCommandID, IDataObject *pDataObject )
|
|
{
|
|
switch( lCommandID )
|
|
{
|
|
case IDM_WEBSERVER_START:
|
|
OnToolbarCommand( pConsole, (MMC_CONSOLE_VERB) ID_BUTTONSTART, pDataObject );
|
|
break;
|
|
case IDM_WEBSERVER_STOP:
|
|
OnToolbarCommand( pConsole, (MMC_CONSOLE_VERB) ID_BUTTONSTOP, pDataObject );
|
|
break;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
struct LoggingData
|
|
{
|
|
LoggingData()
|
|
: bEventLogChanged( false )
|
|
, bFileLogChanged( false )
|
|
, pWebServer( NULL ){}
|
|
|
|
bool bEventLogChanged;
|
|
bool bFileLogChanged;
|
|
CUDDIWebServerNode *pWebServer;
|
|
};
|
|
|
|
BOOL CALLBACK CUDDIWebServerNode::LoggingDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
//
|
|
// Setup the window data
|
|
//
|
|
CUDDIWebServerNode *pWebServer = reinterpret_cast<CUDDIWebServerNode *>(reinterpret_cast<PROPSHEETPAGE *>(lParam)->lParam);
|
|
LoggingData *pdata = new LoggingData();
|
|
if( NULL == pdata )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
pdata->pWebServer = pWebServer;
|
|
SetWindowLongPtr( hwndDlg, GWLP_USERDATA, (LONG_PTR) pdata );
|
|
|
|
CPropertyMap& m_mapProperties = pWebServer->m_mapProperties;
|
|
|
|
int nEventLogLevel = _tstoi( m_mapProperties[ UDDI_EVENTLOG_LEVEL ].c_str() );
|
|
int nFileLogLevel = _tstoi( m_mapProperties[ UDDI_FILELOG_LEVEL ].c_str() );
|
|
|
|
SetDlgItemText( hwndDlg, IDC_LOGGING_TXT_LOGFILE_LOCATION, m_mapProperties[ UDDI_LOG_FILENAME ].c_str() );
|
|
SendDlgItemMessage( hwndDlg, IDC_LOGGING_SLIDER_FILELOG, TBM_SETRANGE, (WPARAM) TRUE, (LPARAM) MAKELONG( 0, 6 ) );
|
|
SendDlgItemMessage( hwndDlg, IDC_LOGGING_SLIDER_EVENTLOG, TBM_SETRANGE, (WPARAM) TRUE, (LPARAM) MAKELONG( 0, 6 ) );
|
|
SendDlgItemMessage( hwndDlg, IDC_LOGGING_SLIDER_EVENTLOG, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) nEventLogLevel );
|
|
SendDlgItemMessage( hwndDlg, IDC_LOGGING_SLIDER_FILELOG, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) nFileLogLevel );
|
|
break;
|
|
}
|
|
case WM_DESTROY:
|
|
{
|
|
//
|
|
// Release the window data
|
|
//
|
|
LoggingData* pData = (LoggingData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
delete pData;
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
{
|
|
LoggingData* pData = (LoggingData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
wstring strHelp( pData->pWebServer->GetHelpFile() );
|
|
strHelp += g_wszUddiLoggingPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
|
|
case WM_HSCROLL:
|
|
{
|
|
//
|
|
// This message indicates that a slider has changed position
|
|
//
|
|
LoggingData* pData = (LoggingData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
|
|
//
|
|
// The handle of slider is in the LPARAM
|
|
//
|
|
if( IDC_LOGGING_SLIDER_EVENTLOG == GetDlgCtrlID( (HWND) lParam ) )
|
|
{
|
|
pData->bEventLogChanged = true;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0 );
|
|
}
|
|
else if( IDC_LOGGING_SLIDER_FILELOG == GetDlgCtrlID( (HWND) lParam ) )
|
|
{
|
|
pData->bFileLogChanged = true;
|
|
SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
if( PSN_APPLY == ( (NMHDR *) lParam )->code )
|
|
{
|
|
//
|
|
// The Apply button or the OK Button was clicked
|
|
//
|
|
LoggingData* pdata = (LoggingData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
if( pdata->bEventLogChanged )
|
|
{
|
|
_TCHAR szPos[ 34 ];
|
|
int nPos = (int) SendDlgItemMessage( hwndDlg, IDC_LOGGING_SLIDER_EVENTLOG, TBM_GETPOS, 0, 0 );
|
|
|
|
pdata->pWebServer->m_mapChanges[ UDDI_EVENTLOG_LEVEL ] = _itot( nPos, szPos, 10 );
|
|
}
|
|
|
|
if( pdata->bFileLogChanged )
|
|
{
|
|
_TCHAR szPos[ 34 ];
|
|
int nPos = (int) SendDlgItemMessage( hwndDlg, IDC_LOGGING_SLIDER_FILELOG, TBM_GETPOS, 0, 0 );
|
|
|
|
pdata->pWebServer->m_mapChanges[ UDDI_FILELOG_LEVEL ] = _itot( nPos, szPos, 10 );
|
|
}
|
|
|
|
//
|
|
// Reset the change indicators so we don't update twice
|
|
//
|
|
pdata->bEventLogChanged = false;
|
|
pdata->bFileLogChanged = false;
|
|
|
|
//
|
|
// Ask MMC to send us a message (on the main thread) so
|
|
// we know the Apply button was clicked.
|
|
//
|
|
HRESULT hr = MMCPropertyChangeNotify( pdata->pWebServer->m_ppHandle, (LPARAM) pdata->pWebServer );
|
|
_ASSERT(SUCCEEDED(hr));
|
|
return PSNRET_NOERROR;
|
|
}
|
|
else if( PSN_HELP == ((NMHDR *) lParam)->code )
|
|
{
|
|
DatabaseConnectionData* pdata = (DatabaseConnectionData*) GetWindowLongPtr( hwndDlg, GWLP_USERDATA );
|
|
tstring strHelp( pdata->pWebServer->GetHelpFile() );
|
|
strHelp += g_wszUddiLoggingPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CALLBACK CUDDIWebServerNode::NewWebServerDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
static WebServerData* pWSData = NULL;
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
pWSData = reinterpret_cast<WebServerData *>(lParam);
|
|
|
|
if( NULL == pWSData || NULL == pWSData->pBase )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
WCHAR wszBuf[ MAX_PATH ];
|
|
DWORD dwBufSize = MAX_PATH;
|
|
wszBuf[ 0 ] = 0x00;
|
|
|
|
if( !GetComputerName( wszBuf, &dwBufSize ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL fChildExists = pWSData->pBase->ChildExists( wszBuf );
|
|
|
|
if( IsWebServer( wszBuf ) && !fChildExists )
|
|
{
|
|
// Defaults for the groups of radio buttons are: add this computer,
|
|
// and add it as both a reader + writer.
|
|
//
|
|
SendDlgItemMessage( hwndDlg, IDC_SITE_CONNECT_RADIO_LOCALCOMPUTER, BM_SETCHECK, TRUE, NULL );
|
|
SendDlgItemMessage( hwndDlg, IDC_SITE_CONNECT_RADIO_BOTH, BM_SETCHECK, TRUE, NULL );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDOK ), TRUE );
|
|
|
|
pWSData->connectMode = CM_Both;
|
|
}
|
|
else
|
|
{
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_RADIO_LOCALCOMPUTER ), FALSE );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_BTN_BROWSE ), TRUE );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER ), TRUE );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDOK ), FALSE );
|
|
|
|
SetDlgItemText( hwndDlg, IDC_SITE_CONNECT_TXT_DATABASE_INSTANCE, _T("") );
|
|
SendDlgItemMessage( hwndDlg, IDC_SITE_CONNECT_RADIO_ANOTHERCOMPUTER, BM_SETCHECK, TRUE, NULL );
|
|
SetFocus( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER ) );
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case WM_HELP:
|
|
{
|
|
tstring strHelp( pWSData->pBase->GetHelpFile() );
|
|
strHelp += g_wszUddiAddWebServerHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
break;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
switch( LOWORD(wParam) )
|
|
{
|
|
case IDC_SITE_CONNECT_RADIO_LOCALCOMPUTER:
|
|
{
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_BTN_BROWSE ), FALSE );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER ), FALSE );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDOK ), TRUE );
|
|
|
|
break;
|
|
}
|
|
|
|
case IDC_SITE_CONNECT_RADIO_ANOTHERCOMPUTER:
|
|
{
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_BTN_BROWSE ), TRUE );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER ), TRUE );
|
|
|
|
WCHAR wszComputerName[ 256 ];
|
|
wszComputerName[ 0 ] = 0x00;
|
|
GetDlgItemText( hwndDlg, IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER, wszComputerName, ARRAYLEN( wszComputerName ) );
|
|
|
|
//
|
|
// Enable the OK button only if there is some sort of text
|
|
// in the edit control where the computer name is supposed
|
|
// to be typed in.
|
|
//
|
|
EnableWindow( GetDlgItem( hwndDlg, IDOK ), 0 == wcslen( wszComputerName ) ? FALSE : TRUE );
|
|
|
|
break;
|
|
}
|
|
|
|
case IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER:
|
|
{
|
|
if( EN_CHANGE == HIWORD(wParam) )
|
|
{
|
|
WCHAR wszComputerName[ 256 ];
|
|
wszComputerName[ 0 ] = 0x00;
|
|
GetDlgItemText( hwndDlg, IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER, wszComputerName, ARRAYLEN( wszComputerName ) );
|
|
|
|
//
|
|
// Enable the OK button only if there is some sort of text
|
|
// in the edit control where the computer name is supposed
|
|
// to be typed in.
|
|
//
|
|
EnableWindow( GetDlgItem( hwndDlg, IDOK ), 0 == wcslen( wszComputerName ) ? FALSE : TRUE );
|
|
}
|
|
break;
|
|
}
|
|
|
|
case IDC_SITE_CONNECT_BTN_BROWSE:
|
|
{
|
|
_TCHAR szComputerName[ 256 ];
|
|
if( ObjectPicker( hwndDlg, OT_Computer, szComputerName, ARRAYLEN( szComputerName ) ) )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER, szComputerName );
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case IDHELP:
|
|
{
|
|
wstring strHelp( pWSData->pBase->GetHelpFile() );
|
|
strHelp += g_wszUddiAddWebServerHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
|
|
break;
|
|
}
|
|
|
|
case IDOK:
|
|
{
|
|
_TCHAR szBuf[ MAX_PATH + 1 ];
|
|
DWORD dwSize = MAX_PATH + 1;
|
|
memset( szBuf, 0, dwSize * sizeof( _TCHAR ) );
|
|
|
|
if( SendDlgItemMessage( hwndDlg, IDC_SITE_CONNECT_RADIO_LOCALCOMPUTER, BM_GETCHECK, NULL, NULL ) )
|
|
{
|
|
szBuf[ 0 ] = 0;
|
|
::GetComputerName( szBuf, &dwSize );
|
|
ToUpper( szBuf );
|
|
pWSData->szName = szBuf;
|
|
}
|
|
else
|
|
{
|
|
::GetDlgItemText( hwndDlg, IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER, szBuf, dwSize );
|
|
ToUpper( szBuf );
|
|
pWSData->szName = szBuf;
|
|
}
|
|
|
|
if( !CUDDIWebServerNode::IsWebServer( pWSData->szName.c_str() ) )
|
|
{
|
|
_TCHAR szTitle[ 256 ];
|
|
_TCHAR szMessage[ 1024 ];
|
|
LoadString( g_hinst, IDS_WEBSERVER_SELECT_ERROR, szMessage, ARRAYLEN( szMessage ) );
|
|
LoadString( g_hinst, IDS_WEBSERVER_SELECT_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
MessageBox( hwndDlg, szMessage, szTitle, MB_ICONERROR );
|
|
return FALSE;
|
|
}
|
|
EndDialog( hwndDlg, TRUE );
|
|
return TRUE;
|
|
}
|
|
|
|
case IDCANCEL:
|
|
{
|
|
EndDialog( hwndDlg, FALSE );
|
|
}
|
|
}
|
|
case WM_DESTROY:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CUDDIWebServerNode::UpdateResultPaneItem(IConsole *pConsole, HRESULTITEM item)
|
|
{
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
if( NULL == pConsole )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
IResultData *pResultData = NULL;
|
|
hr = pConsole->QueryInterface( IID_IResultData, (void **)&pResultData );
|
|
if( S_OK != hr )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
RESULTDATAITEM rditem;
|
|
ZeroMemory( &rditem, sizeof( RESULTDATAITEM ) );
|
|
rditem.itemID = item;
|
|
|
|
hr = pResultData->GetItem( &rditem );
|
|
_ASSERT( S_OK == hr );
|
|
|
|
rditem.mask &= RDI_STR;
|
|
rditem.str = MMC_CALLBACK;
|
|
hr = pResultData->SetItem( &rditem );
|
|
_ASSERT( S_OK == hr );
|
|
|
|
//
|
|
// Update the "Status" column. Because we are updating the text, we
|
|
// don't change the mask in rditem.
|
|
//
|
|
rditem.nCol = 1;
|
|
hr = pResultData->SetItem( &rditem );
|
|
_ASSERT( S_OK == hr );
|
|
|
|
pResultData->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CUDDIWebServerNode::UpdateScopePaneItem( IConsole *pConsole, HSCOPEITEM item )
|
|
{
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
if( NULL == pConsole )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
IConsoleNameSpace *pNameSpace = NULL;
|
|
hr = pConsole->QueryInterface( IID_IConsoleNameSpace, (void **)&pNameSpace );
|
|
if( S_OK != hr )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
SCOPEDATAITEM sditem;
|
|
ZeroMemory( &sditem, sizeof( SCOPEDATAITEM ) );
|
|
sditem.ID = item;
|
|
|
|
hr = pNameSpace->GetItem( &sditem );
|
|
_ASSERT( S_OK == hr );
|
|
|
|
sditem.mask &= SDI_STR;
|
|
sditem.displayname = MMC_CALLBACK;
|
|
|
|
hr = pNameSpace->SetItem( &sditem );
|
|
_ASSERT( S_OK == hr );
|
|
|
|
pNameSpace->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CUDDIWebServerNode::IsW3SvcRunning()
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
// 1. Open the Service Control Manager on the machine which the
|
|
// Web Server is currently running on.
|
|
//
|
|
SC_HANDLE hSCManager = OpenSCManager( m_szName, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT );
|
|
if( NULL == hSCManager )
|
|
{
|
|
return bRet;
|
|
}
|
|
|
|
// 2. Get a handle to the WWW Service on said machine. Note the
|
|
// access permissions that we are using.
|
|
//
|
|
SC_HANDLE hW3Svc = OpenService( hSCManager, _T("w3svc"), SERVICE_QUERY_STATUS );
|
|
if( NULL == hW3Svc )
|
|
{
|
|
CloseServiceHandle( hSCManager );
|
|
return bRet;
|
|
}
|
|
|
|
// 3. Query the status of the WWW Service.
|
|
//
|
|
SERVICE_STATUS stW3Svc;
|
|
ZeroMemory( &stW3Svc, sizeof( SERVICE_STATUS ) );
|
|
|
|
if( QueryServiceStatus( hW3Svc, &stW3Svc ) )
|
|
{
|
|
bRet = ( SERVICE_RUNNING == stW3Svc.dwCurrentState ) ? TRUE : FALSE;
|
|
}
|
|
|
|
CloseServiceHandle( hSCManager );
|
|
CloseServiceHandle( hW3Svc );
|
|
return bRet;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CUDDIWebServerNode::GetReaderConnectionString( const tstring& szName, tstring &szReader )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Database" ), KEY_READ, szName.c_str() );
|
|
szReader = key.GetString( _T("ReaderConnectionString"), _T("") );
|
|
|
|
return TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
CUDDIWebServerNode::GetWriterConnectionString( const tstring& szName, tstring &szWriter )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Database" ), KEY_READ, szName.c_str() );
|
|
szWriter = key.GetString( _T("WriterConnectionString"), _T("") );
|
|
|
|
return TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
BOOL
|
|
CUDDIWebServerNode::SetReaderConnectionString( const tstring& szName, const tstring& szReader )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Database" ), KEY_ALL_ACCESS, szName.c_str() );
|
|
key.SetValue( _T("ReaderConnectionString"), szReader.c_str() );
|
|
return TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
BOOL
|
|
CUDDIWebServerNode::SetWriterConnectionString( const tstring& szName, const tstring& szWriter )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Database" ), KEY_ALL_ACCESS, szName.c_str() );
|
|
key.SetValue( _T("WriterConnectionString"), szWriter.c_str() );
|
|
return TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
BOOL
|
|
CUDDIWebServerNode::IsAssignedToSite( const tstring& szWebServer, const ConnectMode& cm, tstring& szSite )
|
|
{
|
|
try
|
|
{
|
|
tstring szConnStr = _T( "" );
|
|
tstring szDomain = _T( "" );
|
|
tstring szInstance = _T( "" );
|
|
|
|
szSite = _T( "" );
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Database" ), KEY_READ, szWebServer.c_str() );
|
|
|
|
tstring szName = ( CM_Reader == cm ) ? _T("ReaderConnectionString") : _T("WriterConnectionString");
|
|
|
|
szConnStr = key.GetString( szName.c_str() );
|
|
if( 0 < szConnStr.length() )
|
|
{
|
|
CrackConnectionString( szConnStr, szDomain, szSite, szInstance );
|
|
}
|
|
|
|
return ( 0 == szSite.length() ) ? FALSE : TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
CUDDIWebServerNode::GetDBSchemaVersion( tstring& szVersion )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup\\WebServer" ), KEY_READ, m_szName );
|
|
|
|
szVersion = key.GetString( _T( "DBSchemaVersion" ) );
|
|
|
|
return ( 0 == szVersion.length() ) ? FALSE : TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
BOOL
|
|
CUDDIWebServerNode::GetDBSchemaVersion( const wstring& strComputer, wstring& strVersion )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup\\WebServer" ), KEY_READ, strComputer );
|
|
|
|
strVersion = key.GetString( _T( "DBSchemaVersion" ) );
|
|
|
|
return ( 0 == strVersion.length() ) ? FALSE : TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
void
|
|
CUDDIWebServerNode::DeleteFromScopePane( IConsoleNameSpace *pConsoleNameSpace )
|
|
{
|
|
if( NULL != pConsoleNameSpace )
|
|
{
|
|
pConsoleNameSpace->DeleteItem( GetScopeItemValue(), TRUE );
|
|
m_isDeleted = TRUE;
|
|
}
|
|
}
|