bool CGPImporter::Import(LPCTSTR szSrcFilePath, ITaskList* pDestTaskFile, BOOL /*bSilent*/, IPreferences* /*pPrefs*/, LPCTSTR /*szKey*/) { CXmlFile fileSrc(_T("project"), CP_UTF8); if (!fileSrc.Load(szSrcFilePath)) return false; const CXmlItem* pXISrcTasks = fileSrc.GetItem(_T("tasks")); if (!pXISrcTasks) // must exist return false; const CXmlItem* pXISrcTask = pXISrcTasks->GetItem(_T("task")); if (!pXISrcTask) // must exist return false; ITaskList8* pITL8 = GetITLInterface<ITaskList8>(pDestTaskFile, IID_TASKLIST8); if (!ImportTask(pXISrcTask, pITL8, NULL, TRUE)) return false; // fix up resource allocations FixupResourceAllocations(fileSrc.Root(), pITL8); // and dependencies FixupDependencies(pXISrcTask, pITL8, TRUE); return true; // no tasks to import }
bool CMLOImporter::Import(const TCHAR* szSrcFilePath, ITaskList* pDestTaskFile) { ITaskList5* pTL5 = GetITLInterface<ITaskList5>(pDestTaskFile, IID_TASKLIST5); if (!pTL5) { return false; } CXmlFile file; if (!file.Load(szSrcFilePath, _T("MyLifeOrganized-xml"))) { return false; } const CXmlItem* pXIMLOTree = file.GetItem(_T("TaskTree")); if (!pXIMLOTree) { return false; } const CXmlItem* pXIMLOTask = pXIMLOTree->GetItem(_T("TaskNode")); if (!pXIMLOTask) { return false; } // this first node always seems to be untitled // so we get the first subnode pXIMLOTask = pXIMLOTask->GetItem(_T("TaskNode")); if (!pXIMLOTask) { return true; // just means it was an empty tasklist } return ImportTask(pXIMLOTask, pTL5, NULL); // NULL == root }
bool CMLOImporter::ImportTask(const CXmlItem* pXIMLOTask, ITaskList5* pDestTaskFile, HTASKITEM hParent) const { ASSERT(pXIMLOTask); HTASKITEM hTask = pDestTaskFile->NewTask(ATL::CT2A(pXIMLOTask->GetItemValue(_T("Caption"))), hParent); if (!hTask) { return false; } // priority (== Importance) int nPriority = (pXIMLOTask->GetItemValueI(_T("Importance")) * 10) / 100; pDestTaskFile->SetTaskPriority(hTask, (unsigned char)nPriority); // categories (== places) const CXmlItem* pXIPlace = pXIMLOTask->GetItem(_T("Places"), _T("Place")); while (pXIPlace) { pDestTaskFile->AddTaskCategory(hTask, ATL::CT2A(pXIPlace->GetValue())); pXIPlace = pXIPlace->GetSibling(); } // estimated time (== EstimateMax) double dTimeEst = pXIMLOTask->GetItemValueF(_T("EstimateMax")); // in days pDestTaskFile->SetTaskTimeEstimate(hTask, dTimeEst, 'D'); // due date (== DueDateTime) pDestTaskFile->SetTaskDueDate(hTask, GetDate(pXIMLOTask, _T("DueDateTime"))); // completion (== CompletionDateTime) pDestTaskFile->SetTaskDoneDate(hTask, GetDate(pXIMLOTask, _T("CompletionDateTime"))); // comments (== Note) CString sComments = pXIMLOTask->GetItemValue(_T("Note")); pDestTaskFile->SetTaskComments(hTask, ATL::CT2A(sComments)); // children const CXmlItem* pXIMLOSubTask = pXIMLOTask->GetItem(_T("TaskNode")); if (pXIMLOSubTask) { if (!ImportTask(pXIMLOSubTask, pDestTaskFile, hTask)) { return false; } } // siblings pXIMLOTask = pXIMLOTask->GetSibling(); if (pXIMLOTask) { return ImportTask(pXIMLOTask, pDestTaskFile, hParent); } // else return true; }
bool CGPImporter::ImportTask(const CXmlItem* pXISrcTask, ITaskList8* pDestTaskFile, HTASKITEM htDestParent, BOOL bAndSiblings) { if (!pXISrcTask) return true; CString sName = pXISrcTask->GetItemValue(_T("name")); DWORD dwID = GetTDLTaskID(pXISrcTask->GetItemValueI(_T("id"))); ASSERT(dwID); HTASKITEM hTask = pDestTaskFile->NewTask(sName, htDestParent, dwID); ASSERT (hTask); if (!hTask) return false; // completion int nPercentDone = pXISrcTask->GetItemValueI(_T("complete")); pDestTaskFile->SetTaskPercentDone(hTask, (unsigned char)nPercentDone); // dates time_t tStart; if (CDateHelper::DecodeDate(pXISrcTask->GetItemValue(_T("start")), tStart)) { pDestTaskFile->SetTaskStartDate(hTask, tStart); int nDuration = pXISrcTask->GetItemValueI(_T("duration")); // only add duration to leaf tasks else it'll double up if (nDuration && !pXISrcTask->HasItem(_T("task"))) { if (nPercentDone == 100) { pDestTaskFile->SetTaskDoneDate(hTask, tStart + (nDuration - 1) * ONEDAY); // gp dates are inclusive pDestTaskFile->SetTaskTimeSpent(hTask, nDuration, 'D'); } else { pDestTaskFile->SetTaskDueDate(hTask, tStart + (nDuration - 1) * ONEDAY); // gp dates are inclusive pDestTaskFile->SetTaskTimeEstimate(hTask, nDuration, 'D'); } } } // priority int nPriority = pXISrcTask->GetItemValueI(_T("priority")); pDestTaskFile->SetTaskPriority(hTask, (unsigned char)(nPriority * 3 + 2)); // 2, 5, 8 // file ref CString sFileRef = pXISrcTask->GetItemValue(_T("webLink")); sFileRef.TrimLeft(); if (!sFileRef.IsEmpty()) { // decode file paths if (sFileRef.Find(_T("file://")) == 0) { sFileRef = sFileRef.Mid(7); sFileRef.Replace(_T("%20"), _T("")); } pDestTaskFile->SetTaskFileReferencePath(hTask, sFileRef); } // comments pDestTaskFile->SetTaskComments(hTask, pXISrcTask->GetItemValue(_T("notes"))); // dependency // do this after we've imported all the tasks because GP does it // the opposite way round to TDL // children if (!ImportTask(pXISrcTask->GetItem(_T("task")), pDestTaskFile, hTask, TRUE)) return false; // handle sibling tasks WITHOUT RECURSION if (bAndSiblings) { pXISrcTask = pXISrcTask->GetSibling(); while (pXISrcTask) { // FALSE == don't recurse on siblings if (!ImportTask(pXISrcTask, pDestTaskFile, htDestParent, FALSE)) return false; pXISrcTask = pXISrcTask->GetSibling(); } } return true; }