• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <android-base/thread_annotations.h>
20 #include <android/net/mdns/aidl/IMDnsEventListener.h>
21 
22 #include <set>
23 
24 class MDnsEventReporter final {
25   public:
26     class EventListener : public android::IBinder::DeathRecipient {
27       public:
EventListener(MDnsEventReporter * eventReporter,const android::sp<android::net::mdns::aidl::IMDnsEventListener> & listener)28         EventListener(MDnsEventReporter* eventReporter,
29                       const android::sp<android::net::mdns::aidl::IMDnsEventListener>& listener)
30             : mEventReporter(eventReporter), mListener(listener) {}
31         ~EventListener() override = default;
binderDied(const android::wp<android::IBinder> &)32         void binderDied(const android::wp<android::IBinder>& /* who */) override {
33             mEventReporter->removeEventListenerImpl(mListener);
34         }
getListener()35         android::sp<android::net::mdns::aidl::IMDnsEventListener> getListener() {
36             return mListener;
37         }
38 
39       private:
40         MDnsEventReporter* mEventReporter;
41         android::sp<android::net::mdns::aidl::IMDnsEventListener> mListener;
42     };
43 
44     MDnsEventReporter(const MDnsEventReporter&) = delete;
45     MDnsEventReporter& operator=(const MDnsEventReporter&) = delete;
46 
47     using EventListenerSet = std::set<android::sp<EventListener>>;
48 
49     // Get the instance of the singleton MDnsEventReporter.
50     static MDnsEventReporter& getInstance();
51 
52     // Return registered binder services from the singleton MDnsEventReporter. This method is
53     // threadsafe.
54     const EventListenerSet& getEventListeners() const REQUIRES(mMutex);
55 
56     // Add the binder to the singleton MDnsEventReporter. This method is threadsafe.
57     int addEventListener(const android::sp<android::net::mdns::aidl::IMDnsEventListener>& listener);
58 
59     // Remove the binder from the singleton MDnsEventReporter. This method is threadsafe.
60     int removeEventListener(
61             const android::sp<android::net::mdns::aidl::IMDnsEventListener>& listener);
62 
63     mutable std::mutex mMutex;
64 
65   private:
66     MDnsEventReporter() = default;
67     ~MDnsEventReporter() = default;
68 
69     EventListenerSet mEventListeners GUARDED_BY(mMutex);
70 
71     int addEventListenerImpl(
72             const android::sp<android::net::mdns::aidl::IMDnsEventListener>& listener)
73             EXCLUDES(mMutex);
74     int removeEventListenerImpl(
75             const android::sp<android::net::mdns::aidl::IMDnsEventListener>& listener)
76             EXCLUDES(mMutex);
77     const EventListenerSet& getEventListenersImpl() const REQUIRES(mMutex);
78 };
79