windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/itools/isadmin/scrmap1.cpp
2020-09-26 16:20:57 +08:00

350 lines
9.4 KiB
C++

// scrmap1.cpp : implementation file
//
#include "stdafx.h"
#include "ISAdmin.h"
#include "scrmap1.h"
#include "scripmap.h"
#include "addscrip.h"
#include "editscri.h"
#include "delscrip.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// ScrMap1 property page
IMPLEMENT_DYNCREATE(ScrMap1, CGenPage)
ScrMap1::ScrMap1() : CGenPage(ScrMap1::IDD)
{
//{{AFX_DATA_INIT(ScrMap1)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_rkScriptKey = NULL;
m_pseScriptMapList = NULL;
}
ScrMap1::~ScrMap1()
{
if (m_rkScriptKey != NULL)
delete(m_rkScriptKey);
DeleteScriptList();
}
void ScrMap1::DoDataExchange(CDataExchange* pDX)
{
CGenPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(ScrMap1)
DDX_Control(pDX, IDC_SCRIPTMAPLISTBOX, m_lboxScriptMap);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(ScrMap1, CGenPage)
//{{AFX_MSG_MAP(ScrMap1)
ON_BN_CLICKED(IDC_SCRIPTMAPADDBUTTON, OnScriptmapaddbutton)
ON_BN_CLICKED(IDC_SCRIPTMAPEDITBUTTON, OnScriptmapeditbutton)
ON_BN_CLICKED(IDC_SCRIPTMAPREMOVEBUTTON, OnScriptmapremovebutton)
ON_LBN_DBLCLK(IDC_SCRIPTMAPLISTBOX, OnDblclkScriptmaplistbox)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// ScrMap1 message handlers
BOOL ScrMap1::OnInitDialog()
{
CGenPage::OnInitDialog();
CString strNextValueName, strNextValue;
BOOL bAllocationError = FALSE;
CRegValueIter *rviScriptKeys;
DWORD err, ulRegType;
m_ulScriptIndex = 0;
BOOL bReadError = FALSE;
int iTabSpacing = 58;
m_lboxScriptMap.SetTabStops(iTabSpacing);
m_bScriptEntriesExist = FALSE;
m_rkScriptKey = new CRegKey(*m_rkMainKey,_T("Script Map"),REGISTRY_ACCESS_RIGHTS);
// Anything under this key should be a mime mapping.
// No way to verify that, but non-string entries are invalid
// so ignore them.
if (m_rkScriptKey != NULL) {
if (*m_rkScriptKey != NULL) {
if (rviScriptKeys = new CRegValueIter(*m_rkScriptKey)) {
while ((err = rviScriptKeys->Next(&strNextValueName, &ulRegType)) == ERROR_SUCCESS) {
if (ulRegType == REG_SZ) {
if (m_rkScriptKey->QueryValue(strNextValueName, strNextValue) == 0) {
if (!AddScriptEntry(strNextValueName, strNextValue, TRUE))
bAllocationError = TRUE;
}
else {
bReadError = TRUE;
}
}
}
delete (rviScriptKeys);
}
m_bScriptEntriesExist = TRUE;
}
}
if (!m_bScriptEntriesExist) { //Can't open registry key
CString strNoScriptEntriesMsg;
strNoScriptEntriesMsg.LoadString(IDS_SCRIPTNOSCRIPTENTRIESMSG);
AfxMessageBox(strNoScriptEntriesMsg);
}
if (bAllocationError) { //Error adding one or more entries
CString strAllocFailMsg;
strAllocFailMsg.LoadString(IDS_SCRIPTENTRIESALLOCFAILMSG);
AfxMessageBox(strAllocFailMsg);
}
if (bReadError) { //Error reading one or more entries
CString strReadErrorMsg;
strReadErrorMsg.LoadString(IDS_SCRIPTREADERRORMSG);
AfxMessageBox(strReadErrorMsg);
}
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void ScrMap1::OnScriptmapaddbutton()
{
// TODO: Add your control notification handler code here
if (m_bScriptEntriesExist) {
CAddScript addscriptGetInfo(this);
if (addscriptGetInfo.DoModal() == IDOK) {
if (AddScriptEntry(addscriptGetInfo.GetFileExtension(), addscriptGetInfo.GetScriptMap(),FALSE)) {
m_bIsDirty = TRUE;
SetModified(TRUE);
}
else {
CString strAllocFailMsg;
strAllocFailMsg.LoadString(IDS_SCRIPTENTRYALLOCFAILMSG);
AfxMessageBox(strAllocFailMsg);
}
}
}
else {
CString strNoScriptEntriesMsg;
strNoScriptEntriesMsg.LoadString(IDS_SCRIPTNOSCRIPTENTRIESMSG);
AfxMessageBox(strNoScriptEntriesMsg);
}
}
void ScrMap1::OnScriptmapeditbutton()
{
// TODO: Add your control notification handler code here
if (m_bScriptEntriesExist) {
int iCurSel;
PSCRIPT_ENTRY pseEditEntry;
if ((iCurSel = m_lboxScriptMap.GetCurSel()) != LB_ERR) {
for (pseEditEntry = m_pseScriptMapList;(pseEditEntry != NULL) &&
(m_lboxScriptMap.GetItemData(iCurSel) != pseEditEntry->iListIndex);
pseEditEntry = pseEditEntry->NextPtr)
;
ASSERT (pseEditEntry != NULL);
CEditScript editscriptGetInfo(this,
pseEditEntry->scriptData->GetFileExtension(),
pseEditEntry->scriptData->GetScriptMap());
if (editscriptGetInfo.DoModal() == IDOK) {
if (EditScriptMapping(iCurSel,
pseEditEntry,
editscriptGetInfo.GetFileExtension(),
editscriptGetInfo.GetScriptMap())) {
m_bIsDirty = TRUE;
SetModified(TRUE);
}
else {
CString strEditErrorMsg;
strEditErrorMsg.LoadString(IDS_SCRIPTEDITERRORMSG);
AfxMessageBox(strEditErrorMsg);
}
}
}
else {
CString strNoHighlightMsg;
strNoHighlightMsg.LoadString(IDS_NOHIGHLIGHTMSG);
AfxMessageBox(strNoHighlightMsg);
}
}
else {
CString strNoScriptEntriesMsg;
strNoScriptEntriesMsg.LoadString(IDS_SCRIPTNOSCRIPTENTRIESMSG);
AfxMessageBox(strNoScriptEntriesMsg);
}
}
void ScrMap1::OnScriptmapremovebutton()
{
// TODO: Add your control notification handler code here
if (m_bScriptEntriesExist) {
int iCurSel;
CDelScript delscriptGetInfo(this);
if ((iCurSel = m_lboxScriptMap.GetCurSel()) != LB_ERR) {
if (delscriptGetInfo.DoModal() == IDOK) {
DeleteScriptMapping(iCurSel);
m_bIsDirty = TRUE;
SetModified(TRUE);
}
}
else {
CString strNoHighlightMsg;
strNoHighlightMsg.LoadString(IDS_NOHIGHLIGHTMSG);
AfxMessageBox(strNoHighlightMsg);
}
}
else {
CString strNoScriptEntriesMsg;
strNoScriptEntriesMsg.LoadString(IDS_SCRIPTNOSCRIPTENTRIESMSG);
AfxMessageBox(strNoScriptEntriesMsg);
}
}
void ScrMap1::OnDblclkScriptmaplistbox()
{
// TODO: Add your control notification handler code here
OnScriptmapeditbutton();
}
////////////////////////////////////////////////////////////////////////
// Other Functions
void ScrMap1::SaveInfo()
{
PSCRIPT_ENTRY pseSaveEntry;
CString strTempValue;
if (m_bIsDirty) {
for (pseSaveEntry = m_pseScriptMapList;(pseSaveEntry != NULL); pseSaveEntry = pseSaveEntry->NextPtr) {
if (pseSaveEntry->DeleteCurrent) {
m_rkScriptKey->DeleteValue(pseSaveEntry->scriptData->GetPrevFileExtension());
pseSaveEntry->DeleteCurrent = FALSE;
}
if (pseSaveEntry->WriteNew) {
strTempValue = pseSaveEntry->scriptData->GetScriptMap();
m_rkScriptKey->SetValue(pseSaveEntry->scriptData->GetFileExtension(), strTempValue);
pseSaveEntry->scriptData->SetPrevFileExtension();
pseSaveEntry->WriteNew = FALSE;
}
}
}
CGenPage::SaveInfo();
}
BOOL ScrMap1::AddScriptEntry(LPCTSTR pchFileExtension, LPCTSTR pchScriptMap, BOOL bExistingEntry)
{
PSCRIPT_ENTRY pseNewEntry;
int iCurSel;
BOOL bretcode = FALSE;
if ((pseNewEntry = new SCRIPT_ENTRY) != NULL) {
if ((pseNewEntry->scriptData = new CScriptMap(pchFileExtension, pchScriptMap, bExistingEntry)) != NULL) {
iCurSel = m_lboxScriptMap.AddString(pseNewEntry->scriptData->GetDisplayString());
if ((iCurSel != LB_ERR) && (iCurSel != LB_ERRSPACE)) {
pseNewEntry->DeleteCurrent = FALSE;
pseNewEntry->WriteNew = TRUE;
m_lboxScriptMap.SetItemData(iCurSel,m_ulScriptIndex);
m_lboxScriptMap.SetCurSel(iCurSel);
pseNewEntry->iListIndex = m_ulScriptIndex++;
pseNewEntry->NextPtr = m_pseScriptMapList;
m_pseScriptMapList = pseNewEntry;
bretcode = TRUE;
}
else {
delete (pseNewEntry->scriptData);
delete (pseNewEntry);
}
}
else
delete (pseNewEntry);
}
return (bretcode);
}
void ScrMap1::DeleteScriptList()
{
PSCRIPT_ENTRY pseCurEntry;
while (m_pseScriptMapList != NULL) {
delete (m_pseScriptMapList->scriptData);
pseCurEntry = m_pseScriptMapList;
m_pseScriptMapList = m_pseScriptMapList->NextPtr;
delete (pseCurEntry);
}
}
void ScrMap1::DeleteScriptMapping(int iCurSel)
{
PSCRIPT_ENTRY pseDelEntry;
for (pseDelEntry = m_pseScriptMapList;(pseDelEntry != NULL) &&
(m_lboxScriptMap.GetItemData(iCurSel) != pseDelEntry->iListIndex);
pseDelEntry = pseDelEntry->NextPtr)
;
ASSERT (pseDelEntry != NULL);
if (pseDelEntry->scriptData->PrevScriptMapExists())
pseDelEntry->DeleteCurrent = TRUE;
pseDelEntry->WriteNew = FALSE;
m_lboxScriptMap.DeleteString(iCurSel);
}
BOOL ScrMap1::EditScriptMapping(int iCurSel,
PSCRIPT_ENTRY pseEditEntry,
LPCTSTR pchFileExtension,
LPCTSTR pchScriptMap)
{
BOOL bretcode = FALSE;
pseEditEntry->scriptData->SetFileExtension(pchFileExtension);
pseEditEntry->scriptData->SetScriptMap(pchScriptMap);
m_lboxScriptMap.DeleteString(iCurSel); // Delete first so memory is freed
iCurSel = m_lboxScriptMap.AddString(pseEditEntry->scriptData->GetDisplayString());
// There error case on this is incredibly rare, so don't bother saving and restoring the above fields
// Just don't set flags so registry is not updated.
if ((iCurSel != LB_ERR) && (iCurSel != LB_ERRSPACE)) {
m_lboxScriptMap.SetItemData(iCurSel,pseEditEntry->iListIndex);
if (pseEditEntry->scriptData->PrevScriptMapExists())
pseEditEntry->DeleteCurrent = TRUE;
pseEditEntry->WriteNew = TRUE;
bretcode = TRUE;
}
return (bretcode);
}