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