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 ¤t_prefix, 138 StreamString &result_stream, 139 Error &err); 140 141 static void 142 GetAllVariableValues (CommandInterpreter &interpreter, 143 lldb::UserSettingsControllerSP root, 144 std::string ¤t_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