diff -r f5050f1da672 -r 04becd199f91 javaextensions/pim/versit/src.s60/cpimcalendarconverter.cpp --- /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 + +// ============================ 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* 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(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(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(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& aItemArray, Versit::TVersitCharSet aCharset) +{ + JELOG2(EPim); + + + CParserVCal* parser = CParserVCal::NewL(); + CleanupStack::PushL(parser); + parser->SetDefaultCharSet(aCharset); + parser->InternalizeL(aStream); + + CArrayPtr* eventArray = parser->EntityL( + KVersitVarTokenVEVENT, EFalse); + CleanupStack::PushL(eventArray); + CArrayPtr* 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(eventArray->At(i)); + ParserToEventL(*entity, aItemArray); + } + } + + if (todoArray) + { + TInt todoCount = todoArray->Count(); + for (TInt i = 0; i < todoCount; i++) + { + CParserVCalEntity* entity = + static_cast(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& 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* 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& 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* 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