//===-- SWIG Interface for SBPlatform ---------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

namespace lldb {

    
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);
};

class SBPlatformShellCommand
{
public:
    SBPlatformShellCommand (const char *shell_command);
    
    SBPlatformShellCommand (const SBPlatformShellCommand &rhs);
    
    ~SBPlatformShellCommand();
    
    void
    Clear();

    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 the 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 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();
    
    bool
    IsValid () 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
    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);

};

} // namespace lldb
