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

#ifndef LLDB_SBAttachInfo_h_
#define LLDB_SBAttachInfo_h_

#include "lldb/API/SBDefines.h"

namespace lldb {

class SBTarget;

class LLDB_API SBAttachInfo
{
public:
    SBAttachInfo ();

    SBAttachInfo (lldb::pid_t pid);

    //------------------------------------------------------------------
    /// Attach to a process by name.
    ///
    /// This function implies that a future call to SBTarget::Attach(...)
    /// will be synchronous.
    ///
    /// @param[in] path
    ///     A full or partial name for the process to attach to.
    ///
    /// @param[in] wait_for
    ///     If \b false, attach to an existing process whose name matches.
    ///     If \b true, then wait for the next process whose name matches.
    //------------------------------------------------------------------
    SBAttachInfo (const char *path, bool wait_for);

    //------------------------------------------------------------------
    /// Attach to a process by name.
    ///
    /// Future calls to SBTarget::Attach(...) will be synchronous or
    /// asynchronous depending on the \a async argument.
    ///
    /// @param[in] path
    ///     A full or partial name for the process to attach to.
    ///
    /// @param[in] wait_for
    ///     If \b false, attach to an existing process whose name matches.
    ///     If \b true, then wait for the next process whose name matches.
    ///
    /// @param[in] async
    ///     If \b false, then the SBTarget::Attach(...) call will be a
    ///     synchronous call with no way to cancel the attach in
    ///     progress.
    ///     If \b true, then the SBTarget::Attach(...) function will
    ///     return immediately and clients are expected to wait for a
    ///     process eStateStopped event if a suitable process is
    ///     eventually found. If the client wants to cancel the event,
    ///     SBProcess::Stop() can be called and an eStateExited process
    ///     event will be delivered.
    //------------------------------------------------------------------
    SBAttachInfo (const char *path, bool wait_for, bool async);

    SBAttachInfo (const SBAttachInfo &rhs);

    ~SBAttachInfo();

    SBAttachInfo &
    operator = (const SBAttachInfo &rhs);

    lldb::pid_t
    GetProcessID ();

    void
    SetProcessID (lldb::pid_t pid);

    void
    SetExecutable (const char *path);

    void
    SetExecutable (lldb::SBFileSpec exe_file);

    bool
    GetWaitForLaunch ();

    //------------------------------------------------------------------
    /// Set attach by process name settings.
    ///
    /// Designed to be used after a call to SBAttachInfo::SetExecutable().
    /// This function implies that a call to SBTarget::Attach(...) will
    /// be synchronous.
    ///
    /// @param[in] wait_for
    ///     If \b false, attach to an existing process whose name matches.
    ///     If \b true, then wait for the next process whose name matches.
    //------------------------------------------------------------------
    void
    SetWaitForLaunch (bool b);

    //------------------------------------------------------------------
    /// Set attach by process name settings.
    ///
    /// Designed to be used after a call to SBAttachInfo::SetExecutable().
    /// Future calls to SBTarget::Attach(...) will be synchronous or
    /// asynchronous depending on the \a async argument.
    ///
    /// @param[in] wait_for
    ///     If \b false, attach to an existing process whose name matches.
    ///     If \b true, then wait for the next process whose name matches.
    ///
    /// @param[in] async
    ///     If \b false, then the SBTarget::Attach(...) call will be a
    ///     synchronous call with no way to cancel the attach in
    ///     progress.
    ///     If \b true, then the SBTarget::Attach(...) function will
    ///     return immediately and clients are expected to wait for a
    ///     process eStateStopped event if a suitable process is
    ///     eventually found. If the client wants to cancel the event,
    ///     SBProcess::Stop() can be called and an eStateExited process
    ///     event will be delivered.
    //------------------------------------------------------------------
    void
    SetWaitForLaunch (bool b, bool async);

    bool
    GetIgnoreExisting ();

    void
    SetIgnoreExisting (bool b);

    uint32_t
    GetResumeCount ();

    void
    SetResumeCount (uint32_t c);

    const char *
    GetProcessPluginName ();

    void
    SetProcessPluginName (const char *plugin_name);

    uint32_t
    GetUserID();

    uint32_t
    GetGroupID();

    bool
    UserIDIsValid ();

    bool
    GroupIDIsValid ();

    void
    SetUserID (uint32_t uid);

    void
    SetGroupID (uint32_t gid);

    uint32_t
    GetEffectiveUserID();

    uint32_t
    GetEffectiveGroupID();

    bool
    EffectiveUserIDIsValid ();

    bool
    EffectiveGroupIDIsValid ();

    void
    SetEffectiveUserID (uint32_t uid);

    void
    SetEffectiveGroupID (uint32_t gid);

    lldb::pid_t
    GetParentProcessID ();

    void
    SetParentProcessID (lldb::pid_t pid);

    bool
    ParentProcessIDIsValid();

    //----------------------------------------------------------------------
    /// Get the listener that will be used to receive process events.
    ///
    /// If no listener has been set via a call to
    /// SBLaunchInfo::SetListener(), then an invalid SBListener will be
    /// returned (SBListener::IsValid() will return false). If a listener
    /// has been set, then the valid listener object will be returned.
    //----------------------------------------------------------------------
    SBListener
    GetListener ();

    //----------------------------------------------------------------------
    /// Set the listener that will be used to receive process events.
    ///
    /// By default the SBDebugger, which has a listener, that the SBTarget
    /// belongs to will listen for the process events. Calling this function
    /// allows a different listener to be used to listen for process events.
    //----------------------------------------------------------------------
    void
    SetListener (SBListener &listener);


protected:
    friend class SBTarget;

    lldb_private::ProcessAttachInfo &
    ref ();

    ProcessAttachInfoSP m_opaque_sp;
};

} // namespace lldb

#endif  // LLDB_SBAttachInfo_h_
