UserSettingsController.h revision 598df88bd6fc33c6fb330bc859bdc277795501f3
1//====-- UserSettingsController.h --------------------------------*- 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#ifndef liblldb_UserSettingsController_h_
11#define liblldb_UserSettingsController_h_
12
13// C Includes
14// C++ Includes
15
16#include <string>
17#include <vector>
18
19// Other libraries and framework includes
20// Project includes
21
22#include "lldb/lldb-private.h"
23#include "lldb/Core/ConstString.h"
24#include "lldb/Core/StringList.h"
25#include "lldb/Core/Stream.h"
26#include "lldb/Core/StreamString.h"
27#include "lldb/Host/Mutex.h"
28#include "lldb/Interpreter/NamedOptionValue.h"
29
30namespace lldb_private {
31
32typedef struct
33{
34    const char *var_name;
35    SettableVariableType var_type;
36    const char *default_value;
37    OptionEnumValueElement *enum_values;
38    bool initialized;
39    bool hidden;
40    const char *description;   //help text
41} SettingEntry;
42
43
44typedef struct
45{
46    lldb::UserSettingsControllerSP parent;
47    ConstString level_name;
48    std::vector<SettingEntry> global_settings;
49    std::vector<SettingEntry> instance_settings;
50} UserSettingDefinition;
51
52class UserSettingsController :
53    public STD_ENABLE_SHARED_FROM_THIS(UserSettingsController)
54{
55public:
56
57    UserSettingsController (const char *level_name,
58                            const lldb::UserSettingsControllerSP &parent);
59
60    virtual
61    ~UserSettingsController ();
62
63    // Pure virtual functions, which all sub-classes must implement.
64    virtual lldb::InstanceSettingsSP
65    CreateInstanceSettings (const char *instance_name) = 0;
66
67    // Virtual functions that you can override if you have global settings
68    // (not instance specific).
69    virtual bool
70    SetGlobalVariable (const ConstString &var_name,
71                       const char *index_value,
72                       const char *value,
73                       const SettingEntry &entry,
74                       const VarSetOperationType op,
75                       Error &err);
76
77    virtual bool
78    GetGlobalVariable (const ConstString &var_name,
79                       StringList &value,
80                       Error &err);
81
82    // End of pure virtual functions.
83    StringList
84    GetVariable (const char *full_dot_name,
85                 SettableVariableType &var_type,
86                 const char *debugger_instance_name,
87                 Error &err);
88
89    Error
90    SetVariable (const char *full_dot_name,
91                 const char *value,
92                 const VarSetOperationType op,
93                 const bool override,
94                 const char *debugger_instance_name,
95                 const char *index_value = NULL);
96
97    const lldb::UserSettingsControllerSP &
98    GetParent ();
99
100    const ConstString &
101    GetLevelName ();
102
103    void
104    RegisterChild (const lldb::UserSettingsControllerSP &child);
105
106    void
107    RemoveChild (const lldb::UserSettingsControllerSP &child);
108
109    void
110    CreateSettingsVector (const SettingEntry *table,
111                          const bool global);
112
113    void
114    CreateDefaultInstanceSettings ();
115
116    void
117    InitializeGlobalVariables ();
118
119    const lldb::InstanceSettingsSP &
120    FindPendingSettings (const ConstString &instance_name);
121
122    void
123    RemovePendingSettings (const ConstString &instance_name);
124
125    void
126    RegisterInstanceSettings (InstanceSettings *instance_settings);
127
128    void
129    UnregisterInstanceSettings (InstanceSettings *instance_settings);
130
131    void
132    RenameInstanceSettings (const char *old_name, const char *new_name);
133
134    void
135    SetDefaultInstanceSettings (const lldb::InstanceSettingsSP &instance_settings_sp)
136    {
137        m_default_settings = instance_settings_sp;
138    }
139    // -------------------------------------------------------------------------
140    // Public static methods
141    // -------------------------------------------------------------------------
142
143    static void
144    FindAllSettingsDescriptions (CommandInterpreter &interpreter,
145                                 const lldb::UserSettingsControllerSP& usc_sp,
146                                 const char *current_prefix,
147                                 Stream &result_stream,
148                                 Error &err);
149
150    static void
151    FindSettingsDescriptions (CommandInterpreter &interpreter,
152                              const lldb::UserSettingsControllerSP& usc_sp,
153                              const char *current_prefix,
154                              const char *search_name,
155                              Stream &result_stream,
156                              Error &err);
157
158    static void
159    SearchAllSettingsDescriptions (CommandInterpreter &interpreter,
160                                   const lldb::UserSettingsControllerSP& usc_sp,
161                                   const char *current_prefix,
162                                   const char *search_word,
163                                   Stream &result_stream);
164
165    static void
166    GetAllVariableValues (CommandInterpreter &interpreter,
167                          const lldb::UserSettingsControllerSP& usc_sp,
168                          const char *current_prefix,
169                          Stream &result_stream,
170                          Error &err);
171
172    static bool
173    DumpValue (CommandInterpreter &interpreter,
174               const lldb::UserSettingsControllerSP& usc_sp,
175               const char *variable_dot_name,
176               Stream &strm);
177
178    static bool
179    DumpValue (const char *variable_dot_name,
180               SettableVariableType var_type,
181               const StringList &variable_value,
182               Stream &strm);
183
184    static int
185    CompleteSettingsNames (const lldb::UserSettingsControllerSP& usc_sp,
186                           Args &partial_setting_name_pieces,
187                           bool &word_complete,
188                           StringList &matches);
189
190    static int
191    CompleteSettingsValue (const lldb::UserSettingsControllerSP& usc_sp,
192                           const char *full_dot_name,
193                           const char *partial_value,
194                           bool &word_complete,
195                           StringList &matches);
196
197    static Args
198    BreakNameIntoPieces (const char *full_dot_name);
199
200    static const char *
201    GetTypeString (SettableVariableType var_type);
202
203
204    static const char *
205    EnumToString (const OptionEnumValueElement *enum_values, int value);
206
207    static void
208    UpdateStringVariable (VarSetOperationType op,
209                          std::string &string_var,
210                          const char *new_value,
211                          Error &err);
212
213
214    static void
215    UpdateBooleanVariable (VarSetOperationType op,
216                           bool &bool_var,
217                           const char *new_value,
218                           bool clear_value, // Used for op == eVarSetOperationClear
219                           Error &err);
220
221    static void
222    UpdateStringArrayVariable (VarSetOperationType op,
223                               const char *index_value,
224                               Args &array_var,
225                               const char *new_value,
226                               Error &err);
227
228    static void
229    UpdateDictionaryVariable (VarSetOperationType op,
230                              const char *index_value,
231                              std::map<std::string, std::string> &dictionary,
232                              const char *new_value,
233                              Error &err);
234
235    static void
236    UpdateEnumVariable (OptionEnumValueElement *enum_values,
237                        int *enum_var,
238                        const char *new_value,
239                        Error &err);
240
241    static Error
242    UpdateStringOptionValue (const char *new_value_cstr,
243                             VarSetOperationType op,
244                             OptionValueString &option_value);
245
246    static Error
247    UpdateBooleanOptionValue (const char *new_value_cstr,
248                              VarSetOperationType op,
249                              OptionValueBoolean &option_value);
250
251    static Error
252    UpdateFileSpecOptionValue (const char *new_value_cstr,
253                               VarSetOperationType op,
254                               OptionValueFileSpec &option_value);
255
256    static bool
257    InitializeSettingsController (lldb::UserSettingsControllerSP &controller_sp,
258                                  SettingEntry *global_settings,
259                                  SettingEntry *instance_settings);
260
261    static void
262    FinalizeSettingsController (lldb::UserSettingsControllerSP &controller_sp);
263
264
265    lldb::InstanceSettingsSP
266    GetDefaultInstanceSettings ()
267    {
268        return m_default_settings;
269    }
270
271protected:
272
273    // -------------------------------------------------------------------------
274    // Protected methods are declared below here.
275    // -------------------------------------------------------------------------
276
277    bool
278    IsLiveInstance (const std::string &instance_name);
279
280    int
281    GlobalVariableMatches (const char *partial_name,
282                           const std::string &complete_prefix,
283                           StringList &matches);
284
285    int
286    InstanceVariableMatches (const char *partial_name,
287                             const std::string &complete_prefix,
288                             const char *instance_name,
289                             StringList &matches);
290
291    int
292    LiveInstanceMatches (const char *partial_name,
293                         const std::string &complete_prefix,
294                         bool &word_complete,
295                         StringList &matches);
296
297    int
298    ChildMatches (const char *partial_name,
299                  const std::string &complete_prefix,
300                  bool &word_complete,
301                  StringList &matches);
302
303
304    size_t
305    GetNumChildren ();
306
307    const lldb::UserSettingsControllerSP
308    GetChildAtIndex (size_t index);
309
310
311    const SettingEntry *
312    GetGlobalEntry (const ConstString &var_name);
313
314    const SettingEntry *
315    GetInstanceEntry (const ConstString &var_name);
316
317    void
318    BuildParentPrefix (std::string &parent_prefix);
319
320
321    void
322    CopyDefaultSettings (const lldb::InstanceSettingsSP &new_settings,
323                         const ConstString &instance_name,
324                         bool pending);
325
326    lldb::InstanceSettingsSP
327    PendingSettingsForInstance (const ConstString &instance_name);
328
329    InstanceSettings *
330    FindSettingsForInstance (const ConstString &instance_name);
331
332    void
333    GetAllPendingSettingValues (Stream &result_stream);
334
335    void
336    GetAllDefaultSettingValues (Stream &result_stream);
337
338    void
339    GetAllInstanceVariableValues (CommandInterpreter &interpreter,
340                                  Stream &result_stream);
341
342    void
343    OverrideAllInstances (const ConstString &var_name,
344                          const char *value,
345                          VarSetOperationType op,
346                          const char *index_value,
347                          Error &err);
348
349    UserSettingDefinition &
350    GetControllerSettings () { return m_settings; }
351
352    // -------------------------------------------------------------------------
353    // Static protected methods are declared below here.
354    // -------------------------------------------------------------------------
355
356    static void
357    PrintEnumValues (const OptionEnumValueElement *enum_values,
358                     Stream &str);
359
360
361    static int
362    BooleanMatches (const char *partial_value,
363                    bool &word_complete,
364                    StringList &matches);
365
366    static int
367    EnumMatches (const char *partial_value,
368                 OptionEnumValueElement *enum_values,
369                 bool &word_complete,
370                 StringList &matches);
371
372    static void
373    VerifyOperationForType (SettableVariableType var_type,
374                            VarSetOperationType op,
375                            const ConstString &var_name,
376                            Error &err);
377
378    // This is protected rather than private so that classes that inherit from UserSettingsController can access it.
379
380    lldb::InstanceSettingsSP m_default_settings;
381
382private:
383
384    UserSettingDefinition m_settings;
385
386    typedef std::map<std::string,InstanceSettings*> InstanceSettingsMap;
387
388    std::vector<lldb::UserSettingsControllerSP> m_children;
389    std::map <std::string, lldb::InstanceSettingsSP> m_pending_settings;
390    InstanceSettingsMap m_live_settings;    // live settings should never be NULL (hence 'live')
391    mutable Mutex m_children_mutex;
392    mutable Mutex m_pending_settings_mutex;
393    mutable Mutex m_live_settings_mutex;
394
395    DISALLOW_COPY_AND_ASSIGN (UserSettingsController);
396};
397
398class InstanceSettings
399{
400public:
401
402    InstanceSettings (const lldb::UserSettingsControllerSP &owner_sp, const char *instance_name, bool live_instance = true);
403
404    InstanceSettings (const InstanceSettings &rhs);
405
406    virtual
407    ~InstanceSettings ();
408
409    InstanceSettings&
410    operator= (const InstanceSettings &rhs);
411
412    // Begin Pure Virtual Functions
413
414    virtual void
415    UpdateInstanceSettingsVariable (const ConstString &var_name,
416                                    const char *index_value,
417                                    const char *value,
418                                    const ConstString &instance_name,
419                                    const SettingEntry &entry,
420                                    VarSetOperationType op,
421                                    Error &err,
422                                    bool pending) = 0;
423
424    virtual bool
425    GetInstanceSettingsValue (const SettingEntry &entry,
426                              const ConstString &var_name,
427                              StringList &value,
428                              Error *err) = 0;
429
430    virtual void
431    CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings,
432                          bool pending) = 0;
433
434    virtual const ConstString
435    CreateInstanceName () = 0;
436
437    // End Pure Virtual Functions
438
439    const ConstString &
440    GetInstanceName () { return m_instance_name; }
441
442
443    void
444    ChangeInstanceName (const std::string &new_instance_name);
445
446    static const ConstString &
447    GetDefaultName ();
448
449    static const ConstString &
450    InvalidName ();
451
452protected:
453
454    lldb::UserSettingsControllerWP m_owner_wp;
455    ConstString m_instance_name;
456};
457
458
459
460} // namespace lldb_private
461
462#endif // liblldb_UserSettingsController_h_
463