// mimemap1.cpp : implementation file // #include "stdafx.h" #include "afxcmn.h" #include "ISAdmin.h" #include "mimemap1.h" #include "addmime.h" #include "delmime.h" #include "editmime.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // MIMEMAP1 property page IMPLEMENT_DYNCREATE(MIMEMAP1, CGenPage) MIMEMAP1::MIMEMAP1() : CGenPage(MIMEMAP1::IDD) { //{{AFX_DATA_INIT(MIMEMAP1) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_rkMimeKey = NULL; m_pmeMimeMapList = NULL; } MIMEMAP1::~MIMEMAP1() { if (m_rkMimeKey != NULL) delete(m_rkMimeKey); DeleteMimeList(); } void MIMEMAP1::DoDataExchange(CDataExchange* pDX) { CGenPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(MIMEMAP1) DDX_Control(pDX, IDC_MIMEMAPLIST1, m_lboxMimeMapList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(MIMEMAP1, CGenPage) //{{AFX_MSG_MAP(MIMEMAP1) ON_BN_CLICKED(IDC_MIMEMAPADDBUTTON, OnMimemapaddbutton) ON_BN_CLICKED(IDC_MIMEMAPREMOVEBUTTON, OnMimemapremovebutton) ON_BN_CLICKED(IDC_MIMEMAPEDITBUTTON, OnMimemapeditbutton) ON_LBN_DBLCLK(IDC_MIMEMAPLIST1, OnDblclkMimemaplist1) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // MIMEMAP1 message handlers BOOL MIMEMAP1::OnInitDialog() { CGenPage::OnInitDialog(); /* CMimeMap mimeTestMime(_T("mimetype,fileextension,imagefile,g")); CMimeMap *pmimeTestMimePtr; */ CString strNextValue; BOOL bAllocationError = FALSE; int lpiTabStops[2]; CRegValueIter *rviMimeKeys; DWORD err, ulRegType; lpiTabStops[0] = 58; lpiTabStops[1] = 191; m_ulMimeIndex = 0; m_lboxMimeMapList.SetTabStops(2,lpiTabStops); m_bMimeEntriesExist = FALSE; m_rkMimeKey = new CRegKey(*m_rkMainKey,_T("MimeMap"),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_rkMimeKey != NULL) { if (*m_rkMimeKey != NULL) { if (rviMimeKeys = new CRegValueIter(*m_rkMimeKey)) { while ((err = rviMimeKeys->Next(&strNextValue, &ulRegType)) == ERROR_SUCCESS) { if (ulRegType == REG_SZ) { if (!AddMimeEntry(strNextValue)) bAllocationError = TRUE; } } delete (rviMimeKeys); } m_bMimeEntriesExist = TRUE; } } if (!m_bMimeEntriesExist) { //Can't open registry key CString strNoMimeEntriesMsg; strNoMimeEntriesMsg.LoadString(IDS_MIMENOMIMEENTRIESMSG); AfxMessageBox(strNoMimeEntriesMsg); } if (bAllocationError) { //Error adding one or more entries CString strAllocFailMsg; strAllocFailMsg.LoadString(IDS_MIMEENTRIESALLOCFAILMSG); AfxMessageBox(strAllocFailMsg); } /* strTestString = _T("mimetype,fileextension,,g"); pmimeTestMimePtr = new CMimeMap(strTestString); strTestString = mimeTestMime; */ // 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 MIMEMAP1::OnMimemapaddbutton() { // TODO: Add your control notification handler code here if (m_bMimeEntriesExist) { CAddMime addmimeGetInfo(this); if (addmimeGetInfo.DoModal() == IDOK) { if (AddMimeEntry(addmimeGetInfo.GetFileExtension(), addmimeGetInfo.GetMimeType(), addmimeGetInfo.GetImageFile(), addmimeGetInfo.GetGopherType())) { m_bIsDirty = TRUE; SetModified(TRUE); } else { CString strAllocFailMsg; strAllocFailMsg.LoadString(IDS_MIMEENTRYALLOCFAILMSG); AfxMessageBox(strAllocFailMsg); } } } else { CString strNoMimeEntriesMsg; strNoMimeEntriesMsg.LoadString(IDS_MIMENOMIMEENTRIESMSG); AfxMessageBox(strNoMimeEntriesMsg); } } void MIMEMAP1::OnMimemapremovebutton() { // TODO: Add your control notification handler code here if (m_bMimeEntriesExist) { int iCurSel; CDelMime delmimeGetInfo(this); if ((iCurSel = m_lboxMimeMapList.GetCurSel()) != LB_ERR) { if (delmimeGetInfo.DoModal() == IDOK) { DeleteMimeMapping(iCurSel); m_bIsDirty = TRUE; SetModified(TRUE); } } else { CString strNoHighlightMsg; strNoHighlightMsg.LoadString(IDS_NOHIGHLIGHTMSG); AfxMessageBox(strNoHighlightMsg); } } else { CString strNoMimeEntriesMsg; strNoMimeEntriesMsg.LoadString(IDS_MIMENOMIMEENTRIESMSG); AfxMessageBox(strNoMimeEntriesMsg); } } void MIMEMAP1::OnMimemapeditbutton() { // TODO: Add your control notification handler code here if (m_bMimeEntriesExist) { int iCurSel; PMIME_ENTRY pmeEditEntry; if ((iCurSel = m_lboxMimeMapList.GetCurSel()) != LB_ERR) { for (pmeEditEntry = m_pmeMimeMapList;(pmeEditEntry != NULL) && (m_lboxMimeMapList.GetItemData(iCurSel) != pmeEditEntry->iListIndex); pmeEditEntry = pmeEditEntry->NextPtr) ; ASSERT (pmeEditEntry != NULL); CEditMime editmimeGetInfo(this, pmeEditEntry->mimeData->GetFileExtension(), pmeEditEntry->mimeData->GetMimeType(), pmeEditEntry->mimeData->GetImageFile(), pmeEditEntry->mimeData->GetGopherType()); if (editmimeGetInfo.DoModal() == IDOK) { if (EditMimeMapping(iCurSel, pmeEditEntry, editmimeGetInfo.GetFileExtension(), editmimeGetInfo.GetMimeType(), editmimeGetInfo.GetImageFile(), editmimeGetInfo.GetGopherType() )) { m_bIsDirty = TRUE; SetModified(TRUE); } else { CString strEditErrorMsg; strEditErrorMsg.LoadString(IDS_MIMEEDITERRORMSG); AfxMessageBox(strEditErrorMsg); } } } else { CString strNoHighlightMsg; strNoHighlightMsg.LoadString(IDS_NOHIGHLIGHTMSG); AfxMessageBox(strNoHighlightMsg); } } else { CString strNoMimeEntriesMsg; strNoMimeEntriesMsg.LoadString(IDS_MIMENOMIMEENTRIESMSG); AfxMessageBox(strNoMimeEntriesMsg); } } void MIMEMAP1::OnDblclkMimemaplist1() { // TODO: Add your control notification handler code here OnMimemapeditbutton(); } //////////////////////////////////////////////////////////////////////////////// // Other Functions void MIMEMAP1::SaveInfo() { PMIME_ENTRY pmeSaveEntry; CString strDummyValue(_T("")); if (m_bIsDirty) { for (pmeSaveEntry = m_pmeMimeMapList;(pmeSaveEntry != NULL); pmeSaveEntry = pmeSaveEntry->NextPtr) { if (pmeSaveEntry->DeleteCurrent) { m_rkMimeKey->DeleteValue(pmeSaveEntry->mimeData->GetPrevMimeMap()); pmeSaveEntry->DeleteCurrent = FALSE; } if (pmeSaveEntry->WriteNew) { m_rkMimeKey->SetValue(*(pmeSaveEntry->mimeData), strDummyValue); pmeSaveEntry->mimeData->SetPrevMimeMap(); pmeSaveEntry->WriteNew = FALSE; } } } CGenPage::SaveInfo(); } //This version is called for existing entries BOOL MIMEMAP1::AddMimeEntry(CString &strNewMimeMap) { PMIME_ENTRY pmeNewEntry; int iCurSel; BOOL bretcode = FALSE; if ((pmeNewEntry = new MIME_ENTRY) != NULL) { if ((pmeNewEntry->mimeData = new CMimeMap(strNewMimeMap)) != NULL) { iCurSel = m_lboxMimeMapList.AddString(pmeNewEntry->mimeData->GetDisplayString()); if ((iCurSel != LB_ERR) && (iCurSel != LB_ERRSPACE)) { pmeNewEntry->DeleteCurrent = FALSE; pmeNewEntry->WriteNew = FALSE; m_lboxMimeMapList.SetItemData(iCurSel,m_ulMimeIndex); pmeNewEntry->iListIndex = m_ulMimeIndex++; pmeNewEntry->NextPtr = m_pmeMimeMapList; m_pmeMimeMapList = pmeNewEntry; bretcode = TRUE; } else { delete (pmeNewEntry->mimeData); delete (pmeNewEntry); } } else delete (pmeNewEntry); } return (bretcode); } // This version is called for new entries so set the write flag. BOOL MIMEMAP1::AddMimeEntry(LPCTSTR pchFileExtension, LPCTSTR pchMimeType, LPCTSTR pchImageFile, LPCTSTR pchGoperType) { PMIME_ENTRY pmeNewEntry; int iCurSel; BOOL bretcode = FALSE; if ((pmeNewEntry = new MIME_ENTRY) != NULL) { if ((pmeNewEntry->mimeData = new CMimeMap(pchFileExtension, pchMimeType, pchImageFile, pchGoperType)) != NULL) { iCurSel = m_lboxMimeMapList.AddString(pmeNewEntry->mimeData->GetDisplayString()); if ((iCurSel != LB_ERR) && (iCurSel != LB_ERRSPACE)) { pmeNewEntry->DeleteCurrent = FALSE; pmeNewEntry->WriteNew = TRUE; m_lboxMimeMapList.SetItemData(iCurSel,m_ulMimeIndex); m_lboxMimeMapList.SetCurSel(iCurSel); pmeNewEntry->iListIndex = m_ulMimeIndex++; pmeNewEntry->NextPtr = m_pmeMimeMapList; m_pmeMimeMapList = pmeNewEntry; bretcode = TRUE; } else { delete (pmeNewEntry->mimeData); delete (pmeNewEntry); } } else delete (pmeNewEntry); } return (bretcode); } void MIMEMAP1::DeleteMimeList() { PMIME_ENTRY pmeCurEntry; while (m_pmeMimeMapList != NULL) { delete (m_pmeMimeMapList->mimeData); pmeCurEntry = m_pmeMimeMapList; m_pmeMimeMapList = m_pmeMimeMapList->NextPtr; delete (pmeCurEntry); } } void MIMEMAP1::DeleteMimeMapping(int iCurSel) { PMIME_ENTRY pmeDelEntry; for (pmeDelEntry = m_pmeMimeMapList;(pmeDelEntry != NULL) && (m_lboxMimeMapList.GetItemData(iCurSel) != pmeDelEntry->iListIndex); pmeDelEntry = pmeDelEntry->NextPtr) ; ASSERT (pmeDelEntry != NULL); if (pmeDelEntry->mimeData->PrevMimeMapExists()) pmeDelEntry->DeleteCurrent = TRUE; pmeDelEntry->WriteNew = FALSE; m_lboxMimeMapList.DeleteString(iCurSel); } BOOL MIMEMAP1::EditMimeMapping(int iCurSel, PMIME_ENTRY pmeEditEntry, LPCTSTR pchFileExtension, LPCTSTR pchMimeType, LPCTSTR pchImageFile, LPCTSTR pchGopherType) { BOOL bretcode = FALSE; pmeEditEntry->mimeData->SetFileExtension(pchFileExtension); pmeEditEntry->mimeData->SetMimeType(pchMimeType); pmeEditEntry->mimeData->SetImageFile(pchImageFile); pmeEditEntry->mimeData->SetGopherType(pchGopherType); m_lboxMimeMapList.DeleteString(iCurSel); // Delete first so memory is freed iCurSel = m_lboxMimeMapList.AddString(pmeEditEntry->mimeData->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_lboxMimeMapList.SetItemData(iCurSel,pmeEditEntry->iListIndex); if (pmeEditEntry->mimeData->PrevMimeMapExists()) pmeEditEntry->DeleteCurrent = TRUE; pmeEditEntry->WriteNew = TRUE; bretcode = TRUE; } return (bretcode); }