javauis/mmapi_qt/baseline/src/managerimpl.cpp
branchRCL_3
changeset 65 ae942d28ec0e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_qt/baseline/src/managerimpl.cpp	Tue Aug 31 15:09:22 2010 +0300
@@ -0,0 +1,264 @@
+/*
+* Copyright (c) 2002 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:  This class has ManagerImpl JNI functions
+*
+*/
+
+#include <logger.h>
+
+#include <JniEnvWrapper.h>
+
+#include "com_nokia_microedition_media_ManagerImpl.h"
+#include "cmmamanager.h"
+#include "cmmaplayer.h"
+#include "jstringutils.h"
+#include "s60commonutils.h"
+using namespace java::util;
+
+const TInt KMMADefaultArrayGranularity = 8;
+
+JNIEXPORT void JNICALL Java_com_nokia_microedition_media_ManagerImpl__1dispose
+(JNIEnv* /*aJni*/, jobject, jint aEventSourceHandle)
+{
+    LOG(EJavaMMAPI,EInfo,"MMA::ManagerImpl dispose");
+    MMAFunctionServer* eventSource =
+        reinterpret_cast< MMAFunctionServer* >(aEventSourceHandle);
+    delete eventSource;
+}
+
+LOCAL_C void ReleaseEventSource(MMAFunctionServer* aEventSource)
+{
+    aEventSource->Release();
+}
+
+JNIEXPORT void JNICALL Java_com_nokia_microedition_media_ManagerImpl__1release
+(JNIEnv*, jobject, jint aEventSourceHandle)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::ManagerImpl release");
+    MMAFunctionServer* eventSource =
+        reinterpret_cast< MMAFunctionServer* >(aEventSourceHandle);
+    eventSource->ExecuteV(&ReleaseEventSource,
+                          eventSource);
+}
+
+/*
+ * Class:     javax_microedition_media_Manager
+ * Method:    _createManager
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_microedition_media_ManagerImpl__1createManager
+(JNIEnv*, jobject, jint aEventSourceHandle, jint aMIDletSuiteID)
+{
+    MMAFunctionServer* eventSource =  reinterpret_cast<MMAFunctionServer*>(aEventSourceHandle);
+
+    CMMAManager* manager = NULL;
+    TInt error = eventSource->ExecuteTrap(&CMMAManager::StaticCreateManagerL,
+                                          &manager,
+                                          aMIDletSuiteID);
+    ELOG1(EJavaMMAPI, "MMA::ManagerImpl createManager StaticCreateManagerL %d",
+          error);
+    if (error != KErrNone)
+    {
+        return error;
+    }
+
+    TInt managerHandle(reinterpret_cast<TInt>(manager));
+
+    error = eventSource->ExecuteTrap(MMAFunctionServer::StaticAddObjectFromHandleL,
+                                     eventSource,
+                                     managerHandle);
+
+    ELOG1(EJavaMMAPI, "MMA::ManagerImpl createManager StaticAddObjectFromHandleL %d",
+          error);
+
+    if (error != KErrNone)
+    {
+        // Adding manager to event source failed.
+        delete manager;
+
+        // Error code will be returned to java
+        managerHandle = error;
+    }
+    LOG1(EJavaMMAPI, EInfo, "MMA::ManagerImpl createManager %d",
+         managerHandle);
+    return managerHandle;
+}
+
+
+LOCAL_C void InvokeConstructSvrL(MMAFunctionServer* aEventSource)
+{
+    aEventSource->ConstructSvrL();
+}
+
+/*
+ * Class:     javax_microedition_media_Manager
+ * Method:    _getEventSource
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_microedition_media_ManagerImpl__1createEventSource
+(JNIEnv* aJni, jobject aPeer)
+{
+    TInt eventSourceHandle = -1;
+    TRAPD(err,eventSourceHandle = MMAFunctionServer::NewL(*aJni, aPeer));
+    if (err != KErrNone)
+        eventSourceHandle = err;
+    if (eventSourceHandle > KErrNone)
+    {
+        MMAFunctionServer* eventSource =
+            reinterpret_cast< MMAFunctionServer* >(eventSourceHandle);
+
+        // third phase construction
+        TInt error = eventSource->ExecuteTrap(&InvokeConstructSvrL,
+                                              eventSource);
+        if (error != KErrNone)
+        {
+            eventSourceHandle = error;
+        }
+    }
+    LOG1(EJavaMMAPI, EInfo, "MMA::ManagerImpl createEventSource %d",
+         eventSourceHandle);
+    return eventSourceHandle;
+}
+
+/**
+ * Local function which can be used to call CMMAManager class methods.
+ * Type of of the function pointer must be
+ * void CMMAManager::aFuncL( RPointerArray< HBufC >&, const TDesC& )
+ * Java String array will be created and set to aArray variable.
+ *
+ * @param aManager CMMAManager instance.
+ * @param aFuncL Pointer to the CMMAManager method.
+ * @param aJni Used to create an array.
+ * @param aArray Values got from aFuncL will be copied to this array.
+ * @param aParam Parameter that will be passed to aFuncL method.
+ */
+LOCAL_C void GetObjectArrayL(MMAFunctionServer* aEventSource,
+                             CMMAManager* aManager,
+                             void (CMMAManager::*aFuncL)(const TDesC&,
+                                                         CDesC16Array&),
+                             JNIEnv* aJni,
+                             jobjectArray* aArray,
+                             const TDesC* aParam)
+{
+    // Temporary descriptor array to be copied to Java array.
+    CDesC16ArrayFlat* values = new(ELeave) CDesC16ArrayFlat(
+        KMMADefaultArrayGranularity);
+    CleanupStack::PushL(values);
+
+    // Call void CMMAManager::aFuncL( const TDesC&, RPointerArray< HBufC >& )
+    // method. Method can leave.
+    // Elements of the array will be owned by this method.
+    (aManager->*aFuncL)(*aParam, *values);
+
+    // JNI interface pointer can't be passed to different thread, so
+    // it is needed to get valid JNI interface pointer for Event Server thread
+    aJni =aEventSource->getValidJniEnv();
+
+    // Create new java String array and copy values from the values array
+    *aArray = MMAPIUtils::CopyToNewJavaStringArrayL(*aJni, *values);
+    CleanupStack::PopAndDestroy(values);
+}
+
+
+/*
+ * Class:     javax_microedition_media_Manager
+ * Method:    _getSupportedContentTypes
+ * Signature: (II)[[B
+ */
+JNIEXPORT jobjectArray JNICALL Java_com_nokia_microedition_media_ManagerImpl__1getSupportedContentTypes
+(JNIEnv* aJni,
+ jclass,
+ jint aEventSourceHandle,
+ jint aManagerHandle,
+ jstring aProtocol)
+{
+    MMAFunctionServer* eventSource =
+        reinterpret_cast< MMAFunctionServer * >(aEventSourceHandle);
+    CMMAManager* manager = reinterpret_cast< CMMAManager *>(aManagerHandle);
+
+    jobjectArray contentTypes = NULL;
+
+    // Create descritor from Java String.
+    // JStringUtils is derived from TPtrC16 and is save to cast to TDesC
+    JStringUtils tmp(*aJni, aProtocol);
+    const TDesC* protocol = &tmp;
+    if (aProtocol == NULL)
+    {
+        protocol = &KNullDesC;
+    }
+
+    // Call manager->GetSupportedContentTypesL and create Java array.
+    TInt err = eventSource->ExecuteTrap(&GetObjectArrayL,
+                                        eventSource,
+                                        manager,
+                                        &CMMAManager::GetSupportedContentTypesL,
+                                        aJni,
+                                        &contentTypes,
+                                        protocol);
+
+    if (err != KErrNone)
+    {
+        // Something failed. Returning NULL, because contentTypes array may not
+        // be complete. contentTypes array is left for carbage collertor,
+        // because it can't be released.
+        return NULL;
+    }
+    return contentTypes;
+}
+
+/*
+ * Class:     javax_microedition_media_Manager
+ * Method:    _getSupportedProtocols
+ * Signature: (II)[[B
+ */
+JNIEXPORT jobjectArray JNICALL Java_com_nokia_microedition_media_ManagerImpl__1getSupportedProtocols
+(JNIEnv* aJni,
+ jclass,
+ jint aEventSourceHandle,
+ jint aManagerHandle,
+ jstring aContentType)
+{
+    MMAFunctionServer* eventSource =
+        reinterpret_cast< MMAFunctionServer *>(aEventSourceHandle);
+    CMMAManager* manager = reinterpret_cast< CMMAManager *>(aManagerHandle);
+
+    jobjectArray protocols = NULL;
+
+    // Create descritor from Java String.
+    // JStringUtils is derived from TPtrC16 and is save to cast to TDesC
+    JStringUtils tmp(*aJni, aContentType);
+    const TDesC* contentType = &tmp;
+    if (aContentType == NULL)
+    {
+        contentType = &KNullDesC;
+    }
+
+    // Call manager->GetSupportedProtocolsL and create Java array.
+    TInt err = eventSource->ExecuteTrap(&GetObjectArrayL,
+                                        eventSource,
+                                        manager,
+                                        &CMMAManager::GetSupportedProtocolsL,
+                                        aJni,
+                                        &protocols,
+                                        contentType);
+    if (err != KErrNone)
+    {
+        // Something failed. Returning NULL, because contentTypes array may not
+        // be complete. contentTypes array is left for carbage collertor,
+        // because it can't be released.
+        return NULL;
+    }
+    return protocols;
+}
+
+//  END OF FILE