// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef PLATFORM_API_PLATFORM_H_ #define PLATFORM_API_PLATFORM_H_ #include #include #include #include #include #include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "internal/platform/implementation/app_lifecycle_monitor.h" #include "internal/platform/implementation/atomic_boolean.h" #include "internal/platform/implementation/atomic_reference.h" #include "internal/platform/implementation/awdl.h" #include "internal/platform/implementation/ble.h" #include "internal/platform/implementation/bluetooth_adapter.h" #include "internal/platform/implementation/bluetooth_classic.h" #include "internal/platform/implementation/condition_variable.h" #include "internal/platform/implementation/count_down_latch.h" #include "internal/platform/implementation/credential_storage.h" #include "internal/platform/implementation/device_info.h" #include "internal/platform/implementation/http_loader.h" #include "internal/platform/implementation/input_file.h" #include "internal/platform/implementation/log_message.h" #include "internal/platform/implementation/mutex.h" #include "internal/platform/implementation/output_file.h" #include "internal/platform/implementation/scheduled_executor.h" #include "internal/platform/implementation/submittable_executor.h" #include "internal/platform/implementation/timer.h" #ifndef NO_WEBRTC #include "internal/platform/implementation/webrtc.h" #endif #ifndef NEARBY_CHROMIUM #include "internal/platform/implementation/preferences_manager.h" #endif #include "internal/platform/implementation/wifi.h" #include "internal/platform/implementation/wifi_direct.h" #include "internal/platform/implementation/wifi_hotspot.h" #include "internal/platform/implementation/wifi_lan.h" #include "internal/platform/os_name.h" #include "internal/platform/payload_id.h" namespace nearby { namespace api { // API rework notes: // https://docs.google.com/spreadsheets/d/1erZNkX7pX8s5jWTHdxgjntxTMor3BGiY2H_fC_ldtoQ/edit#gid=381357998 class ImplementationPlatform { public: // General platform support: // - atomic variables (boolean, and any other copyable type) // - synchronization primitives: // - mutex (regular, and recursive) // - condition variable (must work with regular mutex only) // - CountDownLatch : to ensure at least N threads are waiting. // - file I/O // - Logging static std::string GetCustomSavePath(const std::string& parent_folder, const std::string& file_name); static std::string GetDownloadPath(const std::string& parent_folder, const std::string& file_name); static std::string GetDownloadPath(const std::string& file_name); static std::string GetAppDataPath(const std::string& file_name); static OSName GetCurrentOS(); // Atomics: // ======= // Atomic boolean: special case. Uses native platform atomics. // Does not use locking. // Does not use dynamic memory allocations in operations. static std::unique_ptr CreateAtomicBoolean(bool initial_value); // Supports enums and integers up to 32-bit. // Does not use locking, if platform supports 32-bit atomics natively. // Does not use dynamic memory allocations in operations. static std::unique_ptr CreateAtomicUint32(std::uint32_t value); static std::unique_ptr CreateCountDownLatch( std::int32_t count); #pragma push_macro("CreateMutex") #undef CreateMutex static std::unique_ptr CreateMutex(Mutex::Mode mode); #pragma pop_macro("CreateMutex") static std::unique_ptr CreateConditionVariable( Mutex* mutex); static std::unique_ptr CreateInputFile(PayloadId); static std::unique_ptr CreateInputFile(const std::string&); static std::unique_ptr CreateOutputFile(PayloadId); static std::unique_ptr CreateOutputFile(const std::string&); static std::unique_ptr CreateLogMessage( const char* file, int line, LogMessage::Severity severity); // Java-like Executors static std::unique_ptr CreateSingleThreadExecutor(); static std::unique_ptr CreateMultiThreadExecutor( std::int32_t max_concurrency); static std::unique_ptr CreateScheduledExecutor(); // Protocol implementations, domain-specific support static std::unique_ptr CreateAwdlMedium(); static std::unique_ptr CreateBluetoothAdapter(); static std::unique_ptr CreateBluetoothClassicMedium( BluetoothAdapter&); static std::unique_ptr CreateBleMedium( api::BluetoothAdapter&); static std::unique_ptr CreateCredentialStorage(); static std::unique_ptr CreateWifiMedium(); static std::unique_ptr CreateWifiLanMedium(); static std::unique_ptr CreateWifiHotspotMedium(); static std::unique_ptr CreateWifiDirectMedium(); static std::unique_ptr CreateTimer(); static std::unique_ptr CreateDeviceInfo(); #ifndef NO_WEBRTC static std::unique_ptr CreateWebRtcMedium(); #endif #if defined(NEARBY_CHROMIUM) static std::unique_ptr CreateAppLifecycleMonitor( std::function state_updated_callback) { return nullptr; } #else static std::unique_ptr CreateAppLifecycleMonitor( std::function state_updated_callback); #endif // Gets HTTP response from remote server. // // @param request Webrequest // // @return returns absl::FailedPreconditionError if having platform error. // return WebResponse if HTTP status code between 200 and 300. // other cases will return absl Status in error. static absl::StatusOr SendRequest(const WebRequest& request); #if defined(NEARBY_CHROMIUM) static std::unique_ptr CreatePreferencesManager(absl::string_view path) { return nullptr; } #else static std::unique_ptr CreatePreferencesManager(absl::string_view path); #endif }; } // namespace api } // namespace nearby #endif // PLATFORM_API_PLATFORM_H_