1 //===-- PlatformiOSSimulatorCoreSimulatorSupport.h ----------------*- C++ 2 //-*-===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_OBJCXX_PLATFORMIOSSIMULATORCORESIMULATORSUPPORT_H 11 #define LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_OBJCXX_PLATFORMIOSSIMULATORCORESIMULATORSUPPORT_H 12 13 #include <functional> 14 #include <ostream> 15 #include <string> 16 #include <vector> 17 #ifdef __APPLE__ 18 #include <objc/objc.h> 19 #else 20 typedef void *id; 21 #endif 22 #include "lldb/Host/ProcessLaunchInfo.h" 23 #include "lldb/Utility/Args.h" 24 #include "lldb/Utility/ConstString.h" 25 #include "lldb/Utility/Status.h" 26 27 #include "llvm/ADT/Optional.h" 28 29 // And now the actual magic 30 namespace CoreSimulatorSupport { 31 class Process { 32 public: GetPID()33 lldb::pid_t GetPID() { return m_pid; } 34 35 explicit operator bool() { return m_pid != LLDB_INVALID_PROCESS_ID; } 36 GetError()37 lldb_private::Status GetError() { return m_error; } 38 39 private: 40 Process(lldb::pid_t p); 41 42 Process(lldb_private::Status error); 43 44 Process(lldb::pid_t p, lldb_private::Status error); 45 46 lldb::pid_t m_pid; 47 lldb_private::Status m_error; 48 49 friend class Device; 50 }; 51 52 class ModelIdentifier { 53 public: 54 ModelIdentifier(const std::string &mi); 55 ModelIdentifier(); 56 57 explicit operator bool() const { return !m_versions.empty(); } 58 GetNumVersions()59 size_t GetNumVersions() const { return m_versions.size(); } 60 GetVersionAtIndex(size_t idx)61 unsigned int GetVersionAtIndex(size_t idx) const { return m_versions[idx]; } 62 GetFamily()63 std::string GetFamily() const { return m_family.c_str(); } 64 65 private: 66 std::string m_family; 67 std::vector<unsigned int> m_versions; 68 }; 69 70 class DeviceType { 71 public: 72 enum class ProductFamilyID : int32_t { 73 iPhone = 1, 74 iPad = 2, 75 appleTV = 3, 76 appleWatch = 4 77 }; 78 79 DeviceType(); 80 81 DeviceType(id d); 82 83 explicit operator bool(); 84 85 std::string GetName(); 86 87 lldb_private::ConstString GetIdentifier(); 88 89 ModelIdentifier GetModelIdentifier(); 90 91 lldb_private::ConstString GetProductFamily(); 92 93 ProductFamilyID GetProductFamilyID(); 94 95 private: 96 id m_dev; 97 llvm::Optional<ModelIdentifier> m_model_identifier; 98 }; 99 100 class OSVersion { 101 public: 102 OSVersion(const std::string &ver, const std::string &build); 103 104 OSVersion(); 105 106 explicit operator bool() const { return !m_versions.empty(); } 107 GetNumVersions()108 size_t GetNumVersions() const { return m_versions.size(); } 109 GetVersionAtIndex(size_t idx)110 unsigned int GetVersionAtIndex(size_t idx) const { return m_versions[idx]; } 111 GetBuild()112 const char *GetBuild() const { return m_build.c_str(); } 113 114 private: 115 std::vector<unsigned int> m_versions; 116 std::string m_build; 117 }; 118 119 class DeviceRuntime { 120 public: 121 DeviceRuntime(); 122 123 DeviceRuntime(id d); 124 125 explicit operator bool(); 126 127 OSVersion GetVersion(); 128 129 bool IsAvailable(); 130 131 private: 132 id m_dev; 133 llvm::Optional<OSVersion> m_os_version; 134 }; 135 136 class Device { 137 private: 138 typedef unsigned long int NSUInteger; 139 140 public: 141 enum class State : NSUInteger { 142 Creating, 143 Shutdown, 144 Booting, 145 Booted, 146 ShuttingDown 147 }; 148 149 Device(); 150 151 Device(id d); 152 153 explicit operator bool(); 154 155 std::string GetName() const; 156 157 DeviceType GetDeviceType(); 158 159 DeviceRuntime GetDeviceRuntime(); 160 161 State GetState(); 162 163 bool Boot(lldb_private::Status &err); 164 165 bool Shutdown(lldb_private::Status &err); 166 167 std::string GetUDID() const; 168 169 Process Spawn(lldb_private::ProcessLaunchInfo &launch_info); 170 171 private: 172 id m_dev; 173 llvm::Optional<DeviceType> m_dev_type; 174 llvm::Optional<DeviceRuntime> m_dev_runtime; 175 176 friend class DeviceSet; 177 }; 178 179 bool operator>(const OSVersion &lhs, const OSVersion &rhs); 180 181 bool operator>(const ModelIdentifier &lhs, const ModelIdentifier &rhs); 182 183 bool operator<(const OSVersion &lhs, const OSVersion &rhs); 184 185 bool operator<(const ModelIdentifier &lhs, const ModelIdentifier &rhs); 186 187 bool operator==(const OSVersion &lhs, const OSVersion &rhs); 188 189 bool operator==(const ModelIdentifier &lhs, const ModelIdentifier &rhs); 190 191 bool operator!=(const OSVersion &lhs, const OSVersion &rhs); 192 193 bool operator!=(const ModelIdentifier &lhs, const ModelIdentifier &rhs); 194 195 class DeviceSet { 196 public: 197 static DeviceSet GetAllDevices(const char *developer_dir); 198 199 static DeviceSet GetAvailableDevices(const char *developer_dir); 200 201 size_t GetNumDevices(); 202 203 Device GetDeviceAtIndex(size_t idx); 204 205 void ForEach(std::function<bool(const Device &)> f); 206 207 DeviceSet GetDevicesIf(std::function<bool(Device)> f); 208 209 DeviceSet GetDevices(DeviceType::ProductFamilyID dev_id); 210 211 Device GetFanciest(DeviceType::ProductFamilyID dev_id); 212 213 private: DeviceSet(id arr)214 DeviceSet(id arr) : m_dev(arr) {} 215 216 id m_dev; 217 }; 218 } 219 220 #endif // LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_OBJCXX_PLATFORMIOSSIMULATORCORESIMULATORSUPPORT_H 221