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

Commit d9392165 authored by Chris Manton's avatar Chris Manton Committed by Hansong Zhang
Browse files

L2CAP classic fixed service manager

Implement classic fixed channel service registration

Test: bluetooth_test_gd
Change-Id: Ic5d5b4543e88a0e4b9918f4583c5d115ef021cf0
parent ad0e497d
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
filegroup {
    name: "BluetoothL2capSources",
    srcs: [
        "fcs.cc",
        "l2cap_layer.cc",
        "classic_fixed_channel.cc",
        "classic_fixed_channel_manager.cc",
        "classic_fixed_channel_service.cc",
        "internal/classic_fixed_channel_service_manager_impl.cc",
    ],
}

@@ -12,7 +14,7 @@ filegroup {
    name: "BluetoothL2capTestSources",
    srcs: [
        "l2cap_packet_test.cc",
        "fcs.cc",
        "internal/classic_fixed_channel_service_manager_test.cc",
        "signal_id_test.cc",
    ],
}
+9 −0
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */

#include "l2cap/classic_fixed_channel_manager.h"
#include "l2cap/internal/classic_fixed_channel_service.h"
#include "l2cap/internal/classic_fixed_channel_service_manager_impl.h"

namespace bluetooth {
namespace l2cap {
@@ -28,6 +30,13 @@ bool ClassicFixedChannelManager::ConnectServices(common::Address device,
bool ClassicFixedChannelManager::RegisterService(Cid cid, const SecurityPolicy& security_policy,
                                                 OnRegistrationCompleteCallback on_registration_complete,
                                                 OnConnectionOpenCallback on_connection_open, os::Handler* handler) {
  internal::ClassicFixedChannelServiceImpl::Builder builder;
  builder.SetUserHandler(handler)
      .SetOnRegister(std::move(on_registration_complete))
      .SetOnChannelOpen(std::move(on_connection_open));

  l2cap_layer_handler_->Post(common::BindOnce(&internal::ClassicFixedChannelServiceManagerImpl::Register,
                                              common::Unretained(manager_), cid, std::move(builder)));
  return true;
}

+16 −3
Original line number Diff line number Diff line
@@ -27,18 +27,23 @@
namespace bluetooth {
namespace l2cap {

namespace internal {
class ClassicFixedChannelServiceManagerImpl;
}

class ClassicFixedChannelManager {
 public:
  /**
   * OnConnectionFailureCallback(std::string failure_reason);
   */
  using OnConnectionFailureCallback = common::OnceCallback<void(std::string)>;
  using OnConnectionFailureCallback = common::Callback<void(std::string)>;

  /**
   * OnConnectionOpenCallback(ClassicFixedChannel channel);
   */
  using OnConnectionOpenCallback = common::OnceCallback<void(ClassicFixedChannel)>;
  using OnConnectionOpenCallback = common::Callback<void(ClassicFixedChannel)>;

  enum RegistrationResult { SUCCESS, FAIL };
  enum class RegistrationResult { SUCCESS, FAIL };

  /**
   * OnRegistrationFailureCallback(RegistrationResult result, ClassicFixedChannelService service);
@@ -97,6 +102,14 @@ class ClassicFixedChannelManager {
  bool RegisterService(Cid cid, const SecurityPolicy& security_policy,
                       OnRegistrationCompleteCallback on_registration_complete,
                       OnConnectionOpenCallback on_connection_open, os::Handler* handler);

  // The constructor is not to be used by user code
  ClassicFixedChannelManager(internal::ClassicFixedChannelServiceManagerImpl* manager, os::Handler* l2cap_layer_handler)
      : manager_(manager), l2cap_layer_handler_(l2cap_layer_handler) {}

 private:
  internal::ClassicFixedChannelServiceManagerImpl* manager_ = nullptr;
  os::Handler* l2cap_layer_handler_ = nullptr;
};

}  // namespace l2cap
+8 −1
Original line number Diff line number Diff line
@@ -15,11 +15,18 @@
 */

#include "l2cap/classic_fixed_channel_service.h"
#include "l2cap/internal/classic_fixed_channel_service_manager_impl.h"

namespace bluetooth {
namespace l2cap {

void ClassicFixedChannelService::Unregister(OnUnregisteredCallback on_unregistered) {}
void ClassicFixedChannelService::Unregister(OnUnregisteredCallback on_unregistered,
                                            os::Handler* on_unregistered_handler) {
  ASSERT_LOG(manager_ != nullptr, "this service is invalid");
  l2cap_layer_handler_->Post(common::BindOnce(&internal::ClassicFixedChannelServiceManagerImpl::Unregister,
                                              common::Unretained(manager_), cid_, std::move(on_unregistered),
                                              on_unregistered_handler));
}

}  // namespace l2cap
}  // namespace bluetooth
 No newline at end of file
+18 −1
Original line number Diff line number Diff line
@@ -18,12 +18,20 @@

#include "common/address.h"
#include "common/callback.h"
#include "l2cap/cid.h"
#include "os/handler.h"

namespace bluetooth {
namespace l2cap {

namespace internal {
class ClassicFixedChannelServiceManagerImpl;
}

class ClassicFixedChannelService {
 public:
  ClassicFixedChannelService() = default;

  using OnUnregisteredCallback = common::OnceCallback<void()>;

  /**
@@ -32,7 +40,16 @@ class ClassicFixedChannelService {
   *
   * @param on_unregistered will be triggered when unregistration is complete
   */
  void Unregister(OnUnregisteredCallback on_unregistered);
  void Unregister(OnUnregisteredCallback on_unregistered, os::Handler* on_unregistered_handler);

  friend internal::ClassicFixedChannelServiceManagerImpl;

 private:
  ClassicFixedChannelService(Cid cid, internal::ClassicFixedChannelServiceManagerImpl* manager, os::Handler* handler)
      : cid_(cid), manager_(manager), l2cap_layer_handler_(handler) {}
  Cid cid_ = kInvalidCid;
  internal::ClassicFixedChannelServiceManagerImpl* manager_ = nullptr;
  os::Handler* l2cap_layer_handler_;
};

}  // namespace l2cap
Loading