93 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  * Copyright (C) 2018 The Android Open Source Project
 | |
|  *
 | |
|  * 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.
 | |
|  */
 | |
| 
 | |
| #ifndef NETD_RESOLV_EVENT_REPORTER_H
 | |
| #define NETD_RESOLV_EVENT_REPORTER_H
 | |
| 
 | |
| #include <set>
 | |
| 
 | |
| #include <android-base/thread_annotations.h>
 | |
| 
 | |
| #include "aidl/android/net/metrics/INetdEventListener.h"
 | |
| #include "aidl/android/net/resolv/aidl/IDnsResolverUnsolicitedEventListener.h"
 | |
| 
 | |
| /*
 | |
|  * This class can be used to get the binder reference to the netd events listener service
 | |
|  * via stable runtime ABI which is achieved from libbinder_ndk. It also allows that
 | |
|  * register an event listener.
 | |
|  */
 | |
| class ResolverEventReporter {
 | |
|   public:
 | |
|     ResolverEventReporter(ResolverEventReporter const&) = delete;
 | |
|     ResolverEventReporter(ResolverEventReporter&&) = delete;
 | |
|     ResolverEventReporter& operator=(ResolverEventReporter const&) = delete;
 | |
|     ResolverEventReporter& operator=(ResolverEventReporter&&) = delete;
 | |
| 
 | |
|     using ListenerSet = std::set<std::shared_ptr<aidl::android::net::metrics::INetdEventListener>>;
 | |
|     using UnsolEventListenerSet = std::set<std::shared_ptr<
 | |
|             aidl::android::net::resolv::aidl::IDnsResolverUnsolicitedEventListener>>;
 | |
| 
 | |
|     // Get the instance of the singleton ResolverEventReporter.
 | |
|     static ResolverEventReporter& getInstance();
 | |
| 
 | |
|     // Return the binder from the singleton ResolverEventReporter. This method is threadsafe.
 | |
|     ListenerSet getListeners() const;
 | |
| 
 | |
|     // Return registered binder services from the singleton ResolverEventReporter. This method is
 | |
|     // threadsafe.
 | |
|     UnsolEventListenerSet getUnsolEventListeners() const;
 | |
| 
 | |
|     // Add the binder to the singleton ResolverEventReporter. This method is threadsafe.
 | |
|     int addListener(
 | |
|             const std::shared_ptr<aidl::android::net::metrics::INetdEventListener>& listener);
 | |
| 
 | |
|     // Add the binder to the singleton ResolverEventReporter. This method is threadsafe.
 | |
|     int addUnsolEventListener(
 | |
|             const std::shared_ptr<
 | |
|                     aidl::android::net::resolv::aidl::IDnsResolverUnsolicitedEventListener>&
 | |
|                     listener);
 | |
| 
 | |
|   private:
 | |
|     ResolverEventReporter() = default;
 | |
|     ~ResolverEventReporter() = default;
 | |
| 
 | |
|     void addDefaultListener() EXCLUDES(mMutex);
 | |
|     int addListenerImpl(
 | |
|             const std::shared_ptr<aidl::android::net::metrics::INetdEventListener>& listener)
 | |
|             EXCLUDES(mMutex);
 | |
|     int addListenerImplLocked(
 | |
|             const std::shared_ptr<aidl::android::net::metrics::INetdEventListener>& listener)
 | |
|             REQUIRES(mMutex);
 | |
|     int addUnsolEventListenerImpl(
 | |
|             const std::shared_ptr<
 | |
|                     aidl::android::net::resolv::aidl::IDnsResolverUnsolicitedEventListener>&
 | |
|                     listener) EXCLUDES(mMutex);
 | |
|     int addUnsolEventListenerImplLocked(
 | |
|             const std::shared_ptr<
 | |
|                     aidl::android::net::resolv::aidl::IDnsResolverUnsolicitedEventListener>&
 | |
|                     listener) REQUIRES(mMutex);
 | |
|     ListenerSet getListenersImpl() const EXCLUDES(mMutex);
 | |
|     UnsolEventListenerSet getUnsolEventListenersImpl() const EXCLUDES(mMutex);
 | |
|     void handleBinderDied(const void* who) EXCLUDES(mMutex);
 | |
|     void handleUnsolEventBinderDied(const void* who) EXCLUDES(mMutex);
 | |
| 
 | |
|     mutable std::mutex mMutex;
 | |
|     ListenerSet mListeners GUARDED_BY(mMutex);
 | |
|     UnsolEventListenerSet mUnsolEventListeners GUARDED_BY(mMutex);
 | |
| };
 | |
| 
 | |
| #endif  // NETD_RESOLV_EVENT_REPORTER_H
 |