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