-/*\r
-* //******************************************************************\r
-* //\r
-* // Copyright 2015 Intel Corporation.\r
-* //\r
-* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
-* //\r
-* // Licensed under the Apache License, Version 2.0 (the "License");\r
-* // you may not use this file except in compliance with the License.\r
-* // You may obtain a copy of the License at\r
-* //\r
-* // http://www.apache.org/licenses/LICENSE-2.0\r
-* //\r
-* // Unless required by applicable law or agreed to in writing, software\r
-* // distributed under the License is distributed on an "AS IS" BASIS,\r
-* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-* // See the License for the specific language governing permissions and\r
-* // limitations under the License.\r
-* //\r
-* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
-*/\r
-\r
-#include "JniOcStack.h"\r
-#include <mutex>\r
-\r
-#ifndef _JniListenerManager\r
-#define _JniListenerManager\r
-\r
-class JniOcResource;\r
-\r
-template <class T>\r
-class JniListenerManager\r
-{\r
-public:\r
- T* addListener(JNIEnv* env, jobject jListener, JniOcResource* owner)\r
- {\r
- T *onEventListener = NULL;\r
-\r
- m_mapMutex.lock();\r
-\r
- for (auto it = m_listenerMap.begin(); it != m_listenerMap.end(); ++it)\r
- {\r
- if (env->IsSameObject(jListener, it->first))\r
- {\r
- auto refPair = it->second;\r
- onEventListener = refPair.first;\r
- refPair.second++;\r
- it->second = refPair;\r
- m_listenerMap.insert(*it);\r
- LOGD("OnEventListener: ref. count is incremented");\r
- break;\r
- }\r
- }\r
- if (!onEventListener)\r
- {\r
- onEventListener = new T(env, jListener, owner);\r
- jobject jgListener = env->NewGlobalRef(jListener);\r
-\r
- if (jgListener)\r
- {\r
- m_listenerMap.insert(std::pair<jobject, std::pair<T*, int>>(jgListener, std::pair<T*, int>(onEventListener, 1)));\r
- }\r
- else\r
- {\r
- LOGD("OnEventListener: Failed to create global listener ref.");\r
- delete onEventListener;\r
- }\r
- LOGD("OnEventListener: new listener");\r
- }\r
- m_mapMutex.unlock();\r
- return onEventListener;\r
- }\r
-\r
- void removeListener(JNIEnv* env, jobject jListener)\r
- {\r
- m_mapMutex.lock();\r
- for (auto it = m_listenerMap.begin(); it != m_listenerMap.end(); ++it)\r
- {\r
- if (env->IsSameObject(jListener, it->first))\r
- {\r
- auto refPair = it->second;\r
- if (refPair.second > 1)\r
- {\r
- refPair.second--;\r
- it->second = refPair;\r
- m_listenerMap.insert(*it);\r
- LOGI("OnEventListener: ref. count is decremented");\r
- }\r
- else\r
- {\r
- env->DeleteGlobalRef(it->first);\r
- T* listener = refPair.first;\r
- delete listener;\r
- m_listenerMap.erase(it);\r
-\r
- LOGI("OnEventListener is removed");\r
- }\r
- break;\r
- }\r
- }\r
- m_mapMutex.unlock();\r
- }\r
-\r
- void removeAllListeners(JNIEnv* env)\r
- {\r
- m_mapMutex.lock();\r
-\r
- for (auto it = m_listenerMap.begin(); it != m_listenerMap.end(); ++it)\r
- {\r
- env->DeleteGlobalRef(it->first);\r
- auto refPair = it->second;\r
- T* listener = refPair.first;\r
- delete listener;\r
- m_listenerMap.erase(it);\r
- }\r
-\r
- m_mapMutex.unlock();\r
- }\r
-\r
-private:\r
- std::map<jobject, std::pair<T*, int>> m_listenerMap;\r
- std::mutex m_mapMutex;\r
-};\r
-\r
-#endif\r
+/*
+* //******************************************************************
+* //
+* // Copyright 2015 Intel Corporation.
+* //
+* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+* //
+* // Licensed under the Apache License, Version 2.0 (the "License");
+* // you may not use this file except in compliance with the License.
+* // You may obtain a copy of the License at
+* //
+* // http://www.apache.org/licenses/LICENSE-2.0
+* //
+* // Unless required by applicable law or agreed to in writing, software
+* // distributed under the License is distributed on an "AS IS" BASIS,
+* // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* // See the License for the specific language governing permissions and
+* // limitations under the License.
+* //
+* //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+*/
+
+#include "JniOcStack.h"
+#include <mutex>
+
+#ifndef _JniListenerManager
+#define _JniListenerManager
+
+class JniOcResource;
+
+template <class T>
+class JniListenerManager
+{
+public:
+ T* addListener(JNIEnv* env, jobject jListener, JniOcResource* owner)
+ {
+ T *onEventListener = nullptr;
+
+ m_mapMutex.lock();
+
+ for (auto it = m_listenerMap.begin(); it != m_listenerMap.end(); ++it)
+ {
+ if (env->IsSameObject(jListener, it->first))
+ {
+ auto refPair = it->second;
+ onEventListener = refPair.first;
+ refPair.second++;
+ it->second = refPair;
+ m_listenerMap.insert(*it);
+ LOGD("OnEventListener: ref. count is incremented");
+ break;
+ }
+ }
+ if (!onEventListener)
+ {
+ onEventListener = new T(env, jListener, owner);
+ jobject jgListener = env->NewGlobalRef(jListener);
+
+ if (jgListener)
+ {
+ m_listenerMap.insert(
+ std::pair<jobject,
+ std::pair<T*, int>>(jgListener, std::pair<T*, int>(onEventListener, 1)));
+ }
+ else
+ {
+ LOGD("OnEventListener: Failed to create global listener ref.");
+ delete onEventListener;
+ }
+ LOGD("OnEventListener: new listener");
+ }
+ m_mapMutex.unlock();
+ return onEventListener;
+ }
+
+ void removeListener(JNIEnv* env, jobject jListener)
+ {
+ m_mapMutex.lock();
+ for (auto it = m_listenerMap.begin(); it != m_listenerMap.end(); ++it)
+ {
+ if (env->IsSameObject(jListener, it->first))
+ {
+ auto refPair = it->second;
+ if (refPair.second > 1)
+ {
+ refPair.second--;
+ it->second = refPair;
+ m_listenerMap.insert(*it);
+ LOGI("OnEventListener: ref. count is decremented");
+ }
+ else
+ {
+ env->DeleteGlobalRef(it->first);
+ T* listener = refPair.first;
+ delete listener;
+ m_listenerMap.erase(it);
+
+ LOGI("OnEventListener is removed");
+ }
+ break;
+ }
+ }
+ m_mapMutex.unlock();
+ }
+
+ void removeAllListeners(JNIEnv* env)
+ {
+ m_mapMutex.lock();
+
+ for (auto& pair : m_listenerMap)
+ {
+ env->DeleteGlobalRef(pair.first);
+ auto refPair = pair.second;
+ delete refPair.first;
+ }
+ m_listenerMap.clear();
+
+ m_mapMutex.unlock();
+ }
+
+private:
+ std::map<jobject, std::pair<T*, int>> m_listenerMap;
+ std::mutex m_mapMutex;
+};
+
+#endif