javaextensions/pim/framework/src.s60/cpimserializer.cpp
branchRCL_3
changeset 19 04becd199f91
--- /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];
+}
+