2 * //******************************************************************
4 * // Copyright 2015 Intel Corporation.
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
8 * // Licensed under the Apache License, Version 2.0 (the "License");
9 * // you may not use this file except in compliance with the License.
10 * // You may obtain a copy of the License at
12 * // http://www.apache.org/licenses/LICENSE-2.0
14 * // Unless required by applicable law or agreed to in writing, software
15 * // distributed under the License is distributed on an "AS IS" BASIS,
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * // See the License for the specific language governing permissions and
18 * // limitations under the License.
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
23 #include "JniOcStack.h"
26 #ifndef _JniListenerManager
27 #define _JniListenerManager
31 class JniOcAccountManager;
35 class JniListenerManager
38 T* addListener(JNIEnv* env, jobject jListener, JniOcResource* owner)
40 T *onEventListener = nullptr;
44 for (auto it = m_listenerMap.begin(); it != m_listenerMap.end(); ++it)
46 if (env->IsSameObject(jListener, it->first))
48 auto refPair = it->second;
49 onEventListener = refPair.first;
52 m_listenerMap.insert(*it);
53 LOGD("OnEventListener: ref. count is incremented");
60 onEventListener = new T(env, jListener, owner);
61 jobject jgListener = env->NewGlobalRef(jListener);
67 std::pair<T*, int>>(jgListener, std::pair<T*, int>(onEventListener, 1)));
71 LOGD("OnEventListener: Failed to create global listener ref.");
72 delete onEventListener;
76 LOGD("OnEventListener: new listener");
80 return onEventListener;
84 T* addListener(JNIEnv* env, jobject jListener, JniOcAccountManager* owner)
86 T *onEventListener = nullptr;
90 for (auto it = m_listenerMap.begin(); it != m_listenerMap.end(); ++it)
92 if (env->IsSameObject(jListener, it->first))
94 auto refPair = it->second;
95 onEventListener = refPair.first;
98 m_listenerMap.insert(*it);
99 LOGD("OnEventListener: ref. count is incremented");
104 if (!onEventListener)
106 onEventListener = new T(env, jListener, owner);
107 jobject jgListener = env->NewGlobalRef(jListener);
111 m_listenerMap.insert(
113 std::pair<T*, int>>(jgListener, std::pair<T*, int>(onEventListener, 1)));
117 LOGD("OnEventListener: Failed to create global listener ref.");
118 delete onEventListener;
122 LOGD("OnEventListener: new listener");
126 return onEventListener;
130 void removeListener(JNIEnv* env, jobject jListener)
133 for (auto it = m_listenerMap.begin(); it != m_listenerMap.end(); ++it)
135 if (env->IsSameObject(jListener, it->first))
137 auto refPair = it->second;
138 if (refPair.second > 1)
141 it->second = refPair;
142 m_listenerMap.insert(*it);
143 LOGI("OnEventListener: ref. count is decremented");
147 env->DeleteGlobalRef(it->first);
148 T* listener = refPair.first;
150 m_listenerMap.erase(it);
151 LOGI("OnEventListener is removed");
159 void removeAllListeners(JNIEnv* env)
162 LOGI("All listeners are removed");
164 for (auto& pair : m_listenerMap)
166 env->DeleteGlobalRef(pair.first);
167 auto refPair = pair.second;
168 delete refPair.first;
170 m_listenerMap.clear();
176 std::map<jobject, std::pair<T*, int>> m_listenerMap;
177 std::mutex m_mapMutex;