Index: src/ch/TTaskDefinition.cpp
===================================================================
diff -u -rca1933ef07e18d939449e4878eca5cc81cc73f3f -r1d7d79169d480a02e335b8b0a4919f9c78d58325
--- src/ch/TTaskDefinition.cpp	(.../TTaskDefinition.cpp)	(revision ca1933ef07e18d939449e4878eca5cc81cc73f3f)
+++ src/ch/TTaskDefinition.cpp	(.../TTaskDefinition.cpp)	(revision 1d7d79169d480a02e335b8b0a4919f9c78d58325)
@@ -28,81 +28,99 @@
 #include "TTaskDefinition.h"
 
 TTaskDefinition::TTaskDefinition() :
-	m_bNeedsSaving(false),
+	m_bModified(false),
 	m_strTaskUniqueID()
 {
 	boost::uuids::random_generator gen;
 	boost::uuids::uuid u = gen();
-	m_strTaskUniqueID = boost::lexical_cast<std::wstring>(u);
+	m_strTaskUniqueID = boost::lexical_cast<std::wstring>(u).c_str();
 }
 
+TTaskDefinition::TTaskDefinition(const TTaskDefinition& rSrc) :
+	m_strTaskUniqueID(rSrc.m_strTaskUniqueID),
+	m_vSourcePaths(rSrc.m_vSourcePaths),
+	m_strDestinationPath(rSrc.m_strDestinationPath),
+	m_tOperationPlan(rSrc.m_tOperationPlan),
+	m_tConfiguration(rSrc.m_tConfiguration),
+	m_bModified(rSrc.m_bModified)
+{
+}
+
 TTaskDefinition::~TTaskDefinition()
 {
 }
 
-// initialize object with data (get/set, from cfg file?, from string(cmd line options))
-void TTaskDefinition::AddSourcePath(const CString& strPath)
+TTaskDefinition& TTaskDefinition::operator=(const TTaskDefinition& rSrc)
 {
-	CClipboardEntryPtr spEntry(boost::make_shared<CClipboardEntry>());
-	spEntry->SetPath(strPath);
+	if(this != &rSrc)
+	{
+		m_strTaskUniqueID = rSrc.m_strTaskUniqueID;
+		m_vSourcePaths = rSrc.m_vSourcePaths;
+		m_strDestinationPath = rSrc.m_strDestinationPath;
+		m_tOperationPlan = rSrc.m_tOperationPlan;
+		m_tConfiguration = rSrc.m_tConfiguration;
+		m_bModified = rSrc.m_bModified;
+	}
 
-	m_arrSourcePaths.Add(spEntry);
+	return *this;
 }
 
-CString TTaskDefinition::GetSourcePathNameAt(size_t stIndex) const
+// Task unique id
+CString TTaskDefinition::GetTaskUniqueID() const
 {
-	CClipboardEntryPtr spEntry = m_arrSourcePaths.GetAt(stIndex);
-	if(spEntry)
-		return spEntry->GetPath();
-	return CString();
+	return m_strTaskUniqueID;
 }
 
-CClipboardEntryPtr TTaskDefinition::GetSourcePathAt(size_t stIndex) const
+// Source paths
+// initialize object with data (get/set, from cfg file?, from string(cmd line options))
+void TTaskDefinition::AddSourcePath(const CString& strPath)
 {
-	CClipboardEntryPtr spEntry = m_arrSourcePaths.GetAt(stIndex);
-	return spEntry;
+	m_vSourcePaths.push_back(strPath);
+	m_bModified = true;
 }
 
+CString TTaskDefinition::GetSourcePathAt(size_t stIndex) const
+{
+	return m_vSourcePaths.at(stIndex);
+}
+
 size_t TTaskDefinition::GetSourcePathCount() const
 {
-	return m_arrSourcePaths.GetSize();
+	return m_vSourcePaths.size();
 }
 
 void TTaskDefinition::ClearSourcePaths()
 {
-	m_arrSourcePaths.RemoveAll();
+	m_vSourcePaths.clear();
+	m_bModified = true;
 }
 
-const CClipboardArray& TTaskDefinition::GetSourcePaths() const
+const std::vector<CString>& TTaskDefinition::GetSourcePaths() const
 {
-	return m_arrSourcePaths;
+	return m_vSourcePaths;
 }
 
+// Destination path
 void TTaskDefinition::SetDestinationPath(const CString& strPath)
 {
-	m_tDestinationPath.SetPath(strPath);
+	m_strDestinationPath = strPath;
+	if(m_strDestinationPath.Right(1) != _T("\\"))
+		m_strDestinationPath += _T("\\");
+	m_bModified = true;
 }
 
 CString TTaskDefinition::GetDestinationPath() const
 {
-	return m_tDestinationPath.GetPath();
+	return m_strDestinationPath;
 }
 
-const CDestPath& TTaskDefinition::GetDestPath() const
-{
-	return m_tDestinationPath;
-}
-
+// Operation type
 void TTaskDefinition::SetOperationType(EOperationType eOperation)
 {
 	m_tOperationPlan.SetOperationType(eOperation);
+	m_bModified = true;
 }
 
-CString TTaskDefinition::GetTaskUniqueID() const
-{
-	return m_strTaskUniqueID.c_str();
-}
-
 EOperationType TTaskDefinition::GetOperationType() const
 {
 	return m_tOperationPlan.GetOperationType();
@@ -113,12 +131,87 @@
 	return m_tOperationPlan;
 }
 
-TTaskConfiguration& TTaskDefinition::GetConfiguration()
+// Task configuration
+void TTaskDefinition::SetConfig(const TConfig& rConfig)
 {
-	return m_tOperationConfiguration;
+	m_tConfiguration = rConfig;
+	m_bModified = true;
 }
 
-const TTaskConfiguration& TTaskDefinition::GetConfiguration() const
+TConfig& TTaskDefinition::GetConfiguration()
 {
-	return m_tOperationConfiguration;
+	return m_tConfiguration;
 }
+
+const TConfig& TTaskDefinition::GetConfiguration() const
+{
+	return m_tConfiguration;
+}
+
+// Serialization
+void TTaskDefinition::Load(const CString& strPath)
+{
+	// read everything
+	TConfig tTaskInfo;
+	tTaskInfo.Read(strPath);
+
+	// clear everything
+	m_strTaskUniqueID.Empty();
+	m_vSourcePaths.clear();
+	m_strDestinationPath.Empty();
+
+	m_tConfiguration.Clear();
+
+	m_bModified = false;
+
+	// get information from config file
+	// task unique id - use if provided, generate otherwise
+	tTaskInfo.GetValue(_T("TaskDefinition.UniqueID"), m_strTaskUniqueID, _T(""));
+	if(m_strTaskUniqueID.IsEmpty())
+	{
+		boost::uuids::random_generator gen;
+		boost::uuids::uuid u = gen();
+		m_strTaskUniqueID = boost::lexical_cast<std::wstring>(u).c_str();
+
+		m_bModified = true;
+	}
+
+	// basic information
+	tTaskInfo.GetValue(_T("TaskDefinition.SourcePaths"), m_vSourcePaths);
+	tTaskInfo.GetValue(_T("TaskDefinition.DestinationPath"), m_strDestinationPath, _T(""));
+	if(m_strDestinationPath.Right(1) != _T("\\"))
+		m_strDestinationPath += _T("\\");
+
+	int iOperation = eOperation_None;
+	tTaskInfo.GetValue(_T("TaskDefinition.OperationType"), iOperation, eOperation_None);
+	m_tOperationPlan.SetOperationType((EOperationType)iOperation);
+
+	tTaskInfo.ExtractSubConfig(_T("TaskDefinition.TaskSettings"), m_tConfiguration);
+}
+
+void TTaskDefinition::Store(const CString& strPath, bool bOnlyIfModified)
+{
+	if(!bOnlyIfModified || m_bModified || m_tConfiguration.IsModified())
+	{
+		// read everything
+		TConfig tTaskInfo;
+		tTaskInfo.SetFilePath(strPath);
+
+		// get information from config file
+		// task unique id - use if provided, generate otherwise
+		tTaskInfo.SetValue(_T("TaskDefinition.UniqueID"), m_strTaskUniqueID);
+
+		// basic information
+		tTaskInfo.SetValue(_T("TaskDefinition.SourcePaths.Path"), m_vSourcePaths);
+		tTaskInfo.SetValue(_T("TaskDefinition.DestinationPath"), m_strDestinationPath);
+
+		int iOperation = m_tOperationPlan.GetOperationType();
+		tTaskInfo.SetValue(_T("TaskDefinition.OperationType"), iOperation);
+
+		tTaskInfo.PutSubConfig(_T("TaskDefinition.TaskSettings"), m_tConfiguration);
+
+		tTaskInfo.Write();
+
+		m_bModified = false;
+	}
+}