blob: 083e2d6c568770f61cf0179165160e50f93ff9fd [file] [log] [blame]
//===-- PlatformiOSSimulatorCoreSimulatorSupport.h ----------------*- C++
//-*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_PlatformiOSSimulatorCoreSimulatorSupport_h_
#define liblldb_PlatformiOSSimulatorCoreSimulatorSupport_h_
// C Includes
// C++ Includes
#include <functional>
#include <ostream>
#include <string>
#include <vector>
// Other libraries and framework includes
#ifdef __APPLE__
#include <objc/objc.h>
#else
typedef void *id;
#endif
// Project includes
#include "lldb/Target/ProcessLaunchInfo.h"
#include "lldb/Utility/Args.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/Utility/Status.h"
#include "llvm/ADT/Optional.h"
// And now the actual magic
namespace CoreSimulatorSupport {
class Process {
public:
lldb::pid_t GetPID() { return m_pid; }
explicit operator bool() { return m_pid != LLDB_INVALID_PROCESS_ID; }
lldb_private::Status GetError() { return m_error; }
private:
Process(lldb::pid_t p);
Process(lldb_private::Status error);
Process(lldb::pid_t p, lldb_private::Status error);
lldb::pid_t m_pid;
lldb_private::Status m_error;
friend class Device;
};
class ModelIdentifier {
public:
ModelIdentifier(const std::string &mi);
ModelIdentifier();
explicit operator bool() const { return !m_versions.empty(); }
size_t GetNumVersions() const { return m_versions.size(); }
unsigned int GetVersionAtIndex(size_t idx) const { return m_versions[idx]; }
std::string GetFamily() const { return m_family.c_str(); }
private:
std::string m_family;
std::vector<unsigned int> m_versions;
};
class DeviceType {
public:
enum class ProductFamilyID : int32_t {
iPhone = 1,
iPad = 2,
appleTV = 3,
appleWatch = 4
};
DeviceType();
DeviceType(id d);
explicit operator bool();
std::string GetName();
lldb_private::ConstString GetIdentifier();
ModelIdentifier GetModelIdentifier();
lldb_private::ConstString GetProductFamily();
ProductFamilyID GetProductFamilyID();
private:
id m_dev;
llvm::Optional<ModelIdentifier> m_model_identifier;
};
class OSVersion {
public:
OSVersion(const std::string &ver, const std::string &build);
OSVersion();
explicit operator bool() const { return !m_versions.empty(); }
size_t GetNumVersions() const { return m_versions.size(); }
unsigned int GetVersionAtIndex(size_t idx) const { return m_versions[idx]; }
const char *GetBuild() const { return m_build.c_str(); }
private:
std::vector<unsigned int> m_versions;
std::string m_build;
};
class DeviceRuntime {
public:
DeviceRuntime();
DeviceRuntime(id d);
explicit operator bool();
OSVersion GetVersion();
bool IsAvailable();
private:
id m_dev;
llvm::Optional<OSVersion> m_os_version;
};
class Device {
private:
typedef unsigned long int NSUInteger;
public:
enum class State : NSUInteger {
Creating,
Shutdown,
Booting,
Booted,
ShuttingDown
};
Device();
Device(id d);
explicit operator bool();
std::string GetName() const;
DeviceType GetDeviceType();
DeviceRuntime GetDeviceRuntime();
State GetState();
bool Boot(lldb_private::Status &err);
bool Shutdown(lldb_private::Status &err);
std::string GetUDID() const;
Process Spawn(lldb_private::ProcessLaunchInfo &launch_info);
private:
id m_dev;
llvm::Optional<DeviceType> m_dev_type;
llvm::Optional<DeviceRuntime> m_dev_runtime;
friend class DeviceSet;
};
bool operator>(const OSVersion &lhs, const OSVersion &rhs);
bool operator>(const ModelIdentifier &lhs, const ModelIdentifier &rhs);
bool operator<(const OSVersion &lhs, const OSVersion &rhs);
bool operator<(const ModelIdentifier &lhs, const ModelIdentifier &rhs);
bool operator==(const OSVersion &lhs, const OSVersion &rhs);
bool operator==(const ModelIdentifier &lhs, const ModelIdentifier &rhs);
bool operator!=(const OSVersion &lhs, const OSVersion &rhs);
bool operator!=(const ModelIdentifier &lhs, const ModelIdentifier &rhs);
class DeviceSet {
public:
static DeviceSet GetAllDevices(const char *developer_dir);
static DeviceSet GetAvailableDevices(const char *developer_dir);
size_t GetNumDevices();
Device GetDeviceAtIndex(size_t idx);
void ForEach(std::function<bool(const Device &)> f);
DeviceSet GetDevicesIf(std::function<bool(Device)> f);
DeviceSet GetDevices(DeviceType::ProductFamilyID dev_id);
Device GetFanciest(DeviceType::ProductFamilyID dev_id);
private:
DeviceSet(id arr) : m_dev(arr) {}
id m_dev;
};
}
#endif // liblldb_PlatformiOSSimulatorCoreSimulatorSupport_h_