#ifndef CORE_INTERNAL_MEDIUMS_WIFI_LAN_H_ #define CORE_INTERNAL_MEDIUMS_WIFI_LAN_H_ #include #include "platform/api/lock.h" #include "platform/api/wifi_lan.h" #include "platform/byte_array.h" #include "platform/port/string.h" #include "platform/ptr.h" #include "absl/strings/string_view.h" namespace location { namespace nearby { namespace connections { namespace mediums { class DiscoveredServiceCallback { public: virtual ~DiscoveredServiceCallback() = default; virtual void OnServiceDiscovered(Ptr wifi_lan_service) = 0; virtual void OnServiceLost(Ptr wifi_lan_service) = 0; }; template class WifiLan { public: WifiLan(); virtual ~WifiLan() = default; bool IsAvailable(); bool StartAdvertising(absl::string_view service_id, absl::string_view wifi_lan_service_info_name); void StopAdvertising(absl::string_view service_id); bool IsAdvertising(); bool StartDiscovery( absl::string_view service_id, Ptr discovered_service_callback); void StopDiscovery(absl::string_view service_id); bool IsDiscovering(absl::string_view service_id); class AcceptedConnectionCallback { public: virtual ~AcceptedConnectionCallback() = default; virtual void OnConnectionAccepted(Ptr socket, absl::string_view service_id) = 0; }; bool StartAcceptingConnections( absl::string_view service_id, Ptr accepted_connection_callback); void StopAcceptingConnections(absl::string_view service_id); bool IsAcceptingConnections(absl::string_view service_id); Ptr Connect(Ptr wifi_lan_service, absl::string_view service_id); private: class DiscoveredServiceCallbackBridge : public WifiLanMedium::DiscoveredServiceCallback { public: explicit DiscoveredServiceCallbackBridge( Ptr discovered_service_callback) : discovered_service_callback_(discovered_service_callback) {} ~DiscoveredServiceCallbackBridge() override = default; void OnServiceDiscovered(Ptr wifi_lan_service) override { discovered_service_callback_->OnServiceDiscovered(wifi_lan_service); } void OnServiceLost(Ptr wifi_lan_service) override { discovered_service_callback_->OnServiceLost(wifi_lan_service); } private: ScopedPtr> discovered_service_callback_; }; class WifiLanAcceptedConnectionCallback : public WifiLanMedium::AcceptedConnectionCallback { public: explicit WifiLanAcceptedConnectionCallback( Ptr accepted_connection_callback) : accepted_connection_callback_(accepted_connection_callback) {} ~WifiLanAcceptedConnectionCallback() override = default; void OnConnectionAccepted(Ptr wifi_lan_socket, absl::string_view service_id) override { accepted_connection_callback_->OnConnectionAccepted(wifi_lan_socket, service_id); } private: ScopedPtr> accepted_connection_callback_; }; struct DiscoveringInfo { DiscoveringInfo() = default; explicit DiscoveringInfo(absl::string_view service_id) : service_id(service_id) {} ~DiscoveringInfo() = default; string service_id; }; struct AdvertisingInfo { AdvertisingInfo() = default; explicit AdvertisingInfo(absl::string_view service_id) : service_id(service_id) {} ~AdvertisingInfo() = default; string service_id; }; struct AcceptingConnectionsInfo { AcceptingConnectionsInfo() = default; explicit AcceptingConnectionsInfo(absl::string_view service_id) : service_id(service_id) {} ~AcceptingConnectionsInfo() = default; string service_id; }; // ------------ GENERAL ------------ ScopedPtr> lock_; // ---------- CORE WIFILAN------------ // The underlying, per-platform implementation. ScopedPtr> wifi_lan_medium_; // ------------ DISCOVERY ------------ // discovering_info_ is not scoped because it's nullable. DiscoveringInfo discovering_info_; // ------------ ADVERTISING ------------ // A bundle of state required to start/stop WifiLan service publishing. AdvertisingInfo advertising_info_; // A bundle of state required to start/stop accepting WifiLan service /// connections. AcceptingConnectionsInfo accepting_connections_info_; }; } // namespace mediums } // namespace connections } // namespace nearby } // namespace location #include "core/internal/mediums/wifi_lan.cc" #endif // CORE_INTERNAL_MEDIUMS_WIFI_LAN_H_