javaextensions/midppush/src/pushregistryimplnative.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/midppush/src/pushregistryimplnative.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,319 @@
+/*
+* 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:
+*
+*/
+
+
+#include "com_nokia_mj_impl_push_PushRegistryImpl.h"
+#include "logger.h"
+#include "pushregistry.h"
+#include "pushexception.h"
+#include "javajniutils.h"
+#include "javacommonutils.h"
+#include "pusherrorcodes.h"
+#include "libraryloaderexception.h"
+#include "dynamiclibloader.h"
+#include "pushcontrollerstarter.h"
+#include "pushcontrollerstarterimpl.h"
+
+using namespace java::push;
+using namespace java::runtime;
+using namespace java::util;
+
+class StaticImplObjContainer
+{
+public:
+    StaticImplObjContainer():mImpl(0) {}
+
+    ~StaticImplObjContainer() {}
+
+    PushRegistry* mImpl;
+};
+
+#if defined(__SYMBIAN32__) && defined(__WINSCW__)
+#include <pls.h>
+#else
+static StaticImplObjContainer* sImpObjContainer = 0;
+#endif
+
+#ifdef __SYMBIAN32__
+PushRegistry& getPushRegistryInstance()
+#else
+extern "C" PushRegistry& getPushRegistryInstance()
+#endif
+{
+    JELOG2(EJavaPush);
+    StaticImplObjContainer* container = 0;
+#if defined(__SYMBIAN32__) && defined(__WINSCW__)
+    TUid uid = TUid::Uid(0xE0000020);
+    container = Pls<StaticImplObjContainer>(uid);
+#else
+    if (sImpObjContainer == 0)
+    {
+        sImpObjContainer = new StaticImplObjContainer();
+    }
+    container = sImpObjContainer;
+#endif
+
+    if (0 == container->mImpl)
+    {
+        std::auto_ptr<java::util::DynamicLibLoader> loader(NULL);
+        PushControllerStarter& starter = PushControllerStarter::getPushControllerStarter(loader);
+        //We have to leave this object to memory leak because we does not have correct place
+        //to store DynamicLibLoader object. This just means that
+        //pushcontroller dll is never unloaded from the runtime process.
+        loader.release();
+        PushRegistry* retObj = static_cast<PushControllerStarterImpl*>(&starter);
+        container->mImpl = retObj;
+        return *retObj;
+    }
+    return *container->mImpl;
+}
+
+JNIEXPORT jstring JNICALL Java_com_nokia_mj_impl_push_PushRegistryImpl_getFilter0
+(JNIEnv* aEnv, jclass, jstring aUri, jstring aSuiteUid)
+{
+    JELOG2(EJavaPush);
+    try
+    {
+        Uid suiteUid(JniUtils::jstringToWstring(aEnv,aSuiteUid));
+        std::wstring uriAsWStr = JniUtils::jstringToWstring(aEnv,aUri);
+        PushRegistry& pushRegistry = getPushRegistryInstance();
+        std::wstring filterStr = pushRegistry.getFilter(uriAsWStr,suiteUid);
+        jstring filter = JniUtils::wstringToJstring(aEnv,filterStr);
+        return filter;
+    }
+    catch (PushException& ex)
+    {
+        ELOG1(EJavaPush,"ERROR!!! PushException caught: %s",ex.toString().c_str());
+        return NULL;
+    }
+    catch (...)
+    {
+        ELOG(EJavaPush,"ERROR!!! Unexpected exception was caught");
+        return NULL;
+    }
+}
+
+JNIEXPORT jstring JNICALL Java_com_nokia_mj_impl_push_PushRegistryImpl_getMIDlet0
+(JNIEnv* aEnv, jclass, jstring aUri, jstring aSuiteUid)
+{
+    JELOG2(EJavaPush);
+    try
+    {
+        Uid suiteUid(JniUtils::jstringToWstring(aEnv,aSuiteUid));
+        std::wstring uriAsWStr = JniUtils::jstringToWstring(aEnv,aUri);
+        PushRegistry& pushRegistry = getPushRegistryInstance();
+        std::wstring filterStr = pushRegistry.getClassNameOfMidlet(uriAsWStr,suiteUid);
+        jstring filter = JniUtils::wstringToJstring(aEnv,filterStr);
+        return filter;
+    }
+    catch (PushException& ex)
+    {
+        ELOG1(EJavaPush,"ERROR!!! PushException caught: %s",ex.toString().c_str());
+        return NULL;
+    }
+    catch (...)
+    {
+        ELOG(EJavaPush,"ERROR!!! Unexpected exception was caught");
+        return NULL;
+    }
+}
+
+
+JNIEXPORT jboolean JNICALL Java_com_nokia_mj_impl_push_PushRegistryImpl_isPushConnection0
+(JNIEnv* aEnv, jclass, jstring aUri, jstring aAppUid)
+{
+    JELOG2(EJavaPush);
+    try
+    {
+        Uid appUid(JniUtils::jstringToWstring(aEnv,aAppUid));
+        std::wstring uriAsWStr = JniUtils::jstringToWstring(aEnv,aUri);
+        PushRegistry& pushRegistry = getPushRegistryInstance();
+        bool isPushConn = pushRegistry.isPushConnection(uriAsWStr,appUid);
+        if (isPushConn)
+            return JNI_TRUE;
+        return JNI_FALSE;
+    }
+    catch (PushException& ex)
+    {
+        ELOG1(EJavaPush,"ERROR!!! PushException caught: %s",ex.toString().c_str());
+        return JNI_FALSE;
+    }
+    catch (...)
+    {
+        ELOG(EJavaPush,"ERROR!!! Unexpected exception was caught");
+        return JNI_FALSE;
+    }
+}
+
+JNIEXPORT jobjectArray JNICALL Java_com_nokia_mj_impl_push_PushRegistryImpl_listConnections0
+(JNIEnv* aEnv, jclass, jboolean aAvailable, jstring aAppUid)
+{
+    JELOG2(EJavaPush);
+    try
+    {
+        bool available = false;
+        if (JNI_TRUE == aAvailable)
+            available = true;
+
+        PushRegistry& pushRegistry = getPushRegistryInstance();
+        Uid appUid(JniUtils::jstringToWstring(aEnv,aAppUid));
+        std::list<std::wstring> uriList;
+        pushRegistry.listConnections(available,appUid,uriList);
+        if (0 == uriList.size())
+            return NULL;
+
+        jobjectArray array =
+            (jobjectArray)aEnv->NewObjectArray(uriList.size(),
+                                               aEnv->FindClass("java/lang/String"),
+                                               aEnv->NewStringUTF(""));
+        std::list<std::wstring>::iterator iter;
+        int i = 0;
+        for (iter = uriList.begin(); iter != uriList.end(); ++iter)
+        {
+            char* dynamicChr = JavaCommonUtils::wstringToUtf8((*iter));
+            aEnv->SetObjectArrayElement(array,i,aEnv->NewStringUTF(dynamicChr));
+            i++;
+            delete [] dynamicChr;
+        }//end for
+        return array;
+    }
+    catch (PushException& ex)
+    {
+        ELOG1(EJavaPush,"ERROR!!! PushException caught: %s",ex.toString().c_str());
+        return NULL;
+    }
+    catch (...)
+    {
+        ELOG(EJavaPush,"ERROR!!! Unexpected exception was caught");
+        return NULL;
+    }
+}
+
+JNIEXPORT jlong JNICALL Java_com_nokia_mj_impl_push_PushRegistryImpl_registerAlarm0
+(JNIEnv* aEnv, jclass,jlong aTimeInMilliSecs, jstring aSuiteUid,
+ jstring aMIDletClassName, jboolean aIsUidOfThisMidlet)
+{
+    JELOG2(EJavaPush);
+    try
+    {
+        PushRegistry& pushRegistry = getPushRegistryInstance();
+        Uid suiteUid(JniUtils::jstringToWstring(aEnv,aSuiteUid));
+        std::wstring classNameWStr = JniUtils::jstringToWstring(aEnv,aMIDletClassName);
+        bool isUidOfThisMidlet = false;
+        if (JNI_TRUE == aIsUidOfThisMidlet)
+            isUidOfThisMidlet = true;
+        long long retValue = pushRegistry.registerAlarm(aTimeInMilliSecs,suiteUid,
+                             classNameWStr,isUidOfThisMidlet);
+        return retValue;
+    }
+    catch (PushException& ex)
+    {
+        ELOG1(EJavaPush,"ERROR!!! PushException caught: %s",ex.toString().c_str());
+        if (INVALID_ALARM_TIME == ex.mErrCode)
+        {
+            JniUtils::throwNewException(aEnv,"java/lang/IllegalArgumentException",ex.toString());
+        }
+        //else if(INCORRECT_APP_DATA == ex.mErrCode)
+        else if (std::string::npos != ex.toString().find("-11052"))
+        {
+            JniUtils::throwNewException(aEnv,"java/lang/ClassNotFoundException",ex.toString());
+        }
+        else
+        {
+            //We have to return 0 because IOException cannot be thrown.
+            return 0;
+        }
+    }
+    catch (...)
+    {
+        ELOG(EJavaPush,"ERROR!!! Unexpected exception was caught");
+    }
+    return 0;
+}
+
+JNIEXPORT void JNICALL Java_com_nokia_mj_impl_push_PushRegistryImpl_registerConnection0
+(JNIEnv* aEnv, jclass, jstring aUri, jstring aMIDletClassName, jstring aFilter,
+ jstring aAppUid,jboolean aIsUidOfThisMidlet)
+{
+    JELOG2(EJavaPush);
+    try
+    {
+        PushRegistry& pushRegistry = getPushRegistryInstance();
+        std::wstring uriAsWStr = JniUtils::jstringToWstring(aEnv,aUri);
+        std::wstring midletClassAsWStr = JniUtils::jstringToWstring(aEnv,aMIDletClassName);
+        std::wstring filterAsWStr = JniUtils::jstringToWstring(aEnv,aFilter);
+        Uid appUid(JniUtils::jstringToWstring(aEnv,aAppUid));
+        bool isUidOfThisMidlet = false;
+        if (JNI_TRUE == aIsUidOfThisMidlet)
+            isUidOfThisMidlet = true;
+        pushRegistry.registerDynamicPushConn(uriAsWStr,midletClassAsWStr,filterAsWStr,appUid,
+                                             isUidOfThisMidlet);
+    }
+    catch (PushException& ex)
+    {
+        ELOG1(EJavaPush,"ERROR!!! registerConnection0(): PushException: %s",ex.toString().c_str());
+        if (INVALID_URI == ex.mErrCode)
+        {
+            JniUtils::throwNewException(aEnv,"java/lang/IllegalArgumentException",ex.toString());
+        }
+        //else if(PUSH_CONNECTION_ALREADY_EXISTS == ex.mErrCode){
+        //  JniUtils::throwNewException(aEnv,"java/io/IOException",ex.toString());
+        //}
+        else
+        {
+            JniUtils::throwNewException(aEnv,"java/io/IOException",ex.toString());
+        }
+    }
+    catch (java::util::LibraryLoaderException& ex)
+    {
+        if (java::util::OPENING_LIBRARY_FAILED == ex.mErrCode)
+        {
+            JniUtils::throwNewException
+            (aEnv,"javax/microedition/io/ConnectionNotFoundException",ex.toString());
+        }
+        else
+        {
+            JniUtils::throwNewException(aEnv,"java/io/IOException",ex.toString());
+        }
+    }
+    catch (...)
+    {
+        ELOG(EJavaPush,"ERROR!!! Unexpected exception was caught");
+        JniUtils::throwNewException(aEnv,"java/io/IOException","Unexpected error occurred");
+    }
+}
+JNIEXPORT jboolean JNICALL Java_com_nokia_mj_impl_push_PushRegistryImpl_unregisterConnection0
+(JNIEnv* aEnv, jclass, jstring aUri, jstring aAppUid,jboolean aIsUidOfThisMidlet)
+{
+    JELOG2(EJavaPush);
+    try
+    {
+        PushRegistry& pushRegistry = getPushRegistryInstance();
+        std::wstring uriAsWStr = JniUtils::jstringToWstring(aEnv,aUri);
+        Uid appUid(JniUtils::jstringToWstring(aEnv,aAppUid));
+        bool isUidOfThisMidlet = false;
+        if (JNI_TRUE == aIsUidOfThisMidlet)
+            isUidOfThisMidlet = true;
+        pushRegistry.unregisterDynamicPushConn(uriAsWStr,appUid,isUidOfThisMidlet);
+        return true;
+    }
+    catch (...)
+    {
+        ELOG(EJavaPush,"ERROR!!! Unexpected exception was caught in the unregisterConnection0 operation");
+        return false;
+    }
+}