1/* 2 * Copyright 2013, Rene Gollent, rene@gollent.com. 3 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 4 * Distributed under the terms of the MIT License. 5 */ 6 7 8#include "Settings.h" 9 10#include <AutoLocker.h> 11 12#include "SettingsDescription.h" 13 14 15// #pragma mark - Settings 16 17 18Settings::Settings(SettingsDescription* description) 19 : 20 fLock("settings"), 21 fDescription(description) 22{ 23 fDescription->AcquireReference(); 24} 25 26 27Settings::~Settings() 28{ 29 fDescription->ReleaseReference(); 30} 31 32 33status_t 34Settings::Init() 35{ 36 return fLock.InitCheck(); 37} 38 39 40BVariant 41Settings::Value(Setting* setting) const 42{ 43 AutoLocker<BLocker> locker(fLock); 44 45 BVariant value; 46 return value.SetFromMessage(fValues, setting->ID()) == B_OK 47 ? value : setting->DefaultValue(); 48} 49 50 51BVariant 52Settings::Value(const char* settingID) const 53{ 54 AutoLocker<BLocker> locker(fLock); 55 56 BVariant value; 57 if (value.SetFromMessage(fValues, settingID) == B_OK) 58 return value; 59 60 Setting* setting = fDescription->SettingByID(settingID); 61 return setting != NULL ? setting->DefaultValue() : value; 62} 63 64 65bool 66Settings::SetValue(Setting* setting, const BVariant& value) 67{ 68 AutoLocker<BLocker> locker(fLock); 69 70 // remove the message field and re-add it with the new value 71 const char* fieldName = setting->ID(); 72 fValues.RemoveName(fieldName); 73 74 bool success = value.AddToMessage(fValues, fieldName) == B_OK; 75 76 // notify the listeners 77 int32 count = fListeners.CountItems(); 78 for (int32 i = count - 1; i >= 0; i--) 79 fListeners.ItemAt(i)->SettingValueChanged(setting); 80 81 return success; 82} 83 84 85bool 86Settings::RestoreValues(const BMessage& message) 87{ 88 AutoLocker<BLocker> locker(fLock); 89 90 for (int32 i = 0; i < fDescription->CountSettings(); i++) { 91 Setting* setting = fDescription->SettingAt(i); 92 BVariant value; 93 if (value.SetFromMessage(message, setting->ID()) == B_OK) { 94 if (!SetValue(setting, value)) 95 return false; 96 } 97 } 98 99 return true; 100} 101 102 103SettingsOption* 104Settings::OptionValue(OptionsSetting* setting) const 105{ 106 BVariant value = Value(setting); 107 return value.Type() == B_STRING_TYPE 108 ? setting->OptionByID(value.ToString()) 109 : setting->DefaultOption(); 110} 111 112 113bool 114Settings::AddListener(Listener* listener) 115{ 116 AutoLocker<BLocker> locker(fLock); 117 return fListeners.AddItem(listener); 118} 119 120 121void 122Settings::RemoveListener(Listener* listener) 123{ 124 AutoLocker<BLocker> locker(fLock); 125 fListeners.RemoveItem(listener); 126} 127 128 129// #pragma mark - Listener 130 131 132Settings::Listener::~Listener() 133{ 134} 135