Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12dad709 authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

Store pointer to handle outside of ISecurityManagerListener

ISecurityManagerListener does not need to be aware of the handler

Bug: 142341141
Change-Id: Iff4ad3eef3cf3925509808bf84d4c403d62c618e
parent 3342d99a
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -100,20 +100,20 @@ void SecurityManagerImpl::RemoveBond(std::shared_ptr<hci::ClassicDevice> device)
  // Signal Remove from database
}

void SecurityManagerImpl::RegisterCallbackListener(ISecurityManagerListener* listener) {
void SecurityManagerImpl::RegisterCallbackListener(ISecurityManagerListener* listener, os::Handler* handler) {
  if (listeners_.size() < 1) {
    listeners_.push_back(listener);
    listeners_.push_back({listener, handler});
  } else {
    bool found = false;
    for (auto it = listeners_.begin(); it != listeners_.end(); ++it) {
      found = *it == listener;
      found = it->first == listener;
      if (found) break;
    }

    if (found) {
      LOG_ERROR("Listener has already been registered!");
    } else {
      listeners_.push_back(listener);
      listeners_.push_back({listener, handler});
    }
  }
}
@@ -125,7 +125,7 @@ void SecurityManagerImpl::UnregisterCallbackListener(ISecurityManagerListener* l
    bool found = false;
    auto it = listeners_.begin();
    while (it != listeners_.end()) {
      found = *it == listener;
      found = it->first == listener;
      if (found) break;
      ++it;
    }
@@ -137,18 +137,20 @@ void SecurityManagerImpl::UnregisterCallbackListener(ISecurityManagerListener* l

void SecurityManagerImpl::FireDeviceBondedCallbacks(std::shared_ptr<Device> device) {
  for (auto& iter : listeners_) {
    iter->handler_->Post(common::Bind(&ISecurityManagerListener::OnDeviceBonded, common::Unretained(iter), device));
    iter.second->Post(common::Bind(&ISecurityManagerListener::OnDeviceBonded, common::Unretained(iter.first), device));
  }
}

void SecurityManagerImpl::FireBondFailedCallbacks(std::shared_ptr<Device> device) {
  for (auto& iter : listeners_) {
    iter->handler_->Post(common::Bind(&ISecurityManagerListener::OnDeviceBondFailed, common::Unretained(iter), device));
    iter.second->Post(
        common::Bind(&ISecurityManagerListener::OnDeviceBondFailed, common::Unretained(iter.first), device));
  }
}

void SecurityManagerImpl::FireUnbondCallbacks(std::shared_ptr<Device> device) {
  for (auto& iter : listeners_) {
    iter->handler_->Post(common::Bind(&ISecurityManagerListener::OnDeviceUnbonded, common::Unretained(iter), device));
    iter.second->Post(
        common::Bind(&ISecurityManagerListener::OnDeviceUnbonded, common::Unretained(iter.first), device));
  }
}
+4 −2
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@
#include "os/handler.h"
#include "security/channel/security_manager_channel.h"

#include <utility>

namespace bluetooth {
namespace security {

@@ -80,7 +82,7 @@ class SecurityManagerImpl /*: public channel::ISecurityManagerChannelListener*/
   *
   * @param listener ISecurityManagerListener instance to handle callbacks
   */
  void RegisterCallbackListener(ISecurityManagerListener* listener);
  void RegisterCallbackListener(ISecurityManagerListener* listener, os::Handler* handler);

  /**
   * Unregister listener for callback events from SecurityManager
@@ -90,7 +92,7 @@ class SecurityManagerImpl /*: public channel::ISecurityManagerChannelListener*/
  void UnregisterCallbackListener(ISecurityManagerListener* listener);

 protected:
  std::vector<ISecurityManagerListener*> listeners_;
  std::vector<std::pair<ISecurityManagerListener*, os::Handler*>> listeners_;
  void FireDeviceBondedCallbacks(std::shared_ptr<bluetooth::hci::Device> device);
  void FireBondFailedCallbacks(std::shared_ptr<bluetooth::hci::Device> device);
  void FireUnbondCallbacks(std::shared_ptr<bluetooth::hci::Device> device);
+3 −5
Original line number Diff line number Diff line
@@ -47,14 +47,12 @@ void SecurityManager::RemoveBond(std::shared_ptr<hci::ClassicDevice> device) {
                                           std::forward<std::shared_ptr<hci::ClassicDevice>>(device)));
}

void SecurityManager::RegisterCallbackListener(ISecurityManagerListener* listener) {
void SecurityManager::RegisterCallbackListener(ISecurityManagerListener* listener, os::Handler* handler) {
  security_handler_->Post(common::BindOnce(&internal::SecurityManagerImpl::RegisterCallbackListener,
                                           common::Unretained(security_manager_impl_),
                                           std::forward<ISecurityManagerListener*>(listener)));
                                           common::Unretained(security_manager_impl_), listener, handler));
}

void SecurityManager::UnregisterCallbackListener(ISecurityManagerListener* listener) {
  security_handler_->Post(common::BindOnce(&internal::SecurityManagerImpl::UnregisterCallbackListener,
                                           common::Unretained(security_manager_impl_),
                                           std::forward<ISecurityManagerListener*>(listener)));
                                           common::Unretained(security_manager_impl_), listener));
}
+1 −4
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ namespace security {
 */
class ISecurityManagerListener {
 public:
  ISecurityManagerListener(os::Handler* handler) : handler_(handler) {}
  virtual ~ISecurityManagerListener() = 0;

  /**
@@ -56,8 +55,6 @@ class ISecurityManagerListener {
   * @param device pointer to the device that is no longer bonded
   */
  virtual void OnDeviceBondFailed(std::shared_ptr<bluetooth::hci::Device> device) = 0;

  os::Handler* handler_ = nullptr;
};

/**
@@ -99,7 +96,7 @@ class SecurityManager {
   *
   * @param listener ISecurityManagerListener instance to handle callbacks
   */
  void RegisterCallbackListener(ISecurityManagerListener* listener);
  void RegisterCallbackListener(ISecurityManagerListener* listener, os::Handler* handler);

  /**
   * Unregister listener for callback events from SecurityManager