Index: src/libchcore/TTaskDefinition.cpp =================================================================== diff -u -N -r6dc950d4d76107421ff6eb62069b70f20bcc450e -r2d7bee54f998ae8f5d4145a2cf3f4a589253016f --- src/libchcore/TTaskDefinition.cpp (.../TTaskDefinition.cpp) (revision 6dc950d4d76107421ff6eb62069b70f20bcc450e) +++ src/libchcore/TTaskDefinition.cpp (.../TTaskDefinition.cpp) (revision 2d7bee54f998ae8f5d4145a2cf3f4a589253016f) @@ -103,6 +103,11 @@ m_bModified = true; } +void TTaskDefinition::SetSourcePaths(const chcore::TPathContainer& rvPaths) +{ + m_vSourcePaths = rvPaths; +} + const chcore::TPathContainer& TTaskDefinition::GetSourcePaths() const { return m_vSourcePaths; @@ -139,7 +144,7 @@ } // Task configuration -void TTaskDefinition::SetConfig(const chcore::TConfig& rConfig) +void TTaskDefinition::SetConfiguration(const chcore::TConfig& rConfig) { m_tConfiguration = rConfig; m_bModified = true; @@ -248,4 +253,90 @@ } } +void TTaskDefinition::StoreInString(TWStringData& strOutput) +{ + // read everything + chcore::TConfig tTaskInfo; + + // get information from config file + // task unique id - use if provided, generate otherwise + SetConfigValue(tTaskInfo, _T("TaskDefinition.UniqueID"), m_strTaskUniqueID); + + // basic information + SetConfigValue(tTaskInfo, _T("TaskDefinition.SourcePaths.Path"), m_vSourcePaths); + SetConfigValue(tTaskInfo, _T("TaskDefinition.DestinationPath"), m_pathDestinationPath); + + int iOperation = m_tOperationPlan.GetOperationType(); + SetConfigValue(tTaskInfo, _T("TaskDefinition.OperationType"), iOperation); + + SetConfigValue(tTaskInfo, _T("TaskDefinition.Version"), m_ullTaskVersion); + + tTaskInfo.PutSubConfig(_T("TaskDefinition.TaskSettings"), m_tConfiguration); + + tTaskInfo.WriteToString(strOutput); +} + +void TTaskDefinition::LoadFromString(const TWStringData& strInput) +{ + // read everything + chcore::TConfig tTaskInfo; + tTaskInfo.ReadFromString(strInput); + + // clear everything + m_strTaskUniqueID.clear(); + m_vSourcePaths.Clear(); + m_pathDestinationPath.Clear(); + + m_tConfiguration.Clear(); + + m_bModified = false; + + // get information from config file + // task unique id - use if provided, generate otherwise + if(!GetConfigValue(tTaskInfo, _T("TaskDefinition.UniqueID"), m_strTaskUniqueID) || m_strTaskUniqueID.empty()) + { + boost::uuids::random_generator gen; + boost::uuids::uuid u = gen(); + m_strTaskUniqueID = boost::lexical_cast(u).c_str(); + + m_bModified = true; + } + + // basic information + // source paths to be processed + if(!GetConfigValue(tTaskInfo, _T("TaskDefinition.SourcePaths"), m_vSourcePaths) || m_vSourcePaths.IsEmpty()) + THROW_CORE_EXCEPTION_STR(eMissingData, _T("Missing source paths")); + + // destination path + if(!GetConfigValue(tTaskInfo, _T("TaskDefinition.DestinationPath"), m_pathDestinationPath) || m_pathDestinationPath.IsEmpty()) + THROW_CORE_EXCEPTION_STR(eMissingData, _T("Missing destination path")); + + m_pathDestinationPath.AppendSeparatorIfDoesNotExist(); + + // type of the operation + int iOperation = eOperation_None; + if(!tTaskInfo.GetValue(_T("TaskDefinition.OperationType"), iOperation)) + THROW_CORE_EXCEPTION_STR(eMissingData, _T("Missing operation type")); + + m_tOperationPlan.SetOperationType((EOperationType)iOperation); + + // and version of the task + if(!GetConfigValue(tTaskInfo, _T("TaskDefinition.Version"), m_ullTaskVersion)) + THROW_CORE_EXCEPTION_STR(eMissingData, _T("Missing task definition version")); + + if(m_ullTaskVersion < CURRENT_TASK_VERSION) + { + // migrate the task to the newer version + // (nothing to migrate at this point, since 1.40 is the first release with xml-based tasks). + + // then mark it as a newest version task + m_ullTaskVersion = CURRENT_TASK_VERSION; + m_bModified = true; + } + else if(m_ullTaskVersion > CURRENT_TASK_VERSION) + THROW_CORE_EXCEPTION_STR(eUnsupportedVersion, _T("Unsupported task version")); + + tTaskInfo.ExtractSubConfig(_T("TaskDefinition.TaskSettings"), m_tConfiguration); +} + END_CHCORE_NAMESPACE