--- /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;
+ }
+}