javaextensions/pim/versit/src.s60/cpimcalendarconverter.cpp
branchRCL_3
changeset 19 04becd199f91
child 23 98ccebc37403
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/pim/versit/src.s60/cpimcalendarconverter.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,326 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Converts vCalendars PIM <-> Versit
+ *
+*/
+
+
+// CLASS HEADER
+#include "cpimcalendarconverter.h"
+
+// INTERNAL INCLUDES
+#include "pimcommon.h" // tpimfield
+#include "pimpanics.h"
+#include "pimversit.h"
+#include "cpimitem.h"
+#include "cpimeventitem.h"
+#include "cpimtodoitem.h"
+#include "cpimtodopropertyconverter.h"
+#include "cpimeventpropertyconverter.h"
+#include "fs_methodcall.h"
+#include "logger.h"
+#include "cleanupresetanddestroy.h"
+
+// EXTERNAL INCLUDES
+#include <vcal.h>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPIMCalendarConverter::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPIMCalendarConverter* CPIMCalendarConverter::NewL(
+    const CPIMEventValidator& aEventValidator,
+    const CPIMToDoValidator& aToDoValidator,
+    java::util::FunctionServer* aFuncServer)
+{
+    JELOG2(EPim);
+    CPIMCalendarConverter* self = new(ELeave) CPIMCalendarConverter(
+        aEventValidator, aToDoValidator, aFuncServer);
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+// Destructor
+CPIMCalendarConverter::~CPIMCalendarConverter()
+{
+    JELOG2(EPim);
+    delete iToDoConverter;
+    delete iEventConverter;
+}
+
+// -----------------------------------------------------------------------------
+// CPIMCalendarConverter::ItemToStreamL
+// Converts Event/ToDo Items to vCards.
+// -----------------------------------------------------------------------------
+//
+void CPIMCalendarConverter::ItemToStreamL(RWriteStream& aStream, // RWriteStream to write the vCard to.
+        const CPIMItem& aItem, // CPIMItem which is to be converted.
+        const Versit::TVersitCharSet aCharset) // charSet used in versit objects
+{
+    JELOG2(EPim);
+    CParserVCal* calParser = CParserVCal::NewL();
+    CleanupStack::PushL(calParser);
+    calParser->SetDefaultCharSet(aCharset);
+
+    CParserVCalEntity* parser = CParserVCalEntity::NewL();
+    // NOTE: parser is not put into the cleanup stack since AddEntityL
+    // pushes it right from the start. So it MUST not be pushed here
+    // to avoid duplicate cleanup stack pointers
+    calParser->AddEntityL(parser);
+    // No need to pop here
+
+    CArrayFix<TPIMField>* fields = aItem.GetFieldsL();
+    CleanupStack::PushL(fields);
+    TInt fieldCount = fields->Count();
+    switch (aItem.ItemType())
+    {
+    case EPIMEventList:
+    {
+        TPtrC vEvent(KVersitVarTokenVEVENT);
+        parser->SetEntityNameL(vEvent);
+        for (TInt i = 0; i < fieldCount; i++)
+        {
+            TPIMEventField eventField =
+                static_cast<TPIMEventField>(fields->At(i));
+            CallMethodL(iEventConverter,
+                        &CPIMEventPropertyConverter::ConvertEventFieldL, aItem,
+                        *parser, eventField, iFuncServer);
+        }
+        // Priority is a mandatory property for vCals so add it here...
+        // Since event items do not have priority field, use unspecified
+        // priority value which is zero
+        CParserPropertyValue* value = new(ELeave) CParserPropertyValueInt(0);
+        // value is pushed to the cleanup stack in AddPropertyToParserL
+        // and parser takes the ownership of the added value
+        iEventConverter->AddPropertyToParserL(value, KVersitTokenPRIORITY(),
+                                              *parser);
+        // Add repeat rule vCal property if the item is repeating
+        const CPIMEventItem& eventItem =
+            static_cast<const CPIMEventItem&>(aItem);
+        if (eventItem.IsRepeating())
+        {
+            iEventConverter->ConvertRepeatRuleL(eventItem.GetRepeat(), *parser);
+        }
+        break;
+    }
+    case EPIMToDoList:
+    {
+        // Priority field neesds to be added if not present in the item
+        if (aItem.CountValuesL(EPIMToDoCompleted) == 0)
+        {
+            CParserPropertyValue* propertyValue =
+                CParserPropertyValueHBufC::NewL(KPIMStatusUncompleted);
+            // value is pushed to the cleanup stack in AddPropertyToParserL
+            // and parser takes the ownership of the added value
+            iToDoConverter->AddPropertyToParserL(propertyValue,
+                                                 KVersitTokenSTATUS(), *parser);
+        }
+        // Convert other fields
+        TPtrC vToDo(KVersitVarTokenVTODO);
+        parser->SetEntityNameL(vToDo);
+        for (TInt i = 0; i < fieldCount; i++)
+        {
+            TPIMToDoField todoField =
+                static_cast<TPIMToDoField>(fields->At(i));
+            CallMethodL(iToDoConverter,
+                        &CPIMToDoPropertyConverter::ConvertToDoFieldL, aItem, *parser,
+                        todoField, iFuncServer);
+        }
+        break;
+    }
+    default:
+    {
+        User::Leave(KErrArgument);
+    }
+    }
+    calParser->ExternalizeL(aStream);
+    aStream.CommitL();
+    CleanupStack::PopAndDestroy(2, calParser);  // fields, parser
+}
+
+// -----------------------------------------------------------------------------
+// CPIMCalendarConverter::StreamToItemL
+// Converts vCards to Event Items
+// -----------------------------------------------------------------------------
+//
+void CPIMCalendarConverter::StreamToItemL(RReadStream& aStream, // RReadStream to be converted.
+        RPointerArray<CPIMItem>& aItemArray, Versit::TVersitCharSet aCharset)
+{
+    JELOG2(EPim);
+
+
+    CParserVCal* parser = CParserVCal::NewL();
+    CleanupStack::PushL(parser);
+    parser->SetDefaultCharSet(aCharset);
+    parser->InternalizeL(aStream);
+
+    CArrayPtr<CVersitParser>* eventArray = parser->EntityL(
+                                               KVersitVarTokenVEVENT, EFalse);
+    CleanupStack::PushL(eventArray);
+    CArrayPtr<CVersitParser>* todoArray = parser->EntityL(KVersitVarTokenVTODO,
+                                          EFalse);
+    CleanupStack::PushL(todoArray);
+
+    if (eventArray)
+    {
+        TInt eventCount = eventArray->Count();
+        for (TInt i = 0; i < eventCount; i++)
+        {
+            CParserVCalEntity* entity =
+                static_cast<CParserVCalEntity*>(eventArray->At(i));
+            ParserToEventL(*entity, aItemArray);
+        }
+    }
+
+    if (todoArray)
+    {
+        TInt todoCount = todoArray->Count();
+        for (TInt i = 0; i < todoCount; i++)
+        {
+            CParserVCalEntity* entity =
+                static_cast<CParserVCalEntity*>(todoArray->At(i));
+            ParserToToDoL(*entity, aItemArray);
+        }
+    }
+    CleanupStack::PopAndDestroy(3, parser); // parser, eventArray, todoArray
+
+
+}
+
+// -----------------------------------------------------------------------------
+// CPIMCalendarConverter::CPIMCalendarConverter
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPIMCalendarConverter::CPIMCalendarConverter(
+    const CPIMEventValidator& aEventValidator,
+    const CPIMToDoValidator& aToDoValidator,
+    java::util::FunctionServer* aFuncServer) :
+        iEventValidator(aEventValidator), iToDoValidator(aToDoValidator),
+        iFuncServer(aFuncServer)
+{
+    JELOG2(EPim);
+}
+
+// -----------------------------------------------------------------------------
+// CPIMCalendarConverter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPIMCalendarConverter::ConstructL()
+{
+    JELOG2(EPim);
+    iToDoConverter = CPIMToDoPropertyConverter::NewL();
+    iEventConverter = CPIMEventPropertyConverter::NewL();
+}
+
+// -----------------------------------------------------------------------------
+// CPIMCalendarConverter::ParserToEventL
+// Converts vEvents to Event Items
+// -----------------------------------------------------------------------------
+//
+void CPIMCalendarConverter::ParserToEventL(CParserVCalEntity& aParser,
+        RPointerArray<CPIMItem>& aItemArray)
+{
+    JELOG2(EPim);
+    CleanupResetAndDestroyPushL(aItemArray);
+    CPIMEventItem* item = CPIMEventItem::NewLC(iEventValidator);
+    TPIMDate alarm(TInt64(0));
+    // We don't take the ownership of the propertyArray, so the properties
+    // are deleted when the parser is
+    CArrayPtr<CParserProperty>* propertyArray = aParser.ArrayOfProperties(
+                EFalse);
+    if (!propertyArray)
+    {
+        User::Leave(KErrCorrupt);
+    }
+    TInt propertyCount = propertyArray->Count();
+    for (TInt i = 0; i < propertyCount; i++)
+    {
+        iEventConverter->ConvertPropertyL(*(propertyArray->At(i)), *item, alarm);
+    }
+    if (alarm.Int64() != TInt64(0))
+    {
+        // Count the alarm value
+        if (item->CountValuesL(EPIMEventStart) > 0)
+        {
+            const TPIMDate startDate = item->GetDateL(EPIMEventStart, 0);
+            TTimeIntervalSeconds interval(0);
+            User::LeaveIfError(startDate.SecondsFrom(alarm, interval));
+            item->addInt(EPIMEventAlarm, KPIMAttrNone, interval.Int());
+        }
+    }
+    User::LeaveIfError(aItemArray.Append(item));
+    CleanupStack::Pop(item); // item
+    CleanupStack::Pop(&aItemArray);
+}
+
+// -----------------------------------------------------------------------------
+// CPIMCalendarConverter::ParserToToDoL
+// Converts vTodos to Todo Items
+// -----------------------------------------------------------------------------
+//
+void CPIMCalendarConverter::ParserToToDoL(CParserVCalEntity& aParser,
+        RPointerArray<CPIMItem>& aItemArray)
+{
+    JELOG2(EPim);
+    CleanupResetAndDestroyPushL(aItemArray);
+    CPIMToDoItem* item = CPIMToDoItem::NewLC(iToDoValidator);
+    TPIMDate alarm(TInt64(0));
+    // We don't take the ownership of the propertyArray, so the properties
+    // are deleted when the parser is
+    CArrayPtr<CParserProperty>* propertyArray = aParser.ArrayOfProperties(
+                EFalse);
+    if (!propertyArray)
+    {
+        User::Leave(KErrCorrupt);
+    }
+    TInt propertyCount = propertyArray->Count();
+    for (TInt i = 0; i < propertyCount; i++)
+    {
+        iToDoConverter->ConvertPropertyL(*(propertyArray->At(i)), *item, alarm);
+    }
+    if (alarm.Int64() != TInt64(0))
+    {
+        // Count alarm value if possible
+        if (item->CountValuesL(EPIMToDoDue) > 0)
+        {
+            const TPIMDate dueDate = item->GetDateL(EPIMToDoDue, 0);
+            TTimeIntervalSeconds alarmOffset(0);
+            User::LeaveIfError(dueDate.SecondsFrom(alarm, alarmOffset));
+            item->AddIntL(EPIMToDoExtAlarm, KPIMAttrNone, alarmOffset.Int());
+        }
+    }
+    if (item->CountValuesL(EPIMToDoCompletionDate) == 0)
+    {
+        item->AddBooleanL(EPIMToDoCompleted, KPIMAttrNone, EFalse);
+    }
+    else
+    {
+        item->AddBooleanL(EPIMToDoCompleted, KPIMAttrNone, ETrue);
+    }
+    User::LeaveIfError(aItemArray.Append(item));
+    CleanupStack::Pop(item); // item
+    CleanupStack::Pop(&aItemArray);
+}
+
+//  End of File