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 + -
显示快捷键?