diff -r f5050f1da672 -r 04becd199f91 javaextensions/pim/versit/src.s60/cpimversit.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/pim/versit/src.s60/cpimversit.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,317 @@ +/* +* 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: Handles conversions between PIM Item <-> versit format + * +*/ + + +// INCLUDE FILES +#include "cpimmanager.h" +#include "cpimversit.h" +#include "cpimcardconverter.h" +#include "cpimcalendarconverter.h" +#include "cpimitem.h" +#include "cleanupresetanddestroy.h" +#include "logger.h" +#include // RBufWriteStream +#include +#include +#include + +// CONSTANTS +_LIT(KPIMSlash, "/"); +const TInt KPIMBufferGranularity = 40; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPIMVersit::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPIMVersit* CPIMVersit::NewL(CPIMManager* aManager) +{ + JELOG2(EPim); + CPIMVersit* self = new(ELeave) CPIMVersit(aManager); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; +} + +// Destructor +CPIMVersit::~CPIMVersit() +{ + JELOG2(EPim); + delete iCardConverter; + delete iCalendarConverter; + delete iVCardFormats; + delete iVCalendarFormats; +} + +// ----------------------------------------------------------------------------- +// CPIMVersit::ItemToStringL +// Converts a PIM Item to a Versit object. +// ----------------------------------------------------------------------------- +// +HBufC8* CPIMVersit::ItemToStringL(const CPIMItem& aItem, + Versit::TVersitCharSet aCharset) +{ + JELOG2(EPim); + CBufSeg* buffer = CBufSeg::NewL(KPIMBufferGranularity); + CleanupStack::PushL(buffer); + RBufWriteStream stream(*buffer, 0); + stream.PushL(); + switch (aItem.ItemType()) + { + case EPIMContactList: + { + iCardConverter->ItemToStreamL(stream, aItem, aCharset); + break; + } + case EPIMToDoList: + case EPIMEventList: + { + iCalendarConverter->ItemToStreamL(stream, aItem, aCharset); + break; + } + default: + { + User::Leave(KErrGeneral); + } + } + TInt bufferSize = buffer->Size(); + HBufC8* retVal = HBufC8::NewL(bufferSize); + TPtr8 retDes(retVal->Des()); + buffer->Read(0, retDes, bufferSize); + stream.Pop(); + CleanupStack::PopAndDestroy(buffer); + return retVal; +} + +// ----------------------------------------------------------------------------- +// CPIMVersit::StringToItemL +// Converts a Versit object to a PIM Item. +// ----------------------------------------------------------------------------- +// +RPointerArray* CPIMVersit::StringToItemL(const TDesC8& aString, + Versit::TVersitCharSet aCharset) +{ + JELOG2(EPim); + RPointerArray* itemArray = + new(ELeave) RPointerArray (1); + CleanupStack::PushL(itemArray); + CleanupResetAndDestroyPushL(*itemArray); + + // figure out the type of the item + // is it a vCard + HBufC8* vCardBegin = Combine3DesC8L(KVersitTokenBEGIN(), + KVersitTokenColon(), KVersitTokenVCARD()); + + TInt isVCard = aString.Find(*vCardBegin); + delete vCardBegin; + if (isVCard == 0) + { + // this is a vCard + StringToContactL(aString, *itemArray, aCharset); + CleanupStack::Pop(2); // itemArray reset and destroy, itemArray object + return itemArray; + } + + HBufC8* vCalendarBegin = Combine3DesC8L(KVersitTokenBEGIN(), + KVersitTokenColon(), KVersitTokenVCALENDAR()); + + TInt isVCalendar = aString.Find(*vCalendarBegin); + delete vCalendarBegin; + if (isVCalendar == 0) + { + // this is a vCalendar + + RDesReadStream stream(aString); + + iCalendarConverter->StreamToItemL(stream, *itemArray, aCharset); + CleanupStack::Pop(2); // itemArray reset and restroy, itemArray object + return itemArray; + } + User::Leave(KErrNotSupported); + return itemArray; // not really, just to avoid warning +} + +// ----------------------------------------------------------------------------- +// CPIMVersit::SupportedSerialFormatsL +// Returns an array of supported formats for a specific pim list type. +// ----------------------------------------------------------------------------- +// +const CDesCArray& CPIMVersit::SupportedSerialFormatsL(TPIMListType aPimListType) const +{ + JELOG2(EPim); + CDesCArray* retVal = NULL; + switch (aPimListType) + { + case EPIMContactList: + { + retVal = iVCardFormats; + break; + } + case EPIMEventList: + case EPIMToDoList: + { + retVal = iVCalendarFormats; + break; + } + default: + { + User::Leave(KErrArgument); + } + } + return *retVal; +} + +// ----------------------------------------------------------------------------- +// CPIMVersit::CPIMVersit +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +//CPIMVersit::CPIMVersit( +// const CPIMContactValidator& aContactValidator, // validates contacts +// const CPIMEventValidator& aEventValidator, // validates events +// const CPIMToDoValidator& aToDoValidator, // validates todos +// java::util::FunctionServer* aFuncServer ) +// : iContactValidator( aContactValidator), +// iEventValidator( aEventValidator ), +// iToDoValidator( aToDoValidator ), +// iFuncServer(aFuncServer) +// { +// } +// ----------------------------------------------------------------------------- +// CPIMVersit::CPIMVersit +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPIMVersit::CPIMVersit(CPIMManager* aManager) : + iContactValidator(aManager->ContactValidator()), iEventValidator( + aManager->EventValidator()), iToDoValidator(aManager->ToDoValidator()), + iFuncServer(aManager) +{ + JELOG2(EPim); +} + +// ----------------------------------------------------------------------------- +// CPIMVersit::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPIMVersit::ConstructL() +{ + JELOG2(EPim); + iVCardFormats = new(ELeave) CDesC16ArrayFlat(1); + HBufC* vCardFormat = Combine3DesCLC(KVersitVarTokenVCARD(), KPIMSlash(), + KVersitTokenVCardVersionNo()); + iVCardFormats->AppendL(*vCardFormat); + CleanupStack::PopAndDestroy(vCardFormat); // vCardFormat + + iVCalendarFormats = new(ELeave) CDesC16ArrayFlat(1); + HBufC* vCalendarFormat = Combine3DesCLC(KVersitVarTokenVCALENDAR(), + KPIMSlash(), KVersitTokenVCalVersionNo()); + iVCalendarFormats->AppendL(*vCalendarFormat); + CleanupStack::PopAndDestroy(vCalendarFormat); // vCalendarFormat + + iCardConverter = CPIMCardConverter::NewL(iContactValidator, iFuncServer); + iCalendarConverter = CPIMCalendarConverter::NewL(iEventValidator, + iToDoValidator, iFuncServer); +} + +// ----------------------------------------------------------------------------- +// CPIMVersit::StringToContact +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPIMVersit::StringToContactL(const TDesC8& aString, // contains a vCard + RPointerArray& aItemArray, // items are stored here + Versit::TVersitCharSet aCharset) // defines the used character set +{ + JELOG2(EPim); + // vCard specification says that END:VCARD is optional. + // However, Symbian Versit parser chokes without it. So, + // we have to check if one exists + HBufC8* vCardEnd = HBufC8::NewL(KVersitTokenCRLF().Length() + + KVersitTokenEND().Length() + KVersitTokenVCARD().Length() + + KVersitTokenColon().Length()); + CleanupStack::PushL(vCardEnd); + TPtr8 vCardEndDes = vCardEnd->Des(); + vCardEndDes = KVersitTokenCRLF(); + vCardEndDes.Append(KVersitTokenEND()); + vCardEndDes.Append(KVersitTokenColon()); + vCardEndDes.Append(KVersitTokenVCARD()); + TInt endExist = aString.Find(*vCardEnd); + if (endExist != KErrNotFound) + { + RDesReadStream stream(aString); + iCardConverter->StreamToItemL(stream, aItemArray, aCharset); + } + else + { + HBufC8* vCard = + Combine3DesC8L(aString, vCardEndDes, KVersitLineBreak()); + CleanupStack::PushL(vCard); + RDesReadStream stream(*vCard); + iCardConverter->StreamToItemL(stream, aItemArray, aCharset); + CleanupStack::PopAndDestroy(vCard); // vCard + } + CleanupStack::PopAndDestroy(vCardEnd); // vCardEnd + +} + +// ----------------------------------------------------------------------------- +// CPIMVersit::Combine3DesC8L +// Combines 3 8-bit descriptors into one +// ----------------------------------------------------------------------------- +// +HBufC8* CPIMVersit::Combine3DesC8L(const TDesC8& aDesC1, const TDesC8& aDesC2, + const TDesC8& aDesC3) +{ + JELOG2(EPim); + HBufC8* retVal = HBufC8::NewL(aDesC1.Length() + aDesC2.Length() + + aDesC3.Length()); + TPtr8 retValDes = retVal->Des(); + retValDes = aDesC1; + retValDes.Append(aDesC2); + retValDes.Append(aDesC3); + return retVal; +} + +// ----------------------------------------------------------------------------- +// CPIMVersit::Combine3DesCLC +// Combines 3 16-bit descriptors into one, which is left in cleanup stack +// ----------------------------------------------------------------------------- +// +HBufC* CPIMVersit::Combine3DesCLC(const TDesC& aDesC1, const TDesC& aDesC2, + const TDesC& aDesC3) +{ + JELOG2(EPim); + HBufC* retVal = HBufC::NewL(aDesC1.Length() + aDesC2.Length() + + aDesC3.Length()); + TPtr retValDes = retVal->Des(); + retValDes = aDesC1; + retValDes.Append(aDesC2); + retValDes.Append(aDesC3); + CleanupStack::PushL(retVal); + return retVal; +} + +// End of File