diff -r e8e63152f320 -r 2a9601315dfc javaextensions/midppush/src/pushregistryimplnative.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/midppush/src/pushregistryimplnative.cpp Mon May 03 12:27:20 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 +#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(uid); +#else + if (sImpObjContainer == 0) + { + sImpObjContainer = new StaticImplObjContainer(); + } + container = sImpObjContainer; +#endif + + if (0 == container->mImpl) + { + std::auto_ptr 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(&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 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::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; + } +}