Home | History | Annotate | Download | only in API
      1 //===-- SBInputReader.cpp ---------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 
     11 #include "lldb/lldb-enumerations.h"
     12 
     13 #include "lldb/API/SBDebugger.h"
     14 #include "lldb/API/SBError.h"
     15 #include "lldb/API/SBInputReader.h"
     16 #include "lldb/API/SBStream.h"
     17 #include "lldb/API/SBStringList.h"
     18 #include "lldb/Core/InputReader.h"
     19 #include "lldb/Core/Log.h"
     20 
     21 
     22 using namespace lldb;
     23 using namespace lldb_private;
     24 
     25 SBInputReader::SBInputReader ()  :
     26     m_opaque_sp (),
     27     m_callback_function (NULL),
     28     m_callback_baton (NULL)
     29 
     30 {
     31 }
     32 
     33 SBInputReader::SBInputReader (const lldb::InputReaderSP &reader_sp) :
     34     m_opaque_sp (reader_sp)
     35 {
     36     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     37 
     38     if (log)
     39         log->Printf ("SBInputReader::SBInputReader (reader_sp=%p) => SBInputReader(%p)", reader_sp.get(),
     40                      m_opaque_sp.get());
     41 }
     42 
     43 SBInputReader::SBInputReader (const SBInputReader &rhs) :
     44     m_opaque_sp (rhs.m_opaque_sp)
     45 {
     46     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     47 
     48     if (log)
     49         log->Printf("SBInputReader::SBInputReader (rhs.sp=%p) => SBInputReader(%p)",
     50                     rhs.m_opaque_sp.get(), m_opaque_sp.get());
     51 }
     52 
     53 SBInputReader::~SBInputReader ()
     54 {
     55 }
     56 
     57 size_t
     58 SBInputReader::PrivateCallback
     59 (
     60     void *baton,
     61     InputReader &reader,
     62     lldb::InputReaderAction notification,
     63     const char *bytes,
     64     size_t bytes_len
     65 )
     66 {
     67     SBInputReader *sb_reader = (SBInputReader *)baton;
     68     return sb_reader->m_callback_function (sb_reader->m_callback_baton,
     69                                            sb_reader,
     70                                            notification,
     71                                            bytes,
     72                                            bytes_len);
     73 }
     74 
     75 SBError
     76 SBInputReader::Initialize
     77 (
     78     SBDebugger &debugger,
     79     Callback callback_function,
     80     void *callback_baton,
     81     lldb::InputReaderGranularity granularity,
     82     const char *end_token,
     83     const char *prompt,
     84     bool echo
     85 )
     86 {
     87     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     88 
     89     if (log)
     90         log->Printf("SBInputReader(%p)::Initialize (SBDebugger(%p), callback_function=%p, callback_baton=%p, "
     91                     "granularity=%s, end_token=\"%s\", prompt=\"%s\", echo=%i)",
     92                     m_opaque_sp.get(),
     93                     debugger.get(),
     94                     callback_function,
     95                     callback_baton,
     96                     InputReader::GranularityAsCString (granularity), end_token, prompt,
     97                     echo);
     98 
     99     SBError sb_error;
    100     m_opaque_sp.reset (new InputReader (debugger.ref()));
    101 
    102     m_callback_function = callback_function;
    103     m_callback_baton = callback_baton;
    104 
    105     if (m_opaque_sp)
    106     {
    107         sb_error.SetError (m_opaque_sp->Initialize (SBInputReader::PrivateCallback,
    108                                                     this,
    109                                                     granularity,
    110                                                     end_token,
    111                                                     prompt,
    112                                                     echo));
    113     }
    114 
    115     if (sb_error.Fail())
    116     {
    117         m_opaque_sp.reset ();
    118         m_callback_function = NULL;
    119         m_callback_baton = NULL;
    120     }
    121 
    122     if (log)
    123     {
    124         SBStream sstr;
    125         sb_error.GetDescription (sstr);
    126         log->Printf ("SBInputReader(%p)::Initialize (...) => SBError(%p): %s", m_opaque_sp.get(),
    127                      sb_error.get(), sstr.GetData());
    128     }
    129 
    130     return sb_error;
    131 }
    132 
    133 bool
    134 SBInputReader::IsValid () const
    135 {
    136     return (m_opaque_sp.get() != NULL);
    137 }
    138 
    139 const SBInputReader &
    140 SBInputReader::operator = (const SBInputReader &rhs)
    141 {
    142     if (this != &rhs)
    143         m_opaque_sp = rhs.m_opaque_sp;
    144     return *this;
    145 }
    146 
    147 InputReader *
    148 SBInputReader::operator->() const
    149 {
    150     return m_opaque_sp.get();
    151 }
    152 
    153 lldb::InputReaderSP &
    154 SBInputReader::operator *()
    155 {
    156     return m_opaque_sp;
    157 }
    158 
    159 const lldb::InputReaderSP &
    160 SBInputReader::operator *() const
    161 {
    162     return m_opaque_sp;
    163 }
    164 
    165 InputReader *
    166 SBInputReader::get() const
    167 {
    168     return m_opaque_sp.get();
    169 }
    170 
    171 InputReader &
    172 SBInputReader::ref() const
    173 {
    174     assert (m_opaque_sp.get());
    175     return *m_opaque_sp;
    176 }
    177 
    178 bool
    179 SBInputReader::IsDone () const
    180 {
    181     if (m_opaque_sp)
    182         return m_opaque_sp->IsDone();
    183     else
    184         return true;
    185 }
    186 
    187 void
    188 SBInputReader::SetIsDone (bool value)
    189 {
    190     if (m_opaque_sp)
    191         m_opaque_sp->SetIsDone (value);
    192 }
    193 
    194 bool
    195 SBInputReader::IsActive () const
    196 {
    197     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
    198 
    199     bool ret_value = false;
    200     if (m_opaque_sp)
    201         ret_value = m_opaque_sp->IsActive();
    202 
    203     if (log)
    204         log->Printf ("SBInputReader(%p)::IsActive () => %i", m_opaque_sp.get(), ret_value);
    205 
    206     return ret_value;
    207 }
    208 
    209 InputReaderGranularity
    210 SBInputReader::GetGranularity ()
    211 {
    212     if (m_opaque_sp)
    213         return m_opaque_sp->GetGranularity();
    214     else
    215         return eInputReaderGranularityInvalid;
    216 }
    217