Index: src/libchcore/TTaskConfigTracker.cpp =================================================================== diff -u -N -r8a2ff3b2b71b45fb525e030167e62f316cb32869 -ra4635addad389b9e117679437a3e1b64a739ea96 --- src/libchcore/TTaskConfigTracker.cpp (.../TTaskConfigTracker.cpp) (revision 8a2ff3b2b71b45fb525e030167e62f316cb32869) +++ src/libchcore/TTaskConfigTracker.cpp (.../TTaskConfigTracker.cpp) (revision a4635addad389b9e117679437a3e1b64a739ea96) @@ -1,256 +1,256 @@ -// ============================================================================ -// Copyright (C) 2001-2010 by Jozef Starosczyk -// ixen@copyhandler.com -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU Library General Public License -// (version 2) as published by the Free Software Foundation; -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU Library General Public -// License along with this program; if not, write to the -// Free Software Foundation, Inc., -// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// ============================================================================ -/// @file TTaskConfigTracker.cpp -/// @date 2010/10/04 -/// @brief Contains implementation of TTaskConfigTracker class. -// ============================================================================ -#include "stdafx.h" -#include "TTaskConfigTracker.h" -#include "TCoreException.h" -#include "ErrorCodes.h" -#include "TStringSet.h" -#include - -namespace chcore -{ - TOptionsSet& TOptionsSet::operator%(ETaskOptions eOption) - { - m_setOptions.insert(eOption); - - return *this; - } - - std::set& TOptionsSet::Get() - { - return m_setOptions; - } - - TTaskConfigTracker::TTaskConfigTracker() - { - } - - TTaskConfigTracker::~TTaskConfigTracker() - { - } - - bool TTaskConfigTracker::IsModified() const - { - boost::shared_lock lock(m_lock); - return !m_setModified.empty(); - } - - bool TTaskConfigTracker::IsModified(ETaskOptions eOption) const - { - boost::shared_lock lock(m_lock); - return m_setModified.find(eOption) != m_setModified.end(); - } - - bool TTaskConfigTracker::IsModified(TOptionsSet setOptions) const - { - boost::shared_lock lock(m_lock); - - std::set setCommon; - std::set_intersection(setOptions.Get().begin(), setOptions.Get().end(), m_setModified.begin(), m_setModified.end(), std::inserter(setCommon, setCommon.begin())); - - return !setCommon.empty(); - } - - bool TTaskConfigTracker::IsModified(ETaskOptions eOption, bool bResetModificationState) - { - boost::upgrade_lock lock(m_lock); - - std::set::iterator iterOption = m_setModified.find(eOption); - bool bModified = (iterOption != m_setModified.end()); - if (bModified && bResetModificationState) - { - boost::upgrade_to_unique_lock upgraded_lock(lock); - m_setModified.erase(iterOption); - } - - return bModified; - } - - bool TTaskConfigTracker::IsModified(TOptionsSet setOptions, bool bResetModificationState) - { - boost::upgrade_lock lock(m_lock); - - std::set setCommon; - std::set_intersection(setOptions.Get().begin(), setOptions.Get().end(), m_setModified.begin(), m_setModified.end(), std::inserter(setCommon, setCommon.begin())); - - bool bModified = !setCommon.empty(); - if (bModified && bResetModificationState) - { - boost::upgrade_to_unique_lock upgraded_lock(lock); - std::set::iterator iterOption; - for(ETaskOptions eOption : setCommon) - { - iterOption = m_setModified.find(eOption); - if (iterOption != m_setModified.end()) - m_setModified.erase(iterOption); - } - } - - return bModified; - } - - void TTaskConfigTracker::AddModified(const TString& strModified) - { - ETaskOptions eOption = TTaskConfigTracker::GetOptionFromString(strModified); - - boost::unique_lock lock(m_lock); - - m_setModified.insert(eOption); - } - - void TTaskConfigTracker::AddModified(ETaskOptions eModified) - { - boost::unique_lock lock(m_lock); - m_setModified.insert(eModified); - } - - void TTaskConfigTracker::AddModified(TOptionsSet setOptions) - { - boost::unique_lock lock(m_lock); - m_setModified.insert(setOptions.Get().begin(), setOptions.Get().end()); - } - - void TTaskConfigTracker::AddModified(const TStringSet& setModified) - { - TStringSet::const_iterator iterBegin = setModified.Begin(); - TStringSet::const_iterator iterEnd = setModified.End(); - - for (; iterBegin != iterEnd; ++iterBegin) - { - AddModified(*iterBegin); - } - } - - void TTaskConfigTracker::AddModified(const std::set& setModified) - { - boost::unique_lock lock(m_lock); - - m_setModified.insert(setModified.begin(), setModified.end()); - } - - void TTaskConfigTracker::RemoveModification(ETaskOptions eModified) - { - boost::upgrade_lock lock(m_lock); - std::set::iterator iterOption = m_setModified.find(eModified); - if (iterOption != m_setModified.end()) - { - boost::upgrade_to_unique_lock upgraded_lock(lock); - m_setModified.erase(iterOption); - } - } - - void TTaskConfigTracker::RemoveModificationSet(TOptionsSet setOptions) - { - boost::unique_lock lock(m_lock); - - std::set setCommon; - std::set_intersection(setOptions.Get().begin(), setOptions.Get().end(), m_setModified.begin(), m_setModified.end(), std::inserter(setCommon, setCommon.begin())); - - std::set::iterator iterOption; - for(ETaskOptions eOption : setCommon) - { - iterOption = m_setModified.find(eOption); - if (iterOption != m_setModified.end()) - m_setModified.erase(iterOption); - } - } - - void TTaskConfigTracker::RemoveModification(const TString& strModified) - { - ETaskOptions eOption = TTaskConfigTracker::GetOptionFromString(strModified); - RemoveModification(eOption); - } - - void TTaskConfigTracker::Clear() - { - boost::unique_lock lock(m_lock); - m_setModified.clear(); - } - - void TTaskConfigTracker::NotificationProc(const TStringSet& setModifications, void* pParam) - { - if (!pParam) - throw TCoreException(eErr_InvalidArgument, L"pParam", LOCATION); - - TTaskConfigTracker* pTracker = (TTaskConfigTracker*)pParam; - pTracker->AddModified(setModifications); - } - - ETaskOptions TTaskConfigTracker::GetOptionFromString(const TString& strOption) - { - if (strOption == TaskPropData::GetPropertyName()) - return eTO_UseOnlyDefaultBuffer; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_DefaultBufferSize; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_OneDiskBufferSize; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_TwoDisksBufferSize; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_CDBufferSize; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_LANBufferSize; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_DisableBuffering; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_DisableBufferingMinSize; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_BufferQueueDepth; - - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_SetDestinationAttributes; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_SetDestinationDateTime; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_ProtectReadOnlyFiles; - else if(strOption == TaskPropData::GetPropertyName()) - return eTO_ScanDirectoriesBeforeBlocking; - else if(strOption == TaskPropData::GetPropertyName()) - return eTO_FastMoveBeforeBlocking; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_ThreadPriority; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_DisablePriorityBoost; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_DeleteInSeparateSubTask; - - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_CreateEmptyFiles; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_CreateDirectoriesRelativeToRoot; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_IgnoreDirectories; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_AlternateFilenameFormatString_AfterFirst; - else if (strOption == TaskPropData::GetPropertyName()) - return eTO_AlternateFilenameFormatString_First; - else - { - BOOST_ASSERT(false); // unhandled case - throw TCoreException(eErr_UnhandledCase, L"Option name not supported", LOCATION); - } - - // add new elements before this one - BOOST_STATIC_ASSERT(eTO_Last == eTO_AlternateFilenameFormatString_AfterFirst + 1); - } -} +// ============================================================================ +// Copyright (C) 2001-2010 by Jozef Starosczyk +// ixen@copyhandler.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Library General Public License +// (version 2) as published by the Free Software Foundation; +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// ============================================================================ +/// @file TTaskConfigTracker.cpp +/// @date 2010/10/04 +/// @brief Contains implementation of TTaskConfigTracker class. +// ============================================================================ +#include "stdafx.h" +#include "TTaskConfigTracker.h" +#include "TCoreException.h" +#include "ErrorCodes.h" +#include "TStringSet.h" +#include + +namespace chcore +{ + TOptionsSet& TOptionsSet::operator%(ETaskOptions eOption) + { + m_setOptions.insert(eOption); + + return *this; + } + + std::set& TOptionsSet::Get() + { + return m_setOptions; + } + + TTaskConfigTracker::TTaskConfigTracker() + { + } + + TTaskConfigTracker::~TTaskConfigTracker() + { + } + + bool TTaskConfigTracker::IsModified() const + { + boost::shared_lock lock(m_lock); + return !m_setModified.empty(); + } + + bool TTaskConfigTracker::IsModified(ETaskOptions eOption) const + { + boost::shared_lock lock(m_lock); + return m_setModified.find(eOption) != m_setModified.end(); + } + + bool TTaskConfigTracker::IsModified(TOptionsSet setOptions) const + { + boost::shared_lock lock(m_lock); + + std::set setCommon; + std::set_intersection(setOptions.Get().begin(), setOptions.Get().end(), m_setModified.begin(), m_setModified.end(), std::inserter(setCommon, setCommon.begin())); + + return !setCommon.empty(); + } + + bool TTaskConfigTracker::IsModified(ETaskOptions eOption, bool bResetModificationState) + { + boost::upgrade_lock lock(m_lock); + + std::set::iterator iterOption = m_setModified.find(eOption); + bool bModified = (iterOption != m_setModified.end()); + if (bModified && bResetModificationState) + { + boost::upgrade_to_unique_lock upgraded_lock(lock); + m_setModified.erase(iterOption); + } + + return bModified; + } + + bool TTaskConfigTracker::IsModified(TOptionsSet setOptions, bool bResetModificationState) + { + boost::upgrade_lock lock(m_lock); + + std::set setCommon; + std::set_intersection(setOptions.Get().begin(), setOptions.Get().end(), m_setModified.begin(), m_setModified.end(), std::inserter(setCommon, setCommon.begin())); + + bool bModified = !setCommon.empty(); + if (bModified && bResetModificationState) + { + boost::upgrade_to_unique_lock upgraded_lock(lock); + std::set::iterator iterOption; + for(ETaskOptions eOption : setCommon) + { + iterOption = m_setModified.find(eOption); + if (iterOption != m_setModified.end()) + m_setModified.erase(iterOption); + } + } + + return bModified; + } + + void TTaskConfigTracker::AddModified(const TString& strModified) + { + ETaskOptions eOption = TTaskConfigTracker::GetOptionFromString(strModified); + + boost::unique_lock lock(m_lock); + + m_setModified.insert(eOption); + } + + void TTaskConfigTracker::AddModified(ETaskOptions eModified) + { + boost::unique_lock lock(m_lock); + m_setModified.insert(eModified); + } + + void TTaskConfigTracker::AddModified(TOptionsSet setOptions) + { + boost::unique_lock lock(m_lock); + m_setModified.insert(setOptions.Get().begin(), setOptions.Get().end()); + } + + void TTaskConfigTracker::AddModified(const TStringSet& setModified) + { + TStringSet::const_iterator iterBegin = setModified.Begin(); + TStringSet::const_iterator iterEnd = setModified.End(); + + for (; iterBegin != iterEnd; ++iterBegin) + { + AddModified(*iterBegin); + } + } + + void TTaskConfigTracker::AddModified(const std::set& setModified) + { + boost::unique_lock lock(m_lock); + + m_setModified.insert(setModified.begin(), setModified.end()); + } + + void TTaskConfigTracker::RemoveModification(ETaskOptions eModified) + { + boost::upgrade_lock lock(m_lock); + std::set::iterator iterOption = m_setModified.find(eModified); + if (iterOption != m_setModified.end()) + { + boost::upgrade_to_unique_lock upgraded_lock(lock); + m_setModified.erase(iterOption); + } + } + + void TTaskConfigTracker::RemoveModificationSet(TOptionsSet setOptions) + { + boost::unique_lock lock(m_lock); + + std::set setCommon; + std::set_intersection(setOptions.Get().begin(), setOptions.Get().end(), m_setModified.begin(), m_setModified.end(), std::inserter(setCommon, setCommon.begin())); + + std::set::iterator iterOption; + for(ETaskOptions eOption : setCommon) + { + iterOption = m_setModified.find(eOption); + if (iterOption != m_setModified.end()) + m_setModified.erase(iterOption); + } + } + + void TTaskConfigTracker::RemoveModification(const TString& strModified) + { + ETaskOptions eOption = TTaskConfigTracker::GetOptionFromString(strModified); + RemoveModification(eOption); + } + + void TTaskConfigTracker::Clear() + { + boost::unique_lock lock(m_lock); + m_setModified.clear(); + } + + void TTaskConfigTracker::NotificationProc(const TStringSet& setModifications, void* pParam) + { + if (!pParam) + throw TCoreException(eErr_InvalidArgument, L"pParam", LOCATION); + + TTaskConfigTracker* pTracker = (TTaskConfigTracker*)pParam; + pTracker->AddModified(setModifications); + } + + ETaskOptions TTaskConfigTracker::GetOptionFromString(const TString& strOption) + { + if (strOption == TaskPropData::GetPropertyName()) + return eTO_UseOnlyDefaultBuffer; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_DefaultBufferSize; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_OneDiskBufferSize; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_TwoDisksBufferSize; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_CDBufferSize; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_LANBufferSize; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_DisableBuffering; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_DisableBufferingMinSize; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_BufferQueueDepth; + + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_SetDestinationAttributes; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_SetDestinationDateTime; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_ProtectReadOnlyFiles; + else if(strOption == TaskPropData::GetPropertyName()) + return eTO_ScanDirectoriesBeforeBlocking; + else if(strOption == TaskPropData::GetPropertyName()) + return eTO_FastMoveBeforeBlocking; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_ThreadPriority; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_DisablePriorityBoost; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_DeleteInSeparateSubTask; + + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_CreateEmptyFiles; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_CreateDirectoriesRelativeToRoot; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_IgnoreDirectories; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_AlternateFilenameFormatString_AfterFirst; + else if (strOption == TaskPropData::GetPropertyName()) + return eTO_AlternateFilenameFormatString_First; + else + { + BOOST_ASSERT(false); // unhandled case + throw TCoreException(eErr_UnhandledCase, L"Option name not supported", LOCATION); + } + + // add new elements before this one + BOOST_STATIC_ASSERT(eTO_Last == eTO_AlternateFilenameFormatString_AfterFirst + 1); + } +}