Ejemplo n.º 1
0
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
}
Ejemplo n.º 2
0
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
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}