//===-- SWIG Interface for SBPlatform ---------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

namespace lldb {


%feature("docstring",
"Describes how :py:class:`SBPlatform.ConnectRemote` connects to a remote platform."
) SBPlatformConnectOptions;
class SBPlatformConnectOptions
{
public:
    SBPlatformConnectOptions (const char *url);

    SBPlatformConnectOptions (const SBPlatformConnectOptions &rhs);

    ~SBPlatformConnectOptions ();

    const char *
    GetURL();

    void
    SetURL(const char *url);

    bool
    GetRsyncEnabled();

    void
    EnableRsync (const char *options,
                 const char *remote_path_prefix,
                 bool omit_remote_hostname);

    void
    DisableRsync ();

    const char *
    GetLocalCacheDirectory();

    void
    SetLocalCacheDirectory(const char *path);
};

%feature("docstring",
"Represents a shell command that can be run by :py:class:`SBPlatform.Run`."
) SBPlatformShellCommand;
class SBPlatformShellCommand
{
public:
    SBPlatformShellCommand (const char *shell, const char *shell_command);
    SBPlatformShellCommand (const char *shell_command);

    SBPlatformShellCommand (const SBPlatformShellCommand &rhs);

    ~SBPlatformShellCommand();

    void
    Clear();

    const char *
    GetShell();

    void
    SetShell(const char *shell_interpreter);

    const char *
    GetCommand();

    void
    SetCommand(const char *shell_command);

    const char *
    GetWorkingDirectory ();

    void
    SetWorkingDirectory (const char *path);

    uint32_t
    GetTimeoutSeconds ();

    void
    SetTimeoutSeconds (uint32_t sec);

    int
    GetSignal ();

    int
    GetStatus ();

    const char *
    GetOutput ();
};

%feature("docstring",
"A class that represents a platform that can represent the current host or a remote host debug platform.

The SBPlatform class represents the current host, or a remote host.
It can be connected to a remote platform in order to provide ways
to remotely launch and attach to processes, upload/download files,
create directories, run remote shell commands, find locally cached
versions of files from the remote system, and much more.

SBPlatform objects can be created and then used to connect to a remote
platform which allows the SBPlatform to be used to get a list of the
current processes on the remote host, attach to one of those processes,
install programs on the remote system, attach and launch processes,
and much more.

Every :py:class:`SBTarget` has a corresponding SBPlatform. The platform can be
specified upon target creation, or the currently selected platform
will attempt to be used when creating the target automatically as long
as the currently selected platform matches the target architecture
and executable type. If the architecture or executable type do not match,
a suitable platform will be found automatically."

) SBPlatform;
class SBPlatform
{
public:

    SBPlatform ();

    SBPlatform (const char *);

    ~SBPlatform();

    static SBPlatform GetHostPlatform();

    bool
    IsValid () const;

    explicit operator bool() const;

    void
    Clear ();

    const char *
    GetWorkingDirectory();

    bool
    SetWorkingDirectory(const char *);

    const char *
    GetName ();

    SBError
    ConnectRemote (lldb::SBPlatformConnectOptions &connect_options);

    void
    DisconnectRemote ();

    bool
    IsConnected();

    const char *
    GetTriple();

    const char *
    GetHostname ();

    const char *
    GetOSBuild ();

    const char *
    GetOSDescription ();

    uint32_t
    GetOSMajorVersion ();

    uint32_t
    GetOSMinorVersion ();

    uint32_t
    GetOSUpdateVersion ();

    lldb::SBError
    Get (lldb::SBFileSpec &src, lldb::SBFileSpec &dst);

    lldb::SBError
    Put (lldb::SBFileSpec &src, lldb::SBFileSpec &dst);

    lldb::SBError
    Install (lldb::SBFileSpec &src, lldb::SBFileSpec &dst);

    lldb::SBError
    Run (lldb::SBPlatformShellCommand &shell_command);

    lldb::SBError
    Launch (lldb::SBLaunchInfo &launch_info);

    lldb::SBError
    Kill (const lldb::pid_t pid);

    lldb::SBError
    MakeDirectory (const char *path, uint32_t file_permissions = lldb::eFilePermissionsDirectoryDefault);

    uint32_t
    GetFilePermissions (const char *path);

    lldb::SBError
    SetFilePermissions (const char *path, uint32_t file_permissions);

    lldb::SBUnixSignals
    GetUnixSignals();

    lldb::SBEnvironment
    GetEnvironment();

};

} // namespace lldb
