blob: 92a376fe869827a8dd728ba4aea3cd0cd568042c [file] [log] [blame]
paulhu72742952022-02-09 21:24:09 +08001/*
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#define LOG_TAG "MDnsEventReporter"
18
19#include "MDnsEventReporter.h"
20
Paul Hue5ead452022-06-01 20:03:35 +080021using android::IInterface;
22using android::sp;
paulhu72742952022-02-09 21:24:09 +080023using android::net::mdns::aidl::IMDnsEventListener;
24
25MDnsEventReporter& MDnsEventReporter::getInstance() {
26 // It should be initialized only once.
27 static MDnsEventReporter instance;
28 return instance;
29}
30
31const MDnsEventReporter::EventListenerSet& MDnsEventReporter::getEventListeners() const {
32 return getEventListenersImpl();
33}
34
Paul Hue5ead452022-06-01 20:03:35 +080035int MDnsEventReporter::addEventListener(const sp<IMDnsEventListener>& listener) {
paulhu72742952022-02-09 21:24:09 +080036 return addEventListenerImpl(listener);
37}
38
Paul Hue5ead452022-06-01 20:03:35 +080039int MDnsEventReporter::removeEventListener(const sp<IMDnsEventListener>& listener) {
paulhu72742952022-02-09 21:24:09 +080040 return removeEventListenerImpl(listener);
41}
42
43const MDnsEventReporter::EventListenerSet& MDnsEventReporter::getEventListenersImpl() const {
paulhu72742952022-02-09 21:24:09 +080044 return mEventListeners;
45}
46
Paul Hue5ead452022-06-01 20:03:35 +080047int MDnsEventReporter::addEventListenerImpl(const sp<IMDnsEventListener>& listener) {
paulhu72742952022-02-09 21:24:09 +080048 if (listener == nullptr) {
49 ALOGE("The event listener should not be null");
50 return -EINVAL;
51 }
52
53 std::lock_guard lock(mMutex);
54
55 for (const auto& it : mEventListeners) {
Paul Hue5ead452022-06-01 20:03:35 +080056 if (IInterface::asBinder(it->getListener()).get() == IInterface::asBinder(listener).get()) {
paulhu72742952022-02-09 21:24:09 +080057 ALOGW("The event listener was already subscribed");
58 return -EEXIST;
59 }
60 }
61
Paul Hue5ead452022-06-01 20:03:35 +080062 auto eventListener = sp<EventListener>::make(this, listener);
63 IInterface::asBinder(listener)->linkToDeath(eventListener);
64 mEventListeners.insert(eventListener);
paulhu72742952022-02-09 21:24:09 +080065 return 0;
66}
67
Paul Hue5ead452022-06-01 20:03:35 +080068int MDnsEventReporter::removeEventListenerImpl(const sp<IMDnsEventListener>& listener) {
paulhu72742952022-02-09 21:24:09 +080069 if (listener == nullptr) {
70 ALOGE("The event listener should not be null");
71 return -EINVAL;
72 }
73
74 std::lock_guard lock(mMutex);
75
Paul Hue5ead452022-06-01 20:03:35 +080076 for (const auto& it : mEventListeners) {
77 const auto& binder = IInterface::asBinder(it->getListener());
78 if (binder == IInterface::asBinder(listener)) {
79 binder->unlinkToDeath(it);
80 mEventListeners.erase(it);
81 return 0;
82 }
83 }
84 ALOGE("The event listener does not exist");
85 return -ENOENT;
86}