taskbuilder.cpp
来自「funambol window mobile客户端源代码」· C++ 代码 · 共 827 行 · 第 1/2 页
CPP
827 行
}
}
wsprintf(tempDate, TEXT("%i"), dayOfWeekMask);
taskStringItem = taskStringItem + TEXT("<DayOfWeekMask>") + tempDate + TEXT("</DayOfWeekMask>");
} else {
taskStringItem = taskStringItem + TEXT("<DayOfWeekMask>0</DayOfWeekMask>");
}
//
// Instance
//
if (instance != 0) {
wsprintf(tempDate, TEXT("%i"), instance);
taskStringItem = taskStringItem + TEXT("<Instance>") + tempDate + TEXT("</Instance>");
} else {
taskStringItem = taskStringItem + TEXT("<Instance>0</Instance>");
}
//
// Pattern Start Date
//
pRecurrence->get_PatternStartDate(&date);
wsprintf(tempDate, TEXT(""));
toCompare = MAX_DATE_DOUBLE;
if (date != toCompare && date < toCompare4000 ) {
doubleToSystemTime(tempDate, date);
}
taskStringItem = taskStringItem + TEXT("<PatternStartDate>") + tempDate + TEXT("</PatternStartDate>");
//
// No End Date
//
pRecurrence->get_NoEndDate(&variantBool);
wsprintf(tempDate, TEXT("%i"), variantBool);
normalizeBoolean(tempDate);
taskStringItem = taskStringItem + TEXT("<NoEndDate>") + tempDate + TEXT("</NoEndDate>");
//
// Pattern End Date
//
pRecurrence->get_PatternEndDate(&date);
wsprintf(tempDate, TEXT(""));
toCompare = MAX_DATE_DOUBLE;
if (date != toCompare && date < toCompare4000 ) {
doubleToSystemTime(tempDate, date);
}
taskStringItem = taskStringItem + TEXT("<PatternEndDate>") + tempDate + TEXT("</PatternEndDate>");
//
// Occurrences
//
pRecurrence->get_Occurrences(&elementLong);
if (elementLong < 0) {
elementLong = 0;
}
wsprintf(tempDate, TEXT("%i"), elementLong);
taskStringItem = taskStringItem + TEXT("<Occurrences>") + tempDate + TEXT("</Occurrences>");
*/
taskStringItem += recurrence;
taskStringItem += TEXT("</task>");
}
/*
* The method calculate the CRC hash value for the task item.
* It create the XML structure and calculate the crc value.
* Use to compare for understand the modified value!
*
* @param pTask : the task object that contain every value
*/
long calculateTaskHash (ITask *pTask) {
wstring p ;
populateTaskStringItem(p, pTask, TRUE);
long l = stringCrc32(p.data());
return l;
}
WinItem* taskToWinTask(IItem *pTask, bool isSif) {
HRESULT hr = E_FAIL;
CEPROPVAL *prgPropvalPoom = NULL;
ULONG cbBuffer = 0;
HANDLE hHeap = GetProcessHeap();
WinTask* winT = NULL;
WinRecurrence* winRec = NULL;
wchar_t tempValue[10];
wstring isRecurring, value, start;
if (isSif) { winT = new WinTaskSIF(); }
else { winT = new WinTask() ; }
cbBuffer = 0;
hr = pTask->GetProps(PIMPR_props_task, CEDB_ALLOWREALLOC, NUM_COLS_TASK, &prgPropvalPoom, &cbBuffer, hHeap);
if(FAILED(hr) || NULL == prgPropvalPoom || 0 == cbBuffer) {
goto Exit;
}
//
// Fill all task properties
//
for (int i = 0; i < ePIMPR_RECURRING_TYPE; i++) {
switch (i)
{
case ePIMPR_START_DATE:
case ePIMPR_DUE_DATE:
case ePIMPR_DATE_COMPLETED:
{
// Date values: "yyyyMMdd" - tasks are ALWAYS allday
value = getDatePropertyFromMapi(&prgPropvalPoom[i], false, true);
break;
}
case ePIMPR_REMINDER_TIME:
{
// "YYYYMMDDThhmmss" use local time!
value = getDatePropertyFromMapi(&prgPropvalPoom[i], false, false);
break;
}
case ePIMPR_SUBJECT:
case ePIMPR_CATEGORIES:
case ePIMPR_BODY_TEXT:
{
// String values.
value = getStringPropertyFromMapi(&prgPropvalPoom[i]);
break;
}
default:
{
// Int values.
int tmp = getIntPropertyFromMapi(&prgPropvalPoom[i]);
wsprintf(tempValue, TEXT("%d"), tmp);
value = tempValue;
break;
}
}
winT->setProperty(taskFields[i], value);
//LOG.info("%2d) %ls = \"%ls\"", i+1, taskFields[i], value.c_str());
}
if (!winT->getProperty(TEXT("IsRecurring"), isRecurring)) {
goto Exit;
}
if (isRecurring != TEXT("1")) {
goto Exit;
}
//
// Manage recurring properties: need to retrieve all values together
// ---------------------------- to apply safe checks and conversions.
//
winRec = winT->getRecPattern();
if (!winRec) {
goto Exit;
}
// tasks are ALWAYS allday
winT->getProperty(TEXT("StartDate"), start);
setWinRecurrenceProps(*winRec, prgPropvalPoom, ePIMPR_RECURRING_TYPE, start, true, false);
Exit:
// Free memory.
HeapFree(hHeap, 0, prgPropvalPoom);
return winT;
}
HRESULT winTaskToTask(WinTask& winT, IItem *pTask, const wstring& path, long oidToUpdate) {
HRESULT hr = E_FAIL;
int incNumProp = 0;
bool exists = false;
WinRecurrence* winRec = NULL;
ITask* pTaskOld = NULL;
IRecurrencePattern* pRecurrence = NULL;
CEPROPVAL *prgPropvalPoom = new CEPROPVAL[NUM_COLS_TASK]; // Warning: allocation of CEPROPVAL array is critical...
IP_OUTLOOK_APP* pOutlookApp = NULL;
FILETIME date;
wstring start;
if (oidToUpdate) {
//
// It's an UPDATED item: Clear the recurrence pattern & save task:
// if the task is recurring or not, we have to delete any previous information
// regarding recurrence.
//
pOutlookApp = getOutlookApp();
if (!pOutlookApp) { goto finally; }
// 'pAppointmentOld' is the IAppointment (old interface)
hr = pOutlookApp->GetItemFromOid(oidToUpdate, (IDispatch**)&pTaskOld);
if (!pTaskOld || FAILED(hr)) { goto finally; }
hr = pTaskOld->ClearRecurrencePattern();
if (FAILED(hr)) {
LOG.error("Error clearing rec pattern");
}
hr = pTaskOld->Save();
if (FAILED(hr)) {
LOG.error("Error saving task \"%ls\"", winT.getName().c_str());
goto finally;
}
pTaskOld->Release();
pTaskOld = NULL;
}
// Check if it's recurring.
bool isRecurring = false;
int tmp = 0;
if (winT.getIntProperty(TEXT("IsRecurring"), &tmp)) {
if (tmp == 1) isRecurring = true;
}
//
// Set all normal properties.
//
for (int i=0; i < ePIMPR_RECURRING_TYPE; i++) {
exists = false;
wstring& value = winT.getPropertyRef(taskFields[i], &exists);
if (exists) {
switch (i)
{
case ePIMPR_START_DATE:
case ePIMPR_DUE_DATE:
case ePIMPR_DATE_COMPLETED:
{
// Date values: "yyyyMMdd" - tasks are ALWAYS allday
date = getDatePropertyFromString(value, true);
setDatePropertyToMapi(&prgPropvalPoom[incNumProp], PIMPR_props_task[i], date);
//LOG.debug("%2d. %ls = %ls (date) (%lu %lu)", incNumProp+1, taskFields[i], value.c_str(), date.dwHighDateTime, date.dwLowDateTime);
break;
}
case ePIMPR_REMINDER_TIME:
{
// "YYYYMMDDThhmmss" expected local time.
date = getDatePropertyFromString(value, false);
setDatePropertyToMapi(&prgPropvalPoom[incNumProp], PIMPR_props_task[i], date);
break;
}
case ePIMPR_SUBJECT:
case ePIMPR_CATEGORIES:
{
// String values.
setStringPropertyToMapi(&prgPropvalPoom[incNumProp], PIMPR_props_task[i], value);
//LOG.debug("%2d. %ls = %ls (string)", incNumProp+1, taskFields[i], value.c_str());
break;
}
case ePIMPR_BODY_TEXT:
{
convertNewlines(value); // BUG #1562
setStringPropertyToMapi(&prgPropvalPoom[incNumProp], PIMPR_props_task[i], value);
//LOG.debug("%2d. %ls = %ls (body)", incNumProp+1, taskFields[i], value.c_str());
break;
}
default:
{
// Int values: should add safe checks? ***** TODO ******
int val = getIntPropertyFromWinItem(value);
setIntPropertyToMapi(&prgPropvalPoom[incNumProp], PIMPR_props_task[i], val);
//LOG.debug("%2d. %ls = %d (int)", incNumProp+1, taskFields[i], val);
break;
}
}
incNumProp++;
}
}
if (isRecurring) {
//
// Manage recurring properties: need to retrieve all values together
// ---------------------------- to apply safe checks and conversions.
//
winRec = winT.getRecPattern();
if (!winRec) { goto finally; }
winT.getProperty(TEXT("StartDate"), start);
incNumProp = setMAPIRecurrenceProps(prgPropvalPoom, incNumProp, *winRec, start,
start, true, NULL, false); // tasks are ALWAYS allday
}
//
// Save all props together (with rec props if recurring).
//
hr = saveItemProps(pTask, incNumProp, prgPropvalPoom);
if (FAILED(hr)) {
LOG.error("Error saving task \"%ls\"", winT.getName().c_str());
goto finally;
}
hr = S_OK;
finally:
// Release objects.
if (pRecurrence) { pRecurrence->Release(); }
if (pTaskOld) { pTaskOld->Release(); }
if (prgPropvalPoom) {
delete [] prgPropvalPoom;
}
return hr;
}
ArrayList* getTaskProperties(){
int i = 0;
ArrayList* props = new ArrayList();
while (taskFields[i]){
Property prop;
char* field = toMultibyte(taskFields[i]);
prop.setPropName(field);
props->add(prop);
delete [] field;
i++;
}
return props;
}
ArrayList* getVTodoProperties(){
ArrayList* props = new ArrayList();
Property* p = new Property();
ArrayList valenums;
StringBuffer val;
p->setPropName("BEGIN");
val = "VTODO";
valenums.add(val);
p->setValEnums(&valenums);
props->add(*p);
valenums.clear();
p->setPropName("END");
val = "VTODO";
valenums.add(val);
p->setValEnums(&valenums);
props->add(*p);
valenums.clear();
p->setPropName("VERSION");
val = "1.0";
valenums.add(val);
p->setValEnums(&valenums);
props->add(*p);
p->setPropName("X-FUNAMBOL-ALLDAY");
props->add(*p);
p->setPropName("DESCRIPTION");
props->add(*p);
p->setPropName("CATEGORIES");
props->add(*p);
p->setPropName("STATUS");
props->add(*p);
p->setPropName("COMPLETED");
props->add(*p);
p->setPropName("DUE");
props->add(*p);
p->setPropName("PRIORITY");
props->add(*p);
p->setPropName("X-FUNAMBOL-AALARMOPTIONS");
props->add(*p);
p->setPropName("AALARM");
props->add(*p);
p->setPropName("CLASS");
props->add(*p);
p->setPropName("DTSTART");
props->add(*p);
p->setPropName("SUMMARY");
props->add(*p);
p->setPropName("X-FUNAMBOL-TEAMTASK");
props->add(*p);
p->setPropName("RRULE");
props->add(*p);
delete p; p = NULL;
return props;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?