/* * Copyright (c) 2018-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the LICENSE * file in the root directory of this source tree. * */ #pragma once #include "FlipperConnectionImpl.h" #include "FlipperInitConfig.h" #include "FlipperPlugin.h" #include "SonarState.h" #include "FlipperConnectionManager.h" #include #include #include "SonarStep.h" #include namespace facebook { namespace flipper { class FlipperClient : public FlipperConnectionManager::Callbacks { public: /** Call before accessing instance with FlipperClient::instance(). This will set up all the state needed to establish a Sonar connection. */ static void init(FlipperInitConfig config); /** Standard accessor for the shared FlipperClient instance. This returns a singleton instance to a shared FlipperClient. First call to this function will create the shared FlipperClient. Must call FlipperClient::initDeviceData() before first call to FlipperClient::instance(). */ static FlipperClient* instance(); /** Only public for testing */ FlipperClient(std::unique_ptr socket, std::shared_ptr state) : socket_(std::move(socket)), sonarState_(state) { auto step = sonarState_->start("Create client"); socket_->setCallbacks(this); step->complete(); } void start() { auto step = sonarState_->start("Start client"); socket_->start(); step->complete(); } void stop() { auto step = sonarState_->start("Stop client"); socket_->stop(); step->complete(); } void onConnected() override; void onDisconnected() override; void onMessageReceived(const folly::dynamic& message) override; void addPlugin(std::shared_ptr plugin); void removePlugin(std::shared_ptr plugin); void refreshPlugins(); void setStateListener( std::shared_ptr stateListener); std::shared_ptr getPlugin(const std::string& identifier); std::string getState(); std::vector getStateElements(); template std::shared_ptr

getPlugin(const std::string& identifier) { return std::static_pointer_cast

(getPlugin(identifier)); } bool hasPlugin(const std::string& identifier); private: static FlipperClient* instance_; bool connected_ = false; std::unique_ptr socket_; std::map> plugins_; std::map> connections_; std::mutex mutex_; std::shared_ptr sonarState_; void performAndReportError(const std::function& func); void disconnect(std::shared_ptr plugin); }; } // namespace flipper } // namespace facebook