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