⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mloimporter.cpp

📁 管理项目进度工具的原代码
💻 CPP
字号:
// MLOImporter.cpp: implementation of the CMLOImporter class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MLOImporter.h"
#include <time.h>
#include <unknwn.h>

#include "..\SHARED\iTasklist.h"
#include "..\SHARED\xmlfile.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMLOImporter::CMLOImporter()
{

}

CMLOImporter::~CMLOImporter()
{

}

bool CMLOImporter::Import(const char* szSrcFilePath, ITaskList* pDestTaskFile)
{
	ITaskList5* pTL5 = 0;
	pDestTaskFile->QueryInterface(IID_TASKLIST5, reinterpret_cast<void**>(&pTL5));

	CXmlFile file;

	if (!file.Load(szSrcFilePath, "MyLifeOrganized-xml"))
		return false;

	const CXmlItem* pXIMLOTree = file.GetItem("TaskTree");

	if (!pXIMLOTree)
		return false;

	const CXmlItem* pXIMLOTask = pXIMLOTree->GetItem("TaskNode");

	if (!pXIMLOTask)
		return false;

	// this first node always seems to be untitled 
	// so we get the first subnode
	pXIMLOTask = pXIMLOTask->GetItem("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(pXIMLOTask->GetItemValue("Caption"), hParent);

	if (!hTask)
		return false;

	// priority (== Importance)
	int nPriority = (pXIMLOTask->GetItemValueI("Importance") * 10) / 100;

	pDestTaskFile->SetTaskPriority(hTask, (unsigned char)nPriority);

	// categories (== places)
	const CXmlItem* pXIPlace = pXIMLOTask->GetItem("Places", "Place");

	while (pXIPlace)
	{
		pDestTaskFile->AddTaskCategory(hTask, pXIPlace->GetValue());
		pXIPlace = pXIPlace->GetSibling();
	}

	// estimated time (== EstimateMax)
	double dTimeEst = pXIMLOTask->GetItemValueF("EstimateMax"); // in days

	pDestTaskFile->SetTaskTimeEstimate(hTask, dTimeEst, 'D');

	// due date (== DueDateTime)
	pDestTaskFile->SetTaskDueDate(hTask, GetDate(pXIMLOTask, "DueDateTime"));

	// completion (== CompletionDateTime)
	pDestTaskFile->SetTaskDoneDate(hTask, GetDate(pXIMLOTask, "CompletionDateTime"));

	// comments (== Note)
	CString sComments = pXIMLOTask->GetItemValue("Note");

	pDestTaskFile->SetTaskComments(hTask, sComments);

	// children
	const CXmlItem* pXIMLOSubTask = pXIMLOTask->GetItem("TaskNode");

	if (pXIMLOSubTask)
	{
		if (!ImportTask(pXIMLOSubTask, pDestTaskFile, hTask))
			return false;
	}

	// siblings
	pXIMLOTask = pXIMLOTask->GetSibling();

	if (pXIMLOTask)
		return ImportTask(pXIMLOTask, pDestTaskFile, hParent);

	// else
	return true;
}

time_t CMLOImporter::GetDate(const CXmlItem* pXIMLOTask, LPCTSTR szDateField) const
{
	CString sDate = pXIMLOTask->GetItemValue(szDateField);

	if (!sDate.IsEmpty())
	{
		// parse date string
		int nYear = atoi(sDate);
		sDate = sDate.Mid(sDate.Find('-') + 1);

		int nMonth = atoi(sDate);
		sDate = sDate.Mid(sDate.Find('-') + 1);

		int nDay = atoi(sDate);

		// set date
		tm tDate = { 0,  0,  0, nDay, nMonth - 1, nYear - 1900, 0, 0, 0 };
		return mktime(&tDate);
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -