Imported Upstream version 1.0.0
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniListenerManager.h
index a43ea82..b082f7d 100644 (file)
-/*\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