icalexporter.cpp

来自「管理项目进度工具的原代码」· C++ 代码 · 共 148 行

CPP
148
字号
// iCalExporter.cpp: implementation of the CiCalExporter class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "iCalImportExport.h"
#include "iCalExporter.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

const UINT ONEDAY = 24 * 60 * 60;

CiCalExporter::CiCalExporter()
{

}

CiCalExporter::~CiCalExporter()
{

}

bool CiCalExporter::Export(const ITaskList* pSrcTaskFile, const char* szDestFilePath)
{
	CStdioFile fileOut;

	if (fileOut.Open(szDestFilePath, CFile::modeCreate | CFile::modeWrite))
	{
		// header
		WriteString(fileOut, "BEGIN:VCALENDAR");
		WriteString(fileOut, "PRODID:iCalExporter (c) AbstractSpoon 2005");
		WriteString(fileOut, "VERSION:1.0.0");

		// export first task
		ExportTask(pSrcTaskFile, pSrcTaskFile->GetFirstTask(), fileOut);

		// footer
		WriteString(fileOut, "END:VCALENDAR");

		return true;
	}

	return false;
}

void CiCalExporter::ExportTask(const ITaskList* pSrcTaskFile, HTASKITEM hTask, CStdioFile& fileOut)
{
	if (!hTask)
		return;

	// header
	//	WriteString(fileOut, "BEGIN:VTODO");
	WriteString(fileOut, "BEGIN:VEVENT");
	
	// attributes
	time_t tDate = pSrcTaskFile->GetTaskStartDate(hTask);

	if (tDate)
	{
		COleDateTime date(tDate);
		WriteString(fileOut, "DTSTART;VALUE=DATE:%04d%02d%02d", date.GetYear(), date.GetMonth(), date.GetDay());
	}
	
	tDate = pSrcTaskFile->GetTaskLastModified(hTask);
	
	if (tDate)
	{
		COleDateTime date(tDate);
		WriteString(fileOut, "DTSTAMP;VALUE=DATE:%04d%02d%02d", date.GetYear(), date.GetMonth(), date.GetDay());
	}
	
	tDate = pSrcTaskFile->GetTaskDueDate(hTask);
	
	if (tDate)
	{
		COleDateTime date(tDate);
		WriteString(fileOut, "DUE;VALUE=DATE:%04d%02d%02d", date.GetYear(), date.GetMonth(), date.GetDay());
	}

	tDate = pSrcTaskFile->GetTaskDoneDate(hTask);
	
	if (tDate)
	{
		COleDateTime date(tDate);
		WriteString(fileOut, "DTEND;VALUE=DATE:%04d%02d%02d", date.GetYear(), date.GetMonth(), date.GetDay());
	}
	
	WriteString(fileOut, "SUMMARY:%s", pSrcTaskFile->GetTaskTitle(hTask));
	WriteString(fileOut, "DESCRIPTION:%s", pSrcTaskFile->GetTaskComments(hTask));
	WriteString(fileOut, "STATUS:%s", pSrcTaskFile->GetTaskStatus(hTask));
	WriteString(fileOut, "CATEGORIES:%s", pSrcTaskFile->GetTaskCategory(hTask));
	WriteString(fileOut, "URL:%s", pSrcTaskFile->GetTaskFileReferencePath(hTask));
	WriteString(fileOut, "ORGANIZER:%s", pSrcTaskFile->GetTaskAllocatedBy(hTask));
	WriteString(fileOut, "ATTENDEE:%s", pSrcTaskFile->GetTaskAllocatedTo(hTask));
	
	// use the filepath to assist in the uniqueness
	CString sFile = fileOut.GetFilePath();
	sFile.Replace("\\", "");
	sFile.Replace(":", "");
	
	WriteString(fileOut, "UID:%ld@%s.com", pSrcTaskFile->GetTaskID(hTask), sFile);
	
	// footer
	//		WriteString(fileOut, "END:VTODO");
	WriteString(fileOut, "END:VEVENT");

	// copy across first child
	ExportTask(pSrcTaskFile, pSrcTaskFile->GetFirstTask(hTask), fileOut);

	// copy across first sibling
	ExportTask(pSrcTaskFile, pSrcTaskFile->GetNextTask(hTask), fileOut);
}

void __cdecl CiCalExporter::WriteString(CStdioFile& fileOut, LPCTSTR lpszFormat, ...)
{
	ASSERT(AfxIsValidString(lpszFormat));
	CString sLine;

	va_list argList;
	va_start(argList, lpszFormat);
	sLine.FormatV(lpszFormat, argList);
	va_end(argList);

	sLine.TrimRight();

	// write line out in pieces no longer than 75 bytes
	while (sLine.GetLength() > 75)
	{
		CString sTemp = sLine.Left(75);
		sLine = sLine.Mid(75);

		fileOut.WriteString(sTemp);
		fileOut.WriteString("\\n\n");
	}

	// write out whatever's left
	fileOut.WriteString(sLine);
	fileOut.WriteString("\n");
}

⌨️ 快捷键说明

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