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.
3960 lines
108 KiB
3960 lines
108 KiB
#ifndef _WIN32_WINNT
|
|
#define _WIN32_WINNT 0x0500
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
|
|
#include "uddisitenode.h"
|
|
#include "webservernode.h"
|
|
#include "comp.h"
|
|
#include "compdata.h"
|
|
#include "dataobj.h"
|
|
#include "globals.h"
|
|
#include "resource.h"
|
|
#include "objectpicker.h"
|
|
#include <htmlhelp.h>
|
|
#include <windowsx.h>
|
|
#include <commctrl.h>
|
|
|
|
#include <atldbcli.h>
|
|
#include <oledberr.h>
|
|
#include <sddl.h>
|
|
#include "net_config_get.h"
|
|
#include "net_config_save.h"
|
|
#include "ADM_execResetKeyImmediate.h"
|
|
#include "ADM_setAdminAccount.h"
|
|
|
|
#include <algorithm>
|
|
|
|
#include "uddi.h"
|
|
#include "scppublisher.h"
|
|
|
|
BOOL RefreshInstances( HWND hwndList, PTCHAR szComputerName = _T("") );
|
|
BOOL GetInstances( PTCHAR szComputer, StringVector& instances );
|
|
|
|
// {53186FE3-F178-460c-8F3B-352549292B91}
|
|
const GUID CUDDISiteNode::thisGuid = { 0x53186fe3, 0xf178, 0x460c, { 0x8f, 0x3b, 0x35, 0x25, 0x49, 0x29, 0x2b, 0x91 } };
|
|
|
|
UINT CUDDISiteNode::m_nNextChildID = 0;
|
|
|
|
//==============================================================
|
|
//
|
|
// CDBSchemaVersion implementation
|
|
//
|
|
//
|
|
CDBSchemaVersion::CDBSchemaVersion() :
|
|
m_major( -1 ),
|
|
m_minor( -1 ),
|
|
m_build( -1 ),
|
|
m_rev( -1 )
|
|
{}
|
|
|
|
BOOL
|
|
CDBSchemaVersion::IsCompatible( const CDBSchemaVersion& version )
|
|
{
|
|
//
|
|
// The major and minor versions MUST be equal in order for the versions to be
|
|
// compatible. Other values are ignored.
|
|
//
|
|
return ( m_major == version.m_major ) &&
|
|
( m_minor == version.m_minor );
|
|
}
|
|
|
|
BOOL
|
|
CDBSchemaVersion::Parse( const tstring& versionString )
|
|
{
|
|
szVersion = versionString;
|
|
int length = versionString.length();
|
|
|
|
_TCHAR *buffer = new _TCHAR[ length + 1];
|
|
if( NULL == buffer )
|
|
{
|
|
throw E_OUTOFMEMORY;
|
|
return FALSE;
|
|
}
|
|
_tcscpy( buffer, versionString.c_str() );
|
|
|
|
m_major = GetPart( _tcstok( buffer, _T(".") ) );
|
|
m_minor = GetPart( _tcstok( NULL, _T(".") ) );
|
|
m_build = GetPart( _tcstok( NULL, _T(".") ) );
|
|
m_rev = GetPart( _tcstok( NULL, _T(".") ) );
|
|
|
|
delete[] buffer;
|
|
buffer = NULL;
|
|
|
|
return ( m_major != -1 &&
|
|
m_minor != -1 &&
|
|
m_build != -1 &&
|
|
m_rev != -1 );
|
|
}
|
|
|
|
int
|
|
CDBSchemaVersion::GetPart( const _TCHAR* token )
|
|
{
|
|
if( NULL == token )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
int part = _tstoi( token );
|
|
if( 0 == part && 0 != _tcscmp( token, _T( "0" ) ) )
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return part;
|
|
}
|
|
|
|
//==============================================================
|
|
//
|
|
// CUDDISiteNode implementation
|
|
//
|
|
//
|
|
CUDDISiteNode::CUDDISiteNode( _TCHAR *szName, _TCHAR *szInstanceName, int id, CUDDIServicesNode *parent, BOOL bExtension )
|
|
: m_szName(NULL)
|
|
, m_szInstanceName(NULL)
|
|
, m_ppHandle( 0 )
|
|
, m_isDeleted( FALSE )
|
|
, m_pParent( parent )
|
|
, m_bIsDirty( FALSE )
|
|
, m_bStdSvr( TRUE )
|
|
{
|
|
OutputDebugString( _T("Site Information Follows:\n" ) );
|
|
OutputDebugString( _T("Computer: ") );
|
|
OutputDebugString( szName );
|
|
OutputDebugString( _T("\nInstance: " ) );
|
|
OutputDebugString( szInstanceName );
|
|
OutputDebugString( _T("\n") );
|
|
|
|
m_szName = new _TCHAR[ ( _tcslen( szName ) + 1 ) ];
|
|
_tcscpy( m_szName, szName );
|
|
|
|
tstring strFullyQualifiedInstanceName;
|
|
CUDDISiteNode::GetFullyQualifiedInstanceName( szName, strFullyQualifiedInstanceName );
|
|
|
|
m_szInstanceName = new _TCHAR[ strFullyQualifiedInstanceName.length() + 1 ];
|
|
_tcscpy( m_szInstanceName, strFullyQualifiedInstanceName.c_str() );
|
|
|
|
m_bIsExtension = bExtension;
|
|
}
|
|
|
|
CUDDISiteNode::~CUDDISiteNode()
|
|
{
|
|
ClearChildMap();
|
|
|
|
if( m_szName )
|
|
delete [] m_szName;
|
|
|
|
if( m_szInstanceName )
|
|
delete [] m_szInstanceName;
|
|
|
|
}
|
|
|
|
BOOL
|
|
CUDDISiteNode::ChildExists( const WCHAR *pwszName )
|
|
{
|
|
if( NULL == pwszName )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
return ( NULL == FindChild( pwszName ) ) ? FALSE : TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CUDDISiteNode::HasChildren()
|
|
{
|
|
if( 0 == m_mapConfig.size() && !CUDDIWebServerNode::IsWebServer( m_szName ) )
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
CUDDIServicesNode *
|
|
CUDDISiteNode::GetStaticNode()
|
|
{
|
|
return m_pParent;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CUDDISiteNode::GetData()
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
try
|
|
{
|
|
m_mapConfig.clear();
|
|
|
|
//
|
|
// Determine if the OS that this site node is running on is Windows Server 2003 Standard or not.
|
|
//
|
|
hr = IsStandardServer( m_szName, &m_bStdSvr );
|
|
if( FAILED(hr) )
|
|
{
|
|
THROW_UDDIEXCEPTION_ST( hr, IDS_DOT_NET_SERVER, g_hinst );
|
|
}
|
|
|
|
//
|
|
// Initialize the map to the default settings
|
|
//
|
|
m_mapConfig[ UDDI_AUTHENTICATION_MODE ] = _T( "3" );
|
|
m_mapConfig[ UDDI_REQUIRE_SSL ] = _T( "1" );
|
|
|
|
m_mapConfig[ UDDI_ADMIN_GROUP ] = _T( "S-1-5-32-544" );
|
|
m_mapConfig[ UDDI_COORDINATOR_GROUP ] = _T( "S-1-5-32-544" );
|
|
m_mapConfig[ UDDI_PUBLISHER_GROUP ] = _T( "S-1-5-32-544" );
|
|
m_mapConfig[ UDDI_USER_GROUP ] = _T( "S-1-5-32-545" );
|
|
m_mapConfig[ UDDI_TICKET_TIMEOUT ] = _T( "60" );
|
|
m_mapConfig[ UDDI_KEY_TIMEOUT ] = _T( "7" );
|
|
m_mapConfig[ UDDI_KEY_RESET_DATE ] = _T( "" );
|
|
m_mapConfig[ UDDI_KEY_AUTORESET ] = _T( "0" );
|
|
m_mapConfig[ UDDI_DISCOVERY_URL ] = _T( "" );
|
|
m_mapConfig[ UDDI_FIND_MAXROWS ] = _T( "1000" );
|
|
|
|
//
|
|
// Build up the default Site Name in case Site.Name is not specified
|
|
//
|
|
_TCHAR szBuffer[ 256 ];
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_DEFAULT_SITE_NAME_PREFIX, szBuffer, ARRAYLEN( szBuffer ) - 1 );
|
|
m_mapConfig[ UDDI_SITE_NAME ] = szBuffer;
|
|
m_mapConfig[ UDDI_SITE_NAME ] += m_szName;
|
|
|
|
//
|
|
// Get the setup information
|
|
//
|
|
CUDDIRegistryKey rootkey( _T( "SOFTWARE\\Microsoft\\UDDI"), KEY_READ, m_szName );
|
|
m_mapConfig[ UDDI_SETUP_LOCATION ] = rootkey.GetString( _T("InstallRoot"), _T("") );
|
|
rootkey.Close();
|
|
|
|
_TCHAR szValue[ 256 ];
|
|
CUDDIRegistryKey setupkey( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup"), KEY_READ, m_szName );
|
|
m_mapConfig[ UDDI_SETUP_DB ] = _itot( setupkey.GetDWORD( _T("DBServer"), 0 ), szValue, 10 );
|
|
m_mapConfig[ UDDI_SETUP_WEB ] = _itot( setupkey.GetDWORD( _T("WebServer"), 0 ), szValue, 10 );
|
|
m_mapConfig[ UDDI_SETUP_ADMIN ] = _itot( setupkey.GetDWORD( _T("Admin"), 0 ), szValue, 10 );
|
|
setupkey.Close();
|
|
|
|
CUDDIRegistryKey dbkey( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup\\DBServer"), KEY_READ, m_szName );
|
|
m_mapConfig[ UDDI_SETUP_DATE ] = dbkey.GetString( _T("InstallDate"), _T("") );
|
|
m_mapConfig[ UDDI_SETUP_LANGUAGE ] = dbkey.GetString( _T("ProductLanguage"), _T("") );
|
|
m_mapConfig[ UDDI_SETUP_NAME ] = dbkey.GetString( _T("ProductName"), _T("") );
|
|
m_mapConfig[ UDDI_SETUP_FRAMEWORK_VERSION ] = dbkey.GetString( _T("FrameworkVersion"), _T("") );
|
|
m_mapConfig[ UDDI_SETUP_MANUFACTURER ] = dbkey.GetString( _T("Manufacturer"), _T("") );
|
|
m_mapConfig[ UDDI_SETUP_VERSION ] = dbkey.GetString( _T("ProductVersion"), _T("") );
|
|
dbkey.Close();
|
|
|
|
//
|
|
// Populate the configuration map from the database
|
|
//
|
|
hr = GetConfig( m_mapConfig, GetConnectionStringOLEDB() );
|
|
if( FAILED(hr) )
|
|
{
|
|
THROW_UDDIEXCEPTION_ST( E_FAIL, IDS_DATABASE_SERVER_OLEDB_READ_FAILED, g_hinst );
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Get our version information
|
|
//
|
|
if( FALSE == m_siteVersion.Parse( m_mapConfig[ UDDI_DBSCHEMA_VERSION ] ) )
|
|
{
|
|
_TCHAR szMessage[ 512 ];
|
|
_TCHAR szMessageFormat[ 512 ];
|
|
|
|
memset( szMessage, 0, 512 * sizeof( _TCHAR ) );
|
|
memset( szMessageFormat, 0, 512 * sizeof( _TCHAR ) );
|
|
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_DBSCHEMA_VERSION_READ_FAILED, szMessageFormat, ARRAYLEN( szMessageFormat ) );
|
|
_sntprintf( szMessage, ARRAYLEN( szMessage ) - 1, szMessageFormat, m_szName );
|
|
|
|
THROW_UDDIEXCEPTION( E_FAIL, szMessage );
|
|
}
|
|
|
|
WCHAR wszBuf[ 256 ];
|
|
wszBuf[ 0 ] = 0x00;
|
|
LoadString( g_hinst, IDS_UDDIMMC_UNSPECIFIED, wszBuf, ARRAYLEN( wszBuf ) );
|
|
|
|
if( _T( "unspecified" ) == m_mapConfig[ UDDI_SITE_DESCRIPTION ] )
|
|
{
|
|
m_mapConfig[ UDDI_SITE_DESCRIPTION ] = wszBuf;
|
|
}
|
|
|
|
if( _T( "unspecified" ) == m_mapConfig[ UDDI_SITE_NAME ] )
|
|
{
|
|
m_mapConfig[ UDDI_SITE_NAME ] = wszBuf;
|
|
}
|
|
}
|
|
}
|
|
catch( CUDDIException &e )
|
|
{
|
|
// re-throw.
|
|
throw e;
|
|
}
|
|
catch( ... )
|
|
{
|
|
if( FALSE == FAILED( hr ) )
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
const _TCHAR *CUDDISiteNode::GetDisplayName( int nCol )
|
|
{
|
|
switch( nCol )
|
|
{
|
|
case 0:
|
|
{
|
|
m_strDisplayName = m_mapConfig[ UDDI_SITE_NAME ];
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
m_strDisplayName = m_szName;
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
if( 0 == _tcslen( m_szInstanceName ) )
|
|
m_strDisplayName = DefaultInstanceDisplayName();
|
|
else
|
|
m_strDisplayName = m_szInstanceName;
|
|
|
|
break;
|
|
}
|
|
|
|
case 3:
|
|
{
|
|
m_strDisplayName = m_mapConfig[ UDDI_SITE_DESCRIPTION ];
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
m_strDisplayName = _T("");
|
|
break;
|
|
}
|
|
}
|
|
|
|
return m_strDisplayName.c_str();
|
|
}
|
|
|
|
HRESULT CUDDISiteNode::OnShow( IConsole *pConsole, BOOL bShow, HSCOPEITEM scopeitem )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
IHeaderCtrl *pHeaderCtrl = NULL;
|
|
IResultData *pResultData = NULL;
|
|
|
|
if( bShow )
|
|
{
|
|
hr = pConsole->QueryInterface( IID_IHeaderCtrl, (void **)&pHeaderCtrl );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
|
|
hr = pConsole->QueryInterface( IID_IResultData, (void **)&pResultData );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
|
|
//
|
|
// Set the column headers in the results pane
|
|
//
|
|
|
|
WCHAR szColumnName[ 256 ];
|
|
LoadStringW( g_hinst, IDS_WEBSERVER_COLUMN_NAME, szColumnName, ARRAYLEN( szColumnName ) );
|
|
hr = pHeaderCtrl->InsertColumn( 0, szColumnName, 0, 150 );
|
|
_ASSERT( S_OK == hr );
|
|
|
|
LoadStringW( g_hinst, IDS_WEBSERVER_COLUMN_STATUS, szColumnName, ARRAYLEN( szColumnName ) );
|
|
hr = pHeaderCtrl->InsertColumn( 1, szColumnName, 0, 100 );
|
|
_ASSERT( S_OK == hr );
|
|
|
|
pHeaderCtrl->Release();
|
|
pResultData->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CUDDISiteNode::OnExpand( IConsoleNameSpace *pConsoleNameSpace, IConsole *pConsole, HSCOPEITEM parent )
|
|
{
|
|
//
|
|
// Cache static node's HSCOPEITEM for future use
|
|
//
|
|
// m_hParentHScopeItem = parent;
|
|
|
|
if( !m_bExpanded )
|
|
{
|
|
// Load up the child nodes.
|
|
LoadChildMap( m_mapConfig[ UDDI_SITE_WEBSERVERS ] );
|
|
|
|
return AddChildrenToScopePane( pConsoleNameSpace, GetScopeItemValue() );
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDISiteNode::RemoveChildren( IConsoleNameSpace *pNS )
|
|
{
|
|
if( NULL == pNS )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
for( CUDDIWebServerNodeMap::iterator iter = m_mapChildren.begin();
|
|
iter != m_mapChildren.end(); iter++ )
|
|
{
|
|
CUDDIWebServerNode *pWSNode = (CUDDIWebServerNode *)iter->second;
|
|
HSCOPEITEM hsi = pWSNode->GetScopeItemValue();
|
|
pNS->DeleteItem( hsi, TRUE );
|
|
}
|
|
|
|
ClearChildMap();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDISiteNode::OnPropertyChange( IConsole *pConsole, CComponent *pComponent )
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
try
|
|
{
|
|
hr = SaveData();
|
|
if( S_OK != hr )
|
|
return hr;
|
|
|
|
hr = GetData();
|
|
if( S_OK != hr )
|
|
return hr;
|
|
}
|
|
catch( CUDDIException& e )
|
|
{
|
|
TCHAR szTitle[ 256 ];
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_SELECT_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
HWND hwnd;
|
|
pConsole->GetMainWindow( &hwnd );
|
|
MessageBox( hwnd, e.GetEntireError().c_str(), szTitle, MB_ICONERROR | MB_OK | MB_APPLMODAL );
|
|
return E_FAIL;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
//
|
|
// Call IConsole::UpdateAllViews to redraw the item
|
|
// in all views. We need a data object because of the
|
|
// way UpdateAllViews is implemented, and because
|
|
// MMCN_PROPERTY_CHANGE doesn't give us one
|
|
//
|
|
hr = pConsole->UpdateAllViews( NULL, GetScopeItemValue(), 0 );
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CUDDISiteNode::OnShowContextHelp(IDisplayHelp *pDisplayHelp, LPOLESTR helpFile)
|
|
{
|
|
if( ( NULL == pDisplayHelp ) || ( NULL == helpFile ) )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
wstring wstrHelpInfo = helpFile;
|
|
wstrHelpInfo += g_wszUddiSiteNodeHelp;
|
|
|
|
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 CUDDISiteNode::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() )
|
|
{
|
|
hr = pConsoleVerb->SetVerbState( MMC_VERB_DELETE, ENABLED, TRUE );
|
|
_ASSERT( S_OK == hr );
|
|
}
|
|
|
|
hr = pConsoleVerb->SetVerbState( MMC_VERB_OPEN, ENABLED, TRUE );
|
|
if( FAILED(hr) )
|
|
{
|
|
pConsoleVerb->Release();
|
|
return 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 CUDDISiteNode::GeneralDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
static CUDDISiteNode *pDatabaseServer = NULL;
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
//
|
|
// Catch the "this" pointer so we can actually operate on the object
|
|
//
|
|
pDatabaseServer = reinterpret_cast<CUDDISiteNode *>(reinterpret_cast<PROPSHEETPAGE *>(lParam)->lParam);
|
|
CConfigMap& m_mapProperties = pDatabaseServer->m_mapConfig;
|
|
|
|
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_DISPLAYNAME, m_mapProperties[ UDDI_SITE_NAME ].c_str() );
|
|
SetDlgItemText( hwndDlg, IDC_GENERAL_SITE_TXT_DESCRIPTION, m_mapProperties[ UDDI_SITE_DESCRIPTION ].c_str() );
|
|
SetDlgItemText( hwndDlg, IDC_GENERAL_SITE_TXT_PROVIDER_KEY, m_mapProperties[ UDDI_SITE_KEY ].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() );
|
|
|
|
_TCHAR szServiceName[ 256 ];
|
|
if( _T("1") == m_mapProperties[ UDDI_SETUP_WEB ] )
|
|
{
|
|
::LoadString( g_hinst, IDS_WEBSERVER_COMPONENT_DESCRIPTION, szServiceName, ARRAYLEN( szServiceName ) );
|
|
ListBox_AddString( GetDlgItem( hwndDlg, IDC_GENERAL_SITE_LIST_SERVICES ), szServiceName );
|
|
}
|
|
|
|
if( _T("1") == m_mapProperties[ UDDI_SETUP_DB ] )
|
|
{
|
|
::LoadString( g_hinst, IDS_DATABASE_SERVER_COMPONENT_DESCRIPTION, szServiceName, ARRAYLEN( szServiceName ) );
|
|
ListBox_AddString( GetDlgItem( hwndDlg, IDC_GENERAL_SITE_LIST_SERVICES ), szServiceName );
|
|
}
|
|
|
|
if( _T("1") == m_mapProperties[ UDDI_SETUP_ADMIN ] )
|
|
{
|
|
::LoadString( g_hinst, IDS_UDDIMMC_COMPONENT_DESCRIPTION, szServiceName, ARRAYLEN( szServiceName ) );
|
|
ListBox_AddString( GetDlgItem( hwndDlg, IDC_GENERAL_SITE_LIST_SERVICES ), szServiceName );
|
|
}
|
|
}
|
|
break;
|
|
case WM_NOTIFY:
|
|
if( PSN_HELP == ((NMHDR *) lParam)->code )
|
|
{
|
|
wstring strHelp( pDatabaseServer->GetHelpFile() );
|
|
strHelp += g_wszUddiSiteGeneralPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
{
|
|
wstring strHelp( pDatabaseServer->GetHelpFile() );
|
|
strHelp += g_wszUddiSiteGeneralPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void SplitGroupName( const PTCHAR szGroupName, StringVector& names )
|
|
{
|
|
//
|
|
// Example: CREEVES\\Administrators
|
|
//
|
|
PTCHAR begin = szGroupName;
|
|
PTCHAR end = begin;
|
|
|
|
while( *end )
|
|
{
|
|
if( _T('\\') == *end )
|
|
{
|
|
TCHAR szNameTemp[ 256 ];
|
|
_tcsncpy( szNameTemp, begin, end - begin );
|
|
szNameTemp[ end - begin ] = NULL;
|
|
names.push_back( szNameTemp );
|
|
begin = end + 1;
|
|
}
|
|
end++;
|
|
}
|
|
|
|
//
|
|
// Get the last one
|
|
//
|
|
if( begin != end )
|
|
{
|
|
names.push_back( begin );
|
|
}
|
|
}
|
|
|
|
struct RolesData
|
|
{
|
|
RolesData( CUDDISiteNode* pServer )
|
|
: pDBServer( pServer )
|
|
, bAdminChanged( false )
|
|
, bCoordinatorChanged( false )
|
|
, bPublishChanged( false )
|
|
, bUserChanged( false )
|
|
, bInitialized( false ){}
|
|
|
|
CUDDISiteNode* pDBServer;
|
|
bool bAdminChanged;
|
|
bool bCoordinatorChanged;
|
|
bool bPublishChanged;
|
|
bool bUserChanged;
|
|
bool bInitialized;
|
|
|
|
//
|
|
// These members get updated when the user picks a new role/group
|
|
//
|
|
tstring tsNewAdminSID;
|
|
tstring tsNewCoordinatorSID;
|
|
tstring tsNewPublisherSID;
|
|
tstring tsNewUserSID;
|
|
};
|
|
|
|
tstring SidFromGroupName( const tstring& strGroupName, const LPCTSTR szTargetComputer )
|
|
{
|
|
BYTE sid[ 1024 ];
|
|
TCHAR domain[ 1024 ];
|
|
LPTSTR szSidBuf = NULL;
|
|
DWORD cbSID = ARRAYLEN( sid );
|
|
DWORD cbDomain = ARRAYLEN( domain );
|
|
SID_NAME_USE puse;
|
|
tstring strSid = _T("");
|
|
|
|
try
|
|
{
|
|
BOOL bRet = LookupAccountName(
|
|
NULL,
|
|
strGroupName.c_str(),
|
|
sid,
|
|
&cbSID,
|
|
domain,
|
|
&cbDomain,
|
|
&puse );
|
|
if( !bRet )
|
|
UDDIVERIFYAPI();// bRet, _T("The attempt to lookup the security identifer failed" ) );
|
|
|
|
bRet = ConvertSidToStringSid( sid, &szSidBuf );
|
|
UDDIASSERT( bRet );
|
|
|
|
strSid = szSidBuf;
|
|
|
|
if( szSidBuf )
|
|
LocalFree( szSidBuf );
|
|
}
|
|
catch( CUDDIException& e )
|
|
{
|
|
MessageBox( NULL, e.GetEntireError().c_str(), _T("Security name conversion failed" ), MB_OK );
|
|
}
|
|
return strSid;
|
|
}
|
|
|
|
tstring GroupNameFromSid( const tstring& strGroupSid, const tstring& strTargetComputer )
|
|
{
|
|
PSID lpSid = NULL;
|
|
TCHAR domain[ 1024 ];
|
|
TCHAR name[ 1024 ];
|
|
DWORD cbDomain = ( sizeof domain / sizeof domain[0] );
|
|
DWORD cbName = ( sizeof name / sizeof name[0] );
|
|
SID_NAME_USE puse;
|
|
tstring strGroupName = _T("");
|
|
|
|
BOOL bRet = ConvertStringSidToSid( strGroupSid.c_str(), &lpSid );
|
|
UDDIVERIFY( bRet, _T("Unable to convert the group security identifer into a textual name." ) );
|
|
|
|
bRet = LookupAccountSid( strTargetComputer.c_str(), lpSid, name, &cbName, domain, &cbDomain, &puse );
|
|
if( !bRet )
|
|
{
|
|
if( lpSid )
|
|
LocalFree( lpSid );
|
|
|
|
//
|
|
// If we can't look up the account, we can't continue.
|
|
//
|
|
THROW_UDDIEXCEPTION_ST( GetLastError(), IDS_ACCOUNT_GROUP_ERROR, g_hinst );
|
|
}
|
|
|
|
strGroupName = domain;
|
|
strGroupName += _T("\\");
|
|
strGroupName += name;
|
|
|
|
if( lpSid )
|
|
LocalFree( lpSid );
|
|
|
|
return strGroupName;
|
|
}
|
|
|
|
BOOL CALLBACK CUDDISiteNode::RolesDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
//
|
|
// Save the window data into the user data reference
|
|
//
|
|
CUDDISiteNode* pDBServer = reinterpret_cast<CUDDISiteNode *>(reinterpret_cast<PROPSHEETPAGE *>(lParam)->lParam);
|
|
RolesData* pdata = new RolesData( pDBServer );
|
|
SetWindowLongPtr( hwndDlg, GWLP_USERDATA, reinterpret_cast<LONG_PTR>( pdata ) );
|
|
|
|
//
|
|
// Admin group.
|
|
//
|
|
try
|
|
{
|
|
tstring strAdminGroup = GroupNameFromSid( pDBServer->m_mapConfig[ UDDI_ADMIN_GROUP ], pDBServer->m_szName );
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_ADMIN_GROUP_NAME, strAdminGroup.c_str() );
|
|
}
|
|
catch( ... )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_ADMIN_GROUP_NAME, pDBServer->m_mapConfig[ UDDI_ADMIN_GROUP ].c_str() );
|
|
}
|
|
|
|
//
|
|
// Coordinator Group.
|
|
//
|
|
try
|
|
{
|
|
tstring strCoordinatorGroup = GroupNameFromSid( pDBServer->m_mapConfig[ UDDI_COORDINATOR_GROUP ], pDBServer->m_szName );
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_COORDINATOR_GROUP_NAME, strCoordinatorGroup.c_str() );
|
|
}
|
|
catch( ... )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_COORDINATOR_GROUP_NAME, pDBServer->m_mapConfig[ UDDI_ADMIN_GROUP ].c_str() );
|
|
}
|
|
|
|
//
|
|
// Publisher Group.
|
|
//
|
|
try
|
|
{
|
|
tstring strPublisherGroup = GroupNameFromSid( pDBServer->m_mapConfig[ UDDI_PUBLISHER_GROUP ], pDBServer->m_szName );
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_PUBLISHER_GROUP_NAME, strPublisherGroup.c_str() );
|
|
}
|
|
catch( ... )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_PUBLISHER_GROUP_NAME, pDBServer->m_mapConfig[ UDDI_ADMIN_GROUP ].c_str() );
|
|
}
|
|
|
|
//
|
|
// User Group.
|
|
//
|
|
try
|
|
{
|
|
tstring strUserGroup = GroupNameFromSid( pDBServer->m_mapConfig[ UDDI_USER_GROUP ], pDBServer->m_szName );
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_USER_GROUP_NAME, strUserGroup.c_str() );
|
|
}
|
|
catch( ... )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_USER_GROUP_NAME, pDBServer->m_mapConfig[ UDDI_USER_GROUP ].c_str() );
|
|
}
|
|
|
|
pdata->bInitialized = true;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
RolesData* pdata = reinterpret_cast<RolesData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
|
|
if( BN_CLICKED == HIWORD(wParam) )
|
|
{
|
|
try
|
|
{
|
|
TCHAR szGroupSID[ 1024 ];
|
|
|
|
if( IDC_ROLES_BTN_ADMINISTRATOR_SELECT == LOWORD(wParam) )
|
|
{
|
|
if( ObjectPicker( hwndDlg, OT_GroupSID, szGroupSID, ARRAYLEN( szGroupSID ), pdata->pDBServer->m_szName ) )
|
|
{
|
|
try
|
|
{
|
|
tstring tstr = GroupNameFromSid( szGroupSID, pdata->pDBServer->m_szName );
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_ADMIN_GROUP_NAME, tstr.c_str() );
|
|
}
|
|
catch( ... )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_ADMIN_GROUP_NAME, szGroupSID );
|
|
}
|
|
|
|
pdata->bAdminChanged = true;
|
|
pdata->tsNewAdminSID = szGroupSID;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
}
|
|
}
|
|
else if( IDC_ROLES_BTN_COORDINATOR_SELECT == LOWORD(wParam) )
|
|
{
|
|
if( ObjectPicker( hwndDlg, OT_GroupSID, szGroupSID, ARRAYLEN( szGroupSID ), pdata->pDBServer->m_szName ) )
|
|
{
|
|
try
|
|
{
|
|
tstring tstr = GroupNameFromSid( szGroupSID, pdata->pDBServer->m_szName );
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_COORDINATOR_GROUP_NAME, tstr.c_str() );
|
|
}
|
|
catch( ... )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_COORDINATOR_GROUP_NAME, szGroupSID );
|
|
}
|
|
|
|
pdata->bCoordinatorChanged = true;
|
|
pdata->tsNewCoordinatorSID = szGroupSID;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
}
|
|
}
|
|
else if( IDC_ROLES_BTN_PUBLISHER_SELECT == LOWORD(wParam) )
|
|
{
|
|
if( ObjectPicker( hwndDlg, OT_GroupSID, szGroupSID, ARRAYLEN( szGroupSID ), pdata->pDBServer->m_szName ) )
|
|
{
|
|
try
|
|
{
|
|
tstring tstr = GroupNameFromSid( szGroupSID, pdata->pDBServer->m_szName );
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_PUBLISHER_GROUP_NAME, tstr.c_str() );
|
|
}
|
|
catch( ... )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_PUBLISHER_GROUP_NAME, szGroupSID );
|
|
}
|
|
|
|
pdata->bPublishChanged = true;
|
|
pdata->tsNewPublisherSID = szGroupSID;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
}
|
|
}
|
|
else if( IDC_ROLES_BTN_USER_SELECT == LOWORD(wParam) )
|
|
{
|
|
if( ObjectPicker( hwndDlg, OT_GroupSID, szGroupSID, ARRAYLEN( szGroupSID ), pdata->pDBServer->m_szName ) )
|
|
{
|
|
try
|
|
{
|
|
tstring tstr = GroupNameFromSid( szGroupSID, pdata->pDBServer->m_szName );
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_USER_GROUP_NAME, tstr.c_str() );
|
|
}
|
|
catch( ... )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_ROLES_EDIT_USER_GROUP_NAME, szGroupSID );
|
|
}
|
|
|
|
pdata->bUserChanged = true;
|
|
pdata->tsNewUserSID = szGroupSID;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
catch( CUDDIException& exception )
|
|
{
|
|
_TCHAR szTitle[256];
|
|
::LoadString( g_hinst, IDS_UDDIMMC_SNAPINNAME, szTitle, ARRAYLEN( szTitle ) - 1 );
|
|
|
|
MessageBox( hwndDlg, (LPCTSTR) exception, szTitle, MB_ICONERROR | MB_OK | MB_APPLMODAL );
|
|
|
|
break;
|
|
}
|
|
catch( ... )
|
|
{
|
|
TCHAR wszTitle[ 128 ];
|
|
TCHAR wszMsg[ 256 ];
|
|
|
|
LoadString( g_hinst, IDS_GENERAL_EXCEPTION_TITLE, wszTitle, 128 );
|
|
LoadString( g_hinst, IDS_GENERAL_EXCEPTION, wszMsg, 256 );
|
|
MessageBox( hwndDlg, wszMsg, wszTitle, MB_OK );
|
|
break;
|
|
}
|
|
}
|
|
else if( EN_CHANGE == HIWORD(wParam) )
|
|
{
|
|
if( pdata->bInitialized )
|
|
{
|
|
switch( LOWORD(wParam) )
|
|
{
|
|
case IDC_ROLES_EDIT_USER_GROUP_NAME:
|
|
pdata->bUserChanged = true;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
break;
|
|
case IDC_ROLES_EDIT_PUBLISHER_GROUP_NAME:
|
|
pdata->bPublishChanged = true;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
break;
|
|
case IDC_ROLES_EDIT_COORDINATOR_GROUP_NAME:
|
|
pdata->bCoordinatorChanged = true;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
break;
|
|
case IDC_ROLES_EDIT_ADMIN_GROUP_NAME:
|
|
pdata->bAdminChanged = true;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_DESTROY:
|
|
{
|
|
delete reinterpret_cast<RolesData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
break;
|
|
}
|
|
|
|
case WM_HELP:
|
|
{
|
|
RolesData* pdata = reinterpret_cast<RolesData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
wstring strHelp( pdata->pDBServer->GetHelpFile() );
|
|
strHelp += g_wszUddiRolesPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
switch( ((NMHDR *) lParam)->code )
|
|
{
|
|
case PSN_APPLY:
|
|
{
|
|
RolesData* pdata = reinterpret_cast<RolesData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
|
|
CUDDISiteNode* pDBServer = pdata->pDBServer;
|
|
|
|
if( pdata->bAdminChanged )
|
|
{
|
|
pDBServer->m_mapChanges[ UDDI_ADMIN_GROUP ] = pdata->tsNewAdminSID;
|
|
pdata->bAdminChanged = false;
|
|
}
|
|
|
|
if( pdata->bCoordinatorChanged )
|
|
{
|
|
pDBServer->m_mapChanges[ UDDI_COORDINATOR_GROUP ] = pdata->tsNewCoordinatorSID;
|
|
pdata->bCoordinatorChanged = false;
|
|
}
|
|
|
|
if( pdata->bPublishChanged )
|
|
{
|
|
pDBServer->m_mapChanges[ UDDI_PUBLISHER_GROUP ] = pdata->tsNewPublisherSID;
|
|
pdata->bPublishChanged = false;
|
|
}
|
|
|
|
if( pdata->bUserChanged )
|
|
{
|
|
pDBServer->m_mapChanges[ UDDI_USER_GROUP ] = pdata->tsNewUserSID;
|
|
pdata->bUserChanged = false;
|
|
}
|
|
|
|
//
|
|
// Ask MMC to send us a message (on the main thread) so
|
|
// we know the Apply button was clicked.
|
|
//
|
|
HRESULT hr = MMCPropertyChangeNotify( pDBServer->m_ppHandle, reinterpret_cast<LONG_PTR>(pDBServer) );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
|
|
return PSNRET_NOERROR;
|
|
}
|
|
|
|
case PSN_HELP:
|
|
{
|
|
RolesData* pdata = reinterpret_cast<RolesData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
wstring strHelp( pdata->pDBServer->GetHelpFile() );
|
|
strHelp += g_wszUddiRolesPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
struct SecurityData
|
|
{
|
|
SecurityData( CUDDISiteNode* pDBServer )
|
|
: pServer( pDBServer )
|
|
, bModeChanged( false )
|
|
, bSSLChanged( false )
|
|
, bKeyTimeoutChanged( false )
|
|
, bTicketTimeoutChanged( false )
|
|
, bAutoKeyResetChanged( false )
|
|
, bAutoKeyReset( false )
|
|
, nKeyTimeout( 0 )
|
|
, nTicketTimeout( 0 )
|
|
{
|
|
if( NULL != pServer )
|
|
{
|
|
bAutoKeyReset = ( 0 != _tcscmp( _T("0"), pServer->GetConfigMap()[ UDDI_KEY_AUTORESET ].c_str() ) );
|
|
nKeyTimeout = _tstoi( pDBServer->GetConfigMap()[ UDDI_KEY_TIMEOUT ].c_str() );
|
|
nTicketTimeout = _tstoi( pDBServer->GetConfigMap()[ UDDI_TICKET_TIMEOUT ].c_str() );
|
|
}
|
|
}
|
|
|
|
bool bModeChanged;
|
|
bool bSSLChanged;
|
|
bool bKeyTimeoutChanged;
|
|
bool bTicketTimeoutChanged;
|
|
bool bAutoKeyResetChanged;
|
|
bool bAutoKeyReset;
|
|
int nKeyTimeout;
|
|
int nTicketTimeout;
|
|
CUDDISiteNode* pServer;
|
|
};
|
|
|
|
BOOL CALLBACK CUDDISiteNode::SecurityDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
//
|
|
// Catch the "this" pointer so we can actually operate on the object
|
|
//
|
|
CUDDISiteNode* pDBServer = reinterpret_cast<CUDDISiteNode *>(reinterpret_cast<PROPSHEETPAGE *>(lParam)->lParam);
|
|
SecurityData* pdata = new SecurityData( pDBServer );
|
|
SetWindowLongPtr( hwndDlg, GWLP_USERDATA, reinterpret_cast<LONG_PTR>( pdata ) );
|
|
_TCHAR* pszMode = (_TCHAR*) pDBServer->m_mapConfig[ UDDI_AUTHENTICATION_MODE ].c_str();
|
|
int nAuthenticationMode = _ttoi( pszMode );
|
|
switch( nAuthenticationMode )
|
|
{
|
|
case 1:
|
|
SendDlgItemMessage( hwndDlg, IDC_SECURITY_RADIO_AUTHENTICATION_UDDI, BM_SETCHECK, BST_CHECKED, NULL );
|
|
break;
|
|
case 2:
|
|
case 6:
|
|
SendDlgItemMessage( hwndDlg, IDC_SECURITY_RADIO_AUTHENTICATION_WINDOWS, BM_SETCHECK, BST_CHECKED, NULL );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_SECURITY_CHECK_AUTHENTICATED_READS ), TRUE );
|
|
break;
|
|
case 3:
|
|
default:
|
|
SendDlgItemMessage( hwndDlg, IDC_SECURITY_RADIO_AUTHENTICATION_BOTH, BM_SETCHECK, BST_CHECKED, NULL );
|
|
break;
|
|
}
|
|
|
|
if( 4 & nAuthenticationMode )
|
|
{
|
|
SendDlgItemMessage( hwndDlg, IDC_SECURITY_CHECK_AUTHENTICATED_READS, BM_SETCHECK, BST_CHECKED, NULL );
|
|
}
|
|
|
|
//
|
|
// Setup the HTTPS requirement setting
|
|
//
|
|
_TCHAR* pszHttps = (_TCHAR*) pDBServer->m_mapConfig[ UDDI_REQUIRE_SSL ].c_str();
|
|
int nhttps = _ttoi( pszHttps );
|
|
if( 0 == nhttps )
|
|
{
|
|
SendDlgItemMessage( hwndDlg, IDC_SECURITY_CHECK_REQUIRE_SSL, BM_SETCHECK, BST_UNCHECKED, NULL );
|
|
}
|
|
else
|
|
{
|
|
SendDlgItemMessage( hwndDlg, IDC_SECURITY_CHECK_REQUIRE_SSL, BM_SETCHECK, BST_CHECKED, NULL );
|
|
}
|
|
}
|
|
break;
|
|
case WM_HELP:
|
|
{
|
|
SecurityData* pdata = reinterpret_cast<SecurityData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) ) ;
|
|
wstring strHelp( pdata->pServer->GetHelpFile() );
|
|
strHelp += g_wszUddiSecurityPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
SecurityData* pdata = reinterpret_cast<SecurityData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
CUDDISiteNode* pDBServer = pdata->pServer;
|
|
|
|
//
|
|
// Set the state of the Authenticated Reads check box
|
|
//
|
|
LRESULT nChecked = SendDlgItemMessage( hwndDlg, IDC_SECURITY_RADIO_AUTHENTICATION_WINDOWS, BM_GETCHECK, NULL, NULL );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_SECURITY_CHECK_AUTHENTICATED_READS ), BST_CHECKED == nChecked ? TRUE : FALSE );
|
|
if( !nChecked )
|
|
{
|
|
SendDlgItemMessage( hwndDlg, IDC_SECURITY_CHECK_AUTHENTICATED_READS, BM_SETCHECK, FALSE, NULL );
|
|
}
|
|
|
|
if( IDC_CRYPTOGRAPHY_BTN_CHANGE == LOWORD(wParam) )
|
|
{
|
|
INT_PTR nResult = DialogBoxParam( g_hinst, MAKEINTRESOURCE( IDD_CRYPTOGRAPHY ), GetParent(hwndDlg), CryptographyDialogProc, (LPARAM) pdata );
|
|
|
|
if( nResult )
|
|
{
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0 );
|
|
}
|
|
}
|
|
else if( BN_CLICKED == HIWORD(wParam) &&
|
|
( IDC_SECURITY_RADIO_AUTHENTICATION_BOTH == LOWORD(wParam) ||
|
|
IDC_SECURITY_RADIO_AUTHENTICATION_UDDI == LOWORD(wParam) ||
|
|
IDC_SECURITY_RADIO_AUTHENTICATION_WINDOWS == LOWORD(wParam) ||
|
|
IDC_SECURITY_CHECK_AUTHENTICATED_READS == LOWORD(wParam) ) )
|
|
{
|
|
pdata->bModeChanged = true;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0 );
|
|
}
|
|
else if( BN_CLICKED == HIWORD(wParam) && IDC_SECURITY_CHECK_REQUIRE_SSL == LOWORD(wParam) )
|
|
{
|
|
pdata->bSSLChanged = true;
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0 );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
{
|
|
SecurityData* pdata = reinterpret_cast<SecurityData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
CUDDISiteNode* pDBServer = pdata->pServer;
|
|
delete pdata;
|
|
|
|
//
|
|
// Tell MMC that we're done with the property sheet (we got this
|
|
// handle in CreatePropertyPages
|
|
//
|
|
MMCFreeNotifyHandle( pDBServer->m_ppHandle );
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
switch( ((NMHDR *) lParam)->code )
|
|
{
|
|
case PSN_APPLY:
|
|
{
|
|
SecurityData* pdata = reinterpret_cast<SecurityData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
CUDDISiteNode* pDBServer = pdata->pServer;
|
|
|
|
if( pdata->bAutoKeyResetChanged )
|
|
{
|
|
pDBServer->m_mapChanges[ UDDI_KEY_AUTORESET ] = pdata->bAutoKeyReset ? _T("1") : _T("0");
|
|
}
|
|
|
|
if( pdata->bKeyTimeoutChanged )
|
|
{
|
|
_TCHAR szValue[ 10 ];
|
|
pDBServer->m_mapChanges[ UDDI_KEY_TIMEOUT ] = _itot( pdata->nKeyTimeout, szValue, 10 );
|
|
}
|
|
|
|
if( pdata->bTicketTimeoutChanged )
|
|
{
|
|
_TCHAR szValue[ 10 ];
|
|
pDBServer->m_mapChanges[ UDDI_TICKET_TIMEOUT ] = _itot( pdata->nTicketTimeout, szValue, 10 );
|
|
}
|
|
|
|
if( pdata->bModeChanged )
|
|
{
|
|
if( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDC_SECURITY_RADIO_AUTHENTICATION_BOTH, BM_GETCHECK, 0, 0 ) )
|
|
{
|
|
pDBServer->m_mapChanges[ UDDI_AUTHENTICATION_MODE ] = _T("3");
|
|
}
|
|
else if( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDC_SECURITY_RADIO_AUTHENTICATION_UDDI, BM_GETCHECK, 0, 0 ) )
|
|
{
|
|
pDBServer->m_mapChanges[ UDDI_AUTHENTICATION_MODE ] = _T("1");
|
|
}
|
|
else if( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDC_SECURITY_RADIO_AUTHENTICATION_WINDOWS, BM_GETCHECK, 0, 0 ) )
|
|
{
|
|
if( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDC_SECURITY_CHECK_AUTHENTICATED_READS, BM_GETCHECK, 0, 0 ) )
|
|
pDBServer->m_mapChanges[ UDDI_AUTHENTICATION_MODE ] = _T("6");
|
|
else
|
|
pDBServer->m_mapChanges[ UDDI_AUTHENTICATION_MODE ] = _T("2");
|
|
}
|
|
}
|
|
|
|
if( pdata->bSSLChanged )
|
|
{
|
|
LRESULT nChecked = SendDlgItemMessage( hwndDlg, IDC_SECURITY_CHECK_REQUIRE_SSL, BM_GETCHECK, NULL, NULL );
|
|
pDBServer->m_mapChanges[ UDDI_REQUIRE_SSL ] = ( BST_CHECKED == nChecked ? _T("1") : _T("0") );
|
|
}
|
|
|
|
pdata->bAutoKeyResetChanged = false;
|
|
pdata->bKeyTimeoutChanged = false;
|
|
pdata->bModeChanged = false;
|
|
pdata->bSSLChanged = false;
|
|
pdata->bTicketTimeoutChanged = false;
|
|
|
|
HRESULT hr = MMCPropertyChangeNotify( pDBServer->m_ppHandle, reinterpret_cast<LONG_PTR>(pDBServer) );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
}
|
|
return PSNRET_NOERROR;
|
|
|
|
case PSN_HELP:
|
|
{
|
|
SecurityData* pdata = reinterpret_cast<SecurityData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
wstring strHelp( pdata->pServer->GetHelpFile() );
|
|
strHelp += g_wszUddiSecurityPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
size_t CUDDISiteNode::PublishToActiveDirectory()
|
|
{
|
|
//
|
|
// Build up the list of ServiceConnectionPoint classes
|
|
//
|
|
CUDDIServiceCxnPtPublisher publisher(
|
|
GetConnectionStringOLEDB(),
|
|
m_mapConfig[ UDDI_SITE_KEY ],
|
|
m_mapConfig[ UDDI_SITE_NAME ],
|
|
m_mapConfig[ UDDI_DISCOVERY_URL ] );
|
|
|
|
//
|
|
// Process the binding information for the default
|
|
// provider for the site
|
|
//
|
|
publisher.ProcessSite();
|
|
|
|
//
|
|
// If there are no bindings don't publish anything
|
|
//
|
|
if( 0 == publisher.size() )
|
|
return 0;
|
|
|
|
//
|
|
// Delete the Site container
|
|
//
|
|
try
|
|
{
|
|
publisher.DeleteSiteContainer();
|
|
}
|
|
catch(...)
|
|
{
|
|
}
|
|
|
|
//
|
|
// Publish the Site Container
|
|
//
|
|
publisher.CreateSiteContainer();
|
|
|
|
//
|
|
// Publish the Service Connection Points
|
|
//
|
|
publisher.PublishServiceCxnPts();
|
|
|
|
return publisher.size();
|
|
}
|
|
|
|
void CUDDISiteNode::RemoveFromActiveDirectory()
|
|
{
|
|
//
|
|
// Build up the list of ServiceConnectionPoint classes
|
|
//
|
|
CUDDIServiceCxnPtPublisher publisher(
|
|
GetConnectionStringOLEDB(),
|
|
m_mapConfig[ UDDI_SITE_KEY ],
|
|
m_mapConfig[ UDDI_SITE_NAME ],
|
|
m_mapConfig[ UDDI_DISCOVERY_URL ] );
|
|
|
|
publisher.DeleteSiteContainer();
|
|
}
|
|
|
|
BOOL CUDDISiteNode::CanPublishToActiveDirectory()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CALLBACK CUDDISiteNode::ActiveDirectoryDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
static CUDDISiteNode *pDatabaseServer = NULL;
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
//
|
|
// Catch the "this" pointer so we can actually operate on the object
|
|
//
|
|
pDatabaseServer = reinterpret_cast<CUDDISiteNode *>(reinterpret_cast<PROPSHEETPAGE *>(lParam)->lParam);
|
|
|
|
break;
|
|
case WM_HELP:
|
|
{
|
|
wstring strHelp( pDatabaseServer->GetHelpFile() );
|
|
strHelp += g_wszUddiActiveDirectoryPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
if( IDC_ACTIVEDIRECTORY_BTN_ADD == LOWORD(wParam) )
|
|
{
|
|
try
|
|
{
|
|
size_t nCount = pDatabaseServer->PublishToActiveDirectory();
|
|
|
|
//
|
|
// Tell the user the publication job succeeded
|
|
//
|
|
_TCHAR szMessage[ 256 ];
|
|
_TCHAR szTitle[ 256 ];
|
|
|
|
if( nCount )
|
|
{
|
|
LoadString( g_hinst, IDS_ACTIVEDIRECTORY_PUBLISH_SUCCEEDED, szMessage, ARRAYLEN( szMessage ) );
|
|
LoadString( g_hinst, IDS_UDDIMMC_NAME, szTitle, ARRAYLEN( szTitle ) );
|
|
}
|
|
else
|
|
{
|
|
LoadString( g_hinst, IDS_ACTIVEDIRECTORY_NO_BINDINGS, szMessage, ARRAYLEN( szMessage ) );
|
|
LoadString( g_hinst, IDS_UDDIMMC_NAME, szTitle, ARRAYLEN( szTitle ) );
|
|
}
|
|
|
|
MessageBox( hwndDlg, szMessage, szTitle, MB_OK );
|
|
}
|
|
catch( CUDDIException& e )
|
|
{
|
|
UDDIMsgBox( hwndDlg, IDS_ACTIVEDIRECTORY_PUBLISH_FAILED, IDS_UDDIMMC_SNAPINNAME, MB_ICONERROR, e.GetEntireError().c_str() );
|
|
}
|
|
}
|
|
if( IDC_ACTIVEDIRECTORY_BTN_REMOVE == LOWORD(wParam) )
|
|
{
|
|
try
|
|
{
|
|
pDatabaseServer->RemoveFromActiveDirectory();
|
|
|
|
//
|
|
// Tell the user the publication job succeeded
|
|
//
|
|
_TCHAR szMessage[ 256 ];
|
|
_TCHAR szTitle[ 256 ];
|
|
LoadString( g_hinst, IDS_ACTIVEDIRECTORY_DELETE_SUCCEDED, szMessage, ARRAYLEN( szMessage ) );
|
|
LoadString( g_hinst, IDS_UDDIMMC_NAME, szTitle, ARRAYLEN( szTitle ) );
|
|
MessageBox( hwndDlg, szMessage, szTitle, MB_OK );
|
|
}
|
|
catch( CUDDIException& e )
|
|
{
|
|
UDDIMsgBox( hwndDlg, IDS_ACTIVEDIRECTORY_DELETE_FAILED, IDS_UDDIMMC_SNAPINNAME, MB_ICONERROR, e.GetEntireError().c_str() );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
switch( ((NMHDR *) lParam)->code )
|
|
{
|
|
case PSN_APPLY:
|
|
return PSNRET_NOERROR;
|
|
|
|
case PSN_HELP:
|
|
{
|
|
wstring strHelp( pDatabaseServer->GetHelpFile() );
|
|
strHelp += g_wszUddiActiveDirectoryPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
HRESULT CUDDISiteNode::HasPropertySheets()
|
|
{
|
|
//
|
|
// Say "yes" when MMC asks if we have pages
|
|
//
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDISiteNode::CreatePropertyPages( IPropertySheetCallback *lpProvider, LONG_PTR handle )
|
|
{
|
|
if( ( NULL == lpProvider ) || ( 0 == handle ) )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
HRESULT hr = S_OK;
|
|
try
|
|
{
|
|
hr = GetData();
|
|
}
|
|
catch( CUDDIException& e )
|
|
{
|
|
IConsole *pConsole = NULL;
|
|
HWND hwndConsole = NULL;
|
|
|
|
//
|
|
// This *should* always work. If it does work, then we use
|
|
// pConsole to get the main window handle for the mmc, and use
|
|
// this main window handle to display a modal dialog.
|
|
//
|
|
// If this fails (which it never should), we then display dialog,
|
|
// but with a NULL HWND.
|
|
//
|
|
hr = lpProvider->QueryInterface( IID_IConsole, (void **)&pConsole );
|
|
|
|
if( NULL != pConsole )
|
|
{
|
|
pConsole->GetMainWindow( &hwndConsole );
|
|
}
|
|
|
|
TCHAR szTitle[ 256 ];
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_GETDATA_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
|
|
MessageBox( hwndConsole, e.GetEntireError().c_str(), szTitle, MB_ICONERROR | MB_OK | MB_APPLMODAL );
|
|
|
|
if( NULL != pConsole )
|
|
{
|
|
pConsole->Release();
|
|
}
|
|
|
|
return E_FAIL;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
PropertyPages pps[] = {
|
|
{ IDD_GENERAL_SITE_PROPPAGE, GeneralDialogProc },
|
|
{ IDD_ROLES_PROPPAGE, RolesDialogProc },
|
|
{ IDD_SECURITY_PROPPAGE, SecurityDialogProc },
|
|
{ IDD_ACTIVEDIRECTORY_PROPPAGE, ActiveDirectoryDialogProc },
|
|
{ IDD_ADVANCED_PROPPAGE, AdvancedDialogProc } };
|
|
|
|
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 CUDDISiteNode::GetWatermarks(
|
|
HBITMAP *lphWatermark,
|
|
HBITMAP *lphHeader,
|
|
HPALETTE *lphPalette,
|
|
BOOL *bStretch )
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
HRESULT CUDDISiteNode::OnUpdateItem( IConsole *pConsole, long item, ITEM_TYPE itemtype )
|
|
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
_ASSERT( NULL != this || m_isDeleted || RESULT == itemtype );
|
|
|
|
//
|
|
// Redraw the item
|
|
//
|
|
IResultData *pResultData = NULL;
|
|
|
|
hr = pConsole->QueryInterface( IID_IResultData, (void **)&pResultData );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
|
|
HRESULTITEM myhresultitem;
|
|
_ASSERT( NULL != &myhresultitem );
|
|
|
|
//
|
|
// lparam == this. See CSpaceStation::OnShow
|
|
//
|
|
hr = pResultData->FindItemByLParam( (LPARAM)this, &myhresultitem );
|
|
|
|
if( FAILED(hr) )
|
|
{
|
|
//
|
|
// Failed : Reason may be that current view does not have this item.
|
|
// So exit gracefully.
|
|
//
|
|
hr = S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
hr = pResultData->UpdateItem( myhresultitem );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
}
|
|
|
|
pResultData->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CUDDISiteNode::OnRefresh( IConsole *pConsole )
|
|
{
|
|
//
|
|
// Call IConsole::UpdateAllViews to redraw all views
|
|
// owned by the parent scope item
|
|
//
|
|
HRESULT hr = pConsole->UpdateAllViews( NULL, m_pParent->GetParentScopeItem(), UPDATE_SCOPEITEM );
|
|
_ASSERT( S_OK == hr);
|
|
|
|
if( TRUE == SUCCEEDED( hr ) )
|
|
{
|
|
CUDDIWebServerNodeMap::iterator it = m_mapChildren.begin();
|
|
for ( it = m_mapChildren.begin(); it != m_mapChildren.end(); it++ )
|
|
{
|
|
CUDDIWebServerNode *pWSNode = it->second;
|
|
if( NULL != pWSNode )
|
|
{
|
|
pWSNode->OnRefresh( pConsole );
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CUDDISiteNode::OnAddMenuItems( IContextMenuCallback *pContextMenuCallback, long *pInsertionsAllowed )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if( !IsExtension() )
|
|
{
|
|
WCHAR szWebServerMenuText[ MAX_PATH ];
|
|
WCHAR szWebServerMenuDescription[ MAX_PATH ];
|
|
|
|
LoadStringW( g_hinst, IDS_WEBSERVER_ADD, szWebServerMenuText, ARRAYLEN( szWebServerMenuText ) );
|
|
LoadStringW( g_hinst, IDS_WEBSERVER_DESCRIPTION, szWebServerMenuDescription, ARRAYLEN( szWebServerMenuDescription ) );
|
|
|
|
CONTEXTMENUITEM menuItemsNew[] =
|
|
{
|
|
{
|
|
szWebServerMenuText,
|
|
szWebServerMenuDescription,
|
|
IDM_NEW_WEBSERVER,
|
|
CCM_INSERTIONPOINTID_PRIMARY_TOP,
|
|
m_bStdSvr ? MF_GRAYED : 0, // this menu option is disabled iff site node is on a Windows Server 2003 standard machine.
|
|
0
|
|
},
|
|
{ NULL, NULL, 0, 0, 0 }
|
|
};
|
|
|
|
|
|
//
|
|
// 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 );
|
|
if( FAILED(hr) )
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
#if defined( _DEBUG ) || defined( DBG )
|
|
CONTEXTMENUITEM menuItemsNew[] =
|
|
{
|
|
{
|
|
_T("Debug"), _T("Dump all the configuration data"),
|
|
IDM_DEBUG, CCM_INSERTIONPOINTID_PRIMARY_TOP, 0, 0
|
|
},
|
|
{ NULL, NULL, 0, 0, 0 }
|
|
};
|
|
|
|
|
|
//
|
|
// 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 );
|
|
if( FAILED(hr) )
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return hr;
|
|
}
|
|
|
|
CUDDIWebServerNode* CUDDISiteNode::FindChild( LPCTSTR szName )
|
|
{
|
|
CUDDIWebServerNodeMap::iterator it;
|
|
for( it = m_mapChildren.begin(); it != m_mapChildren.end(); it++ )
|
|
{
|
|
CUDDIWebServerNode* pNode = it->second;
|
|
|
|
if( ( NULL != pNode ) && ( !pNode->IsDeleted() ) && ( 0 == _tcsicmp( szName, pNode->GetName() ) ) )
|
|
{
|
|
return pNode;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
HRESULT CUDDISiteNode::OnMenuCommand( IConsole *pConsole, IConsoleNameSpace *pConsoleNameSpace, long lCommandID, IDataObject *pDataObject )
|
|
{
|
|
switch( lCommandID )
|
|
{
|
|
case IDM_NEW_WEBSERVER:
|
|
{
|
|
//
|
|
// Use these for some message boxes.
|
|
//
|
|
_TCHAR szMessage[ 512 ];
|
|
_TCHAR szTitle[ 128 ];
|
|
|
|
WebServerData wsData;
|
|
wsData.pBase = this;
|
|
|
|
HWND hwndConsole = NULL;
|
|
HRESULT hr = pConsole->GetMainWindow( &hwndConsole );
|
|
_ASSERT( S_OK == hr);
|
|
|
|
INT_PTR nResult = DialogBoxParam( g_hinst, MAKEINTRESOURCE( IDD_WEBSERVER_NEW ), hwndConsole, CUDDIWebServerNode::NewWebServerDialogProc, (LPARAM)&wsData );
|
|
|
|
if( nResult )
|
|
{
|
|
try
|
|
{
|
|
wstring strOldConnStr;
|
|
CUDDIWebServerNode::GetWriterConnectionString( wsData.szName, strOldConnStr );
|
|
|
|
if( !CUDDISiteNode::AddWebServerToSite( m_szName, wsData.szName, hwndConsole ) )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( 0 != strOldConnStr.length() )
|
|
{
|
|
wstring strDomain, strServer, strInstance;
|
|
CUDDIWebServerNode::CrackConnectionString( strOldConnStr, strDomain, strServer, strInstance );
|
|
|
|
CUDDISiteNode *pOldSite = static_cast<CUDDISiteNode *>( m_pParent->FindChild( strServer.c_str() ) );
|
|
if( NULL != pOldSite )
|
|
{
|
|
CUDDIWebServerNode *pOldWS = pOldSite->FindChild( wsData.szName.c_str() );
|
|
if( NULL != pOldSite )
|
|
{
|
|
pOldWS->DeleteFromScopePane( pConsoleNameSpace );
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Make sure the version of the web server is compatible with the version on the site.
|
|
//
|
|
UINT n = m_nNextChildID;
|
|
CUDDIWebServerNode *pNode = new CUDDIWebServerNode( wsData.szName.c_str(), n, this, m_bIsExtension );
|
|
if( TRUE == AddChildEntry( pNode, n ) )
|
|
{
|
|
|
|
//
|
|
// Set the connection strings registry keys on the web server machine to point to this UDDI site.
|
|
//
|
|
tstring szConnStr = CUDDIWebServerNode::BuildConnectionString( m_szName );
|
|
|
|
CUDDIWebServerNode::SetReaderConnectionString( wsData.szName.c_str(), szConnStr );
|
|
CUDDIWebServerNode::SetWriterConnectionString( wsData.szName.c_str(), szConnStr );
|
|
|
|
//
|
|
// Add this new web server node to the list of web servers for this site.
|
|
//
|
|
m_nNextChildID++;
|
|
|
|
m_bIsDirty = TRUE;
|
|
|
|
SCOPEDATAITEM sdi;
|
|
ZeroMemory( &sdi, sizeof(SCOPEDATAITEM) );
|
|
|
|
sdi.mask = SDI_STR | // Displayname is valid
|
|
SDI_PARAM | // lParam is valid
|
|
SDI_IMAGE | // nImage is valid
|
|
SDI_OPENIMAGE | // nOpenImage is valid
|
|
SDI_PARENT |
|
|
SDI_CHILDREN;
|
|
|
|
sdi.relativeID = GetScopeItemValue();
|
|
sdi.nImage = m_mapChildren[ n ]->GetBitmapIndex();
|
|
sdi.nOpenImage = MMC_IMAGECALLBACK;
|
|
sdi.displayname = MMC_CALLBACK;
|
|
sdi.lParam = (LPARAM) m_mapChildren[ n ];
|
|
sdi.cChildren = m_mapChildren[ n ]->HasChildren();
|
|
|
|
hr = pConsoleNameSpace->InsertItem( &sdi );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
|
|
m_mapChildren[ n ]->SetScopeItemValue( sdi.ID );
|
|
m_mapChildren[ n ]->SetParentScopeItem( sdi.relativeID );
|
|
|
|
//
|
|
// We created a new object in result pane. We need to insert this object
|
|
// in all the views, call UpdateAllViews for this.
|
|
// Pass pointer to data object passed into OnMenuCommand.
|
|
//
|
|
hr = pConsole->UpdateAllViews( pDataObject, GetScopeItemValue(), UPDATE_SCOPEITEM );
|
|
_ASSERT( S_OK == hr);
|
|
|
|
//
|
|
// Prompt the user with a warning to tell them that they might have to alter their
|
|
// machine.config settings if this web server is part of a web farm.
|
|
//
|
|
memset( szMessage, 0, 512 * sizeof( _TCHAR ) );
|
|
memset( szTitle, 0, 128 * sizeof( _TCHAR ) );
|
|
|
|
LoadString( g_hinst, IDS_WEBSERVER_WEBFARM_DETAIL, szMessage, ARRAYLEN( szMessage ) );
|
|
LoadString( g_hinst, IDS_WEBSERVER_WEBFARM, szTitle, ARRAYLEN( szTitle ) );
|
|
|
|
MessageBox( hwndConsole, szMessage, szTitle, MB_OK );
|
|
}
|
|
}
|
|
catch( CUDDIException &e )
|
|
{
|
|
UDDIMsgBox( hwndConsole, (LPCTSTR) e, IDS_ERROR_TITLE, MB_ICONEXCLAMATION | MB_OK );
|
|
return E_FAIL;
|
|
}
|
|
catch( ... )
|
|
{
|
|
UDDIMsgBox( hwndConsole, IDS_ERROR_ADDWEBSITE, IDS_ERROR_TITLE, MB_ICONEXCLAMATION | MB_OK );
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
#if defined( _DEBUG ) || defined( DBG )
|
|
case IDM_DEBUG:
|
|
{
|
|
try
|
|
{
|
|
GetData();
|
|
}
|
|
catch( CUDDIException& e )
|
|
{
|
|
TCHAR szTitle[ 256 ];
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_GETDATA_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
HWND hwnd;
|
|
pConsole->GetMainWindow( &hwnd );
|
|
MessageBox( hwnd, e.GetEntireError().c_str(), szTitle, MB_ICONERROR | MB_OK | MB_APPLMODAL );
|
|
return E_FAIL;
|
|
}
|
|
|
|
for( CConfigMap::iterator iter = m_mapConfig.begin();
|
|
iter != m_mapConfig.end(); iter++ )
|
|
{
|
|
OutputDebugString( (*iter).first.c_str() );
|
|
OutputDebugString( _T(" = ") );
|
|
OutputDebugString( (*iter).second.c_str() );
|
|
OutputDebugString( _T("\n") );
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDISiteNode::OnDelete( IConsoleNameSpace *pConsoleNameSpace, IConsole *pConsoleComp )
|
|
{
|
|
if( ( NULL == pConsoleNameSpace ) || ( NULL == pConsoleComp ) )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
HRESULT hr;
|
|
hr = pConsoleNameSpace->DeleteItem( GetScopeItemValue(), TRUE );
|
|
|
|
//
|
|
// 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;
|
|
|
|
return hr;
|
|
}
|
|
|
|
const LPCTSTR CUDDISiteNode::GetName()
|
|
{
|
|
return m_szName;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CUDDISiteNode::GetFullyQualifiedInstanceName( LPCTSTR szName, tstring& strInstanceName )
|
|
{
|
|
try
|
|
{
|
|
strInstanceName = _T( "" );
|
|
|
|
CUDDIRegistryKey dbkey( _T( "SOFTWARE\\Microsoft\\UDDI" ), KEY_READ, szName );
|
|
strInstanceName = dbkey.GetString( _T( "InstanceName" ) );
|
|
dbkey.Close();
|
|
|
|
return TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
strInstanceName = _T( "" );
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
const _TCHAR *
|
|
CUDDISiteNode::GetInstanceName()
|
|
{
|
|
return m_szInstanceName;
|
|
}
|
|
|
|
CUDDISiteNode* CUDDISiteNode::Create( _TCHAR *szName, _TCHAR *szInstanceName, int id, CUDDIServicesNode* parent, BOOL bExtension )
|
|
{
|
|
CUDDISiteNode* pNode = new CUDDISiteNode( szName, szInstanceName, id, parent, bExtension );
|
|
|
|
try
|
|
{
|
|
if( pNode )
|
|
pNode->GetData();
|
|
}
|
|
catch( CUDDIException &e )
|
|
{
|
|
delete pNode;
|
|
pNode = NULL;
|
|
|
|
throw e;
|
|
}
|
|
catch(...)
|
|
{
|
|
}
|
|
return pNode;
|
|
}
|
|
|
|
CConfigMap& CUDDISiteNode::GetConfigMap()
|
|
{
|
|
return m_mapConfig;
|
|
}
|
|
|
|
|
|
tstring
|
|
CUDDISiteNode::GetConnectionStringOLEDB()
|
|
{
|
|
try
|
|
{
|
|
tstring strConn = GetConnectionString();
|
|
if( tstring::npos == strConn.find( _T( "Provider=SQLOLEDB.1" ) ) )
|
|
{
|
|
strConn += _T( ";Provider=SQLOLEDB.1" );
|
|
}
|
|
|
|
return strConn;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return _T( "" );
|
|
}
|
|
}
|
|
|
|
tstring
|
|
CUDDISiteNode::GetConnectionString()
|
|
{
|
|
try
|
|
{
|
|
tstring strConn = _T( "Data Source=" );
|
|
tstring strInstanceName = _T( "" );
|
|
|
|
BOOL b = GetFullyQualifiedInstanceName( m_szName, strInstanceName );
|
|
if( FALSE == b )
|
|
{
|
|
return _T( "" );
|
|
}
|
|
|
|
strConn += strInstanceName;
|
|
|
|
strConn += _T(";Initial Catalog=uddi;Integrated Security=SSPI;");
|
|
|
|
return strConn;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return _T( "" );
|
|
}
|
|
}
|
|
|
|
|
|
BOOL CALLBACK CUDDISiteNode::CryptographyDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
CUDDISiteNode *pDatabaseServer = NULL;
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
SecurityData* pdata = reinterpret_cast<SecurityData*>(lParam);
|
|
CUDDISiteNode* pDBServer = pdata->pServer;
|
|
SetWindowLongPtr( hwndDlg, GWLP_USERDATA, lParam );
|
|
|
|
SetDlgItemText( hwndDlg, IDC_CRYPTOGRAPHY_TXT_RESET_DATE, LocalizedDateTime( pdata->pServer->GetConfigMap()[ UDDI_KEY_RESET_DATE ] ).c_str() );
|
|
SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TICKET_TIMEOUT, UDM_SETRANGE32, (WPARAM) 1, (LPARAM) 1000 );
|
|
SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TIMEOUT, UDM_SETRANGE32, (WPARAM) 1, (LPARAM) 365 );
|
|
SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TICKET_TIMEOUT, UDM_SETPOS32, NULL, (LPARAM) pdata->nTicketTimeout );
|
|
SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TIMEOUT, UDM_SETPOS32, NULL, (LPARAM) pdata->nKeyTimeout );
|
|
SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_CHECK_AUTO_RESET, BM_SETCHECK, pdata->bAutoKeyReset ? BST_CHECKED : BST_UNCHECKED, NULL );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_CRYPTOGRAPHY_EDIT_TIMEOUT ), pdata->bAutoKeyReset );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TIMEOUT ), pdata->bAutoKeyReset );
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
{
|
|
SecurityData* pdata = reinterpret_cast<SecurityData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) ) ;
|
|
wstring strHelp( pdata->pServer->GetHelpFile() );
|
|
strHelp += g_wszUddiCryptographyHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
SecurityData* pdata = reinterpret_cast<SecurityData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) ) ;
|
|
_TCHAR szMessage[ 512 ];
|
|
_TCHAR szTitle[ 256 ];
|
|
|
|
switch( LOWORD(wParam) )
|
|
{
|
|
case IDC_CRYPTOGRAPHY_BTN_RESET_NOW:
|
|
::LoadString( g_hinst, IDS_CRYPTOGRAPHY_RESET_NOW_CONFIRM, szMessage, ARRAYLEN( szMessage ) );
|
|
::LoadString( g_hinst, IDS_CRYPTOGRAPHY_RESET_NOW_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
|
|
if( IDYES == MessageBox( hwndDlg, szMessage, szTitle, MB_YESNO | MB_ICONQUESTION ) )
|
|
{
|
|
if( TRUE == pdata->pServer->ResetCryptography() )
|
|
{
|
|
::LoadString( g_hinst, IDS_CRYPTOGRAPHY_RESET_NOW_SUCCESS, szMessage, ARRAYLEN( szMessage ) );
|
|
::LoadString( g_hinst, IDS_CRYPTOGRAPHY_RESET_NOW_SUCCESS_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
|
|
SetDlgItemText( hwndDlg, IDC_CRYPTOGRAPHY_TXT_RESET_DATE, LocalizedDateTime( pdata->pServer->m_mapConfig[ UDDI_KEY_RESET_DATE ] ).c_str() );
|
|
MessageBox( hwndDlg, szMessage, szTitle, MB_OK );
|
|
}
|
|
else
|
|
{
|
|
::LoadString( g_hinst, IDS_CRYPTOGRAPHY_RESET_NOW_FAILED, szMessage, ARRAYLEN( szMessage ) );
|
|
::LoadString( g_hinst, IDS_CRYPTOGRAPHY_RESET_NOW_FAILED_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
MessageBox( hwndDlg, szMessage, szTitle, MB_OK );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_CRYPTOGRAPHY_CHECK_AUTO_RESET:
|
|
{
|
|
LRESULT nChecked = SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_CHECK_AUTO_RESET, BM_GETCHECK, NULL, NULL );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_CRYPTOGRAPHY_EDIT_TIMEOUT ), BST_CHECKED == nChecked ? TRUE : FALSE );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TIMEOUT ), BST_CHECKED == nChecked ? TRUE : FALSE );
|
|
pdata->bAutoKeyResetChanged = true;
|
|
}
|
|
break;
|
|
|
|
case IDC_CRYPTOGRAPHY_EDIT_TIMEOUT:
|
|
{
|
|
if( ( EN_CHANGE == HIWORD( wParam ) ) && ( NULL != pdata ) )
|
|
{
|
|
pdata->bKeyTimeoutChanged = true;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_CRYPTOGRAPHY_EDIT_TICKET_TIMEOUT:
|
|
{
|
|
if( ( EN_CHANGE == HIWORD( wParam ) ) && ( NULL != pdata ) )
|
|
{
|
|
pdata->bTicketTimeoutChanged = true;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDHELP:
|
|
{
|
|
wstring strHelp( pdata->pServer->GetHelpFile() );
|
|
strHelp += g_wszUddiCryptographyHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
|
|
case IDOK:
|
|
{
|
|
//
|
|
// Check that the ticket timeout is in proper range.
|
|
//
|
|
|
|
BOOL bError = FALSE;
|
|
LRESULT lValue = SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TICKET_TIMEOUT, UDM_GETPOS32, NULL, (LPARAM) &bError );
|
|
if( bError )
|
|
{
|
|
//
|
|
// Value out of range
|
|
//
|
|
LoadString( g_hinst, IDS_CRYPTOGRAPHY_TICKET_TIMEOUT_ERROR, szMessage, ARRAYLEN( szMessage ) );
|
|
LoadString( g_hinst, IDS_CRYPTOGRAPHY_TICKET_TIMEOUT_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
|
|
MessageBox( hwndDlg, szMessage, szTitle, MB_ICONERROR );
|
|
SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TICKET_TIMEOUT, UDM_SETPOS32, NULL, (LPARAM) 1000 );
|
|
SetFocus( GetDlgItem( hwndDlg, IDC_CRYPTOGRAPHY_EDIT_TICKET_TIMEOUT ) );
|
|
return FALSE;
|
|
}
|
|
|
|
if( pdata->bTicketTimeoutChanged )
|
|
{
|
|
pdata->nTicketTimeout = lValue;
|
|
}
|
|
|
|
if( IsWindowEnabled( GetDlgItem( hwndDlg, IDC_CRYPTOGRAPHY_EDIT_TIMEOUT ) ) )
|
|
{
|
|
//
|
|
// Check that the cryptography expiration is within specs
|
|
//
|
|
lValue = SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TIMEOUT, UDM_GETPOS32, NULL, (LPARAM) &bError );
|
|
|
|
if( bError )
|
|
{
|
|
//
|
|
// Value out of range
|
|
//
|
|
LoadString( g_hinst, IDS_CRYPTOGRAPHY_TIMEOUT_ERROR, szMessage, ARRAYLEN( szMessage ) );
|
|
LoadString( g_hinst, IDS_CRYPTOGRAPHY_TICKET_TIMEOUT_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
|
|
MessageBox( hwndDlg, szMessage, szTitle, MB_ICONERROR );
|
|
SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_SPIN_TIMEOUT, UDM_SETPOS32, NULL, (LPARAM) 365 );
|
|
SetFocus( GetDlgItem( hwndDlg, IDC_CRYPTOGRAPHY_EDIT_TIMEOUT ) );
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// We won't update the key timeout unless auto
|
|
// reset is enabled
|
|
//
|
|
if( pdata->bKeyTimeoutChanged )
|
|
{
|
|
pdata->nKeyTimeout = lValue;
|
|
}
|
|
}
|
|
|
|
if( pdata->bAutoKeyResetChanged )
|
|
{
|
|
LRESULT nChecked = SendDlgItemMessage( hwndDlg, IDC_CRYPTOGRAPHY_CHECK_AUTO_RESET, BM_GETCHECK, NULL, NULL );
|
|
pdata->bAutoKeyReset = BST_CHECKED == nChecked;
|
|
}
|
|
EndDialog( hwndDlg, TRUE );
|
|
}
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
{
|
|
//
|
|
// Reset the change flags if the dialog is cancelled
|
|
//
|
|
pdata->bAutoKeyResetChanged = false;
|
|
pdata->bKeyTimeoutChanged = false;
|
|
pdata->bTicketTimeoutChanged = false;
|
|
|
|
EndDialog( hwndDlg, FALSE );
|
|
}
|
|
break;
|
|
} /* End switch(...)*/
|
|
} /* End case WM_COMMAND */
|
|
break;
|
|
case WM_NOTIFY:
|
|
{
|
|
SecurityData* pdata = reinterpret_cast<SecurityData*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) ) ;
|
|
LPNMHDR phdr = (LPNMHDR) lParam;
|
|
|
|
if( UDN_DELTAPOS == phdr->code && IDC_CRYPTOGRAPHY_SPIN_TIMEOUT == phdr->idFrom )
|
|
{
|
|
pdata->bKeyTimeoutChanged = true;
|
|
}
|
|
else if( UDN_DELTAPOS == phdr->code && IDC_CRYPTOGRAPHY_SPIN_TICKET_TIMEOUT == phdr->idFrom )
|
|
{
|
|
pdata->bTicketTimeoutChanged = true;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
break;
|
|
|
|
} /* End switch(nMsg) */
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
CUDDISiteNode::IsDatabaseServer( PTCHAR szName )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup" ), KEY_READ, szName );
|
|
DWORD dwDB = key.GetDWORD( _T( "DBServer" ), 0 );
|
|
key.Close();
|
|
|
|
return ( 0 == dwDB ) ? FALSE : TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
CUDDISiteNode::IsDatabaseServer( PTCHAR szName, PTCHAR szInstance )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup" ), KEY_READ, szName );
|
|
DWORD dwDB = key.GetDWORD( _T( "DBServer" ), 0 );
|
|
key.Close();
|
|
|
|
if( 0 == dwDB )
|
|
return FALSE;
|
|
|
|
CUDDIRegistryKey dbkey( _T( "SOFTWARE\\Microsoft\\UDDI" ), KEY_READ, szName );
|
|
tstring strInstance = dbkey.GetString( _T( "InstanceName" ), _T("") );
|
|
dbkey.Close();
|
|
|
|
if( 0 != _tcsicmp( szInstance, InstanceRealName( strInstance.c_str() ) ) )
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL CUDDISiteNode::ResetCryptography()
|
|
{
|
|
BOOL fRet = FALSE;
|
|
try
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
ADM_execResetKeyImmediate resetkey;
|
|
resetkey.m_connectionString = GetConnectionStringOLEDB().c_str();
|
|
|
|
hr = resetkey.Open();
|
|
|
|
if( FAILED(hr) || 0 != resetkey.m_RETURNVALUE )
|
|
{
|
|
CUDDISiteNode::HandleOLEDBError( hr );
|
|
}
|
|
|
|
m_mapConfig[ UDDI_KEY_RESET_DATE ] = resetkey.m_keyLastResetDate;
|
|
fRet = TRUE;
|
|
}
|
|
catch( CUDDIException &e )
|
|
{
|
|
OutputDebugString( e );
|
|
fRet = FALSE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
fRet = FALSE;
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
HRESULT CUDDISiteNode::SaveData()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//
|
|
// Save each modifed configuration value into the configuration table
|
|
// using net_config_save
|
|
//
|
|
OutputDebugString( _T("Updating Values...\n") );
|
|
|
|
for( CConfigMap::iterator iter = m_mapChanges.begin();
|
|
iter != m_mapChanges.end(); iter++ )
|
|
{
|
|
if( 0 == _tcsicmp( (*iter).first.c_str(), UDDI_ADMIN_GROUP ) )
|
|
{
|
|
OutputDebugString( _T("The Administrator Group Name was modified\n") );
|
|
|
|
//
|
|
// The admin group has been changed. We need to update this independently because the
|
|
// translation of the "S-1..." format to SID is very difficult in T-SQL
|
|
//
|
|
// TODO: This call should be bound inside a transaction. with net_config_save
|
|
//
|
|
ADM_setAdminAccount updateadmin;
|
|
updateadmin.m_connectionString = GetConnectionStringOLEDB().c_str();
|
|
_tcsncpy( updateadmin.m_accountName, GroupNameFromSid( (*iter).second, m_szName ).c_str(), ARRAYLEN( updateadmin.m_accountName ) );
|
|
updateadmin.m_accountName[ ARRAYLEN( updateadmin.m_accountName ) - 1 ] = NULL;
|
|
hr = updateadmin.Open();
|
|
if( FAILED(hr) || 0 != updateadmin.m_RETURNVALUE )
|
|
{
|
|
try
|
|
{
|
|
CUDDISiteNode::HandleOLEDBError( hr );
|
|
}
|
|
catch( CUDDIException &e )
|
|
{
|
|
// leave 'hr' the same.
|
|
OutputDebugString( e );
|
|
}
|
|
catch( ... )
|
|
{
|
|
// leave 'hr' the same.
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
OutputDebugString( (*iter).first.c_str() );
|
|
OutputDebugString( _T(" = ") );
|
|
OutputDebugString( (*iter).second.c_str() );
|
|
OutputDebugString( _T("\n") );
|
|
|
|
net_config_save rs;
|
|
rs.m_connectionString = GetConnectionStringOLEDB().c_str();
|
|
_tcsncpy( rs.m_configName, (*iter).first.c_str(), ARRAYLEN( rs.m_configName ) - 1 );
|
|
rs.m_configName[ ARRAYLEN( rs.m_configName ) - 1 ] = 0x00;
|
|
|
|
_tcsncpy( rs.m_configValue, (*iter).second.c_str(), ARRAYLEN( rs.m_configValue ) - 1 );
|
|
rs.m_configValue[ ARRAYLEN( rs.m_configValue ) - 1 ] = 0x00;
|
|
|
|
hr = rs.Open();
|
|
if( FAILED(hr) || 0 != rs.m_RETURNVALUE )
|
|
{
|
|
try
|
|
{
|
|
CUDDISiteNode::HandleOLEDBError( hr );
|
|
}
|
|
catch( CUDDIException &e )
|
|
{
|
|
// leave 'hr' the same.
|
|
OutputDebugString( e );
|
|
}
|
|
catch( ... )
|
|
{
|
|
// leave 'hr' the same.
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Regardless of the outcome clear the change collection
|
|
//
|
|
m_mapChanges.clear();
|
|
|
|
return hr;
|
|
}
|
|
|
|
struct PropertyData
|
|
{
|
|
CUDDISiteNode* pServer;
|
|
_TCHAR szName[ 512 ];
|
|
_TCHAR szValue[ 512 ];
|
|
_TCHAR szDefault[ 512 ];
|
|
_TCHAR szHelpText[ 512 ];
|
|
};
|
|
|
|
BOOL CALLBACK CUDDISiteNode::AdvancedDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CUDDISiteNode* pDatabaseServer = reinterpret_cast<CUDDISiteNode *>(reinterpret_cast<PROPSHEETPAGE *>(lParam)->lParam);
|
|
SetWindowLongPtr( hwndDlg, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pDatabaseServer) );
|
|
|
|
CConfigMap& m_mapConfig = pDatabaseServer->m_mapConfig;
|
|
HWND hwndList = GetDlgItem( hwndDlg, IDC_ACTIVEDIRECTORY_LIST_ADVANCED );
|
|
|
|
ListView_SetExtendedListViewStyleEx( hwndList, 0, LVS_EX_BORDERSELECT | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES );
|
|
|
|
TCHAR szName[ 256 ];
|
|
LVCOLUMN lvcol;
|
|
LoadString( g_hinst, IDS_ADVANCED_NAME_COLUMN_NAME, szName, ARRAYLEN( szName ) );
|
|
ZeroMemory( &lvcol, sizeof( lvcol ) );
|
|
lvcol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
|
|
lvcol.fmt = LVCFMT_LEFT;
|
|
lvcol.cx = 150;
|
|
lvcol.pszText = szName;
|
|
ListView_InsertColumn( hwndList, 0, &lvcol );
|
|
|
|
LoadString( g_hinst, IDS_ADVANCED_VALUE_COLUMN_NAME, szName, ARRAYLEN( szName ) );
|
|
ZeroMemory( &lvcol, sizeof( lvcol ) );
|
|
lvcol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
|
|
lvcol.fmt = LVCFMT_LEFT;
|
|
lvcol.cx = 215;
|
|
lvcol.pszText = szName;
|
|
ListView_InsertColumn( hwndList, 1, &lvcol );
|
|
|
|
LPCTSTR ppszValues[] = {
|
|
UDDI_DISCOVERY_URL,
|
|
UDDI_FIND_MAXROWS,
|
|
UDDI_OPERATOR_NAME };
|
|
|
|
for( int i=0; i< ARRAYLEN( ppszValues ); i++ )
|
|
{
|
|
LVITEM item;
|
|
ZeroMemory( &item, sizeof( item ) );
|
|
item.mask = LVIF_TEXT;
|
|
item.pszText = _T("");
|
|
int nIndex = ListView_InsertItem( hwndList, &item );
|
|
|
|
ListView_SetItemText( hwndList, nIndex, 0, (PTCHAR) ppszValues[ i ] );
|
|
ListView_SetItemText( hwndList, nIndex, 1, (_TCHAR*) m_mapConfig[ ppszValues[ i ] ].c_str() );
|
|
}
|
|
|
|
break;
|
|
}
|
|
case WM_COMMAND:
|
|
if( IDC_ADVANCED_BTN_EDIT == LOWORD( wParam ) )
|
|
{
|
|
CUDDISiteNode* pDatabaseServer = reinterpret_cast<CUDDISiteNode*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
|
|
HWND hwndList = GetDlgItem( hwndDlg, IDC_ACTIVEDIRECTORY_LIST_ADVANCED );
|
|
int n = ListView_GetNextItem( hwndList, -1, LVNI_SELECTED );
|
|
if( -1 != n )
|
|
{
|
|
PropertyData data;
|
|
data.pServer = pDatabaseServer;
|
|
|
|
ListView_GetItemText( hwndList, n, 0, data.szName, 256 );
|
|
ListView_GetItemText( hwndList, n, 1, data.szValue, 256 );
|
|
|
|
INT_PTR nResult = DialogBoxParam( g_hinst, MAKEINTRESOURCE( IDD_ADVANCED_EDIT ), hwndDlg, PropertyEditDialogProc, (LPARAM) &data );
|
|
|
|
if( nResult )
|
|
{
|
|
ListView_SetItemText( hwndList, n, 1, data.szValue );
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case WM_NOTIFY:
|
|
if( IDC_ACTIVEDIRECTORY_LIST_ADVANCED == wParam && NM_DBLCLK == ((LPNMHDR)lParam)->code )
|
|
{
|
|
CUDDISiteNode* pDatabaseServer = reinterpret_cast<CUDDISiteNode*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
|
|
HWND hwndList = GetDlgItem( hwndDlg, IDC_ACTIVEDIRECTORY_LIST_ADVANCED );
|
|
|
|
//
|
|
// The list was double-clicked
|
|
// use hit test to determine the item index
|
|
//
|
|
LPNMITEMACTIVATE pitem = (LPNMITEMACTIVATE) lParam;
|
|
LVHITTESTINFO htinfo;
|
|
ZeroMemory( &htinfo, sizeof( LVHITTESTINFO ) );
|
|
htinfo.pt = pitem->ptAction;
|
|
int n = ListView_SubItemHitTest( GetDlgItem( hwndDlg, IDC_ACTIVEDIRECTORY_LIST_ADVANCED ),&htinfo );
|
|
|
|
if( -1 != n )
|
|
{
|
|
PropertyData data;
|
|
data.pServer = pDatabaseServer;
|
|
|
|
ListView_GetItemText( hwndList, n, 0, data.szName, ARRAYLEN( data.szName ) );
|
|
ListView_GetItemText( hwndList, n, 1, data.szValue, ARRAYLEN( data.szValue ) );
|
|
|
|
INT_PTR nResult = DialogBoxParam( g_hinst, MAKEINTRESOURCE( IDD_ADVANCED_EDIT ), hwndDlg, PropertyEditDialogProc, (LPARAM) &data );
|
|
|
|
if( nResult )
|
|
{
|
|
ListView_SetItemText( hwndList, n, 1, data.szValue );
|
|
SendMessage( GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0 );
|
|
}
|
|
}
|
|
}
|
|
else if( IDC_ACTIVEDIRECTORY_LIST_ADVANCED == wParam &&
|
|
LVN_ITEMCHANGED == ((LPNMHDR)lParam)->code )
|
|
{
|
|
HWND hwndList = GetDlgItem( hwndDlg, IDC_ACTIVEDIRECTORY_LIST_ADVANCED );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDC_ADVANCED_BTN_EDIT ), ( ListView_GetSelectedCount( hwndList ) > 0 ) );
|
|
}
|
|
else if( PSN_APPLY == ((NMHDR *) lParam)->code )
|
|
{
|
|
CUDDISiteNode* pDatabaseServer = reinterpret_cast<CUDDISiteNode*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
|
|
//
|
|
// Loop through the items and add modified items to the change collection
|
|
//
|
|
HWND hwndList = GetDlgItem( hwndDlg, IDC_ACTIVEDIRECTORY_LIST_ADVANCED );
|
|
int n = ListView_GetNextItem( hwndList, -1, LVNI_ALL );
|
|
while( -1 != n )
|
|
{
|
|
_TCHAR szModified[ 2 ];
|
|
ListView_GetItemText( hwndList, n, 0, szModified, 2 );
|
|
|
|
if( NULL != szModified[ 0 ] )
|
|
{
|
|
_TCHAR szName[ 256 ];
|
|
_TCHAR szValue[ 256 ];
|
|
ListView_GetItemText( hwndList, n, 0, szName, ARRAYLEN( szName ) );
|
|
ListView_GetItemText( hwndList, n, 1, szValue, ARRAYLEN( szValue ) );
|
|
pDatabaseServer->m_mapChanges[ szName ] = szValue;
|
|
}
|
|
|
|
n = ListView_GetNextItem( hwndList, n, LVNI_ALL );
|
|
}
|
|
|
|
//
|
|
// Ask MMC to send us a message (on the main thread) so
|
|
// we know the Apply button was clicked.
|
|
//
|
|
HRESULT hr = MMCPropertyChangeNotify( pDatabaseServer->m_ppHandle, reinterpret_cast<LONG_PTR>( pDatabaseServer ) );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
|
|
return PSNRET_NOERROR;
|
|
}
|
|
else if( PSN_HELP == ((NMHDR *) lParam)->code )
|
|
{
|
|
CUDDISiteNode* pDatabaseServer = reinterpret_cast<CUDDISiteNode*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
wstring strHelp( pDatabaseServer->GetHelpFile() );
|
|
strHelp += g_wszUddiAdvancedPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
|
|
break;
|
|
case WM_HELP:
|
|
{
|
|
CUDDISiteNode* pDatabaseServer = reinterpret_cast<CUDDISiteNode*>( GetWindowLongPtr( hwndDlg, GWLP_USERDATA ) );
|
|
wstring strHelp( pDatabaseServer->GetHelpFile() );
|
|
strHelp += g_wszUddiAdvancedPageHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CALLBACK CUDDISiteNode::PropertyEditDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
PropertyData* pdata = (PropertyData*) lParam;
|
|
SetWindowLongPtr( hwndDlg, GWLP_USERDATA, reinterpret_cast<LONG_PTR>( pdata ) );
|
|
|
|
SetDlgItemText( hwndDlg, IDC_ADVANCED_EDIT_TXT_NAME, pdata->szName );
|
|
SetDlgItemText( hwndDlg, IDC_ADVANCED_EDIT_VALUE, pdata->szValue );
|
|
break;
|
|
}
|
|
case WM_HELP:
|
|
{
|
|
PropertyData* pdata = reinterpret_cast<PropertyData*>( GetWindowLongPtrA( hwndDlg, GWLP_USERDATA ) );
|
|
wstring strHelp( pdata->pServer->GetHelpFile() );
|
|
|
|
strHelp += g_wszUddiEditPropertyHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
break;
|
|
}
|
|
case WM_COMMAND:
|
|
|
|
if( IDOK == LOWORD( wParam ) )
|
|
{
|
|
PropertyData* pdata = reinterpret_cast<PropertyData*>( GetWindowLongPtrA( hwndDlg, GWLP_USERDATA ) );
|
|
GetDlgItemText( hwndDlg, IDC_ADVANCED_EDIT_VALUE, pdata->szValue, sizeof( pdata->szValue ) / sizeof( _TCHAR ) );
|
|
|
|
EndDialog( hwndDlg, TRUE );
|
|
return FALSE;
|
|
}
|
|
else if( IDCANCEL == LOWORD( wParam ) )
|
|
{
|
|
EndDialog( hwndDlg, FALSE );
|
|
return FALSE;
|
|
}
|
|
else if( IDHELP == LOWORD( wParam ) )
|
|
{
|
|
PropertyData* pdata = reinterpret_cast<PropertyData*>( GetWindowLongPtrA( hwndDlg, GWLP_USERDATA ) );
|
|
wstring strHelp( pdata->pServer->GetHelpFile() );
|
|
strHelp += g_wszUddiEditPropertyHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CALLBACK CUDDISiteNode::NewDatabaseServerDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
static DatabaseData* pData = NULL;
|
|
|
|
switch( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
WCHAR wszBuf[ 256 ];
|
|
wszBuf[ 0 ] = 0x00;
|
|
DWORD dwBufSize = 256;
|
|
|
|
GetComputerName( wszBuf, &dwBufSize );
|
|
|
|
pData = reinterpret_cast<DatabaseData*>(lParam);
|
|
|
|
BOOL fChildExists = FALSE;
|
|
if( pData && pData->pBase )
|
|
{
|
|
if( pData->pBase->ChildExists( wszBuf ) )
|
|
{
|
|
fChildExists = TRUE;
|
|
}
|
|
}
|
|
|
|
if( IsDatabaseServer( _T("") ) && !fChildExists )
|
|
{
|
|
SendDlgItemMessage( hwndDlg, IDC_SITE_CONNECT_RADIO_LOCALCOMPUTER, BM_SETCHECK, TRUE, NULL );
|
|
EnableWindow( GetDlgItem( hwndDlg, IDOK ), TRUE );
|
|
RefreshInstances( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_TXT_DATABASE_INSTANCE ) );
|
|
}
|
|
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:
|
|
{
|
|
wstring strHelp( pData->pBase->GetHelpFile() );
|
|
strHelp += g_wszUddiAddSiteHelp;
|
|
|
|
::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 );
|
|
|
|
RefreshInstances( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_TXT_DATABASE_INSTANCE ) );
|
|
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 );
|
|
|
|
if( 0 == _tcslen( wszComputerName ) )
|
|
SetDlgItemText( hwndDlg, IDC_SITE_CONNECT_TXT_DATABASE_INSTANCE, _T("") );
|
|
else
|
|
RefreshInstances( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_TXT_DATABASE_INSTANCE ), wszComputerName );
|
|
|
|
break;
|
|
}
|
|
|
|
case IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER:
|
|
{
|
|
if( EN_CHANGE == HIWORD(wParam) )
|
|
{
|
|
SetDlgItemText( hwndDlg, IDC_SITE_CONNECT_TXT_DATABASE_INSTANCE, _T("") );
|
|
|
|
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 );
|
|
RefreshInstances( GetDlgItem( hwndDlg, IDC_SITE_CONNECT_TXT_DATABASE_INSTANCE ), szComputerName );
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case IDHELP:
|
|
{
|
|
wstring strHelp( pData->pBase->GetHelpFile() );
|
|
strHelp += g_wszUddiAddSiteHelp;
|
|
|
|
::HtmlHelp( hwndDlg, strHelp.c_str(), HH_DISPLAY_TOPIC, NULL );
|
|
|
|
break;
|
|
}
|
|
|
|
case IDOK:
|
|
{
|
|
DWORD dwSize = 256;
|
|
|
|
if( SendDlgItemMessage( hwndDlg, IDC_SITE_CONNECT_RADIO_LOCALCOMPUTER, BM_GETCHECK, NULL, NULL ) )
|
|
{
|
|
//
|
|
// The user chose to use the database on the local computer.
|
|
//
|
|
pData->szServerName[ 0 ] = 0;
|
|
GetComputerName( pData->szServerName, &dwSize );
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// The user chose to go with whatever they typed in for a computer name.
|
|
//
|
|
GetDlgItemText( hwndDlg, IDC_SITE_CONNECT_EDIT_ANOTHERCOMPUTER, pData->szServerName, dwSize );
|
|
|
|
static const tstring szLocalhost = _T("localhost");
|
|
|
|
//
|
|
// If the user typed in 'localhost', we have to switch it. Must be
|
|
// careful though... 'localhostabc' is a 100% legal computer name.
|
|
//
|
|
if( ( szLocalhost.length() == _tcslen( pData->szServerName ) ) && ( 0 == _tcsncicmp( szLocalhost.c_str(), pData->szServerName, szLocalhost.length() ) ) )
|
|
{
|
|
dwSize = 256;
|
|
pData->szServerName[ 0 ] = 0;
|
|
GetComputerName( pData->szServerName, &dwSize );
|
|
|
|
//
|
|
// If there is no UDDI database installed on the local computer,
|
|
// tell the user & force them to re-select.
|
|
//
|
|
if( !CUDDISiteNode::IsDatabaseServer( pData->szServerName ) )
|
|
{
|
|
_TCHAR szTitle[ 256 ];
|
|
_TCHAR szMessage[ 1024 ];
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_SELECT_ERROR, szMessage, ARRAYLEN( szMessage ) );
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_SELECT_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
MessageBox( hwndDlg, szMessage, szTitle, MB_ICONERROR );
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if( 0 == _tcslen( pData->szServerName ) || !CUDDISiteNode::IsDatabaseServer( pData->szServerName ) )
|
|
{
|
|
_TCHAR szTitle[ 256 ];
|
|
_TCHAR szMessage[ 1024 ];
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_SELECT_ERROR, szMessage, ARRAYLEN( szMessage ) );
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_SELECT_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
MessageBox( hwndDlg, szMessage, szTitle, MB_ICONERROR );
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Copy the instance name into the structure
|
|
//
|
|
tstring strLocalInstanceName;
|
|
BOOL bSuccess = CUDDISiteNode::GetFullyQualifiedInstanceName( pData->szServerName, strLocalInstanceName );
|
|
_tcsncpy( pData->szInstanceName, strLocalInstanceName.c_str(), ARRAYLEN( pData->szInstanceName ) );
|
|
pData->szInstanceName[ ARRAYLEN( pData->szInstanceName ) - 1 ] = NULL;
|
|
|
|
ToUpper( pData->szServerName );
|
|
|
|
EndDialog( hwndDlg, TRUE );
|
|
return TRUE;
|
|
}
|
|
|
|
case IDCANCEL:
|
|
{
|
|
EndDialog( hwndDlg, FALSE );
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
case WM_DESTROY:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL GetInstances( PTCHAR szComputer, StringVector& instances )
|
|
{
|
|
try
|
|
{
|
|
CUDDIRegistryKey key( _T("SOFTWARE\\Microsoft\\Microsoft SQL Server" ), KEY_READ, szComputer );
|
|
key.GetMultiString( _T("InstalledInstances"), instances );
|
|
}
|
|
catch(...)
|
|
{
|
|
}
|
|
|
|
return ( 0 != instances.size() );
|
|
}
|
|
|
|
//
|
|
// This function will look at the registry of the specifed
|
|
// computer and determine it hosts a UDDI Services Database
|
|
// Component. If it does it will set the text of the specified
|
|
// control and return TRUE.
|
|
//
|
|
BOOL RefreshInstances( HWND hwnd, PTCHAR szComputerName )
|
|
{
|
|
try
|
|
{
|
|
_TCHAR szText[ 512 ];
|
|
_TCHAR szComputer[ 256 ];
|
|
DWORD dwSize = ARRAYLEN( szComputer );
|
|
|
|
if( 0 == _tcslen( szComputerName ) )
|
|
{
|
|
szComputer[ 0 ] = 0;
|
|
::GetComputerName( szComputer, &dwSize );
|
|
}
|
|
else
|
|
{
|
|
_tcsncpy( szComputer, szComputerName, ARRAYLEN( szComputer ) - 1 );
|
|
szComputer[ ARRAYLEN( szComputer ) - 1 ] = NULL;
|
|
}
|
|
|
|
BOOL bFound = FALSE;
|
|
|
|
StringVector instances;
|
|
if( GetInstances( szComputer, instances ) )
|
|
{
|
|
CUDDIRegistryKey dbkey( _T( "SOFTWARE\\Microsoft\\UDDI\\Setup\\DBServer" ), KEY_READ, szComputer );
|
|
tstring strInstance = dbkey.GetString( _T( "InstanceNameOnly" ), _T("----") );
|
|
dbkey.Close();
|
|
|
|
if( _T("----") != strInstance )
|
|
{
|
|
for( StringVector::iterator iter = instances.begin();
|
|
iter != instances.end() && !bFound; iter++ )
|
|
{
|
|
if( 0 == _tcsicmp( strInstance.c_str(), InstanceDisplayName( (*iter).c_str() ) ) )
|
|
{
|
|
_TCHAR szTemplate[ 512 ];
|
|
LoadString( g_hinst, IDS_SITE_CONNECT_INSTANCE_FOUND_TEMPLATE, szTemplate, ARRAYLEN( szTemplate ) );
|
|
_sntprintf( szText, ARRAYLEN( szText ), szTemplate, strInstance.c_str() );
|
|
szText[ ARRAYLEN( szText ) - 1 ] = NULL;
|
|
bFound = TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( !bFound )
|
|
{
|
|
LoadString( g_hinst, IDS_SITE_CONNECT_NO_INSTANCES_FOUND, szText, ARRAYLEN( szText ) );
|
|
}
|
|
|
|
SetWindowText( hwnd, szText );
|
|
|
|
return TRUE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
_TCHAR szDefaultInstance[ 256 ] = _T("");
|
|
|
|
_TCHAR* DefaultInstanceDisplayName()
|
|
{
|
|
if( !szDefaultInstance[ 0 ] )
|
|
{
|
|
::LoadString( g_hinst, IDS_DATABASE_SERVER_DEFAULT_INSTANCE, szDefaultInstance, ARRAYLEN( szDefaultInstance ) );
|
|
}
|
|
|
|
return (_TCHAR*) szDefaultInstance;
|
|
}
|
|
|
|
const _TCHAR szDefaultRealName[] = _T("");
|
|
|
|
LPCTSTR InstanceDisplayName( LPCTSTR szName )
|
|
{
|
|
if( tstring( szName ) == tstring( _T("MSSQLSERVER") ) ||
|
|
0 == _tcslen( szName ) )
|
|
{
|
|
return DefaultInstanceDisplayName();
|
|
}
|
|
else
|
|
return szName;
|
|
}
|
|
|
|
LPCTSTR InstanceRealName( LPCTSTR szName )
|
|
{
|
|
if( tstring( szName ) == tstring( DefaultInstanceDisplayName() ) )
|
|
{
|
|
return szDefaultRealName;
|
|
}
|
|
else
|
|
return szName;
|
|
}
|
|
|
|
void
|
|
CUDDISiteNode::HandleOLEDBError( HRESULT hrErr )
|
|
{
|
|
CDBErrorInfo ErrorInfo;
|
|
ULONG cRecords = 0;
|
|
HRESULT hr;
|
|
ULONG i;
|
|
CComBSTR bstrDesc, bstrHelpFile, bstrSource, bstrMsg;
|
|
GUID guid;
|
|
DWORD dwHelpContext;
|
|
WCHAR wszGuid[40];
|
|
USES_CONVERSION;
|
|
|
|
// If the user passed in an HRESULT then trace it
|
|
if( hrErr != S_OK )
|
|
{
|
|
TCHAR sz[ 256 ];
|
|
_sntprintf( sz, 256, _T("OLE DB Error Record dump for hr = 0x%x\n"), hrErr );
|
|
sz[ 255 ] = 0x00;
|
|
bstrMsg += sz;
|
|
}
|
|
|
|
LCID lcLocale = GetSystemDefaultLCID();
|
|
|
|
hr = ErrorInfo.GetErrorRecords(&cRecords);
|
|
if( FAILED(hr) && ( ErrorInfo.m_spErrorInfo == NULL ) )
|
|
{
|
|
TCHAR sz[ 256 ];
|
|
_sntprintf( sz, 256, _T("No OLE DB Error Information found: hr = 0x%x\n"), hr );
|
|
sz[ 255 ] = 0x00;
|
|
bstrMsg += sz;
|
|
}
|
|
else
|
|
{
|
|
for( i = 0; i < cRecords; i++ )
|
|
{
|
|
hr = ErrorInfo.GetAllErrorInfo(i, lcLocale, &bstrDesc, &bstrSource, &guid,
|
|
&dwHelpContext, &bstrHelpFile);
|
|
if( FAILED(hr) )
|
|
{
|
|
TCHAR sz[ 256 ];
|
|
_sntprintf( sz, 256, _T("OLE DB Error Record dump retrieval failed: hr = 0x%x\n"), hr );
|
|
sz[ 255 ] = 0x00;
|
|
bstrMsg += sz;
|
|
break;
|
|
}
|
|
|
|
StringFromGUID2( guid, wszGuid, sizeof(wszGuid) / sizeof(WCHAR) );
|
|
TCHAR sz[ 256 ];
|
|
_sntprintf(
|
|
sz, 256,
|
|
_T("Row #: %4d Source: \"%s\" Description: \"%s\" Help File: \"%s\" Help Context: %4d GUID: %s\n"),
|
|
i, OLE2T(bstrSource), OLE2T(bstrDesc), OLE2T(bstrHelpFile), dwHelpContext, OLE2T(wszGuid) );
|
|
|
|
sz[ 255 ] = 0x00;
|
|
bstrMsg += sz;
|
|
|
|
bstrSource.Empty();
|
|
bstrDesc.Empty();
|
|
bstrHelpFile.Empty();
|
|
}
|
|
|
|
bstrMsg += _T("OLE DB Error Record dump end\n");
|
|
|
|
throw CUDDIException( hrErr, wstring( bstrMsg.m_str ) );
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
CUDDISiteNode::ClearChildMap()
|
|
{
|
|
for( CUDDIWebServerNodeMap::iterator iter = m_mapChildren.begin();
|
|
iter != m_mapChildren.end(); iter++ )
|
|
{
|
|
delete iter->second;
|
|
iter->second = NULL;
|
|
}
|
|
|
|
m_mapChildren.clear();
|
|
}
|
|
|
|
|
|
BOOL
|
|
CUDDISiteNode::LoadChildMap( const tstring& szWebServers )
|
|
{
|
|
BOOL fRet = FALSE;
|
|
|
|
//
|
|
// Blow away any current children.
|
|
//
|
|
ClearChildMap();
|
|
|
|
if( IsExtension() )
|
|
{
|
|
if( CUDDIWebServerNode::IsWebServer( m_szName ) )
|
|
{
|
|
tstring strDomain, strServer, strInstance, strWriter;
|
|
CUDDIWebServerNode::GetWriterConnectionString( m_szName, strWriter );
|
|
|
|
if( !strWriter.empty() )
|
|
{
|
|
CUDDIWebServerNode::CrackConnectionString( strWriter, strDomain, strServer, strInstance );
|
|
|
|
if( 0 == _tcsicmp( strServer.c_str(), m_szName ) )
|
|
{
|
|
UINT n = m_nNextChildID;
|
|
m_nNextChildID++;
|
|
CUDDIWebServerNode *pNode = new CUDDIWebServerNode( strServer.c_str(), n, this, m_bIsExtension );
|
|
AddChildEntry( pNode, n );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CStringCollection webServers( szWebServers );
|
|
int iWebServerCnt = webServers.Size();
|
|
for( int i = 0; i < iWebServerCnt; i++ )
|
|
{
|
|
const wstring& webServer = webServers[ i ];
|
|
|
|
//
|
|
// If the machine is hosting the UDDI Web Server, and if that Web Server is not already
|
|
// a part of this UDDI site, then add it.
|
|
//
|
|
if( CUDDIWebServerNode::IsWebServer( webServer.c_str() ) && ( NULL == FindChild( webServer.c_str() ) ) )
|
|
{
|
|
UINT n = m_nNextChildID;
|
|
m_nNextChildID++;
|
|
CUDDIWebServerNode *pNode = new CUDDIWebServerNode( webServer.c_str(), n, this, m_bIsExtension );
|
|
AddChildEntry( pNode, n );
|
|
}
|
|
}
|
|
|
|
fRet = TRUE;
|
|
|
|
if( 0 == m_mapChildren.size() )
|
|
{
|
|
if( CUDDIWebServerNode::IsWebServer( m_szName ) )
|
|
{
|
|
tstring szWriter, szDomain, szServer, szInstance;
|
|
CUDDIWebServerNode::GetWriterConnectionString( m_szName, szWriter );
|
|
|
|
if( !szWriter.empty() )
|
|
{
|
|
CUDDIWebServerNode::CrackConnectionString( szWriter, szDomain, szServer, szInstance );
|
|
|
|
if( 0 == _tcsicmp( szServer.c_str(), m_szName ) )
|
|
{
|
|
// add a node in our child map, change our list of writers
|
|
UINT n = m_mapChildren.size();
|
|
|
|
CUDDIWebServerNode *pNode = new CUDDIWebServerNode( m_szName, n, this, m_bIsExtension );
|
|
|
|
|
|
if( TRUE == AddChildEntry( pNode, n ) )
|
|
{
|
|
tstring szWriters;
|
|
SaveChildMap( szWriters );
|
|
|
|
m_mapChanges[ UDDI_SITE_WEBSERVERS ] = szWriters;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return fRet;
|
|
}
|
|
|
|
int
|
|
CUDDISiteNode::SaveChildMap( tstring& szWebServers )
|
|
{
|
|
szWebServers = _T("");
|
|
BOOL fFirst = TRUE;
|
|
CUDDIWebServerNodeMap::iterator it;
|
|
int cnt = 0;
|
|
|
|
for( it = m_mapChildren.begin(); it != m_mapChildren.end(); it++ )
|
|
{
|
|
CUDDIWebServerNode *pWS = it->second;
|
|
|
|
if( !pWS->IsDeleted() )
|
|
{
|
|
if( fFirst )
|
|
{
|
|
fFirst = FALSE;
|
|
}
|
|
else
|
|
{
|
|
szWebServers.append( _T("%") );
|
|
}
|
|
|
|
szWebServers.append( pWS->GetName() );
|
|
cnt++;
|
|
}
|
|
}
|
|
|
|
return cnt;
|
|
}
|
|
|
|
void
|
|
CUDDISiteNode::OnDeleteChild( const tstring& szName )
|
|
{
|
|
//
|
|
// The child node has already removed itself from the scope pane.
|
|
// We use this function to update our change map to reflect the
|
|
// fact that we now have 1 less Web Server writing to this DB.
|
|
//
|
|
tstring szWebServers;
|
|
SaveChildMap( szWebServers );
|
|
|
|
m_mapChanges[ UDDI_SITE_WEBSERVERS ] = szWebServers;
|
|
|
|
SaveData();
|
|
|
|
m_mapConfig[ UDDI_SITE_WEBSERVERS ] = szWebServers;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
CUDDISiteNode::AddChildrenToScopePane( IConsoleNameSpace *pConsoleNameSpace, HSCOPEITEM parent )
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
if( ( NULL == pConsoleNameSpace ) || ( NULL == parent ) )
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//
|
|
// Create the child nodes, then expand them
|
|
//
|
|
SCOPEDATAITEM sdi;
|
|
CUDDIWebServerNodeMap::iterator it;
|
|
|
|
for( it = m_mapChildren.begin(); it != m_mapChildren.end(); it++ )
|
|
{
|
|
CUDDIWebServerNode *pWSNode = it->second;
|
|
if( NULL == pWSNode )
|
|
{
|
|
hr = E_FAIL;
|
|
return hr;
|
|
}
|
|
|
|
if( !( pWSNode->IsDeleted() ) )
|
|
{
|
|
ZeroMemory( &sdi, sizeof(SCOPEDATAITEM) );
|
|
|
|
sdi.mask = SDI_STR | // Displayname is valid
|
|
SDI_PARAM | // lParam is valid
|
|
SDI_IMAGE | // nImage is valid
|
|
SDI_OPENIMAGE | // nOpenImage is valid
|
|
SDI_PARENT |
|
|
SDI_CHILDREN;
|
|
|
|
sdi.relativeID = parent;
|
|
sdi.nImage = pWSNode->GetBitmapIndex();
|
|
sdi.nOpenImage = MMC_IMAGECALLBACK; //INDEX_OPENFOLDER;
|
|
sdi.displayname = MMC_CALLBACK;
|
|
sdi.lParam = (LPARAM)pWSNode; // The cookie
|
|
sdi.cChildren = 0;
|
|
|
|
hr = pConsoleNameSpace->InsertItem( &sdi );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
|
|
pWSNode->SetScopeItemValue( sdi.ID );
|
|
pWSNode->SetParentScopeItem( sdi.relativeID );
|
|
}
|
|
}
|
|
|
|
hr = S_OK;
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDISiteNode::GetConfig( CConfigMap& configMap, const tstring& connectionString )
|
|
{
|
|
tstring tempConnectionString( connectionString );
|
|
if( connectionString.find( _T("Provider=SQLOLEDB.1") ) == std::wstring::npos )
|
|
{
|
|
tempConnectionString.append( _T(";Provider=SQLOLEDB.1") );
|
|
}
|
|
|
|
net_config_get configGet;
|
|
configGet.m_connectionString = tempConnectionString.c_str();
|
|
|
|
DBROWCOUNT rowCount;
|
|
HRESULT hr = configGet.Open();
|
|
|
|
while( SUCCEEDED(hr) && hr != DB_S_NORESULT )
|
|
{
|
|
if( NULL != configGet.GetInterface() )
|
|
{
|
|
HRESULT hr2 = configGet.Bind();
|
|
|
|
if( SUCCEEDED( hr2 ) )
|
|
{
|
|
while( S_OK == configGet.MoveNext() )
|
|
{
|
|
_ASSERT( !configGet.m_dwconfigNameStatus );
|
|
_ASSERT( !configGet.m_dwconfigValueStatus );
|
|
|
|
configMap[ configGet.m_configName ] = configGet.m_configValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
hr = configGet.GetNextResult( &rowCount );
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
CUDDISiteNode::SaveConfig( CConfigMap& configMap, const tstring& connectionString )
|
|
{
|
|
tstring tempConnectionString( connectionString );
|
|
if( connectionString.find( _T("Provider=SQLOLEDB.1") ) == std::wstring::npos )
|
|
{
|
|
tempConnectionString.append( _T(";Provider=SQLOLEDB.1") );
|
|
}
|
|
|
|
HRESULT hr = E_FAIL;
|
|
|
|
for( CConfigMap::iterator iterator = configMap.begin(); iterator != configMap.end(); iterator++ )
|
|
{
|
|
net_config_save configSave;
|
|
configSave.m_connectionString = tempConnectionString.c_str();
|
|
|
|
OutputDebugString( (*iterator).first.c_str() );
|
|
OutputDebugString( _T(" = ") );
|
|
OutputDebugString( (*iterator).second.c_str() );
|
|
OutputDebugString( _T("\n") );
|
|
|
|
_tcsncpy( configSave.m_configName, (*iterator).first.c_str(), ARRAYLEN( configSave.m_configName ) - 1 );
|
|
configSave.m_configName[ ARRAYLEN( configSave.m_configName ) - 1 ] = 0x00;
|
|
|
|
_tcsncpy( configSave.m_configValue, (*iterator).second.c_str(), ARRAYLEN( configSave.m_configValue ) - 1 );
|
|
configSave.m_configValue[ ARRAYLEN( configSave.m_configValue ) - 1 ] = 0x00;
|
|
|
|
hr = configSave.Open();
|
|
if( FAILED(hr) || 0 != configSave.m_RETURNVALUE )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
const _TCHAR *
|
|
CUDDISiteNode::GetNextWebServer( tstring& webServerList, int& position )
|
|
{
|
|
int length = webServerList.length();
|
|
int nextPosition = position;
|
|
const _TCHAR* webServer = NULL;
|
|
|
|
//
|
|
// No point if there no string.
|
|
//
|
|
if( 0 == length)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
while( nextPosition < length && webServerList[nextPosition] != WEBSERVER_LIST_DELIM )
|
|
{
|
|
nextPosition++;
|
|
}
|
|
|
|
if( nextPosition < length )
|
|
{
|
|
webServerList[ nextPosition ] = NULL_TERMINATOR;
|
|
webServer = webServerList.c_str() + position;
|
|
}
|
|
else
|
|
{
|
|
webServer = ( 0 == position ) ? webServerList.c_str() : NULL;
|
|
}
|
|
position = nextPosition;
|
|
|
|
return webServer;
|
|
}
|
|
|
|
void
|
|
CUDDISiteNode::AddWebServer( tstring& webServerList, const tstring& webServer )
|
|
{
|
|
if( webServerList.length() > 0 )
|
|
{
|
|
webServerList += WEBSERVER_LIST_DELIM;
|
|
}
|
|
webServerList.append( webServer );
|
|
}
|
|
|
|
BOOL
|
|
CUDDISiteNode::AddChildEntry( CUDDIWebServerNode *pNode, UINT position )
|
|
{
|
|
CUDDIWebServerNodeMapEntry entry( position, pNode );
|
|
m_mapChildren.insert( entry );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
CUDDISiteNode::AddChild( const wstring& strName, IConsole *pConsole )
|
|
{
|
|
if( FindChild( strName.c_str() ) || ( NULL == pConsole ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
IConsoleNameSpace *pConsoleNameSpace = NULL;
|
|
pConsole->QueryInterface( IID_IConsoleNameSpace, reinterpret_cast<void **>( &pConsoleNameSpace ) );
|
|
if( NULL == pConsoleNameSpace )
|
|
{
|
|
return;
|
|
}
|
|
|
|
HRESULT hr;
|
|
|
|
CUDDIWebServerNode *pNewWS = new CUDDIWebServerNode( strName.c_str(), m_nNextChildID, this, m_bIsExtension );
|
|
m_nNextChildID++;
|
|
|
|
AddChildEntry( pNewWS );
|
|
|
|
SCOPEDATAITEM sdi;
|
|
ZeroMemory( &sdi, sizeof( SCOPEDATAITEM ) );
|
|
|
|
sdi.mask = SDI_STR | // Displayname is valid
|
|
SDI_PARAM | // lParam is valid
|
|
SDI_IMAGE | // nImage is valid
|
|
SDI_OPENIMAGE | // nOpenImage is valid
|
|
SDI_PARENT |
|
|
SDI_CHILDREN;
|
|
|
|
sdi.relativeID = GetScopeItemValue();
|
|
sdi.nImage = pNewWS->GetBitmapIndex();
|
|
sdi.nOpenImage = MMC_IMAGECALLBACK;
|
|
sdi.displayname = MMC_CALLBACK;
|
|
sdi.lParam = (LPARAM)pNewWS;
|
|
sdi.cChildren = pNewWS->HasChildren();
|
|
|
|
hr = pConsoleNameSpace->InsertItem( &sdi );
|
|
_ASSERT( SUCCEEDED(hr) );
|
|
|
|
pNewWS->SetScopeItemValue( sdi.ID );
|
|
pNewWS->SetParentScopeItem( sdi.relativeID );
|
|
|
|
//
|
|
// We created a new object in result pane. We need to insert this object
|
|
// in all the views, call UpdateAllViews for this.
|
|
// Pass pointer to data object passed into OnMenuCommand.
|
|
//
|
|
//hr = pConsole->UpdateAllViews( pDataObject, m_hParentHScopeItem, UPDATE_SCOPEITEM );
|
|
//_ASSERT( S_OK == hr);
|
|
|
|
//
|
|
// Prompt the user with a warning to tell them that they might have to alter their
|
|
// machine.config settings if this web server is part of a web farm.
|
|
//
|
|
WCHAR wszMessage[ 512 ];
|
|
WCHAR wszTitle[ 512 ];
|
|
memset( wszMessage, 0, 512 * sizeof( _TCHAR ) );
|
|
memset( wszTitle, 0, 128 * sizeof( _TCHAR ) );
|
|
|
|
LoadString( g_hinst, IDS_WEBSERVER_WEBFARM_DETAIL, wszMessage, ARRAYLEN( wszMessage ) );
|
|
LoadString( g_hinst, IDS_WEBSERVER_WEBFARM, wszTitle, ARRAYLEN( wszTitle ) );
|
|
|
|
HWND hwndConsole = NULL;
|
|
pConsole->GetMainWindow( &hwndConsole );
|
|
|
|
MessageBox( hwndConsole, wszMessage, wszTitle, MB_OK );
|
|
|
|
pConsoleNameSpace->Release();
|
|
}
|
|
|
|
BOOL
|
|
CUDDISiteNode::AddWebServerToSite( const wstring& strSite,
|
|
const wstring& strWebServer,
|
|
HWND hwndParent )
|
|
{
|
|
try
|
|
{
|
|
//
|
|
// Make sure our params at least have some sort of content!
|
|
//
|
|
if( ( 0 == strSite.length() ) || ( 0 == strWebServer.length() ) )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// If strSite does not contain the name of a machine/cluster
|
|
// resource which hosts a UDDI Site, barf @ the user & exit
|
|
// immediately.
|
|
//
|
|
if( !CUDDISiteNode::IsDatabaseServer( (PTCHAR)strSite.c_str() ) )
|
|
{
|
|
UDDIMsgBox( hwndParent,
|
|
IDS_DATABASE_SERVER_SELECT_ERROR,
|
|
IDS_DATABASE_SERVER_SELECT_ERROR_TITLE,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// If strWebServer does not contain the name of a machine
|
|
// which hosts a UDDI Web Server, barf @ the user & exit
|
|
// immediately.
|
|
//
|
|
if( !CUDDIWebServerNode::IsWebServer( strWebServer.c_str() ) )
|
|
{
|
|
UDDIMsgBox( hwndParent,
|
|
IDS_WEBSERVER_SELECT_ERROR,
|
|
IDS_WEBSERVER_SELECT_ERROR_TITLE,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
return FALSE;
|
|
}
|
|
|
|
if( strSite != strWebServer )
|
|
{
|
|
//
|
|
// In this particular case the user is attempting to add to the UDDI Site a
|
|
// UDDI Web Server which is running on a Windows Server 2003 Standard machine. This cannot
|
|
// happen.
|
|
//
|
|
BOOL bWSRunsOnStdSvr = TRUE;
|
|
HRESULT hr = E_FAIL;
|
|
hr = ::IsStandardServer( strWebServer.c_str(), &bWSRunsOnStdSvr );
|
|
if( FAILED(hr) )
|
|
{
|
|
UDDIMsgBox( hwndParent,
|
|
IDS_DOT_NET_SERVER,
|
|
IDS_ERROR_TITLE,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
return FALSE;
|
|
}
|
|
|
|
if( TRUE == bWSRunsOnStdSvr )
|
|
{
|
|
UDDIMsgBox( hwndParent,
|
|
IDS_WEBSERVER_NOT_ASSIGNABLE_DETAIL,
|
|
IDS_WEBSERVER_NOT_ASSIGNABLE,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// In this particular case the user is attempting to add a UDDI Web Server
|
|
// to a UDDI Site which is running on a Windows Server 2003 Standard machine. This cannot
|
|
// happen.
|
|
//
|
|
BOOL bDBRunsOnStdSvr = TRUE;
|
|
hr = ::IsStandardServer( strSite.c_str(), &bDBRunsOnStdSvr );
|
|
if( FAILED(hr) )
|
|
{
|
|
UDDIMsgBox( hwndParent,
|
|
IDS_DOT_NET_SERVER,
|
|
IDS_ERROR_TITLE,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
return FALSE;
|
|
}
|
|
|
|
if( TRUE == bDBRunsOnStdSvr )
|
|
{
|
|
UDDIMsgBox( hwndParent,
|
|
IDS_DATABASE_STANDARD_SERVER_DETAIL,
|
|
IDS_DATABASE_STANDARD_SERVER,
|
|
MB_ICONEXCLAMATION | MB_OK );
|
|
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Do a check here to make sure the db schema on the new site
|
|
// is legit.
|
|
//
|
|
|
|
wstring strWSCurrentSite = _T( "" );
|
|
BOOL fWSCurrentSiteIsValid = FALSE;
|
|
BOOL fSameSite = FALSE;
|
|
BOOL fOKToMoveWebServer = FALSE;
|
|
|
|
//
|
|
// 1. Determine if the web server is: currently assigned to a site, if that
|
|
// site is valid, and if that site is the same as the new site.
|
|
//
|
|
if( CUDDIWebServerNode::IsAssignedToSite( strWebServer, CM_Writer, strWSCurrentSite ) )
|
|
{
|
|
//
|
|
// The web server thinks that it is currently assigned to a site. However we
|
|
// must take into consideration the following 2 cases:
|
|
//
|
|
// 1. The web server's connection string contains garbage.
|
|
// 2. The web server's connection string is valid, but the site that it
|
|
// refers to does not exist anymore.
|
|
//
|
|
if( ( 0 == strWSCurrentSite.length() ) ||
|
|
!CUDDISiteNode::IsDatabaseServer( (PTCHAR)strWSCurrentSite.c_str() ) )
|
|
{
|
|
fWSCurrentSiteIsValid = FALSE;
|
|
}
|
|
else
|
|
{
|
|
fWSCurrentSiteIsValid = TRUE;
|
|
}
|
|
|
|
//
|
|
// The user is trying to add the web server back to the same site that the
|
|
// web server thinks it belongs to. This can happen when the user un-installs
|
|
// and then re-installs the database.
|
|
//
|
|
fSameSite = ( 0 == _wcsicmp( strWSCurrentSite.c_str(), strSite.c_str() ) ) ? TRUE : FALSE;
|
|
|
|
//
|
|
// If the old site is valid, and if the site that the user wants isn't the
|
|
// old site, ask them if they are really sure.
|
|
//
|
|
if( fWSCurrentSiteIsValid && !fSameSite )
|
|
{
|
|
//
|
|
// First prompt the user to see if they really want to remove the web server from its current site.
|
|
//
|
|
WCHAR wszMessage[ 512 ];
|
|
WCHAR wszMessageFormat[ 512 ];
|
|
WCHAR wszTitle[ 128 ];
|
|
|
|
wszMessage[ 0 ] = 0x00;
|
|
wszTitle[ 0 ] = 0x00;
|
|
wszMessageFormat[ 0 ] = 0x00;
|
|
|
|
LoadString( g_hinst, IDS_WEBSERVER_ASSIGNED_DETAIL, wszMessageFormat, ARRAYLEN( wszMessageFormat ) );
|
|
_sntprintf( wszMessage,
|
|
ARRAYLEN(wszMessage) - 1,
|
|
wszMessageFormat,
|
|
strWebServer.c_str(),
|
|
strWSCurrentSite.c_str(),
|
|
strWebServer.c_str(),
|
|
strSite.c_str() );
|
|
|
|
LoadString( g_hinst, IDS_WEBSERVER_ASSIGNED, wszTitle, ARRAYLEN( wszTitle ) );
|
|
|
|
int iYesNo = MessageBox( hwndParent, wszMessage, wszTitle, MB_YESNO );
|
|
if( IDNO == iYesNo )
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
fOKToMoveWebServer = TRUE;
|
|
}
|
|
}
|
|
//
|
|
// If we're in here, either the old site is bogus, or it's the same site.
|
|
// In either case, it's ok to move the web server.
|
|
//
|
|
else
|
|
{
|
|
fOKToMoveWebServer = TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fOKToMoveWebServer = TRUE;
|
|
}
|
|
|
|
//
|
|
// 2. Get the list of Web Servers that the old Site contains.
|
|
//
|
|
if( ( FALSE == fSameSite ) && fWSCurrentSiteIsValid )
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
CConfigMap configOldSite;
|
|
wstring strOldConnStr;
|
|
|
|
BOOL b = CUDDIWebServerNode::GetWriterConnectionString( strWebServer, strOldConnStr );
|
|
|
|
CUDDIWebServerNode::SetWriterConnectionString( strWebServer, L"" );
|
|
CUDDIWebServerNode::SetReaderConnectionString( strWebServer, L"" );
|
|
|
|
hr = GetConfig( configOldSite, strOldConnStr );
|
|
if( FAILED(hr) )
|
|
{
|
|
UDDIMsgBox( hwndParent,
|
|
IDS_DATABASE_SERVER_OLEDB_READ_FAILED,
|
|
IDS_DATABASE_SERVER_GETDATA_ERROR_TITLE,
|
|
MB_OK );
|
|
return FALSE;
|
|
}
|
|
|
|
CStringCollection oldSiteWebServers( configOldSite[ UDDI_SITE_WEBSERVERS ] );
|
|
oldSiteWebServers.DeleteString( strWebServer );
|
|
configOldSite[ UDDI_SITE_WEBSERVERS ] = oldSiteWebServers.GetDelimitedString();
|
|
|
|
hr = SaveConfig( configOldSite, strOldConnStr );
|
|
if( FAILED(hr) )
|
|
{
|
|
WCHAR wszMessageFormat[ 512 ];
|
|
WCHAR wszTitle[ 128 ];
|
|
|
|
memset( wszMessageFormat, 0, 512 * sizeof( WCHAR ) );
|
|
memset( wszTitle, 0, 128 * sizeof( WCHAR ) );
|
|
|
|
LoadString( g_hinst,
|
|
IDS_WEBSERVER_REMOVE_FAILED_DETAIL,
|
|
wszMessageFormat,
|
|
ARRAYLEN( wszMessageFormat ) );
|
|
|
|
TCHAR pwszFormatted[ 512 ];
|
|
pwszFormatted[ 0 ] = 0x00;
|
|
|
|
LPCTSTR pwszArgs[ 3 ] = { strWebServer.c_str(), strWSCurrentSite.c_str(), strSite.c_str() };
|
|
DWORD dwBytesWritten = FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
|
(LPCVOID)wszMessageFormat,
|
|
0,
|
|
0,
|
|
pwszFormatted,
|
|
512,
|
|
(va_list *)pwszArgs
|
|
);
|
|
|
|
LoadString( g_hinst,
|
|
IDS_WEBSERVER_REMOVE_FAILED,
|
|
wszTitle,
|
|
ARRAYLEN( wszTitle ) );
|
|
|
|
int iYesNo = MessageBox( hwndParent,
|
|
pwszFormatted,
|
|
wszTitle,
|
|
MB_ICONEXCLAMATION | MB_YESNO );
|
|
|
|
//
|
|
// User does not want to continue.
|
|
//
|
|
if( IDNO == iYesNo )
|
|
{
|
|
CUDDIWebServerNode::SetReaderConnectionString( strWebServer, strOldConnStr );
|
|
CUDDIWebServerNode::SetWriterConnectionString( strWebServer, strOldConnStr );
|
|
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// 3. Get the list of Web Servers that the new Site contains.
|
|
//
|
|
if( fOKToMoveWebServer )
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
CConfigMap configNewSite;
|
|
wstring strNewConnStr;
|
|
|
|
strNewConnStr = CUDDIWebServerNode::BuildConnectionString( strSite );
|
|
hr = GetConfig( configNewSite, strNewConnStr );
|
|
if( FAILED(hr) )
|
|
{
|
|
UDDIMsgBox( hwndParent,
|
|
IDS_DATABASE_SERVER_OLEDB_READ_FAILED,
|
|
IDS_DATABASE_SERVER_GETDATA_ERROR_TITLE,
|
|
MB_OK );
|
|
return FALSE;
|
|
}
|
|
|
|
wstring strWSSchemaVersion;
|
|
if( !CUDDIWebServerNode::GetDBSchemaVersion( strWebServer, strWSSchemaVersion ) )
|
|
{
|
|
WCHAR wszTitle[ 256 ];
|
|
WCHAR wszMessageFormat[ 512 ];
|
|
WCHAR wszMessage[ 512 ];
|
|
|
|
memset( wszMessage, 0, 512 * sizeof( WCHAR ) );
|
|
memset( wszMessageFormat, 0, 512 * sizeof( WCHAR ) );
|
|
|
|
LoadString( g_hinst, IDS_ERROR_TITLE, wszTitle, ARRAYLEN( wszTitle ) );
|
|
LoadString( g_hinst, IDS_WEBSERVER_SERVER_DBSCHEMA_VERSION_READ_FAILED, wszMessageFormat, ARRAYLEN( wszMessageFormat ) );
|
|
_sntprintf( wszMessage, ARRAYLEN( wszMessage ) - 1, wszMessageFormat, strWebServer.c_str() );
|
|
|
|
MessageBox( hwndParent, wszMessage, wszTitle, MB_ICONERROR );
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
CDBSchemaVersion schemaVersionWS;
|
|
if( !schemaVersionWS.Parse( strWSSchemaVersion ) )
|
|
{
|
|
_TCHAR szTitle[ 256 ];
|
|
_TCHAR szMessageFormat[ 512 ];
|
|
_TCHAR szMessage[ 512 ];
|
|
|
|
memset( szMessage, 0, 512 * sizeof( _TCHAR ) );
|
|
memset( szMessageFormat, 0, 512 * sizeof( _TCHAR ) );
|
|
|
|
LoadString( g_hinst, IDS_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
LoadString( g_hinst, IDS_INVALID_VERSION_FORMAT, szMessageFormat, ARRAYLEN( szMessageFormat ) );
|
|
_sntprintf( szMessage, ARRAYLEN( szMessage ) - 1, szMessageFormat, strWebServer );
|
|
|
|
MessageBox( hwndParent, szMessage, szTitle, MB_ICONERROR );
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
CDBSchemaVersion schemaVersionNewSite;
|
|
if( !schemaVersionNewSite.Parse( configNewSite[ UDDI_DBSCHEMA_VERSION ] ) )
|
|
{
|
|
_TCHAR szTitle[ 256 ];
|
|
_TCHAR szMessageFormat[ 512 ];
|
|
_TCHAR szMessage[ 512 ];
|
|
|
|
memset( szMessage, 0, 512 * sizeof( _TCHAR ) );
|
|
memset( szMessageFormat, 0, 512 * sizeof( _TCHAR ) );
|
|
|
|
LoadString( g_hinst, IDS_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
LoadString( g_hinst, IDS_DATABASE_SERVER_DBSCHEMA_VERSION_READ_FAILED, szMessageFormat, ARRAYLEN( szMessageFormat ) );
|
|
_sntprintf( szMessage, ARRAYLEN( szMessage ) - 1, szMessageFormat, strSite );
|
|
|
|
MessageBox( hwndParent, szMessage, szTitle, MB_ICONERROR );
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Make sure the web server version is compatible.
|
|
//
|
|
if( FALSE == schemaVersionNewSite.IsCompatible( schemaVersionWS ) )
|
|
{
|
|
_TCHAR szTitle[ 256 ];
|
|
_TCHAR szMessage[ 1024 ];
|
|
_TCHAR szMessageFormat[ 512 ];
|
|
|
|
memset( szTitle, 0, 256 * sizeof( _TCHAR ) );
|
|
memset( szMessage, 0, 1024 * sizeof( _TCHAR ) );
|
|
memset( szMessageFormat, 0, 512 * sizeof( _TCHAR ) );
|
|
|
|
LoadString( g_hinst, IDS_ERROR_TITLE, szTitle, ARRAYLEN( szTitle ) );
|
|
LoadString( g_hinst, IDS_WEBSERVER_SERVER_INVALID_DBSCHEMA_VERSION, szMessageFormat, ARRAYLEN( szMessageFormat ) );
|
|
_sntprintf( szMessage,
|
|
ARRAYLEN( szMessage ) - 1,
|
|
szMessageFormat,
|
|
strWebServer.c_str(),
|
|
schemaVersionWS.szVersion.c_str(),
|
|
strSite.c_str(),
|
|
schemaVersionNewSite.szVersion.c_str() );
|
|
|
|
MessageBox( hwndParent, szMessage, szTitle, MB_ICONERROR );
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
CStringCollection newSiteWebServers( configNewSite[ UDDI_SITE_WEBSERVERS ] );
|
|
|
|
if( newSiteWebServers.Exists( strWebServer ) && fSameSite )
|
|
{
|
|
WCHAR wszMessage[ 256 ];
|
|
WCHAR wszTitle[ 256 ];
|
|
wszMessage[ 0 ] = 0x00;
|
|
wszTitle[ 0 ] = 0x00;
|
|
|
|
LoadString( g_hinst, IDS_WEBSERVER_ALREADY_EXISTS, wszMessage, ARRAYLEN( wszMessage ) );
|
|
LoadString( g_hinst, IDS_WEBSERVER_SELECT_ERROR_TITLE, wszTitle, ARRAYLEN( wszTitle ) );
|
|
|
|
MessageBox( hwndParent, wszMessage, wszTitle, MB_OK );
|
|
return FALSE;
|
|
}
|
|
|
|
newSiteWebServers.AddString( strWebServer );
|
|
configNewSite[ UDDI_SITE_WEBSERVERS ] = newSiteWebServers.GetDelimitedString();
|
|
|
|
hr = SaveConfig( configNewSite, strNewConnStr );
|
|
if( FAILED(hr) )
|
|
{
|
|
WCHAR wszMessage[ 512 ];
|
|
WCHAR wszMessageFormat[ 512 ];
|
|
WCHAR wszTitle[ 128 ];
|
|
|
|
memset( wszMessage, 0, 512 * sizeof( WCHAR ) );
|
|
memset( wszMessageFormat, 0, 512 * sizeof( WCHAR ) );
|
|
memset( wszTitle, 0, 128 * sizeof( WCHAR ) );
|
|
|
|
LoadString( g_hinst,
|
|
IDS_WEBSERVER_ADD_FAILED_DETAIL,
|
|
wszMessageFormat,
|
|
ARRAYLEN( wszMessageFormat ) );
|
|
|
|
_sntprintf( wszMessage,
|
|
ARRAYLEN(wszMessage) - 1,
|
|
wszMessageFormat,
|
|
strWebServer.c_str(),
|
|
strSite.c_str() );
|
|
|
|
LoadString( g_hinst,
|
|
IDS_WEBSERVER_ADD_FAILED,
|
|
wszTitle,
|
|
ARRAYLEN( wszTitle ) );
|
|
|
|
MessageBox( hwndParent,
|
|
wszMessage,
|
|
wszTitle,
|
|
MB_ICONEXCLAMATION | MB_YESNO );
|
|
|
|
CUDDIWebServerNode::SetReaderConnectionString( strWebServer, L"" );
|
|
CUDDIWebServerNode::SetWriterConnectionString( strWebServer, L"" );
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
CUDDIWebServerNode::SetReaderConnectionString( strWebServer, strNewConnStr );
|
|
CUDDIWebServerNode::SetWriterConnectionString( strWebServer, strNewConnStr );
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
catch( CUDDIException &e )
|
|
{
|
|
UDDIMsgBox( hwndParent, (LPCTSTR) e, IDS_ERROR_TITLE, MB_ICONEXCLAMATION | MB_OK );
|
|
return FALSE;
|
|
}
|
|
catch( ... )
|
|
{
|
|
UDDIMsgBox( hwndParent, IDS_ERROR_ADDWEBSITE, IDS_ERROR_TITLE, MB_ICONEXCLAMATION | MB_OK );
|
|
return FALSE;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
CStringCollection::CStringCollection( const wstring& strDelimitedStrings,
|
|
const wstring& strDelim )
|
|
{
|
|
_coll.clear();
|
|
|
|
if( 0 == strDelimitedStrings.length() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
_strDelim = strDelim;
|
|
|
|
WCHAR *pwsz = new WCHAR[ strDelimitedStrings.length() + 1 ];
|
|
if( NULL == pwsz )
|
|
{
|
|
return;
|
|
}
|
|
|
|
wcsncpy( pwsz, strDelimitedStrings.c_str(), strDelimitedStrings.length() );
|
|
pwsz[ strDelimitedStrings.length() ] = 0x00;
|
|
|
|
//
|
|
// Convert to upper case.
|
|
//
|
|
pwsz = _wcsupr( pwsz );
|
|
|
|
WCHAR *pwszToken = wcstok( pwsz, _strDelim.c_str() );
|
|
while( NULL != pwszToken )
|
|
{
|
|
_coll.push_back( pwszToken );
|
|
pwszToken = wcstok( NULL, _strDelim.c_str() );
|
|
}
|
|
|
|
delete [] pwsz;
|
|
}
|
|
|
|
CStringCollection::~CStringCollection()
|
|
{
|
|
_coll.clear();
|
|
}
|
|
|
|
void
|
|
CStringCollection::DeleteString( const wstring& str )
|
|
{
|
|
if( 0 == str.length() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
vector< wstring >::iterator it = _coll.begin();
|
|
for( ; it != _coll.end(); it++ )
|
|
{
|
|
if( 0 == _wcsicmp( str.c_str(), it->c_str() ) )
|
|
{
|
|
_coll.erase( it );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
CStringCollection::AddString( const wstring& str )
|
|
{
|
|
if( 0 == str.length() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
WCHAR *pwsz = new WCHAR[ str.length() + 1 ];
|
|
if( NULL == pwsz )
|
|
{
|
|
return;
|
|
}
|
|
|
|
wcsncpy( pwsz, str.c_str(), str.length() );
|
|
pwsz[ str.length() ] = 0x00;
|
|
|
|
pwsz = _wcsupr( pwsz );
|
|
|
|
vector< wstring >::const_iterator cit;
|
|
|
|
cit = find( _coll.begin(), _coll.end(), str );
|
|
if( _coll.end() == cit )
|
|
{
|
|
_coll.push_back( str );
|
|
}
|
|
|
|
delete [] pwsz;
|
|
}
|
|
|
|
wstring
|
|
CStringCollection::GetDelimitedString() const
|
|
{
|
|
wstring str;
|
|
vector< wstring >::const_iterator cit;
|
|
|
|
bool first = true;
|
|
for( cit = _coll.begin(); cit != _coll.end(); cit++ )
|
|
{
|
|
first = ( _coll.begin() == cit ) ? true : false;
|
|
|
|
if( !first )
|
|
{
|
|
str += _strDelim;
|
|
}
|
|
|
|
str += *cit;
|
|
}
|
|
|
|
return str;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CStringCollection::Exists( const wstring& str ) const
|
|
{
|
|
BOOL fRet = FALSE;
|
|
if( 0 == str.length() )
|
|
{
|
|
return fRet;
|
|
}
|
|
|
|
vector< wstring >::const_iterator cit = _coll.begin();
|
|
for( ; cit != _coll.end(); cit++ )
|
|
{
|
|
if( 0 == _wcsicmp( str.c_str(), cit->c_str() ) )
|
|
{
|
|
fRet = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|