Index: src/ch/TTaskDefinition.cpp =================================================================== diff -u -N -rb684bec49aaaea4b89ab2e599497f4085d8698a3 -r8dd3566d66a35a662872eaaa45eef5049e71c3dc --- src/ch/TTaskDefinition.cpp (.../TTaskDefinition.cpp) (revision b684bec49aaaea4b89ab2e599497f4085d8698a3) +++ src/ch/TTaskDefinition.cpp (.../TTaskDefinition.cpp) (revision 8dd3566d66a35a662872eaaa45eef5049e71c3dc) @@ -21,15 +21,19 @@ /// @brief Contains implementation of class representing task input data. // ============================================================================ #include "stdafx.h" +#include "..\common\version.h" #include #include #include #include #include "TTaskDefinition.h" +#define CURRENT_TASK_VERSION (((unsigned long long)PRODUCT_VERSION1) << 48 | ((unsigned long long)PRODUCT_VERSION2) << 32 | ((unsigned long long)PRODUCT_VERSION3) << 16 | ((unsigned long long)PRODUCT_VERSION4)) + TTaskDefinition::TTaskDefinition() : m_bModified(false), - m_strTaskUniqueID() + m_strTaskUniqueID(), + m_ullTaskVersion(CURRENT_TASK_VERSION) { boost::uuids::random_generator gen; boost::uuids::uuid u = gen(); @@ -41,6 +45,7 @@ m_vSourcePaths(rSrc.m_vSourcePaths), m_pathDestinationPath(rSrc.m_pathDestinationPath), m_tOperationPlan(rSrc.m_tOperationPlan), + m_ullTaskVersion(rSrc.m_ullTaskVersion), m_tConfiguration(rSrc.m_tConfiguration), m_bModified(rSrc.m_bModified) { @@ -58,6 +63,7 @@ m_vSourcePaths = rSrc.m_vSourcePaths; m_pathDestinationPath = rSrc.m_pathDestinationPath; m_tOperationPlan = rSrc.m_tOperationPlan; + m_ullTaskVersion = rSrc.m_ullTaskVersion; m_tConfiguration = rSrc.m_tConfiguration; m_bModified = rSrc.m_bModified; } @@ -175,20 +181,39 @@ } // basic information + // source paths to be processed if(!GetConfigValue(tTaskInfo, _T("TaskDefinition.SourcePaths"), m_vSourcePaths) || m_vSourcePaths.IsEmpty()) THROW(_T("Missing source paths"), 0, 0, 0); + // destination path if(!GetConfigValue(tTaskInfo, _T("TaskDefinition.DestinationPath"), m_pathDestinationPath) || m_pathDestinationPath.IsEmpty()) THROW(_T("Missing destination path"), 0, 0, 0); m_pathDestinationPath.AppendSeparatorIfDoesNotExist(); + // type of the operation int iOperation = eOperation_None; if(!tTaskInfo.GetValue(_T("TaskDefinition.OperationType"), iOperation)) THROW(_T("Missing operation type"), 0, 0, 0); m_tOperationPlan.SetOperationType((EOperationType)iOperation); + // and version of the task + if(!GetConfigValue(tTaskInfo, _T("TaskDefinition.Version"), m_ullTaskVersion)) + THROW(_T("Missing task definition version"), 0, 0, 0); + + 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(_T("Unsupported task version"), 0, 0, 0); + tTaskInfo.ExtractSubConfig(_T("TaskDefinition.TaskSettings"), m_tConfiguration); }