UserSettingsController.h revision 75b11a343a035ab426473a785a045f0614af9984
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 ¤t_prefix, 138 StreamString &result_stream, 139 Error &err); 140 141 static void 142 FindSettingsDescriptions (CommandInterpreter &interpreter, 143 lldb::UserSettingsControllerSP root, 144 std::string ¤t_prefix, 145 const char *search_name, 146 StreamString &result_stream, 147 Error &err); 148 149 static void 150 GetAllVariableValues (CommandInterpreter &interpreter, 151 lldb::UserSettingsControllerSP root, 152 std::string ¤t_prefix, 153 StreamString &result_stream, 154 Error &err); 155 156 static int 157 CompleteSettingsNames (lldb::UserSettingsControllerSP root_settings, 158 Args &partial_setting_name_pieces, 159 bool &word_complete, 160 StringList &matches); 161 162 static int 163 CompleteSettingsValue (lldb::UserSettingsControllerSP root_settings, 164 const char *full_dot_name, 165 const char *partial_value, 166 bool &word_complete, 167 StringList &matches); 168 169 static Args 170 BreakNameIntoPieces (const char *full_dot_name); 171 172 static const char * 173 GetTypeString (lldb::SettableVariableType var_type); 174 175 176 static const char * 177 EnumToString (const lldb::OptionEnumValueElement *enum_values, int value); 178 179 static void 180 UpdateStringVariable (lldb::VarSetOperationType op, 181 std::string &string_var, 182 const char *new_value, 183 Error &err); 184 185 186 static void 187 UpdateBooleanVariable (lldb::VarSetOperationType op, 188 bool &bool_var, 189 const char *new_value, 190 Error &err); 191 192 static void 193 UpdateStringArrayVariable (lldb::VarSetOperationType op, 194 const char *index_value, 195 Args &array_var, 196 const char *new_value, 197 Error &err); 198 199 static void 200 UpdateDictionaryVariable (lldb::VarSetOperationType op, 201 const char *index_value, 202 std::map<std::string, std::string> &dictionary, 203 const char *new_value, 204 Error &err); 205 206 static void 207 UpdateEnumVariable (lldb::OptionEnumValueElement *enum_values, 208 int *enum_var, 209 const char *new_value, 210 Error &err); 211 212 static bool 213 InitializeSettingsController (lldb::UserSettingsControllerSP &controller_sp, 214 SettingEntry *global_settings, 215 SettingEntry *instance_settings); 216 217 static void 218 FinalizeSettingsController (lldb::UserSettingsControllerSP &controller_sp); 219 220 221protected: 222 223 // ------------------------------------------------------------------------- 224 // Protected methods are declared below here. 225 // ------------------------------------------------------------------------- 226 227 bool 228 IsLiveInstance (const std::string &instance_name); 229 230 int 231 GlobalVariableMatches (const char *partial_name, 232 const std::string &complete_prefix, 233 StringList &matches); 234 235 int 236 InstanceVariableMatches (const char *partial_name, 237 const std::string &complete_prefix, 238 const char *instance_name, 239 StringList &matches); 240 241 int 242 LiveInstanceMatches (const char *partial_name, 243 const std::string &complete_prefix, 244 bool &word_complete, 245 StringList &matches); 246 247 int 248 ChildMatches (const char *partial_name, 249 const std::string &complete_prefix, 250 bool &word_complete, 251 StringList &matches); 252 253 254 size_t 255 GetNumChildren (); 256 257 const lldb::UserSettingsControllerSP 258 GetChildAtIndex (size_t index); 259 260 261 const SettingEntry * 262 GetGlobalEntry (const ConstString &var_name); 263 264 const SettingEntry * 265 GetInstanceEntry (const ConstString &var_name); 266 267 void 268 BuildParentPrefix (std::string &parent_prefix); 269 270 271 void 272 CopyDefaultSettings (const lldb::InstanceSettingsSP &new_settings, 273 const ConstString &instance_name, 274 bool pending); 275 276 lldb::InstanceSettingsSP 277 PendingSettingsForInstance (const ConstString &instance_name); 278 279 InstanceSettings * 280 FindSettingsForInstance (const ConstString &instance_name); 281 282 void 283 GetAllPendingSettingValues (StreamString &result_stream); 284 285 void 286 GetAllDefaultSettingValues (StreamString &result_stream); 287 288 void 289 GetAllInstanceVariableValues (CommandInterpreter &interpreter, 290 StreamString &result_stream); 291 292 void 293 OverrideAllInstances (const ConstString &var_name, 294 const char *value, 295 lldb::VarSetOperationType op, 296 const char *index_value, 297 Error &err); 298 299 UserSettingDefinition & 300 GetControllerSettings () { return m_settings; } 301 302 // ------------------------------------------------------------------------- 303 // Static protected methods are declared below here. 304 // ------------------------------------------------------------------------- 305 306 static void 307 PrintEnumValues (const lldb::OptionEnumValueElement *enum_values, Stream &str); 308 309 310 static int 311 BooleanMatches (const char *partial_value, 312 bool &word_complete, 313 StringList &matches); 314 315 static int 316 EnumMatches (const char *partial_value, 317 lldb::OptionEnumValueElement *enum_values, 318 bool &word_complete, 319 StringList &matches); 320 321 static void 322 VerifyOperationForType (lldb::SettableVariableType var_type, 323 lldb::VarSetOperationType op, 324 const ConstString &var_name, 325 Error &err); 326 327 // This is protected rather than private so that classes that inherit from UserSettingsController can access it. 328 329 lldb::InstanceSettingsSP m_default_settings; 330 331private: 332 333 UserSettingDefinition m_settings; 334 335 std::vector<lldb::UserSettingsControllerSP> m_children; 336 std::map <std::string, lldb::InstanceSettingsSP> m_pending_settings; 337 std::map <std::string, InstanceSettings *> m_live_settings; // live settings should never be NULL (hence 'live') 338 mutable Mutex m_children_mutex; 339 mutable Mutex m_pending_settings_mutex; 340 mutable Mutex m_live_settings_mutex; 341 342 DISALLOW_COPY_AND_ASSIGN (UserSettingsController); 343}; 344 345class InstanceSettings 346{ 347public: 348 349 InstanceSettings (UserSettingsController &owner, const char *instance_name, bool live_instance = true); 350 351 InstanceSettings (const InstanceSettings &rhs); 352 353 virtual 354 ~InstanceSettings (); 355 356 InstanceSettings& 357 operator= (const InstanceSettings &rhs); 358 359 // Begin Pure Virtual Functions 360 361 virtual void 362 UpdateInstanceSettingsVariable (const ConstString &var_name, 363 const char *index_value, 364 const char *value, 365 const ConstString &instance_name, 366 const SettingEntry &entry, 367 lldb::VarSetOperationType op, 368 Error &err, 369 bool pending) = 0; 370 371 virtual void 372 GetInstanceSettingsValue (const SettingEntry &entry, 373 const ConstString &var_name, 374 StringList &value) = 0; 375 376 virtual void 377 CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, 378 bool pending) = 0; 379 380 virtual const ConstString 381 CreateInstanceName () = 0; 382 383 // End Pure Virtual Functions 384 385 const ConstString & 386 GetInstanceName () { return m_instance_name; } 387 388 389 void 390 ChangeInstanceName (const std::string &new_instance_name); 391 392 static const ConstString & 393 GetDefaultName (); 394 395 static const ConstString & 396 InvalidName (); 397 398protected: 399 400 UserSettingsController &m_owner; 401 ConstString m_instance_name; 402}; 403 404 405 406} // namespace lldb_private 407 408#endif // liblldb_UserSettingsController_h_ 409