--- /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<CPIMManager*>(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<CPIMItem>* 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<int>(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<TUint8*>(bytes);
+ const TPtrC8 versitString(temp, aByteLength);
+ TInt error = KErrNone;
+ jintArray itemArray = NULL;
+ TRAP(error, itemArray = FromSerialFormatL(aJniEnv, versitString,
+ static_cast<TEncoding>(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<CPIMItem *>(aItem);
+
+ TInt error = 0;
+ TRAP(error, versitObject = ToSerialFormatL(*item,
+ static_cast<TEncoding>(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];
+}
+