Leaked source code of windows server 2003
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.
 
 
 
 
 
 

2231 lines
62 KiB

/*++
Copyright (c) 1994-2000 Microsoft Corporation
Module Name :
websvcext_sheet.cpp
Abstract:
Property Sheet and Pages
Author:
Aaron Lee (AaronL)
Project:
Internet Services Manager
Revision History:
4/1/2002 aaronl Initial creation
--*/
#include "stdafx.h"
#include "common.h"
#include "strvalid.h"
#include "inetprop.h"
#include "InetMgrApp.h"
#include "shts.h"
#include "iisobj.h"
#include "shlobjp.h"
#include "websvcext_sheet.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
extern CInetmgrApp theApp;
static CComBSTR g_InvalidWebSvcExtCharsPath;
static CComBSTR g_InvalidWebSvcExtCharsName;
static BOOL g_fStaticsLoaded = FALSE;
void LoadStatics(void)
{
if (!g_fStaticsLoaded)
{
g_InvalidWebSvcExtCharsName = _T(",");
g_fStaticsLoaded = g_InvalidWebSvcExtCharsPath.LoadString(IDS_WEBSVCEXT_INVALID_CHARSET);
}
}
IMPLEMENT_DYNAMIC(CWebServiceExtensionSheet, CInetPropertySheet)
CWebServiceExtensionSheet::CWebServiceExtensionSheet(
CComAuthInfo * pComAuthInfo,
LPCTSTR lpszMetaPath,
CWnd * pParentWnd,
LPARAM lParam,
LPARAM lParamParent,
LPARAM lParam2,
UINT iSelectPage
)
: CInetPropertySheet(pComAuthInfo, lpszMetaPath, pParentWnd, lParam, lParamParent, iSelectPage),
m_pprops(NULL)
{
m_pWebServiceExtension = (CWebServiceExtension *) lParam;
m_pRestrictionUIEntry = (CRestrictionUIEntry *) lParam2;
}
CWebServiceExtensionSheet::~CWebServiceExtensionSheet()
{
FreeConfigurationParameters();
}
HRESULT
CWebServiceExtensionSheet::LoadConfigurationParameters()
{
//
// Load base properties
//
CError err;
if (m_pprops == NULL)
{
//
// First call -- load values
//
m_pprops = new CWebServiceExtensionProps(m_pWebServiceExtension->QueryInterface(), QueryMetaPath(),m_pRestrictionUIEntry,m_pWebServiceExtension);
if (!m_pprops)
{
TRACEEOL("LoadConfigurationParameters: OOM");
err = ERROR_NOT_ENOUGH_MEMORY;
return err;
}
err = m_pprops->LoadData();
}
return err;
}
void
CWebServiceExtensionSheet::FreeConfigurationParameters()
{
CInetPropertySheet::FreeConfigurationParameters();
if (m_pprops)
{
delete m_pprops;m_pprops=NULL;
}
}
BEGIN_MESSAGE_MAP(CWebServiceExtensionSheet, CInetPropertySheet)
//{{AFX_MSG_MAP(CWebServiceExtensionSheet)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CWebServiceExtensionGeneral, CInetPropertyPage)
CWebServiceExtensionGeneral::CWebServiceExtensionGeneral(CWebServiceExtensionSheet * pSheet,int iImageIndex, CRestrictionUIEntry * pRestrictionUIEntry)
: CInetPropertyPage(CWebServiceExtensionGeneral::IDD, pSheet),m_hGeneralImage(NULL)
{
m_pRestrictionUIEntry = pRestrictionUIEntry;
HBITMAP hImageStrip = (HBITMAP) LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_INETMGR32), IMAGE_BITMAP, 0, 0,
LR_LOADTRANSPARENT
| LR_LOADMAP3DCOLORS
| LR_SHARED);
if (hImageStrip)
{
if (0 != iImageIndex)
{
m_hGeneralImage = GetBitmapFromStrip(hImageStrip, iImageIndex, 32);
}
}
if (hImageStrip != NULL)
{
FreeResource(hImageStrip);
hImageStrip=NULL;
}
}
CWebServiceExtensionGeneral::~CWebServiceExtensionGeneral()
{
if (m_hGeneralImage != NULL)
{
FreeResource(m_hGeneralImage);
m_hGeneralImage = NULL;
}
}
/* virtual */
HRESULT
CWebServiceExtensionGeneral::FetchLoadedValues()
{
CError err;
BEGIN_META_INST_READ(CWebServiceExtensionSheet)
FETCH_INST_DATA_FROM_SHEET(m_strExtensionName);
FETCH_INST_DATA_FROM_SHEET(m_strExtensionUsedBy);
FETCH_INST_DATA_FROM_SHEET(m_iExtensionUsedByCount);
END_META_INST_READ(err)
if (m_iExtensionUsedByCount > 15)
{
::ShowScrollBar(CONTROL_HWND(IDC_EXTENSION_USEDBY), SB_VERT, TRUE);
}
return err;
}
/* virtual */
HRESULT
CWebServiceExtensionGeneral::SaveInfo()
{
ASSERT(IsDirty());
CError err;
try
{
CWebServiceExtensionSheet * pSheet = (CWebServiceExtensionSheet *)GetSheet();
if (pSheet)
{
pSheet->GetInstanceProperties().m_strExtensionName = m_strExtensionName;
pSheet->GetInstanceProperties().m_strExtensionUsedBy = m_strExtensionUsedBy;
err = pSheet->GetInstanceProperties().WriteDirtyProps();
}
}
catch(CMemoryException * e)
{
e->Delete();
err = ERROR_NOT_ENOUGH_MEMORY;
}
return err;
}
void
CWebServiceExtensionGeneral::DoDataExchange(CDataExchange * pDX)
{
CInetPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWebServiceExtensionGeneral)
DDX_Control(pDX, IDC_EXTENSION_NAME, m_ExtensionName);
DDX_Control(pDX, IDC_EXTENSION_USEDBY, m_ExtensionUsedBy);
//DDX_Text(pDX, IDC_EXTENSION_NAME, m_strExtensionName);
//DDX_Text(pDX, IDC_EXTENSION_NAME, m_strExtensionUsedBy);
//DDV_MinMaxChars(pDX, m_strExtensionName, 1, MAX_PATH);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWebServiceExtensionGeneral, CInetPropertyPage)
//{{AFX_MSG_MAP(CWebServiceExtensionGeneral)
ON_WM_COMPAREITEM()
ON_WM_MEASUREITEM()
ON_WM_DRAWITEM()
ON_COMMAND(ID_HELP, OnHelp)
ON_WM_HELPINFO()
ON_EN_CHANGE(IDC_EXTENSION_NAME, OnItemChanged)
ON_EN_CHANGE(IDC_EXTENSION_USEDBY, OnItemChanged)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL
CWebServiceExtensionGeneral::OnInitDialog()
{
CInetPropertyPage::OnInitDialog();
CString strBeautifullName;
CString strFormat;
strFormat.LoadString(IDS_WEBSVCEXT_PROP_PRENAME);
strBeautifullName.Format(strFormat,m_strExtensionName);
m_ExtensionName.SetWindowText(strBeautifullName);
m_ExtensionUsedBy.SetWindowText(m_strExtensionUsedBy);
if (m_hGeneralImage)
{
::SendDlgItemMessage(m_hWnd,IDC_FILE_ICON,STM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM) m_hGeneralImage);
}
strFormat.LoadString(IDS_WEBSVCEXT_PROP_CAPTION);
strBeautifullName.Format(strFormat,m_strExtensionName);
::SetWindowText(::GetForegroundWindow(), strBeautifullName);
SetControlsState();
SetModified(FALSE);
return TRUE;
}
BOOL
CWebServiceExtensionGeneral::OnHelpInfo(HELPINFO * pHelpInfo)
{
OnHelp();
return TRUE;
}
void
CWebServiceExtensionGeneral::OnHelp()
{
WinHelpDebug(0x20000 + CWebServiceExtensionGeneral::IDD);
::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, 0x20000 + CWebServiceExtensionGeneral::IDD);
}
void
CWebServiceExtensionGeneral::SetControlsState()
{
m_ExtensionName.SetReadOnly(TRUE);
m_ExtensionUsedBy.SetReadOnly(TRUE);
}
void
CWebServiceExtensionGeneral::OnItemChanged()
{
SetModified(TRUE);
}
void
CWebServiceExtensionGeneral::OnDestroy()
{
CInetPropertyPage::OnDestroy();
}
BOOL
CWebServiceExtensionGeneral::OnSetActive()
{
// dunno why this doesn't work.
m_ExtensionName.SetSel(0,0);
//m_ExtensionUsedBy.SetFocus();
return CInetPropertyPage::OnSetActive();
}
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CWebServiceExtensionRequiredFiles, CInetPropertyPage)
CWebServiceExtensionRequiredFiles::CWebServiceExtensionRequiredFiles(CWebServiceExtensionSheet * pSheet,CComAuthInfo * pComAuthInfo,CRestrictionUIEntry * pRestrictionUIEntry)
: CInetPropertyPage(CWebServiceExtensionRequiredFiles::IDD, pSheet)
{
m_pComAuthInfo = pComAuthInfo;
m_pInterface = pSheet->m_pWebServiceExtension->QueryInterface();
m_pRestrictionUIEntry = pRestrictionUIEntry;
m_MyRestrictionList.RemoveAll();
RestrictionListCopy(&m_MyRestrictionList,&m_pRestrictionUIEntry->strlstRestrictionEntries);
}
CWebServiceExtensionRequiredFiles::~CWebServiceExtensionRequiredFiles()
{
// delete the list and all the newly items
CleanRestrictionList(&m_MyRestrictionList);
}
/* virtual */
HRESULT
CWebServiceExtensionRequiredFiles::FetchLoadedValues()
{
CError err;
BEGIN_META_INST_READ(CWebServiceExtensionSheet)
//FETCH_INST_DATA_FROM_SHEET(m_strFileList);
RestrictionListCopy(&m_MyRestrictionList,&pSheet->GetInstanceProperties().m_MyRestrictionList);
END_META_INST_READ(err)
return err;
}
/* virtual */
HRESULT
CWebServiceExtensionRequiredFiles::SaveInfo()
{
ASSERT(IsDirty());
CError err;
BEGIN_META_INST_WRITE(CWebServiceExtensionSheet)
//STORE_INST_DATA_ON_SHEET(m_MyRestrictionList);
RestrictionListCopy(&pSheet->GetInstanceProperties().m_MyRestrictionList,&m_MyRestrictionList);
END_META_INST_WRITE(err)
return err;
}
void
CWebServiceExtensionRequiredFiles::DoDataExchange(CDataExchange * pDX)
{
CInetPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWebServiceExtensionRequiredFiles)
DDX_Control(pDX, IDC_BTN_ADD, m_bnt_Add);
DDX_Control(pDX, IDC_BTN_REMOVE, m_bnt_Remove);
DDX_Control(pDX, IDC_BTN_ENABLE, m_bnt_Enable);
DDX_Control(pDX, IDC_BTN_DISABLE, m_bnt_Disable);
//}}AFX_DATA_MAP
//
// Private DDX/DDV Routines
//
DDX_Control(pDX, IDC_LIST_FILES, m_list_Files);
}
BEGIN_MESSAGE_MAP(CWebServiceExtensionRequiredFiles, CInetPropertyPage)
//{{AFX_MSG_MAP(CWebServiceExtensionRequiredFiles)
ON_BN_CLICKED(IDC_BTN_ADD, OnDoButtonAdd)
ON_BN_CLICKED(IDC_BTN_REMOVE, OnDoButtonRemove)
ON_BN_CLICKED(IDC_BTN_ENABLE, OnDoButtonEnable)
ON_BN_CLICKED(IDC_BTN_DISABLE, OnDoButtonDisable)
ON_NOTIFY(NM_DBLCLK, IDC_LIST_FILES, OnDblclkListFiles)
ON_NOTIFY(NM_CLICK, IDC_LIST_FILES, OnClickListFiles)
ON_NOTIFY(LVN_KEYDOWN, IDC_LIST_FILES, OnKeydownListFiles)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_FILES, OnSelChangedListFiles)
ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_FILES, OnSelChangedListFiles)
ON_COMMAND(ID_HELP, OnHelp)
ON_WM_HELPINFO()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#define COL_1 0
#define COL_1_WID 256
BOOL
CWebServiceExtensionRequiredFiles::OnInitDialog()
{
CInetPropertyPage::OnInitDialog();
CString strMyTitle;
if (m_pRestrictionUIEntry)
{
CString strTruncatedName;
CString strFormat;
strFormat.LoadString(IDS_REQUIREDFILES_TITLE);
if (m_pRestrictionUIEntry->strGroupDescription.GetLength() <= 40)
{
strTruncatedName = m_pRestrictionUIEntry->strGroupDescription;
}
else
{
strTruncatedName = m_pRestrictionUIEntry->strGroupDescription.Left(40);
strTruncatedName = strTruncatedName + _T("...");
}
strMyTitle.Format(strFormat,strTruncatedName,strTruncatedName);
}
GetDlgItem(IDC_REQUIREDFILES_STATIC_TITLE)->SetWindowText(strMyTitle);
m_list_Files.Initialize(2);
FillListBox(NULL);
SetControlState();
SetModified(FALSE);
return TRUE;
}
BOOL
CWebServiceExtensionRequiredFiles::OnHelpInfo(HELPINFO * pHelpInfo)
{
OnHelp();
return TRUE;
}
void
CWebServiceExtensionRequiredFiles::OnHelp()
{
WinHelpDebug(0x20000 + CWebServiceExtensionRequiredFiles::IDD);
::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, 0x20000 + CWebServiceExtensionRequiredFiles::IDD);
}
void
CWebServiceExtensionRequiredFiles::FillListBox(CRestrictionEntry * pSelection)
{
m_list_Files.SetRedraw(FALSE);
m_list_Files.DeleteAllItems();
int cItems = 0;
POSITION pos;
CString TheKey;
CRestrictionEntry * pOneEntry = NULL;
for(pos = m_MyRestrictionList.GetStartPosition();pos != NULL;)
{
m_MyRestrictionList.GetNextAssoc(pos, TheKey, (CRestrictionEntry *&) pOneEntry);
if (pOneEntry)
{
m_list_Files.AddItem(pOneEntry);
++cItems;
}
}
m_list_Files.SetRedraw(TRUE);
if (pSelection)
{
LVFINDINFO fi;
fi.flags = LVFI_PARAM;
fi.lParam = (LPARAM)pSelection;
fi.vkDirection = VK_DOWN;
int i = m_list_Files.FindItem(&fi);
if (i != -1)
{
m_list_Files.SelectItem(i);
}
}
}
void
CWebServiceExtensionRequiredFiles::SetControlState()
{
int nCurSel = m_list_Files.GetSelectionMark();
BOOL bAdd_able = TRUE;
BOOL bRemove_able = FALSE;
BOOL bEnable_able = FALSE;
BOOL bDisable_able = FALSE;
BOOL bNoEntries = TRUE;
CString TheKey;
POSITION pos;
CRestrictionEntry * pOneEntry;
if (-1 != nCurSel)
{
CRestrictionEntry * pOneEntry = m_list_Files.GetItem(nCurSel);
if (pOneEntry)
{
// Check if the entry -- is "not deletable"
if (0 == pOneEntry->iDeletable)
{
bAdd_able = FALSE;
bRemove_able = FALSE;
}
else
{
bRemove_able = TRUE;
}
// check if it's currently prohibited...
// then we should allow them to "allow"
if (WEBSVCEXT_STATUS_PROHIBITED == pOneEntry->iStatus)
{
bEnable_able = TRUE;
}
// check if it's currently allowed...
// then we should allow them to "prohibit"
if (WEBSVCEXT_STATUS_ALLOWED == pOneEntry->iStatus)
{
bDisable_able = TRUE;
}
}
}
if (bAdd_able || bRemove_able)
{
// if we are on one of the "special" entries
// then we cannot add or remove to the entry.
if (WEBSVCEXT_TYPE_ALL_UNKNOWN_ISAPI == m_pRestrictionUIEntry->iType || WEBSVCEXT_TYPE_ALL_UNKNOWN_CGI == m_pRestrictionUIEntry->iType)
{
bAdd_able = FALSE;
bRemove_able = FALSE;
}
// or if our entry is marked as not delet-able...
// then the user cannot add or remove from this list...
for(pos = m_MyRestrictionList.GetStartPosition();pos != NULL;)
{
m_MyRestrictionList.GetNextAssoc(pos, TheKey, (CRestrictionEntry *&) pOneEntry);
if (pOneEntry)
{
bNoEntries = FALSE;
if (0 == pOneEntry->iDeletable)
{
bAdd_able = FALSE;
bRemove_able = FALSE;
break;
}
}
}
}
if (TRUE == bNoEntries)
{
for(pos = m_MyRestrictionList.GetStartPosition();pos != NULL;)
{
m_MyRestrictionList.GetNextAssoc(pos, TheKey, (CRestrictionEntry *&) pOneEntry);
if (pOneEntry)
{
bNoEntries = FALSE;
break;
}
}
}
m_bnt_Add.EnableWindow(bAdd_able);
m_bnt_Remove.EnableWindow(bRemove_able);
m_bnt_Enable.EnableWindow(bEnable_able);
m_bnt_Disable.EnableWindow(bDisable_able);
if (bNoEntries)
{
// disable the OK button
SetModified(FALSE);
::EnableWindow(::GetDlgItem(::GetForegroundWindow(), IDOK), FALSE);
}
else
{
// enable the OK button
::EnableWindow(::GetDlgItem(::GetForegroundWindow(), IDOK), TRUE);
}
m_list_Files.EnableWindow(TRUE);
}
void
CWebServiceExtensionRequiredFiles::OnClickListFiles(NMHDR * pNMHDR, LRESULT * pResult)
{
SetControlState();
*pResult = 0;
}
void
CWebServiceExtensionRequiredFiles::OnKeydownListFiles(NMHDR * pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN * pLVKeyDow = (LV_KEYDOWN *)pNMHDR;
SetControlState();
switch (pLVKeyDow->wVKey)
{
case VK_INSERT:
SendMessage(WM_COMMAND, IDC_BTN_ADD);
break;
case VK_DELETE:
SendMessage(WM_COMMAND, IDC_BTN_REMOVE);
break;
case VK_SPACE:
{
if (GetDlgItem(IDC_BTN_ENABLE)->IsWindowEnabled())
{
OnDoButtonEnable();
}
else if (GetDlgItem(IDC_BTN_DISABLE)->IsWindowEnabled())
{
OnDoButtonDisable();
}
SetControlState();
}
break;
default:
// Continue default action
*pResult = 0;
break;
}
}
void
CWebServiceExtensionRequiredFiles::OnSelChangedListFiles(NMHDR* pNMHDR, LRESULT* pResult)
{
SetControlState();
*pResult = 1;
}
void
CWebServiceExtensionRequiredFiles::OnDblclkListFiles(NMHDR * pNMHDR, LRESULT * pResult)
{
if (GetDlgItem(IDC_BTN_ENABLE)->IsWindowEnabled())
{
OnDoButtonEnable();
}
else if (GetDlgItem(IDC_BTN_DISABLE)->IsWindowEnabled())
{
OnDoButtonDisable();
}
SetControlState();
*pResult = 0;
}
void
CWebServiceExtensionRequiredFiles::OnDoButtonAdd()
{
CFileDlg dlg(IsLocal(), m_pInterface, &m_MyRestrictionList, m_pRestrictionUIEntry ? m_pRestrictionUIEntry->strGroupID : _T(""), this);
if (dlg.DoModal() == IDOK)
{
// Get the filename that they entered
// and add it to our list.
CString strReturnFileName;
strReturnFileName = dlg.m_strFileName;
{
// Get the Status
int iMyStatus = WEBSVCEXT_STATUS_PROHIBITED;
{
POSITION pos;
CString TheKey;
CRestrictionEntry * pOneEntry = NULL;
for(pos = m_MyRestrictionList.GetStartPosition();pos != NULL;)
{
m_MyRestrictionList.GetNextAssoc(pos, TheKey, (CRestrictionEntry *&) pOneEntry);
if (pOneEntry)
{
if (WEBSVCEXT_STATUS_ALLOWED == pOneEntry->iStatus)
{
iMyStatus = WEBSVCEXT_STATUS_ALLOWED;
break;
}
}
}
}
CRestrictionEntry * pNewEntry = CreateRestrictionEntry(
strReturnFileName,
iMyStatus,
1,
m_pRestrictionUIEntry ? m_pRestrictionUIEntry->strGroupID : _T(""), // from parent data
m_pRestrictionUIEntry ? m_pRestrictionUIEntry->strGroupDescription : _T(""), // from parent data
WEBSVCEXT_TYPE_REGULAR);
if (pNewEntry)
{
// THE KEY IS ALWAYS UPPERASE -- REMEMBER THIS!!!!!!!
CString strKey;strKey=pNewEntry->strFileName;strKey.MakeUpper();
m_MyRestrictionList.SetAt(strKey,pNewEntry);
FillListBox(pNewEntry);
}
}
}
SetControlState();
SetModified(TRUE);
}
void
CWebServiceExtensionRequiredFiles::OnDoButtonRemove()
{
int nCurSel = m_list_Files.GetSelectionMark();
if (-1 != nCurSel)
{
CString TheKey;
CRestrictionEntry * pRestrictionEntry = m_list_Files.GetItem(nCurSel);
if (pRestrictionEntry)
{
// 1st -- set to disabled...
pRestrictionEntry->iStatus = WEBSVCEXT_STATUS_PROHIBITED;
m_list_Files.SetListItem(nCurSel, pRestrictionEntry);
// then remove the entry...
{
TheKey = pRestrictionEntry->strFileName;
// THE KEY IS ALWAYS UPPERASE -- REMEMBER THIS!!!!!!!
TheKey.MakeUpper();
m_MyRestrictionList.RemoveKey(TheKey);
}
}
FillListBox(NULL);
int count = m_list_Files.GetItemCount();
if (count > 0)
{
m_list_Files.SelectItem(nCurSel < count ? nCurSel : --nCurSel);
GetDlgItem(IDC_BTN_REMOVE)->SetFocus();
}
else
{
m_list_Files.SelectItem(nCurSel, FALSE);
GetDlgItem(IDC_LIST_FILES)->SetFocus();
}
SetModified(TRUE);
SetControlState();
}
}
void
CWebServiceExtensionRequiredFiles::OnDoButtonEnable()
{
int nCurSel = m_list_Files.GetSelectionMark();
if (-1 != nCurSel)
{
CRestrictionEntry * pRestrictionEntry = m_list_Files.GetItem(nCurSel);
if (pRestrictionEntry)
{
if (WEBSVCEXT_STATUS_ALLOWED != pRestrictionEntry->iStatus)
{
pRestrictionEntry->iStatus = WEBSVCEXT_STATUS_ALLOWED;
SetModified(TRUE);
}
m_list_Files.SetListItem(nCurSel, pRestrictionEntry);
// make sure to select it.
m_list_Files.SelectItem(nCurSel, TRUE);
}
SetControlState();
}
}
void
CWebServiceExtensionRequiredFiles::OnDoButtonDisable()
{
BOOL bProceed = TRUE;
int nCurSel = m_list_Files.GetSelectionMark();
if (-1 != nCurSel)
{
CRestrictionEntry * pRestrictionEntry = m_list_Files.GetItem(nCurSel);
if (pRestrictionEntry)
{
if (WEBSVCEXT_TYPE_REGULAR == pRestrictionEntry->iType)
{
// Check if this item has apps that
// are dependent upon it.
CStringListEx strlstDependApps;
if (TRUE == ReturnDependentAppsList(m_pInterface,pRestrictionEntry->strGroupID,&strlstDependApps,FALSE))
{
bProceed = FALSE;
// check if they really want to do this.
CDepedentAppsDlg dlg(&strlstDependApps,pRestrictionEntry->strGroupDescription,NULL);
if (dlg.DoModal() == IDOK)
{
bProceed = TRUE;
}
}
}
if (bProceed)
{
if (WEBSVCEXT_STATUS_PROHIBITED != pRestrictionEntry->iStatus)
{
pRestrictionEntry->iStatus = WEBSVCEXT_STATUS_PROHIBITED;
SetModified(TRUE);
}
m_list_Files.SetListItem(nCurSel, pRestrictionEntry);
// make sure to select it.
m_list_Files.SelectItem(nCurSel, TRUE);
}
}
SetControlState();
}
}
//
// properties
//
CWebServiceExtensionProps::CWebServiceExtensionProps(
CMetaInterface * pInterface,
LPCTSTR meta_path,
CRestrictionUIEntry * pRestrictionUIEntry,
CWebServiceExtension * pWebServiceExtension
)
: CMetaProperties(pInterface, meta_path),
m_pRestrictionUIEntry(pRestrictionUIEntry),
m_pWebServiceExtension(pWebServiceExtension)
{
m_MyRestrictionList.RemoveAll();
m_pInterface = pInterface;
}
CWebServiceExtensionProps::~CWebServiceExtensionProps()
{
CleanRestrictionList(&m_MyRestrictionList);
}
//
// This is where the values get read from the metabase
//
void
CWebServiceExtensionProps::ParseFields()
{
// Get the data out from our passed in format.
CRestrictionUIEntry * pMyPointer = m_pRestrictionUIEntry;
CString strAllEntries;
CString strOurGroupID;
strOurGroupID = pMyPointer->strGroupID;
//
// General property
//
m_strExtensionName = pMyPointer->strGroupDescription;
m_strExtensionUsedBy = _T("");
m_iExtensionUsedByCount = 0;
// Load Applications which are using this GroupID!!!
// fetch the list from the metabase and loop thru the list
CStringListEx strlstDependApps;
if (TRUE == ReturnDependentAppsList(m_pWebServiceExtension->QueryInterface(),strOurGroupID,&strlstDependApps,FALSE))
{
CString csOneEntry,csOneEntry2;
POSITION pos,pos2 = NULL;
int count = (int) strlstDependApps.GetCount();
for (int i = 0; i < count-1; i++)
{
if( ( pos = strlstDependApps.FindIndex( i )) != NULL )
{
csOneEntry = strlstDependApps.GetAt(pos);
for (int j = i; j < count; j++ )
{
if( ( pos2 = strlstDependApps.FindIndex( j )) != NULL )
{
csOneEntry2 = strlstDependApps.GetAt(pos2);
if (0 < csOneEntry.Compare(csOneEntry2))
{
strlstDependApps.SetAt( pos, csOneEntry2 );
strlstDependApps.SetAt( pos2, csOneEntry );
csOneEntry = csOneEntry2;
}
}
}
}
}
m_iExtensionUsedByCount = count;
}
POSITION pos1 = strlstDependApps.GetHeadPosition();
while (pos1)
{
strAllEntries = strAllEntries + strlstDependApps.GetNext(pos1);
strAllEntries = strAllEntries + _T("\r\n");
}
if (strAllEntries.IsEmpty())
{
strAllEntries.LoadString(IDS_UNKNOWN);
}
m_strExtensionUsedBy = strAllEntries;
//
// Required Files propety
//
m_MyRestrictionList.RemoveAll();
RestrictionListCopy(&m_MyRestrictionList,&pMyPointer->strlstRestrictionEntries);
return;
}
HRESULT
CWebServiceExtensionProps::UpdateMMC(DWORD dwUpdateFlag)
{
void ** ppParam = (void **) m_pWebServiceExtension;
if (IsValidAddress( (const void*) *ppParam,sizeof(void*),FALSE))
{
CWebServiceExtension * lParam = (CWebServiceExtension *) m_pWebServiceExtension;
if (lParam)
{
// Make sure to refresh the GetProperty stuff too..
// this will be done in the destructor, so we don't have to do it here
if (lParam)
{
// caution
if (IsValidAddress( (const void*) lParam->m_ppHandle,sizeof(void*),FALSE))
{
if (lParam->QueryResultItem())
{
// RefreshData at the container level
// will sync up everything.
lParam->m_UpdateFlag = dwUpdateFlag; //PROP_CHANGE_DISPLAY_ONLY;
MMCPropertyChangeNotify(lParam->m_ppHandle, (LPARAM) lParam);
}
else
{
TRACEEOLID("MMCPropertyChangeNotify:Looks like this is an orphaned property sheet, don't send notification...\r\n");
}
}
}
}
}
return S_OK;
}
//
// This is where the values get written to the metabase
//
HRESULT
CWebServiceExtensionProps::WriteDirtyProps()
{
CError err;
CRestrictionUIList MasterRestrictionUIList;
CRestrictionUIEntry NewUIEntry;
CMetaInterface * pInterface = m_pInterface;
// Get the data out from our passed in format.
CRestrictionUIEntry * pMyPointer = m_pRestrictionUIEntry;
if (!pMyPointer)
{
return E_POINTER;
}
NewUIEntry.iType = pMyPointer->iType;
NewUIEntry.strGroupID = pMyPointer->strGroupID;
NewUIEntry.strGroupDescription = m_strExtensionName;
// if there is restrictionlist entries
// then add it to the new entry we are going to write to the metabase.
{
POSITION pos;
CString TheKey;
CRestrictionEntry * pOneEntry = NULL;
for(pos = m_MyRestrictionList.GetStartPosition();pos != NULL;)
{
m_MyRestrictionList.GetNextAssoc(pos, TheKey, (CRestrictionEntry *&) pOneEntry);
if (pOneEntry)
{
// THE KEY IS ALWAYS UPPERASE -- REMEMBER THIS!!!!!!!
TheKey.MakeUpper();
NewUIEntry.strlstRestrictionEntries.SetAt(TheKey,pOneEntry);
}
}
pMyPointer->strGroupDescription = m_strExtensionName;
// Check if we still have the interface to the metabase...
if (pInterface)
{
err = CheckForMetabaseAccess(METADATA_PERMISSION_READ,pInterface,METABASE_PATH_FOR_RESTRICT_LIST);
if (err.Failed())
{
goto WriteDirtyProps_Exit;
}
}
if (SUCCEEDED(LoadMasterUIWithoutOldEntry(pInterface,&MasterRestrictionUIList,pMyPointer)))
{
if (m_MyRestrictionList.IsEmpty())
{
// if there are no restrictionlist entries...
// then we don't have an entry... remove it
AddRestrictUIEntryToRestrictUIList(&MasterRestrictionUIList,NULL);
}
else
{
AddRestrictUIEntryToRestrictUIList(&MasterRestrictionUIList,&NewUIEntry);
}
// Merge our changes with the master list!!!!!
// 1. read the master list.
// 2. merge our changes into it.
// 3. write out the master list.
// 4. update the UI.
CStringListEx strlstReturned;
if (SUCCEEDED(PrepRestictionUIListForWrite(&MasterRestrictionUIList,&strlstReturned)))
{
// Write out the strlstReturned to the metabase.
err = OpenForWriting(FALSE);
if (err.Succeeded())
{
err = SetValue(MD_WEB_SVC_EXT_RESTRICTION_LIST, strlstReturned);
Close();
}
if (err.Succeeded())
{
// update the UI with the changed value
// 1. remove the UI's old value
// 2. add in the new value to the UI
//
// get the list of extensions
// update our entry or delete our entry...
// copy new value into existing place.
// this will clean out the existing place's objects...
UpdateMMC(0);
}
}
}
}
WriteDirtyProps_Exit:
//m_Dirty = err.Succeeded();
return err;
}
// -----------------------------------------------------------
CFileDlg::CFileDlg(
IN BOOL fLocal,
IN CMetaInterface * pInterface,
IN CRestrictionList * pMyRestrictionList,
IN LPCTSTR strGroupID,
IN CWnd * pParent OPTIONAL
)
: CDialog(CFileDlg::IDD, pParent),
m_fLocal(fLocal)
{
//{{AFX_DATA_INIT(CFileDlg)
m_strFileName = _T("");
m_pInterface = pInterface;
m_strGroupID = strGroupID;
m_pRestrictionList = pMyRestrictionList;
m_bValidateFlag = FALSE;
//}}AFX_DATA_INIT
}
void
CFileDlg::DoDataExchange(
IN CDataExchange * pDX
)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFileDlg)
DDX_Control(pDX, IDOK, m_button_Ok);
DDX_Control(pDX, IDC_EDIT_FILENAME, m_edit_FileName);
DDX_Control(pDX, IDC_BUTTON_BROWSE, m_button_Browse);
//}}AFX_DATA_MAP
DDX_Text(pDX, IDC_EDIT_FILENAME, m_strFileName);
if (pDX->m_bSaveAndValidate)
{
DDV_MaxCharsBalloon(pDX, m_strFileName, 255);
int iErrorMsg = 0;
m_strFileName.TrimLeft();m_strFileName.TrimRight();
CString csPathMunged;
csPathMunged = m_strFileName;
#ifdef SUPPORT_SLASH_SLASH_QUESTIONMARK_SLASH_TYPE_PATHS
GetSpecialPathRealPath(0,m_strFileName,csPathMunged);
#endif
//DDV_FilePath(pDX, csPathMunged, m_fLocal);
// if this is a path/filename without a .ext then remove any period from the end.
// check if it ends with a period.
if (csPathMunged.Right(1) == _T("."))
{
TCHAR szFilename_ext_only[_MAX_EXT];
_tsplitpath(csPathMunged, NULL, NULL, NULL, szFilename_ext_only);
if (szFilename_ext_only)
{
if (0 == _tcscmp(szFilename_ext_only,_T(".")))
{
csPathMunged.TrimRight(_T("."));
}
}
}
DWORD dwAllowedFlags = CHKPATH_ALLOW_UNC_PATH;
DWORD dwCharsetFlags = CHKPATH_CHARSET_GENERAL;
dwCharsetFlags |= CHKPATH_CHARSET_GENERAL_NO_COMMA;
FILERESULT dwReturn = MyValidatePath(csPathMunged,m_fLocal,CHKPATH_WANT_FILE,dwAllowedFlags,dwCharsetFlags);
if (FAILED(dwReturn))
{
iErrorMsg = IDS_WEBSVCEXT_INVALID_FILENAME_FORMAT;
if (IS_FLAG_SET(dwReturn,CHKPATH_FAIL_INVALID_CHARSET))
{
iErrorMsg = IDS_WEBSVCEXT_INVALID_FILENAME_CHARS;
}
else
{
if (dwReturn == CHKPATH_FAIL_NOT_ALLOWED_DIR_NOT_EXIST)
{
iErrorMsg = IDS_ERR_PATH_NOT_FOUND;
}
}
}
else
{
// check for % character
// there must be at least 2
TCHAR * pChar = NULL;
pChar = _tcschr(csPathMunged, _T('%'));
if (pChar)
{
pChar++;
pChar = _tcschr(pChar, _T('%'));
if (pChar)
{
TRACEEOL("Path:Warn if percent character");
iErrorMsg = IDS_WEBSVCEXT_INVALID_PERCENT_WARNING;
}
}
}
// Check for invalid characters
if (0 != iErrorMsg)
{
if (IDS_WEBSVCEXT_INVALID_PERCENT_WARNING == iErrorMsg)
{
// For some reason, we need this
// flag so that we don't show the message twice...
if (!m_bValidateFlag)
{
if (IDCANCEL == ::AfxMessageBox(IDS_WEBSVCEXT_INVALID_PERCENT_WARNING,MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON2))
{
m_bValidateFlag = FALSE;
pDX->Fail();
}
else
{
// ensure user doesn't see the 2nd msgbox
m_bValidateFlag = TRUE;
}
}
else
{
// flip it back on
m_bValidateFlag = FALSE;
}
}
else if (IDS_WEBSVCEXT_INVALID_FILENAME_CHARS == iErrorMsg)
{
// formulate the real error message
CString strMsg;
CString strTempList;
CComBSTR strTempFormat;
strTempFormat.LoadString(IDS_WEBSVCEXT_INVALID_FILENAME_CHARS);
LoadStatics();
strTempList = _T(":");
strTempList += g_InvalidWebSvcExtCharsPath;
strMsg.Format(strTempFormat,strTempList);
DDV_ShowBalloonAndFail(pDX, strMsg);
m_bValidateFlag = FALSE;
}
else
{
DDV_ShowBalloonAndFail(pDX, iErrorMsg);
m_bValidateFlag = FALSE;
}
}
}
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CFileDlg, CDialog)
//{{AFX_MSG_MAP(CFileDlg)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_EN_CHANGE(IDC_EDIT_FILENAME, OnFilenameChanged)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
HRESULT AFXAPI
MyLimitInputPath(HWND hWnd)
{
CString strMsg;
CComBSTR strTempFormat;
strTempFormat.LoadString(IDS_WEBSVCEXT_INVALID_FILENAME_CHARS);
LoadStatics();
strMsg.Format(strTempFormat,g_InvalidWebSvcExtCharsPath);
LIMITINPUT li = {0};
li.cbSize = sizeof(li);
li.dwMask = LIM_FLAGS | LIM_FILTER | LIM_MESSAGE | LIM_HINST;
li.dwFlags = LIF_EXCLUDEFILTER | LIF_HIDETIPONVALID | LIF_PASTESKIP;
li.hinst = _Module.GetResourceInstance();
// don't ask me why, but when we use this
// it truncates it to like 80 chars.
// specifying an actual string allows more than 80
//li.pszMessage = MAKEINTRESOURCE(IDS_WEBSVCEXT_INVALID_FILENAME_CHARS);
li.pszMessage = (LPTSTR) (LPCTSTR) strMsg;
li.pszFilter = g_InvalidWebSvcExtCharsPath;
return SHLimitInputEditWithFlags(hWnd, &li);
}
HRESULT AFXAPI
MyLimitInputName(HWND hWnd)
{
CComBSTR strTempString;
strTempString.LoadString(IDS_WEBSVCEXT_INVALID_NAME_CHARS);
LoadStatics();
LIMITINPUT li = {0};
li.cbSize = sizeof(li);
li.dwMask = LIM_FLAGS | LIM_FILTER | LIM_MESSAGE | LIM_HINST;
li.dwFlags = LIF_EXCLUDEFILTER | LIF_HIDETIPONVALID | LIF_PASTESKIP;
li.hinst = _Module.GetResourceInstance();
// don't ask me why, but when we use this
// it truncates it to like 80 chars.
// specifying an actual string allows more than 80
//li.pszMessage = MAKEINTRESOURCE(IDS_WEBSVCEXT_INVALID_NAME_CHARS);
li.pszMessage = strTempString;
li.pszFilter = g_InvalidWebSvcExtCharsName;
return SHLimitInputEditWithFlags(hWnd, &li);
}
BOOL
CFileDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
// Available on local connections only
//
m_button_Browse.EnableWindow(m_fLocal);
MySetControlStates();
MyLimitInputPath(CONTROL_HWND(IDC_EDIT_FILENAME));
return TRUE;
}
void
CFileDlg::OnButtonBrowse()
{
ASSERT(m_fLocal);
CString strFileMask((LPCTSTR)IDS_ISAPI_CGI_MASK);
//
// CODEWORK: Derive a class from CFileDialog that allows
// the setting of the initial path
//
//CString strPath;
//m_edit_FileName.GetWindowText(strPath);
CFileDialog dlgBrowse(
TRUE,
NULL,
NULL,
OFN_HIDEREADONLY,
strFileMask,
this
);
// Disable hook to get Windows 2000 style dialog
dlgBrowse.m_ofn.Flags &= ~(OFN_ENABLEHOOK);
dlgBrowse.m_ofn.Flags |= OFN_DONTADDTORECENT|OFN_FILEMUSTEXIST;
INT_PTR rc = dlgBrowse.DoModal();
if (rc == IDOK)
{
m_edit_FileName.SetWindowText(dlgBrowse.GetPathName());
}
else if (rc == IDCANCEL)
{
DWORD err = CommDlgExtendedError();
}
OnItemChanged();
}
void
CFileDlg::MySetControlStates()
{
m_button_Ok.EnableWindow(m_edit_FileName.GetWindowTextLength() > 0);
}
void
CFileDlg::OnItemChanged()
{
MySetControlStates();
}
void
CFileDlg::OnFilenameChanged()
{
OnItemChanged();
}
BOOL
CFileDlg::FilePathEntryExists(
IN LPCTSTR lpName,
IN OUT CString * strUser
)
/*++
Routine Description:
Look for a given filename in the list
Arguments:
LPCTSTR lpName : filename name to look for
Return Value:
TRUE if the name already existed in the metabase
--*/
{
// Loop thru to ensure that this specified path\filename
// isn't already being used in the metabase by
// a different entry.
return IsFileUsedBySomeoneElse(m_pInterface, lpName, m_strGroupID,strUser);
}
void
CFileDlg::OnOK()
{
if (UpdateData(TRUE))
{
BOOL bInUseAlready = FALSE;
// Make sure the filname is unique
// within our own entry!
if (!m_strFileName.IsEmpty())
{
CString strUser;
CRestrictionEntry * pOneRestrictEntry = NULL;
pOneRestrictEntry = NULL;
if (m_pRestrictionList)
{
// THE KEY IS ALWAYS UPPERASE -- REMEMBER THIS!!!!!!!
CString strKey;strKey=m_strFileName;strKey.MakeUpper();
m_pRestrictionList->Lookup(strKey,(CRestrictionEntry *&) pOneRestrictEntry);
if (pOneRestrictEntry)
{
bInUseAlready = TRUE;
CComBSTR strMessage;
strMessage.LoadString(IDS_DUPLICATE_ENTRY);
EditShowBalloon(m_edit_FileName.m_hWnd, (CString) strMessage);
}
}
}
//
// Make sure the filename is unique
//
if (FALSE == bInUseAlready)
{
CString strUser;
if (FilePathEntryExists(m_strFileName,&strUser))
{
bInUseAlready = TRUE;
CString strMessage;
CComBSTR strFormat;
strFormat.LoadString(IDS_WEBSVCEXT_NOT_UNIQUE);
strMessage.Format(strFormat,strUser);
EditShowBalloon(m_edit_FileName.m_hWnd, strMessage);
}
}
// Everything okay
if (!bInUseAlready)
{
CDialog::OnOK();
}
}
//
// Don't dismiss the dialog
//
}
// -----------------------------------------------------------
CWebSvcExtAddNewDlg::CWebSvcExtAddNewDlg(
IN BOOL fLocal,
IN CMetaInterface * pInterface,
IN CWnd * pParent OPTIONAL
)
: CDialog(CWebSvcExtAddNewDlg::IDD, pParent),
m_fIsLocal(fLocal)
{
//{{AFX_DATA_INIT(CWebSvcExtAddNewDlg)
m_strGroupName = _T("");
m_fAllow = FALSE;
m_pInterface = pInterface;
m_MyRestrictionList.RemoveAll();
//}}AFX_DATA_INIT
}
CWebSvcExtAddNewDlg::~CWebSvcExtAddNewDlg()
{
CleanRestrictionList(&m_MyRestrictionList);
}
void
CWebSvcExtAddNewDlg::DoDataExchange(
IN CDataExchange * pDX
)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWebSvcExtAddNewDlg)
DDX_Control(pDX, IDC_EDIT_EXTENSION_NAME, m_edit_FileName);
DDX_Control(pDX, IDC_BTN_ADD, m_bnt_Add);
DDX_Control(pDX, IDC_BTN_REMOVE, m_bnt_Remove);
DDX_Control(pDX, IDC_CHECK_ALLOW, m_chk_Allow);
DDX_Control(pDX, IDOK, m_button_Ok);
DDX_Control(pDX, ID_HELP, m_button_Help);
//}}AFX_DATA_MAP
DDX_Text(pDX, IDC_EDIT_EXTENSION_NAME, m_strGroupName);
DDX_Control(pDX, IDC_LIST_FILES, m_list_Files);
if (pDX->m_bSaveAndValidate)
{
m_strGroupName.TrimLeft();
m_strGroupName.TrimRight();
DDV_MinMaxChars(pDX, m_strGroupName, 1, 256);
if (m_strGroupName.GetLength() > 256){DDV_ShowBalloonAndFail(pDX, IDS_ERR_INVALID_PATH /*IDS_BAD_URL_PATH*/ );}
}
//if (pDX->m_bSaveAndValidate){DDV_FilePath(pDX, m_strGroupName, m_fLocal);}
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CWebSvcExtAddNewDlg, CDialog)
//{{AFX_MSG_MAP(CWebSvcExtAddNewDlg)
ON_EN_CHANGE(IDC_EDIT_EXTENSION_NAME, OnFilenameChanged)
ON_BN_CLICKED(IDC_BTN_ADD, OnDoButtonAdd)
ON_BN_CLICKED(IDC_BTN_REMOVE, OnDoButtonRemove)
ON_BN_CLICKED(IDC_CHECK_ALLOW, OnDoCheckAllow)
ON_NOTIFY(NM_CLICK, IDC_LIST_FILES, OnClickListFiles)
ON_NOTIFY(LVN_KEYDOWN, IDC_LIST_FILES, OnKeydownListFiles)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_FILES, OnSelChangedListFiles)
ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_FILES, OnSelChangedListFiles)
ON_COMMAND(ID_HELP, OnHelp)
ON_WM_HELPINFO()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL
CWebSvcExtAddNewDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_list_Files.Initialize(1);
m_fAllow = FALSE;
m_chk_Allow.SetCheck(m_fAllow);
MySetControlStates();
MyLimitInputName(CONTROL_HWND(IDC_EDIT_EXTENSION_NAME));
return TRUE;
}
BOOL
CWebSvcExtAddNewDlg::OnHelpInfo(HELPINFO * pHelpInfo)
{
OnHelp();
return TRUE;
}
void
CWebSvcExtAddNewDlg::OnHelp()
{
WinHelpDebug(0x20000 + CWebSvcExtAddNewDlg::IDD);
::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, 0x20000 + CWebSvcExtAddNewDlg::IDD);
}
void
CWebSvcExtAddNewDlg::MySetControlStates()
{
m_edit_FileName.EnableWindow(TRUE);
m_bnt_Add.EnableWindow(TRUE);
m_list_Files.EnableWindow(TRUE);
// Enable Remove only if there is something selected...
int nCurSel = m_list_Files.GetSelectionMark();
if (-1 != nCurSel)
{
m_bnt_Remove.EnableWindow(TRUE);
}
else
{
m_bnt_Remove.EnableWindow(FALSE);
}
// Enable OK only if there is a filename
// and at least one entry in the list box
int nCount = m_list_Files.GetItemCount();
if (nCount > 0)
{
m_button_Ok.EnableWindow(m_edit_FileName.GetWindowTextLength() > 0);
}
else
{
m_button_Ok.EnableWindow(FALSE);
}
m_fAllow = m_chk_Allow.GetCheck();
}
void
CWebSvcExtAddNewDlg::OnItemChanged()
{
MySetControlStates();
}
void
CWebSvcExtAddNewDlg::OnFilenameChanged()
{
OnItemChanged();
}
BOOL
CWebSvcExtAddNewDlg::FilePathEntryExists(
IN LPCTSTR lpName
)
{
// Loop thru to ensure that this specified GroupID
// isn't already being used in the metabase by
// a different entry.
return IsGroupIDUsedBySomeoneElse(m_pInterface, lpName);
}
void
CWebSvcExtAddNewDlg::OnOK()
{
if (UpdateData(TRUE))
{
//
// Make sure the group name is unique
//
if (FilePathEntryExists(m_strGroupName))
{
EditShowBalloon(m_edit_FileName.m_hWnd, IDS_WEBSVCEXT_ID_NOT_UNIQUE);
return;
}
CDialog::OnOK();
}
}
void
CWebSvcExtAddNewDlg::OnDoCheckAllow()
{
m_fAllow = !m_fAllow;
OnItemChanged();
MySetControlStates();
}
void
CWebSvcExtAddNewDlg::OnDoButtonAdd()
{
int nCurSel = m_list_Files.GetSelectionMark();
CFileDlg dlg(m_fIsLocal, m_pInterface, &m_MyRestrictionList, _T(""), this);
if (dlg.DoModal() == IDOK)
{
// Get the filename that they entered
// and add it to our list.
CString strReturnFileName;
strReturnFileName = dlg.m_strFileName;
{
CRestrictionEntry * pNewEntry = CreateRestrictionEntry(
strReturnFileName,
WEBSVCEXT_STATUS_ALLOWED, // doesn't matter we won't use what gets set here..
1, // doesn't matter we won't use what gets set here..
_T(""),
_T(""),
WEBSVCEXT_TYPE_REGULAR // doesn't matter we won't use what gets set here..
);
if (pNewEntry)
{
// THE KEY IS ALWAYS UPPERASE -- REMEMBER THIS!!!!!!!
CString strKey;strKey=pNewEntry->strFileName;strKey.MakeUpper();
m_MyRestrictionList.SetAt(strKey,pNewEntry);
FillListBox(pNewEntry);
}
}
}
MySetControlStates();
}
void
CWebSvcExtAddNewDlg::OnDoButtonRemove()
{
int nCurSel = m_list_Files.GetSelectionMark();
if (-1 != nCurSel)
{
CString TheKey;
CRestrictionEntry * pRestrictionEntry = m_list_Files.GetItem(nCurSel);
if (pRestrictionEntry)
{
// remove the entry...
{
TheKey = pRestrictionEntry->strFileName;
// THE KEY IS ALWAYS UPPERASE -- REMEMBER THIS!!!!!!!
TheKey.MakeUpper();
m_MyRestrictionList.RemoveKey(TheKey);
}
}
FillListBox(NULL);
int count = m_list_Files.GetItemCount();
if (count > 0)
{
m_list_Files.SelectItem(nCurSel < count ? nCurSel : --nCurSel);
GetDlgItem(IDC_BTN_REMOVE)->SetFocus();
}
else
{
m_list_Files.SelectItem(nCurSel, FALSE);
GetDlgItem(IDC_LIST_FILES)->SetFocus();
}
MySetControlStates();
}
}
void
CWebSvcExtAddNewDlg::OnClickListFiles(NMHDR * pNMHDR, LRESULT * pResult)
{
MySetControlStates();
*pResult = 0;
}
void
CWebSvcExtAddNewDlg::OnKeydownListFiles(NMHDR * pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN * pLVKeyDow = (LV_KEYDOWN *)pNMHDR;
MySetControlStates();
switch (pLVKeyDow->wVKey)
{
case VK_INSERT:
SendMessage(WM_COMMAND, IDC_BTN_ADD);
break;
case VK_DELETE:
SendMessage(WM_COMMAND, IDC_BTN_REMOVE);
break;
default:
// Continue default action
*pResult = 0;
break;
}
}
void
CWebSvcExtAddNewDlg::OnSelChangedListFiles(NMHDR* pNMHDR, LRESULT* pResult)
{
MySetControlStates();
*pResult = 1;
}
void
CWebSvcExtAddNewDlg::FillListBox(CRestrictionEntry * pSelection)
{
m_list_Files.SetRedraw(FALSE);
m_list_Files.DeleteAllItems();
int cItems = 0;
POSITION pos;
CString TheKey;
CRestrictionEntry * pOneEntry = NULL;
for(pos = m_MyRestrictionList.GetStartPosition();pos != NULL;)
{
m_MyRestrictionList.GetNextAssoc(pos, TheKey, (CRestrictionEntry *&) pOneEntry);
if (pOneEntry)
{
m_list_Files.AddItem(pOneEntry);
++cItems;
}
}
m_list_Files.SetRedraw(TRUE);
if (pSelection)
{
LVFINDINFO fi;
fi.flags = LVFI_PARAM;
fi.lParam = (LPARAM)pSelection;
fi.vkDirection = VK_DOWN;
int i = m_list_Files.FindItem(&fi);
if (i != -1)
{
m_list_Files.SelectItem(i);
}
}
}
// -----------------------------------------------------------
CWebSvcExtAddNewForAppDlg::CWebSvcExtAddNewForAppDlg(
IN BOOL fLocal,
IN CMetaInterface * pInterface,
IN CWnd * pParent OPTIONAL
)
: CDialog(CWebSvcExtAddNewForAppDlg::IDD, pParent),
m_fLocal(fLocal)
{
//{{AFX_DATA_INIT(CWebSvcExtAddNewForAppDlg)
m_pMySelectedApplication = NULL;
m_nComboSelection = -1;
m_pInterface = pInterface;
//}}AFX_DATA_INIT
}
void
CWebSvcExtAddNewForAppDlg::DoDataExchange(
IN CDataExchange * pDX
)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWebSvcExtAddNewForAppDlg)
DDX_Control(pDX, IDOK, m_button_Ok);
DDX_Control(pDX, ID_HELP, m_button_Help);
DDX_CBIndex(pDX, IDC_COMBO_APPLICATION, m_nComboSelection);
DDX_Control(pDX, IDC_COMBO_APPLICATION, m_combo_Applications);
DDX_Control(pDX, IDC_DEPENDENCIES_TXT, m_Dependencies);
//}}AFX_DATA_MAP
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CWebSvcExtAddNewForAppDlg, CDialog)
//{{AFX_MSG_MAP(CWebSvcExtAddNewForAppDlg)
ON_CBN_SELCHANGE(IDC_COMBO_APPLICATION, OnSelchangeComboApplications)
ON_COMMAND(ID_HELP, OnHelp)
ON_WM_HELPINFO()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL
CWebSvcExtAddNewForAppDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_combo_Applications.SetRedraw(FALSE);
m_combo_Applications.ResetContent();
// fetch the list from the
// metabase and loop thru the list
CApplicationDependList MyMasterList;
if (SUCCEEDED(LoadApplicationDependList(m_pInterface,&MyMasterList,TRUE)))
{
// loop thru the returned back list
int TheIndex;
POSITION pos;
CString TheKey;
CApplicationDependEntry * pOneEntry = NULL;
for(pos = MyMasterList.GetStartPosition();pos != NULL;)
{
MyMasterList.GetNextAssoc(pos, TheKey, (CApplicationDependEntry *&) pOneEntry);
if (pOneEntry)
{
TheIndex = m_combo_Applications.AddString(pOneEntry->strApplicationName);
if (TheIndex != CB_ERR)
{
m_combo_Applications.SetItemDataPtr(TheIndex, pOneEntry);
}
}
}
}
// Load Mapping for GroupID to friendlyName
LoadApplicationFriendlyNames(m_pInterface,&m_GroupIDtoGroupFriendList);
m_combo_Applications.EnableWindow(TRUE);
m_combo_Applications.SetRedraw(TRUE);
m_combo_Applications.SetCurSel(m_nComboSelection);
// Highlight the 1st selection...
if (-1 == m_nComboSelection)
{
m_nComboSelection = m_combo_Applications.GetCount();
if (m_nComboSelection >= 0)
{
m_combo_Applications.SetCurSel(0);
OnSelchangeComboApplications();
}
}
MySetControlStates();
return TRUE;
}
BOOL
CWebSvcExtAddNewForAppDlg::OnHelpInfo(HELPINFO * pHelpInfo)
{
OnHelp();
return TRUE;
}
void
CWebSvcExtAddNewForAppDlg::OnHelp()
{
WinHelpDebug(0x20000 + CWebSvcExtAddNewForAppDlg::IDD);
::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, 0x20000 + CWebSvcExtAddNewForAppDlg::IDD);
}
void
CWebSvcExtAddNewForAppDlg::MySetControlStates()
{
m_Dependencies.SetReadOnly(TRUE);
int nSel = m_combo_Applications.GetCurSel();
if (-1 == nSel)
{
m_button_Ok.EnableWindow(FALSE);
}
else
{
m_button_Ok.EnableWindow(TRUE);
}
}
void
CWebSvcExtAddNewForAppDlg::OnSelchangeComboApplications()
{
int nSel = m_combo_Applications.GetCurSel();
if (m_nComboSelection == nSel)
{
//
// Selection didn't change
//
return;
}
m_nComboSelection = nSel;
int idx = m_combo_Applications.GetCurSel();
if (idx != -1)
{
m_Dependencies.SetWindowText(_T(""));
CApplicationDependEntry * pOneEntry = NULL;
CString strOneFriendly;
CString strOneGroupID;
CString strAllEntries;
pOneEntry = (CApplicationDependEntry *) m_combo_Applications.GetItemDataPtr(idx);
if (pOneEntry)
{
// dump out our info.
POSITION pos = pOneEntry->strlistGroupID.GetHeadPosition();
while (pos)
{
strOneGroupID = pOneEntry->strlistGroupID.GetNext(pos);
// replace ID with friendly string
strOneFriendly = _T("");
// THE KEY IS ALWAYS UPPERASE -- REMEMBER THIS!!!!!!!
CString strKey;strKey=strOneGroupID;strKey.MakeUpper();
m_GroupIDtoGroupFriendList.Lookup(strKey,strOneFriendly);
if (strOneFriendly.IsEmpty())
{
strAllEntries = strAllEntries + strOneGroupID;
}
else
{
strAllEntries = strAllEntries + strOneFriendly;
}
strAllEntries = strAllEntries + _T("\r\n");
}
}
m_Dependencies.SetWindowText(strAllEntries);
}
MySetControlStates();
}
void
CWebSvcExtAddNewForAppDlg::OnOK()
{
if (UpdateData(TRUE))
{
int idx = m_combo_Applications.GetCurSel();
if (idx != -1)
{
CApplicationDependEntry * pOneEntry = NULL;
pOneEntry = (CApplicationDependEntry *) m_combo_Applications.GetItemDataPtr(idx);
m_pMySelectedApplication = pOneEntry;
}
CDialog::OnOK();
}
}
BOOL StartAddNewDialog(CWnd * pParent,CMetaInterface * pInterface,BOOL bIsLocal,CRestrictionUIEntry **pReturnedNewEntry)
{
BOOL bRet = FALSE;
CError err;
CWebSvcExtAddNewDlg dlg(bIsLocal, pInterface, pParent);
*pReturnedNewEntry = NULL;
if (dlg.DoModal() == IDOK)
{
BOOL bPleaseUpdateMetabase = FALSE;
CRestrictionList MasterRestrictionList;
CString strReturnGroupName = dlg.m_strGroupName;
BOOL bReturnedAllowStatus = dlg.m_fAllow;
// get the data from the modal dialog
// and create a new entry...
// also, add the entry to the metabase
// and update the UI
// Create a new UI entry for the UI
// if all of this is successfull...
// update the UI
CRestrictionUIEntry * pNewUIEntry = new CRestrictionUIEntry;
if (pNewUIEntry)
{
pNewUIEntry->iType = WEBSVCEXT_TYPE_REGULAR;
// this has to have the EMPTY_GROUPID_KEY part!
pNewUIEntry->strGroupID = EMPTY_GROUPID_KEY + strReturnGroupName;
pNewUIEntry->strGroupDescription = strReturnGroupName;
}
if (SUCCEEDED(LoadMasterRestrictListWithoutOldEntry(pInterface,&MasterRestrictionList,NULL)))
{
// Loop thru the restrictionlist that the had.
CRestrictionEntry * pOneEntry = NULL;
CString TheKey;
POSITION pos;
for(pos = dlg.m_MyRestrictionList.GetStartPosition();pos != NULL;)
{
dlg.m_MyRestrictionList.GetNextAssoc(pos, TheKey, (CRestrictionEntry *&) pOneEntry);
if (pOneEntry)
{
CRestrictionEntry * pNewEntry = CreateRestrictionEntry(
pOneEntry->strFileName,
bReturnedAllowStatus ? WEBSVCEXT_STATUS_ALLOWED : WEBSVCEXT_STATUS_PROHIBITED,
1,
// this has to have the EMPTY_GROUPID_KEY part!
EMPTY_GROUPID_KEY + strReturnGroupName,
strReturnGroupName,
WEBSVCEXT_TYPE_REGULAR); // user can only add regular type entries that are deletable.
if (pNewEntry)
{
// Add our new entry to the "master restrictlist"...
AddRestrictEntryToRestrictList(&MasterRestrictionList,pNewEntry);
// add it to our new UI entry
// THE KEY IS ALWAYS UPPERASE -- REMEMBER THIS!!!!!!!
CString strKey;strKey=pNewEntry->strFileName;strKey.MakeUpper();
pNewUIEntry->strlstRestrictionEntries.SetAt(strKey,pNewEntry);
bPleaseUpdateMetabase = TRUE;
}
}
}
if (bPleaseUpdateMetabase)
{
CStringListEx strlstReturned;
if (SUCCEEDED(PrepRestictionListForWrite(&MasterRestrictionList,&strlstReturned)))
{
// Write out the strlstReturned to the metabase.
if (SUCCEEDED(WriteSettingsRestrictionList(pInterface,&strlstReturned)))
{
bRet = TRUE;
}
}
}
}
if (pNewUIEntry)
{
if (bRet)
{
// if we have a new ui entry
// then pass it back
*pReturnedNewEntry = pNewUIEntry;
}
else
{
// clean this entry up
delete pNewUIEntry;
pNewUIEntry = NULL;
}
}
}
return bRet;
}
BOOL StartAddNewByAppDialog(CWnd * pParent,CMetaInterface * pInterface,BOOL bIsLocal)
{
BOOL bRet = FALSE;
CRestrictionList MasterRestrictionList;
CWebSvcExtAddNewForAppDlg dlg(bIsLocal, pInterface, pParent);
if (dlg.DoModal() != IDOK)
{
goto StartAddNewByAppDialog_Exit;
}
// Get the selected Application from the list
// that they selected.
if (NULL == dlg.m_pMySelectedApplication)
{
goto StartAddNewByAppDialog_Exit;
}
int iDesiredState = WEBSVCEXT_STATUS_ALLOWED;
BOOL bPleaseUpdateMetabase = FALSE;
CApplicationDependEntry * pOneEntry = dlg.m_pMySelectedApplication;
if (SUCCEEDED(LoadMasterRestrictListWithoutOldEntry(pInterface,&MasterRestrictionList,NULL)))
{
POSITION pos1,pos2;
CString strOneAppName;
CRestrictionEntry * pOneRestEntry = NULL;
CString TheKey;
// Loop thru the list of GROUPID's
// that they specified that they want to be enabled...
pos1 = pOneEntry->strlistGroupID.GetHeadPosition();
while (pos1)
{
strOneAppName = pOneEntry->strlistGroupID.GetNext(pos1);
// we have a GroupID,
// let's find all the entries with that entry
// and update them...
for(pos2 = MasterRestrictionList.GetStartPosition();pos2 != NULL;)
{
pOneRestEntry = NULL;
MasterRestrictionList.GetNextAssoc(pos2, TheKey, (CRestrictionEntry *&) pOneRestEntry);
if (pOneRestEntry)
{
// if the GroupID matches, then update it to desired state
if (0 == strOneAppName.Compare(pOneRestEntry->strGroupID))
{
if (WEBSVCEXT_TYPE_REGULAR == pOneRestEntry->iType)
{
if (pOneRestEntry->iStatus != iDesiredState)
{
bPleaseUpdateMetabase = TRUE;
pOneRestEntry->iStatus = iDesiredState;
}
}
}
}
}
}
//
// save the metabase info
//
if (bPleaseUpdateMetabase)
{
CStringListEx strlstReturned;
if (SUCCEEDED(PrepRestictionListForWrite(&MasterRestrictionList,&strlstReturned)))
{
// Write out the strlstReturned to the metabase.
if (SUCCEEDED(WriteSettingsRestrictionList(pInterface,&strlstReturned)))
{
bRet = TRUE;
}
}
}
//
// resync the UI with the changes.
//
}
StartAddNewByAppDialog_Exit:
return bRet;
}
CDepedentAppsDlg::CDepedentAppsDlg(
IN CStringListEx * pstrlstDependApps,
IN LPCTSTR strExtensionName,
IN CWnd * pParent OPTIONAL
)
: CDialog(CDepedentAppsDlg::IDD, pParent),m_pstrlstDependentAppList(NULL)
{
//{{AFX_DATA_INIT(CDepedentAppsDlg)
m_strExtensionName = strExtensionName;
//}}AFX_DATA_INIT
if (pstrlstDependApps){m_pstrlstDependentAppList = pstrlstDependApps;}
}
void
CDepedentAppsDlg::DoDataExchange(
IN CDataExchange * pDX
)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDepedentAppsDlg)
DDX_Control(pDX, ID_HELP, m_button_Help);
DDX_Control(pDX, IDC_DEPENDENT_APPS_LIST, m_dependent_apps_list);
//}}AFX_DATA_MAP
}
//
// Message Map
//
BEGIN_MESSAGE_MAP(CDepedentAppsDlg, CDialog)
//{{AFX_MSG_MAP(CDepedentAppsDlg)
ON_COMMAND(ID_HELP, OnHelp)
ON_WM_HELPINFO()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//
// Message Handlers
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL
CDepedentAppsDlg::OnInitDialog()
{
CString strTempString;
CString strWarn1;
CString strWarn2;
CDialog::OnInitDialog();
strTempString.Empty();
// Display the stuff that was passed to us...
if (m_pstrlstDependentAppList)
{
m_dependent_apps_list.SetRedraw(FALSE);
m_dependent_apps_list.ResetContent();
CString strOneAppNameEntry;
POSITION pos = m_pstrlstDependentAppList->GetHeadPosition();
while (pos)
{
strOneAppNameEntry = m_pstrlstDependentAppList->GetNext(pos);
// add it to the new listbox
m_dependent_apps_list.AddString(strOneAppNameEntry);
}
// Set the Backcolor to read only color.
//m_dependent_apps_list.SetBack
m_dependent_apps_list.SetRedraw(TRUE);
}
// Formulate text for the static labels..
strTempString.LoadString(IDS_APP_DEPEND_WARN1);
strWarn1.Format(strTempString,m_strExtensionName);
GetDlgItem(IDC_EDIT_WARN1)->SetWindowText(strWarn1);
if (strWarn1.GetLength() > 200)
{
::ShowScrollBar(CONTROL_HWND(IDC_EDIT_WARN1), SB_VERT, TRUE);
}
strTempString.LoadString(IDS_APP_DEPEND_WARN2);
strWarn2.Format(strTempString,m_strExtensionName);
GetDlgItem(IDC_EDIT_WARN2)->SetWindowText(strWarn2);
if (strWarn2.GetLength() > 200)
{
::ShowScrollBar(CONTROL_HWND(IDC_EDIT_WARN2), SB_VERT, TRUE);
}
CenterWindow();
MessageBeep(MB_ICONEXCLAMATION);
// Default to NO
GetDlgItem(IDCANCEL)->SetFocus();
return FALSE;
}
BOOL
CDepedentAppsDlg::OnHelpInfo(HELPINFO * pHelpInfo)
{
OnHelp();
return TRUE;
}
void
CDepedentAppsDlg::OnHelp()
{
WinHelpDebug(0x20000 + CDepedentAppsDlg::IDD);
::WinHelp(m_hWnd, theApp.m_pszHelpFilePath, HELP_CONTEXT, 0x20000 + CDepedentAppsDlg::IDD);
}
void
CDepedentAppsDlg::OnOK()
{
if (UpdateData(TRUE))
{
CDialog::OnOK();
}
}