diff -r f5050f1da672 -r 04becd199f91 javaextensions/pim/framework/src.s60/cpimserializer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/pim/framework/src.s60/cpimserializer.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,332 @@ +/* +* 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: Versit serializer native side. + * +*/ + + +// INCLUDE FILES +#include "cpimserializer.h" +#include "cpimmanager.h" +#include "cpimversit.h" +#include "cpimitem.h" +#include "cpimeventitem.h" +#include "pimbaserepeatrule.h" +#include "pimjnitools.h" +#include "pimutils.h" +#include "logger.h" + +// CONSTANTS +const Versit::TVersitCharSet KCharSetMapping[] = + { Versit::EUTF8CharSet, Versit::EISO88591CharSet }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPIMSerializer::getInstance +// Two-phased constructor for JNI +// ----------------------------------------------------------------------------- +// +pimbaseserializer* pimbaseserializer::getInstance(pimbasemanager* aManager) // used for getting validators +{ + JELOG2(EPim); + CPIMManager* manager = static_cast(aManager); + TInt error = KErrNone; + pimbaseserializer *serializer = NULL; + TRAP(error, serializer = CPIMSerializer::NewL(manager)); + if (error != KErrNone) + { + throw error; + } + return serializer; +} + +// ----------------------------------------------------------------------------- +// CPIMSerializer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPIMSerializer* CPIMSerializer::NewL(CPIMManager* aManager) +{ + JELOG2(EPim); + CPIMSerializer* self = new(ELeave) CPIMSerializer; + + CleanupStack::PushL(self); + self->ConstructL(aManager); + CleanupStack::Pop(); + + return self; +} + +// Destructor +CPIMSerializer::~CPIMSerializer() +{ + JELOG2(EPim); + delete iVersit; +} + +// ----------------------------------------------------------------------------- +// CPIMSerializer::FromSerialFormatL +// forwards the request to the versit module +// ----------------------------------------------------------------------------- +// +jintArray CPIMSerializer::FromSerialFormatL(JNIEnv* aJniEnv, + const TDesC8& aBuffer, TEncoding aEncoding) +{ + JELOG2(EPim); + Versit::TVersitCharSet charSet = MapEncodingL(aEncoding); + RPointerArray* itemArray = iVersit->StringToItemL(aBuffer, + charSet); + CleanupDeletePushL(itemArray); + CleanupClosePushL(*itemArray); + + // calculate the length of the needed array + TInt arrayLength = 0; + TInt itemCount = itemArray->Count(); + TInt i = 0; + for (i = 0; i < itemCount; i++) + { + switch ((*itemArray)[i]->ItemType()) + { + case EPIMContactList: + case EPIMToDoList: + { + arrayLength += 2; + break; + } + case EPIMEventList: + { + arrayLength += 4; + break; + } + default: + { + User::Leave(KErrNoMemory); + } + } + } + + jintArray itemHandles = aJniEnv->NewIntArray(arrayLength); + if (!itemHandles) + { + User::Leave(KErrNoMemory); + } + jint* handles = aJniEnv->GetIntArrayElements(itemHandles, 0); + jint* handlePointer = handles; + for (i = 0; i < itemCount; i++) + { + pimbaseitem* item = (*itemArray)[i]; + TInt itemHandle(reinterpret_cast(item)); + TInt itemType = ((*itemArray)[i])->ItemType(); + *handlePointer++ = itemType; + *handlePointer++ = itemHandle; + if (itemType == EPIMEventList) + { + + int baseRepeatRuleHandle = item->getRepeatHandle(); + if (baseRepeatRuleHandle < KErrNone) + throw baseRepeatRuleHandle; + + *handlePointer++ = baseRepeatRuleHandle; + handlePointer++; + } + } + aJniEnv->ReleaseIntArrayElements(itemHandles, handles, 0); + + CleanupStack::PopAndDestroy(2); + return itemHandles; +} + +jintArray CPIMSerializer::fromSerialFormat(JNIEnv* aJniEnv, jbyteArray aBytes, + int aByteLength, int aEncoding, jintArray aError) +{ + JELOG2(EPim); + jbyte* bytes = aJniEnv->GetByteArrayElements(aBytes, 0); + TUint8* temp = reinterpret_cast(bytes); + const TPtrC8 versitString(temp, aByteLength); + TInt error = KErrNone; + jintArray itemArray = NULL; + TRAP(error, itemArray = FromSerialFormatL(aJniEnv, versitString, + static_cast(aEncoding))); + aJniEnv->ReleaseByteArrayElements(aBytes, bytes, JNI_ABORT); + if (error != KErrNone) + { + SetJavaErrorCode(aJniEnv, aError, error); + return NULL; + } + + if (!itemArray) + { + SetJavaErrorCode(aJniEnv, aError, KErrNoMemory); + return NULL; + } + + SetJavaErrorCode(aJniEnv, aError, KErrNone); + + return itemArray; +} + +// ----------------------------------------------------------------------------- +// CPIMSerializer::ToSerialFormatL +// forwards the request to the versit module +// ----------------------------------------------------------------------------- +// +HBufC8* CPIMSerializer::ToSerialFormatL(const CPIMItem& aItem, + TEncoding aEncoding) +{ + JELOG2(EPim); + Versit::TVersitCharSet charSet = MapEncodingL(aEncoding); + return iVersit->ItemToStringL(aItem, charSet); +} + +jbyteArray CPIMSerializer::toSerialFormat(pimbaseitem* aItem, int aEncoding, + JNIEnv* aJniEnv, jintArray aError) +{ + JELOG2(EPim); + HBufC8* versitObject = NULL; + CPIMItem* item = static_cast(aItem); + + TInt error = 0; + TRAP(error, versitObject = ToSerialFormatL(*item, + static_cast(aEncoding))); + if (error != KErrNone) + { + SetJavaErrorCode(aJniEnv, aError, error); + return NULL; + } + + if (!versitObject) + { + SetJavaErrorCode(aJniEnv, aError, KErrNoMemory); + return NULL; + } + + TInt versitLength = versitObject->Length(); + jbyteArray retVal = aJniEnv->NewByteArray(versitLength); + if (!retVal) + { + // creating a new byte array failed + SetJavaErrorCode(aJniEnv, aError, KErrNoMemory); + delete versitObject; + return NULL; + } + jbyte* bytes = aJniEnv->GetByteArrayElements(retVal, 0); + const TUint8* versitPtr = versitObject->Ptr(); + for (int i = 0; i < versitLength; i++) + { + bytes[i] = versitPtr[i]; + } + aJniEnv->ReleaseByteArrayElements(retVal, bytes, 0); + SetJavaErrorCode(aJniEnv, aError, KErrNone); + delete versitObject; + return retVal; +} + +// ----------------------------------------------------------------------------- +// CPIMSerializer::SupportedSerialFormatsL +// forwards the request to the versit module +// ----------------------------------------------------------------------------- +// +const CDesCArray& CPIMSerializer::SupportedSerialFormatsL( + TPIMListType aPimListType) +{ + JELOG2(EPim); + return iVersit->SupportedSerialFormatsL(aPimListType); +} + +jobjectArray CPIMSerializer::supportedSerialFormats(TPIMListType aPimListType, + JNIEnv* aJniEnv, jintArray aError) +{ + JELOG2(EPim); + const CDesCArray* desArray = NULL; + TInt error = KErrNone; + TRAP(error, desArray = &(SupportedSerialFormatsL(aPimListType))); + if (error != KErrNone) + { + SetJavaErrorCode(aJniEnv, aError, error); + return NULL; + } + + if (!desArray) + { + SetJavaErrorCode(aJniEnv, aError, KErrNoMemory); + return NULL; + } + + TInt desCount = desArray->Count(); + jobjectArray retVal = aJniEnv->NewObjectArray(desCount, aJniEnv->FindClass( + "java/lang/String"), NULL); + if (retVal == NULL) + { + SetJavaErrorCode(aJniEnv, aError, KErrNoMemory); + return NULL; + } + + for (TInt i = 0; i < desCount; i++) + { + TPtrC epocString = (*desArray)[i]; + jstring javaString = aJniEnv->NewString(epocString.Ptr(), + epocString.Length()); + if (javaString == NULL) + { + SetJavaErrorCode(aJniEnv, aError, KErrNoMemory); + return NULL; + } + aJniEnv->SetObjectArrayElement(retVal, i, javaString); + + // Avoid exceeding max local references (5) + aJniEnv->DeleteLocalRef(javaString); + } + // note that desArray is owned by the adapter, and not deleted here + SetJavaErrorCode(aJniEnv, aError, KErrNone); + return retVal; +} + +// ----------------------------------------------------------------------------- +// CPIMSerializer::CPIMSerializer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPIMSerializer::CPIMSerializer() +{ + JELOG2(EPim); +} + +// ----------------------------------------------------------------------------- +// CPIMSerializer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPIMSerializer::ConstructL(CPIMManager* aManager) +{ + JELOG2(EPim); + iVersit = CPIMVersit::NewL(aManager); +} + +// ----------------------------------------------------------------------------- +// CPIMSerializer::MapEncodingL +// Maps the encoding from TEncoding to Versit::TVersitCharSet +// ----------------------------------------------------------------------------- +// +Versit::TVersitCharSet CPIMSerializer::MapEncodingL(TEncoding aEncoding) +{ + JELOG2(EPim); + if ((aEncoding < 0) || (aEncoding > EISO88591)) + { + User::Leave(KErrArgument); + } + return KCharSetMapping[aEncoding]; +} +