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
Settings(SettingsDescription * description)18 Settings::Settings(SettingsDescription* description)
19 :
20 fLock("settings"),
21 fDescription(description)
22 {
23 fDescription->AcquireReference();
24 }
25
26
~Settings()27 Settings::~Settings()
28 {
29 fDescription->ReleaseReference();
30 }
31
32
33 status_t
Init()34 Settings::Init()
35 {
36 return fLock.InitCheck();
37 }
38
39
40 BVariant
Value(Setting * setting) const41 Settings::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
51 BVariant
Value(const char * settingID) const52 Settings::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
65 bool
SetValue(Setting * setting,const BVariant & value)66 Settings::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
85 bool
RestoreValues(const BMessage & message)86 Settings::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
103 SettingsOption*
OptionValue(OptionsSetting * setting) const104 Settings::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
113 bool
AddListener(Listener * listener)114 Settings::AddListener(Listener* listener)
115 {
116 AutoLocker<BLocker> locker(fLock);
117 return fListeners.AddItem(listener);
118 }
119
120
121 void
RemoveListener(Listener * listener)122 Settings::RemoveListener(Listener* listener)
123 {
124 AutoLocker<BLocker> locker(fLock);
125 fListeners.RemoveItem(listener);
126 }
127
128
129 // #pragma mark - Listener
130
131
~Listener()132 Settings::Listener::~Listener()
133 {
134 }
135