Index: src/ch/CustomCopyDlg.cpp =================================================================== diff -u -re912e0a6b456c2eed24bec7303a908d3ff0aa59a -r09d557ffefb1dd57e7606695e16c3151e42285f2 --- src/ch/CustomCopyDlg.cpp (.../CustomCopyDlg.cpp) (revision e912e0a6b456c2eed24bec7303a908d3ff0aa59a) +++ src/ch/CustomCopyDlg.cpp (.../CustomCopyDlg.cpp) (revision 09d557ffefb1dd57e7606695e16c3151e42285f2) @@ -242,7 +242,7 @@ lvc.cx=static_cast<int>(0.1*rc.Width()); m_ctlFilters.InsertColumn(6, &lvc); - m_bFilters=!!m_ccData.m_afFilters.GetSize(); + m_bFilters = !m_ccData.m_afFilters.IsEmpty(); // other custom flags m_bAdvanced=(m_ccData.m_bIgnoreFolders | m_ccData.m_bCreateStructure); @@ -341,8 +341,12 @@ // refresh the entries in filters' list m_ctlFilters.DeleteAllItems(); - for (int i=0;i<m_ccData.m_afFilters.GetSize();i++) - AddFilter(m_ccData.m_afFilters.GetAt(i), i); + for (size_t i=0;i<m_ccData.m_afFilters.GetSize();i++) + { + const CFileFilter* pFilter = m_ccData.m_afFilters.GetAt(i); + if(pFilter) + AddFilter(*pFilter, i); + } } void CCustomCopyDlg::OnAddDirectoryButton() @@ -526,12 +530,17 @@ { CFilterDlg dlg; CString strData; - for (int i=0;i<m_ccData.m_afFilters.GetSize();i++) + for (size_t i=0;i<m_ccData.m_afFilters.GetSize();i++) { - if (m_ccData.m_afFilters.GetAt(i).m_bUseMask) - dlg.m_astrAddMask.Add(m_ccData.m_afFilters.GetAt(i).GetCombinedMask(strData)); - if (m_ccData.m_afFilters.GetAt(i).m_bUseExcludeMask) - dlg.m_astrAddExcludeMask.Add(m_ccData.m_afFilters.GetAt(i).GetCombinedExcludeMask(strData)); + const CFileFilter* pFilter = m_ccData.m_afFilters.GetAt(i); + BOOST_ASSERT(pFilter); + if(pFilter) + { + if(pFilter->m_bUseMask) + dlg.m_astrAddMask.Add(pFilter->GetCombinedMask(strData)); + if(pFilter->m_bUseExcludeMask) + dlg.m_astrAddExcludeMask.Add(pFilter->GetCombinedExcludeMask(strData)); + } } if (dlg.DoModal() == IDOK) @@ -749,28 +758,36 @@ { int iItem=m_ctlFilters.GetNextSelectedItem(pos); CFilterDlg dlg; - dlg.m_ffFilter=m_ccData.m_afFilters.GetAt(iItem); + const CFileFilter* pFilter = m_ccData.m_afFilters.GetAt(iItem); + BOOST_ASSERT(pFilter); + if(pFilter) + dlg.m_ffFilter = *pFilter; CString strData; - for (int i=0;i<m_ccData.m_afFilters.GetSize();i++) + for (size_t i=0;i<m_ccData.m_afFilters.GetSize();i++) { - if (m_ccData.m_afFilters.GetAt(i).m_bUseMask && i != iItem) - dlg.m_astrAddMask.Add(m_ccData.m_afFilters.GetAt(i).GetCombinedMask(strData)); - if (m_ccData.m_afFilters.GetAt(i).m_bUseExcludeMask && i != iItem) - dlg.m_astrAddExcludeMask.Add(m_ccData.m_afFilters.GetAt(i).GetCombinedExcludeMask(strData)); + pFilter = m_ccData.m_afFilters.GetAt(i); + BOOST_ASSERT(pFilter); + if(pFilter) + { + if (pFilter->m_bUseMask && i != iItem) + dlg.m_astrAddMask.Add(pFilter->GetCombinedMask(strData)); + if (pFilter->m_bUseExcludeMask && i != iItem) + dlg.m_astrAddExcludeMask.Add(pFilter->GetCombinedExcludeMask(strData)); + } } if (dlg.DoModal() == IDOK) { // delete old element m_ctlFilters.DeleteItem(iItem); - m_ccData.m_afFilters.RemoveAt(iItem); + //m_ccData.m_afFilters.RemoveAt(iItem); // insert new if needed if (dlg.m_ffFilter.m_bUseMask || dlg.m_ffFilter.m_bUseExcludeMask || dlg.m_ffFilter.m_bUseSize || dlg.m_ffFilter.m_bUseDate || dlg.m_ffFilter.m_bUseAttributes) { - m_ccData.m_afFilters.InsertAt(iItem, dlg.m_ffFilter); + m_ccData.m_afFilters.SetAt(iItem, dlg.m_ffFilter); AddFilter(dlg.m_ffFilter, iItem); } } Index: src/ch/FileFilter.cpp =================================================================== diff -u -r52e4374b1e7044f77439e34581780750675125a7 -r09d557ffefb1dd57e7606695e16c3151e42285f2 --- src/ch/FileFilter.cpp (.../FileFilter.cpp) (revision 52e4374b1e7044f77439e34581780750675125a7) +++ src/ch/FileFilter.cpp (.../FileFilter.cpp) (revision 09d557ffefb1dd57e7606695e16c3151e42285f2) @@ -552,15 +552,27 @@ } } +CFiltersArray& CFiltersArray::operator=(const CFiltersArray& rSrc) +{ + if(this != &rSrc) + { + m_vFilters = rSrc.m_vFilters; + } + + return *this; +} + bool CFiltersArray::Match(const CFileInfo& rInfo) const { - if (GetSize() == 0) + if(m_vFilters.empty()) return true; // if only one of the filters matches - return true - for (int i=0;i<GetSize();i++) - if (GetAt(i).Match(rInfo)) + for(std::vector<CFileFilter>::const_iterator iterFilter = m_vFilters.begin(); iterFilter != m_vFilters.end(); iterFilter++) + { + if((*iterFilter).Match(rInfo)) return true; + } return false; } @@ -569,21 +581,74 @@ { if (ar.is_storing()) { - ar<<GetSize(); - for (int i=0;i<GetSize();i++) - GetAt(i).Serialize(ar); + ar<< m_vFilters.size(); + for(std::vector<CFileFilter>::iterator iterFilter = m_vFilters.begin(); iterFilter != m_vFilters.end(); iterFilter++) + { + (*iterFilter).Serialize(ar); + } } else { - int iSize; + m_vFilters.clear(); + + size_t stSize; CFileFilter ff; - ar>>iSize; - SetSize(iSize); - for (int i=0;i<iSize;i++) + ar >> stSize; + m_vFilters.reserve(stSize); + while(stSize--) { ff.Serialize(ar); - SetAt(i, ff); + m_vFilters.push_back(ff); } } } + +bool CFiltersArray::IsEmpty() const +{ + return m_vFilters.empty(); +} + +void CFiltersArray::Add(const CFileFilter& rFilter) +{ + m_vFilters.push_back(rFilter); +} + +bool CFiltersArray::SetAt(size_t stIndex, const CFileFilter& rNewFilter) +{ + BOOST_ASSERT(stIndex < m_vFilters.size()); + if(stIndex < m_vFilters.size()) + { + CFileFilter& rFilter = m_vFilters.at(stIndex); + rFilter = rNewFilter; + return true; + } + else + return false; +} + +const CFileFilter* CFiltersArray::GetAt(size_t stIndex) const +{ + BOOST_ASSERT(stIndex < m_vFilters.size()); + if(stIndex < m_vFilters.size()) + return &m_vFilters.at(stIndex); + else + return NULL; +} + +bool CFiltersArray::RemoveAt(size_t stIndex) +{ + BOOST_ASSERT(stIndex < m_vFilters.size()); + if(stIndex < m_vFilters.size()) + { + m_vFilters.erase(m_vFilters.begin() + stIndex); + return true; + } + else + return false; +} + +size_t CFiltersArray::GetSize() const +{ + return m_vFilters.size(); +} Index: src/ch/FileFilter.h =================================================================== diff -u -r52e4374b1e7044f77439e34581780750675125a7 -r09d557ffefb1dd57e7606695e16c3151e42285f2 --- src/ch/FileFilter.h (.../FileFilter.h) (revision 52e4374b1e7044f77439e34581780750675125a7) +++ src/ch/FileFilter.h (.../FileFilter.h) (revision 09d557ffefb1dd57e7606695e16c3151e42285f2) @@ -98,11 +98,25 @@ int m_iDirectory; }; -class CFiltersArray : public CArray<CFileFilter, CFileFilter> +class CFiltersArray { public: + CFiltersArray() {} + ~CFiltersArray() {} + + CFiltersArray& operator=(const CFiltersArray& rSrc); bool Match(const CFileInfo& rInfo) const; void Serialize(icpf::archive& ar); + bool IsEmpty() const; + + void Add(const CFileFilter& rFilter); + bool SetAt(size_t stIndex, const CFileFilter& rNewFilter); + const CFileFilter* GetAt(size_t stIndex) const; + bool RemoveAt(size_t stIndex); + size_t GetSize() const; + +protected: + std::vector<CFileFilter> m_vFilters; }; #endif \ No newline at end of file Index: src/ch/MainWnd.cpp =================================================================== diff -u -re912e0a6b456c2eed24bec7303a908d3ff0aa59a -r09d557ffefb1dd57e7606695e16c3151e42285f2 --- src/ch/MainWnd.cpp (.../MainWnd.cpp) (revision e912e0a6b456c2eed24bec7303a908d3ff0aa59a) +++ src/ch/MainWnd.cpp (.../MainWnd.cpp) (revision 09d557ffefb1dd57e7606695e16c3151e42285f2) @@ -1753,7 +1753,7 @@ iPriority=dlg.m_ccData.m_iPriority; strDstPath=dlg.m_ccData.m_strDestPath; bsSizes=dlg.m_ccData.m_bsSizes; - ffFilters.Copy(dlg.m_ccData.m_afFilters); + ffFilters = dlg.m_ccData.m_afFilters; bIgnoreDirs=dlg.m_ccData.m_bIgnoreFolders; bForceDirectories=dlg.m_ccData.m_bForceDirectories; bOnlyCreate=dlg.m_ccData.m_bCreateStructure; Index: src/ch/Structs.cpp =================================================================== diff -u -re912e0a6b456c2eed24bec7303a908d3ff0aa59a -r09d557ffefb1dd57e7606695e16c3151e42285f2 --- src/ch/Structs.cpp (.../Structs.cpp) (revision e912e0a6b456c2eed24bec7303a908d3ff0aa59a) +++ src/ch/Structs.cpp (.../Structs.cpp) (revision 09d557ffefb1dd57e7606695e16c3151e42285f2) @@ -939,13 +939,13 @@ else if ((m_nStatus & ST_OPERATION_MASK) == ST_COPY ) { _tcscat(pData->m_szStatusText, GetResManager()->LoadString(IDS_STATUS0_STRING+1)); - if (m_afFilters.GetSize()) + if(!m_afFilters.IsEmpty()) _tcscat(pData->m_szStatusText, GetResManager()->LoadString(IDS_FILTERING_STRING)); } else if ( (m_nStatus & ST_OPERATION_MASK) == ST_MOVE ) { _tcscat(pData->m_szStatusText, GetResManager()->LoadString(IDS_STATUS0_STRING+2)); - if (m_afFilters.GetSize()) + if(!m_afFilters.IsEmpty()) _tcscat(pData->m_szStatusText, GetResManager()->LoadString(IDS_FILTERING_STRING)); } else @@ -1052,8 +1052,12 @@ void CTask::SetFilters(const CFiltersArray* pFilters) { + BOOST_ASSERT(pFilters); + if(!pFilters) + return; + m_cs.Lock(); - m_afFilters.Copy(*pFilters); + m_afFilters = *pFilters; m_cs.Unlock(); }