rtsp_streamer run loop in a separate thread
[haiku.git] / src / apps / debugger / settings / SettingsManager.cpp
blob7efe77bebcbb4dc18f24e940625fe5746828ecd8
1 /*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
7 #include "SettingsManager.h"
9 #include <new>
11 #include <Directory.h>
12 #include <File.h>
13 #include <FindDirectory.h>
15 #include <AutoDeleter.h>
16 #include <AutoLocker.h>
18 #include "TeamSettings.h"
21 static const char* const kSettingsDirPath = "Debugger";
22 static const char* const kGlobalSettingsName = "Global";
23 static const int32 kMaxRecentTeamSettings = 10;
26 SettingsManager::SettingsManager()
28 fLock("settings manager"),
29 fRecentTeamSettings(kMaxRecentTeamSettings, true),
30 fUiSettingsFactory(NULL)
35 SettingsManager::~SettingsManager()
37 _Unset();
41 status_t
42 SettingsManager::Init(TeamUiSettingsFactory* factory)
44 // check the lock
45 status_t error = fLock.InitCheck();
46 if (error != B_OK)
47 return error;
49 fUiSettingsFactory = factory;
51 // get and create our settings directory
52 if (find_directory(B_USER_SETTINGS_DIRECTORY, &fSettingsPath, true) == B_OK
53 && fSettingsPath.Append(kSettingsDirPath) == B_OK
54 && create_directory(fSettingsPath.Path(), 0700) == B_OK
55 && fSettingsPath.Append(kGlobalSettingsName) == B_OK) {
56 // load the settings
57 _LoadSettings();
58 } else {
59 // something went wrong -- clear the path
60 fSettingsPath.Unset();
63 return B_OK;
67 status_t
68 SettingsManager::LoadTeamSettings(const char* teamName, TeamSettings& settings)
70 AutoLocker<BLocker> locker(fLock);
72 int32 index = _TeamSettingsIndex(teamName);
73 if (index < 0)
74 return B_ENTRY_NOT_FOUND;
76 try {
77 settings = *fRecentTeamSettings.ItemAt(index);
78 return B_OK;
79 } catch (std::bad_alloc) {
80 return B_NO_MEMORY;
85 status_t
86 SettingsManager::SaveTeamSettings(const TeamSettings& _settings)
88 AutoLocker<BLocker> locker(fLock);
90 TeamSettings* settings;
91 int32 index = _TeamSettingsIndex(_settings.TeamName());
92 if (index >= 0) {
93 settings = fRecentTeamSettings.RemoveItemAt(index);
94 } else {
95 settings = new(std::nothrow) TeamSettings;
96 if (settings == NULL)
97 return B_NO_MEMORY;
99 // enforce recent limit
100 while (fRecentTeamSettings.CountItems() >= kMaxRecentTeamSettings)
101 delete fRecentTeamSettings.RemoveItemAt(0);
104 ObjectDeleter<TeamSettings> settingsDeleter(settings);
106 try {
107 *settings = _settings;
108 if (!fRecentTeamSettings.AddItem(settings))
109 return B_NO_MEMORY;
110 settingsDeleter.Detach();
112 return _SaveSettings();
113 } catch (std::bad_alloc) {
114 return B_NO_MEMORY;
119 void
120 SettingsManager::_Unset()
122 fRecentTeamSettings.MakeEmpty();
126 status_t
127 SettingsManager::_LoadSettings()
129 _Unset();
131 if (fSettingsPath.Path() == NULL)
132 return B_ENTRY_NOT_FOUND;
134 // read the settings file
135 BFile file;
136 status_t error = file.SetTo(fSettingsPath.Path(), B_READ_ONLY);
137 if (error != B_OK)
138 return error;
140 BMessage archive;
141 error = archive.Unflatten(&file);
142 if (error != B_OK)
143 return error;
145 // unarchive the recent team settings
146 BMessage childArchive;
147 for (int32 i = 0; archive.FindMessage("teamSettings", i, &childArchive)
148 == B_OK; i++) {
149 TeamSettings* settings = new(std::nothrow) TeamSettings;
150 if (settings == NULL)
151 return B_NO_MEMORY;
153 error = settings->SetTo(childArchive, *fUiSettingsFactory);
154 if (error != B_OK) {
155 delete settings;
156 continue;
159 if (!fRecentTeamSettings.AddItem(settings)) {
160 delete settings;
161 return B_NO_MEMORY;
165 return B_OK;
169 status_t
170 SettingsManager::_SaveSettings()
172 if (fSettingsPath.Path() == NULL)
173 return B_ENTRY_NOT_FOUND;
175 // archive the recent team settings
176 BMessage archive;
177 for (int32 i = 0; TeamSettings* settings = fRecentTeamSettings.ItemAt(i);
178 i++) {
179 BMessage childArchive;
180 status_t error = settings->WriteTo(childArchive);
181 if (error != B_OK)
182 return error;
184 error = archive.AddMessage("teamSettings", &childArchive);
185 if (error != B_OK)
186 return error;
189 // open the settings file
190 BFile file;
191 status_t error = file.SetTo(fSettingsPath.Path(),
192 B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
193 if (error != B_OK)
194 return error;
196 return archive.Flatten(&file);
200 int32
201 SettingsManager::_TeamSettingsIndex(const char* teamName) const
203 for (int32 i = 0; TeamSettings* settings = fRecentTeamSettings.ItemAt(i);
204 i++) {
205 if (settings->TeamName() == teamName)
206 return i;
209 return -1;