758 lines
21 KiB
C++
758 lines
21 KiB
C++
// AdvDlg.cpp : implementation file
|
|
//
|
|
|
|
// NOTE: This files makes the assumption that there are a reasonable number of published.
|
|
// If there are thousands, or hundreds of thousands of them - it will be slow because it
|
|
// rescans the metabase after changes. Then again, this whole product is intended for
|
|
// sites that are MUCH smaller than that.
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "AdvDlg.h"
|
|
#include "pwsDoc.h"
|
|
#include "PWSChart.h"
|
|
#include "PwsForm.h"
|
|
|
|
#include <mddef.h>
|
|
#include "EdDir.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define COL_ALIAS 0
|
|
#define COL_DIRECTORY 1
|
|
#define COL_ERROR 2
|
|
// a global reference to the form view - for ease of access
|
|
extern CPwsForm* g_p_FormView;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAdvancedDlg dialog
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
CAdvancedDlg::CAdvancedDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CAdvancedDlg::IDD, pParent),
|
|
m_fApplyingGlobals( FALSE )
|
|
{
|
|
//{{AFX_DATA_INIT(CAdvancedDlg)
|
|
m_sz_defaultdoc = _T("");
|
|
m_f_browsingallowed = FALSE;
|
|
m_f_enabledefault = FALSE;
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
void CAdvancedDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAdvancedDlg)
|
|
DDX_Control(pDX, IDC_STATIC_DEFAULT, m_cstatic_default);
|
|
DDX_Control(pDX, IDC_DEFAULT_DOC, m_cedit_default);
|
|
DDX_Control(pDX, IDC_CHANGE, m_cbutton_change);
|
|
DDX_Control(pDX, IDC_LIST, m_clistctrl_list);
|
|
DDX_Control(pDX, IDC_REMOVE, m_cbutton_remove);
|
|
DDX_Text(pDX, IDC_DEFAULT_DOC, m_sz_defaultdoc);
|
|
DDX_Check(pDX, IDC_BROWSING_ALLOWED, m_f_browsingallowed);
|
|
DDX_Check(pDX, IDC_ENABLEDEFAULT, m_f_enabledefault);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
//-----------------------------------------------------------------
|
|
BEGIN_MESSAGE_MAP(CAdvancedDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CAdvancedDlg)
|
|
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, OnItemchangedList)
|
|
ON_BN_CLICKED(IDC_ADD, OnAdd)
|
|
ON_BN_CLICKED(IDC_CHANGE, OnChange)
|
|
ON_BN_CLICKED(IDC_REMOVE, OnRemove)
|
|
ON_BN_CLICKED(IDC_ENABLEDEFAULT, OnEnabledefault)
|
|
ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList)
|
|
ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
|
|
ON_BN_CLICKED(IDC_BROWSING_ALLOWED, OnBrowsingAllowed)
|
|
ON_EN_KILLFOCUS(IDC_DEFAULT_DOC, OnKillfocusDefaultDoc)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//-----------------------------------------------------------------
|
|
BOOL CAdvancedDlg::FInitList()
|
|
{
|
|
CString sz;
|
|
int i;
|
|
|
|
// setup the alias field
|
|
sz.LoadString( IDS_ALIAS );
|
|
i = m_clistctrl_list.InsertColumn( COL_ALIAS, sz, LVCFMT_LEFT, 95 );
|
|
|
|
// setup the directory field
|
|
sz.LoadString( IDS_DIRECTORY );
|
|
i = m_clistctrl_list.InsertColumn( COL_DIRECTORY, sz, LVCFMT_LEFT, 225);
|
|
// setup the match criteria column
|
|
sz.LoadString( IDS_ERROR );
|
|
i = m_clistctrl_list.InsertColumn( COL_ERROR, sz, LVCFMT_LEFT, 95 );
|
|
|
|
// prepare the list's image list
|
|
if ( m_imageList.Create( IDB_LIST_IMAGES, 17, 3, 0x00FF00FF ) )
|
|
// set the image list into the list control
|
|
m_clistctrl_list.SetImageList( &m_imageList, LVSIL_SMALL );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//-----------------------------------------------------------------
|
|
BOOL CAdvancedDlg::FInitGlobalParameters()
|
|
{
|
|
CHAR buff[MAX_PATH];
|
|
DWORD dword;
|
|
|
|
m_fApplyingGlobals = TRUE;
|
|
|
|
// prep the mb objcet
|
|
CWrapMetaBase mb;
|
|
if ( !FInitMetabaseWrapper(NULL) )
|
|
return FALSE;
|
|
|
|
if ( !mb.FInit() ) {
|
|
FCloseMetabaseWrapper();
|
|
return FALSE;
|
|
}
|
|
|
|
// open the root directory object
|
|
if ( !mb.Open(SZ_MB_DIRGLOBALS_OBJECT) )
|
|
{
|
|
AfxMessageBox( IDS_MetaError );
|
|
FCloseMetabaseWrapper();
|
|
return (DWORD)-1;
|
|
}
|
|
|
|
// Get the parameters from the metabase and put them into the dialog
|
|
if ( mb.GetDword( "", MD_DIRECTORY_BROWSING, IIS_MD_UT_FILE, &dword ) )
|
|
{
|
|
m_f_browsingallowed = (dword & MD_DIRBROW_ENABLED) > 0;
|
|
m_f_enabledefault = (dword & MD_DIRBROW_LOADDEFAULT) > 0;
|
|
}
|
|
else
|
|
{
|
|
m_f_browsingallowed = FALSE;
|
|
m_f_enabledefault = FALSE;
|
|
}
|
|
|
|
// get the default document string
|
|
dword = MAX_PATH;
|
|
if ( mb.GetString( "", MD_DEFAULT_LOAD_FILE, IIS_MD_UT_FILE, buff, &dword ) )
|
|
m_sz_defaultdoc = buff;
|
|
m_szSaved = m_sz_defaultdoc;
|
|
|
|
// update the data
|
|
UpdateData( FALSE );
|
|
|
|
// enable or disable the default document string as appropriate
|
|
OnEnabledefault();
|
|
// close the metabase object
|
|
mb.Close();
|
|
FCloseMetabaseWrapper();
|
|
|
|
m_fApplyingGlobals = FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
BOOL CAdvancedDlg::FillList()
|
|
{
|
|
CHAR buff[MAX_PATH];
|
|
DWORD cbpath;
|
|
|
|
CVirtDir* pDir;
|
|
|
|
// prep the mb objcet
|
|
CWrapMetaBase mb;
|
|
if ( !FInitMetabaseWrapper(NULL) )
|
|
return FALSE;
|
|
|
|
if ( !mb.FInit() ) {
|
|
FCloseMetabaseWrapper();
|
|
return FALSE;
|
|
}
|
|
|
|
// open the root directory object
|
|
if ( !mb.Open(SZ_MB_ROOTDIR_OBJECT) )
|
|
{
|
|
AfxMessageBox( IDS_MetaError );
|
|
FCloseMetabaseWrapper();
|
|
return (DWORD)-1;
|
|
}
|
|
|
|
// create the root <home> directory object
|
|
pDir = new CVirtDir( TRUE ); // true means this is the root
|
|
pDir->m_szAlias.LoadString( IDS_HOME_DIRECTORY );
|
|
pDir->m_szMetaAlias.Empty();
|
|
// get the directory path
|
|
cbpath = MAX_PATH;
|
|
mb.GetString( "", MD_VR_PATH, IIS_MD_UT_FILE, buff, &cbpath);
|
|
pDir->m_szPath = buff;
|
|
// add the item to the list
|
|
AddToDisplayList( pDir );
|
|
|
|
// enumerate the directories, adding each to the list
|
|
DWORD index = 0;
|
|
while ( mb.EnumObjects("", buff, index) )
|
|
{
|
|
// create the new directory object
|
|
pDir = new CVirtDir();
|
|
|
|
// set the alias
|
|
pDir->m_szAlias = buff;
|
|
pDir->m_szMetaAlias = buff;
|
|
|
|
// get the directory path
|
|
cbpath = MAX_PATH;
|
|
if ( !mb.GetString( buff, MD_VR_PATH, IIS_MD_UT_FILE, buff, &cbpath) )
|
|
break;
|
|
pDir->m_szPath = buff;
|
|
|
|
// add the item to the list
|
|
AddToDisplayList( pDir );
|
|
|
|
// advance the index
|
|
index++;
|
|
}
|
|
|
|
// close the metabase object
|
|
mb.Close();
|
|
FCloseMetabaseWrapper();
|
|
return TRUE;
|
|
}
|
|
|
|
//-----------------------------------------------------------------
|
|
void CAdvancedDlg::AddToDisplayList( CVirtDir* pDir )
|
|
{
|
|
CString szErr;
|
|
DWORD i = m_clistctrl_list.GetSelectedCount();
|
|
|
|
// add the item to the end of the list - with the alias text
|
|
i = m_clistctrl_list.InsertItem( i, pDir->m_szAlias, 0 );
|
|
|
|
// fill in the directory in the list
|
|
m_clistctrl_list.SetItemText( i, COL_DIRECTORY, pDir->m_szPath );
|
|
|
|
// fill in the error string
|
|
pDir->GetErrorStr( szErr );
|
|
m_clistctrl_list.SetItemText( i, COL_ERROR, szErr );
|
|
|
|
// attach the object itself to the list as private data.
|
|
m_clistctrl_list.SetItemData( i, (DWORD)pDir );
|
|
}
|
|
|
|
//-----------------------------------------------------------------
|
|
void CAdvancedDlg::EnableDependantButtons()
|
|
{
|
|
CVirtDir* pDir;
|
|
|
|
// the whole purpose of this routine is to gray or activate
|
|
// the edit and delete buttons depending on whether or not anything
|
|
// is selected. So start by getting the selection count
|
|
UINT cItemsSel = m_clistctrl_list.GetSelectedCount();
|
|
// get index of the selected list item
|
|
int iList = m_clistctrl_list.GetNextItem( -1, LVNI_SELECTED );
|
|
|
|
// get the pDir from the list
|
|
pDir = (CVirtDir*)m_clistctrl_list.GetItemData( iList );
|
|
ASSERT( pDir );
|
|
|
|
if ( cItemsSel > 0 )
|
|
{
|
|
// there are items selected
|
|
m_cbutton_change.EnableWindow( TRUE );
|
|
m_cbutton_remove.EnableWindow( !pDir->m_fIsRoot ); // cannot remove the root
|
|
}
|
|
else
|
|
{
|
|
// nope. Nothing selected
|
|
m_cbutton_change.EnableWindow( FALSE );
|
|
m_cbutton_remove.EnableWindow( FALSE );
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAdvancedDlg message handlers
|
|
//---------------------------------------------------------------------------
|
|
BOOL CAdvancedDlg::OnInitDialog()
|
|
{
|
|
//DebugBreak();
|
|
// call the parental oninitdialog
|
|
BOOL f = CDialog::OnInitDialog();
|
|
|
|
// initialize the global parameters
|
|
FInitGlobalParameters();
|
|
|
|
// initialize the list
|
|
FInitList();
|
|
FillList();
|
|
EnableDependantButtons();
|
|
|
|
// exchange the data
|
|
UpdateData( FALSE );
|
|
|
|
// return the answer
|
|
return f;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::RefreshGlobals()
|
|
{
|
|
UpdateData( TRUE );
|
|
FInitGlobalParameters();
|
|
UpdateData( FALSE );
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::RefreshList()
|
|
{
|
|
// first, delete all the virdir objects referenced by the list
|
|
EmptyOutList();
|
|
// re-fill the list
|
|
FillList();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnRefresh()
|
|
{
|
|
m_fApplyingGlobals = TRUE;
|
|
RefreshGlobals();
|
|
m_fApplyingGlobals = FALSE;
|
|
RefreshList();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::EmptyOutList()
|
|
{
|
|
CVirtDir* pVDir;
|
|
|
|
// get the number of elements in the list
|
|
DWORD cItems = m_clistctrl_list.GetItemCount();
|
|
for ( DWORD iItem = 0; iItem < cItems; iItem++ )
|
|
{
|
|
// get the virt dir pointer
|
|
pVDir = (CVirtDir*)m_clistctrl_list.GetItemData( iItem );
|
|
// delete the vit dir
|
|
if ( pVDir )
|
|
delete pVDir;
|
|
}
|
|
|
|
// empty the list itself
|
|
m_clistctrl_list.DeleteAllItems();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnCancel()
|
|
{
|
|
// clean up the list
|
|
EmptyOutList();
|
|
ShowWindow(SW_HIDE);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnKillfocusDefaultDoc()
|
|
{
|
|
UpdateData( TRUE );
|
|
// apply it to the metabase right-away
|
|
if ( !m_fApplyingGlobals )
|
|
{
|
|
m_fApplyingGlobals = TRUE;
|
|
// apply it to the metabase right-away
|
|
ApplyGlobalParameters();
|
|
RefreshGlobals();
|
|
if ( g_p_FormView )
|
|
g_p_FormView->UpdateDirInfo();
|
|
m_fApplyingGlobals = FALSE;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnBrowsingAllowed()
|
|
{
|
|
UpdateData( TRUE );
|
|
// apply it to the metabase right-away
|
|
if ( !m_fApplyingGlobals )
|
|
{
|
|
m_fApplyingGlobals = TRUE;
|
|
// apply it to the metabase right-away
|
|
ApplyGlobalParameters();
|
|
RefreshGlobals();
|
|
if ( g_p_FormView )
|
|
g_p_FormView->UpdateDirInfo();
|
|
m_fApplyingGlobals = FALSE;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnEnabledefault()
|
|
{
|
|
UpdateData( TRUE );
|
|
// enable or disable the default document string as appropriate
|
|
if ( m_f_enabledefault )
|
|
{
|
|
m_sz_defaultdoc = m_szSaved;
|
|
// enable things
|
|
m_cedit_default.EnableWindow( TRUE );
|
|
m_cstatic_default.EnableWindow( TRUE );
|
|
}
|
|
else
|
|
{
|
|
m_szSaved = m_sz_defaultdoc;
|
|
m_sz_defaultdoc.Empty();
|
|
// disable things
|
|
m_cedit_default.EnableWindow( FALSE );
|
|
m_cstatic_default.EnableWindow( FALSE );
|
|
}
|
|
UpdateData( FALSE );
|
|
|
|
if ( !m_fApplyingGlobals )
|
|
{
|
|
m_fApplyingGlobals = TRUE;
|
|
// apply it to the metabase right-away
|
|
ApplyGlobalParameters();
|
|
RefreshGlobals();
|
|
if ( g_p_FormView )
|
|
g_p_FormView->UpdateDirInfo();
|
|
m_fApplyingGlobals = FALSE;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
|
|
*pResult = 0;
|
|
|
|
// enable the correct items
|
|
EnableDependantButtons();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnAdd()
|
|
{
|
|
// create the new directory object
|
|
CVirtDir* pDir = new CVirtDir();
|
|
|
|
// give the new directory some defaults
|
|
pDir->m_szPath.Empty();
|
|
pDir->m_szAlias.Empty();
|
|
pDir->m_szMetaAlias.Empty();
|
|
|
|
// Edit the rule. If it fails, remove it from the list
|
|
if ( pDir->Edit() )
|
|
{
|
|
// save the item to the metabase
|
|
pDir->FSaveToMetabase();
|
|
// refresh the list
|
|
RefreshList();
|
|
}
|
|
|
|
// in all cases, delete the pDir object. If it was saved to the metabase,
|
|
// it was picked up again during the refresh
|
|
delete pDir;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
*pResult = 0;
|
|
// if something in the list was double clicked, edit it
|
|
if ( m_clistctrl_list.GetSelectedCount() > 0 )
|
|
OnChange();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnChange()
|
|
{
|
|
CVirtDir* pDir;
|
|
int iList;
|
|
CString szErr;
|
|
|
|
// there had better be one selected
|
|
if ( m_clistctrl_list.GetSelectedCount() != 1 )
|
|
return;
|
|
|
|
// get index of the selected list item
|
|
iList = m_clistctrl_list.GetNextItem( -1, LVNI_SELECTED );
|
|
ASSERT( iList >= 0 );
|
|
|
|
// get the pDir from the list
|
|
pDir = (CVirtDir*)m_clistctrl_list.GetItemData( iList );
|
|
|
|
// edit the pDir, update it if successful, delete if not
|
|
if ( pDir->Edit() )
|
|
{
|
|
// save the item to the metabase
|
|
pDir->FSaveToMetabase();
|
|
// refresh the list
|
|
RefreshList();
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::OnRemove()
|
|
{
|
|
int iList;
|
|
CVirtDir* pDir;
|
|
|
|
// there had better be one selected
|
|
if ( m_clistctrl_list.GetSelectedCount() != 1 )
|
|
return;
|
|
|
|
// ask the user to confirm this decision
|
|
if ( AfxMessageBox(IDS_CONFIRM_REMOVE, MB_OKCANCEL) != IDOK )
|
|
return;
|
|
|
|
// get index of the selected list item
|
|
iList = m_clistctrl_list.GetNextItem( -1, LVNI_SELECTED );
|
|
ASSERT( iList >= 0 );
|
|
|
|
// get the pDir from the list
|
|
pDir = (CVirtDir*)m_clistctrl_list.GetItemData( iList );
|
|
|
|
// remove the item from the metabase
|
|
pDir->FRemoveFromMetabase();
|
|
|
|
// refresh the list
|
|
RefreshList();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CAdvancedDlg::ApplyGlobalParameters()
|
|
{
|
|
DWORD dword;
|
|
BOOL f;
|
|
|
|
// prep the mb objcet
|
|
CWrapMetaBase mb;
|
|
if ( !FInitMetabaseWrapper(NULL) )
|
|
return;
|
|
|
|
if ( !mb.FInit() ) {
|
|
FCloseMetabaseWrapper();
|
|
return;
|
|
}
|
|
|
|
// open the root directory object
|
|
if ( !mb.Open(SZ_MB_DIRGLOBALS_OBJECT, METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE) )
|
|
{
|
|
DWORD err = GetLastError();
|
|
CString sz;
|
|
sz.LoadString( IDS_MetaError );
|
|
sz.Format( "%s\nError = %d", sz, err );
|
|
AfxMessageBox( sz );
|
|
FCloseMetabaseWrapper();
|
|
return;
|
|
}
|
|
|
|
// to prepare the browsing flag for saving - we must get the current value
|
|
if ( mb.GetDword( "", MD_DIRECTORY_BROWSING, IIS_MD_UT_FILE, &dword ) )
|
|
{
|
|
// start by setting or clearing the browsing allowed flag
|
|
if ( m_f_browsingallowed )
|
|
dword |= MD_DIRBROW_ENABLED; // set the flag
|
|
else
|
|
dword &= ~MD_DIRBROW_ENABLED; // clear the flag
|
|
|
|
// next, set or clear the enable default flag
|
|
if ( m_f_enabledefault )
|
|
dword |= MD_DIRBROW_LOADDEFAULT; // set the flag
|
|
else
|
|
dword &= ~MD_DIRBROW_LOADDEFAULT; // clear the flag
|
|
|
|
// save the browsing flag
|
|
f = mb.SetDword( "", MD_DIRECTORY_BROWSING, IIS_MD_UT_FILE, dword );
|
|
}
|
|
|
|
|
|
// save the default string
|
|
if ( m_f_enabledefault )
|
|
f = mb.SetString( "", MD_DEFAULT_LOAD_FILE, IIS_MD_UT_FILE, (LPCSTR)m_sz_defaultdoc );
|
|
|
|
// close the metabase object
|
|
mb.Close();
|
|
FCloseMetabaseWrapper();
|
|
return;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CVirtDir object - for maintaining the list
|
|
//---------------------------------------------------------------------------
|
|
CVirtDir::CVirtDir(BOOL bRoot) :
|
|
m_fIsRoot(bRoot)
|
|
{}
|
|
|
|
//---------------------------------------------------------------------------
|
|
BOOL CVirtDir::FInitAsNew()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void CVirtDir::GetErrorStr( CString &sz )
|
|
{
|
|
// see if the specified path is valid
|
|
if ( GetFileAttributes(m_szPath) == 0xFFFFFFFF )
|
|
sz.LoadString( IDS_ERR_PATH_INVALID );
|
|
else
|
|
sz.Empty();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
BOOL CVirtDir::Edit()
|
|
{
|
|
CEditDirectory dlg;
|
|
dlg.pDir = this;
|
|
dlg.m_sz_alias = m_szAlias;
|
|
dlg.m_sz_path = m_szPath;
|
|
if ( dlg.DoModal() == IDOK )
|
|
{
|
|
m_szAlias = dlg.m_sz_alias;
|
|
m_szPath = dlg.m_sz_path;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
BOOL CVirtDir::FSaveToMetabase()
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
CString sz;
|
|
DWORD err;
|
|
|
|
// if the alias name has changed, we must first remove the original object
|
|
// from the metabase, then re-add it with the new name
|
|
if ( !m_fIsRoot && (m_szAlias != m_szMetaAlias) )
|
|
{
|
|
fSuccess = FRemoveFromMetabase( FALSE ); // false to not save the metabase
|
|
m_szMetaAlias.Empty();
|
|
if ( !fSuccess ) return FALSE;
|
|
}
|
|
|
|
// prep the metabase
|
|
CWrapMetaBase mb;
|
|
if ( !FInitMetabaseWrapper(NULL) )
|
|
return FALSE;
|
|
|
|
if ( !mb.FInit() ) {
|
|
FCloseMetabaseWrapper();
|
|
return FALSE;
|
|
}
|
|
|
|
// the first thing we do is open the metabase with WRITE permissions
|
|
// open the metabase object
|
|
if ( !mb.Open(SZ_MB_ROOTDIR_OBJECT, METADATA_PERMISSION_WRITE) )
|
|
{
|
|
err = GetLastError();
|
|
sz.LoadString( IDS_MetaError );
|
|
sz.Format( "%s\nError = %d", sz, err );
|
|
AfxMessageBox( sz );
|
|
FCloseMetabaseWrapper();
|
|
return FALSE;
|
|
}
|
|
|
|
// if the object is new, then there is nothing in the metaAlias string.
|
|
// in that case we should start by creating a new object in the metabase
|
|
if ( !m_fIsRoot && m_szMetaAlias.IsEmpty() )
|
|
{
|
|
fSuccess = mb.AddObject( m_szAlias );
|
|
m_szMetaAlias = m_szAlias;
|
|
}
|
|
|
|
// now we can save the directory data - but only if the object is there
|
|
if ( fSuccess ) // test the object existence
|
|
{
|
|
fSuccess = mb.SetString( m_szMetaAlias, MD_VR_PATH, IIS_MD_UT_FILE, m_szPath );
|
|
}
|
|
|
|
// save the metabase
|
|
mb.Save();
|
|
|
|
// close the object
|
|
mb.Close();
|
|
FCloseMetabaseWrapper();
|
|
|
|
// if there was an error - say something intelligent
|
|
if ( !fSuccess )
|
|
{
|
|
err = GetLastError();
|
|
sz.LoadString( IDS_MetaError );
|
|
sz.Format( "%s\nError = %d", sz, err );
|
|
AfxMessageBox( sz );
|
|
}
|
|
|
|
// return the answer
|
|
return fSuccess;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
BOOL CVirtDir::FRemoveFromMetabase( BOOL fSaveMB )
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
CString sz;
|
|
DWORD err;
|
|
|
|
// Never remove a root object.
|
|
if ( m_szMetaAlias.IsEmpty() )
|
|
return fSuccess;
|
|
|
|
// prep the metabase
|
|
CWrapMetaBase mb;
|
|
if ( !FInitMetabaseWrapper(NULL) )
|
|
return FALSE;
|
|
|
|
if ( !mb.FInit() ) {
|
|
FCloseMetabaseWrapper();
|
|
return FALSE;
|
|
}
|
|
|
|
// the first thing we do is open the metabase with WRITE permissions
|
|
// open the metabase object
|
|
if ( !mb.Open(SZ_MB_ROOTDIR_OBJECT, METADATA_PERMISSION_WRITE) )
|
|
{
|
|
err = GetLastError();
|
|
sz.LoadString( IDS_MetaError );
|
|
sz.Format( "%s\nError = %d", sz, err );
|
|
AfxMessageBox( sz );
|
|
FCloseMetabaseWrapper();
|
|
return FALSE;
|
|
}
|
|
|
|
// delete the item
|
|
fSuccess = mb.DeleteObject( m_szMetaAlias );
|
|
|
|
// save the metabase - if requested
|
|
if ( fSaveMB )
|
|
mb.Save();
|
|
|
|
//
|
|
// close the metawrapper
|
|
//
|
|
|
|
mb.Close();
|
|
FCloseMetabaseWrapper();
|
|
|
|
// if there was an error - say something intelligent
|
|
if ( !fSuccess )
|
|
{
|
|
err = GetLastError();
|
|
sz.LoadString( IDS_MetaError );
|
|
sz.Format( "%s\nError = %d", sz, err );
|
|
AfxMessageBox( sz );
|
|
}
|
|
|
|
// return the answer
|
|
return fSuccess;
|
|
}
|
|
|
|
|
|
|