2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2016, Rene Gollent, rene@gollent.com.
4 * Distributed under the terms of the MIT License.
8 #include "DebuggerSettingsManager.h"
12 #include <Directory.h>
14 #include <FindDirectory.h>
16 #include <AutoDeleter.h>
17 #include <AutoLocker.h>
19 #include "TeamSettings.h"
22 static const char* const kSettingsDirPath
= "Debugger";
23 static const char* const kGlobalSettingsName
= "Global";
24 static const int32 kMaxRecentTeamSettings
= 10;
27 DebuggerSettingsManager::DebuggerSettingsManager()
30 fLock("settings manager"),
31 fRecentTeamSettings(kMaxRecentTeamSettings
, true),
32 fUiSettingsFactory(NULL
)
37 DebuggerSettingsManager::~DebuggerSettingsManager()
44 DebuggerSettingsManager::Init(TeamUiSettingsFactory
* factory
)
47 status_t error
= fLock
.InitCheck();
51 fUiSettingsFactory
= factory
;
53 // get and create our settings directory
54 if (find_directory(B_USER_SETTINGS_DIRECTORY
, &fSettingsPath
, true) == B_OK
55 && fSettingsPath
.Append(kSettingsDirPath
) == B_OK
56 && create_directory(fSettingsPath
.Path(), 0700) == B_OK
57 && fSettingsPath
.Append(kGlobalSettingsName
) == B_OK
) {
61 // something went wrong -- clear the path
62 fSettingsPath
.Unset();
70 DebuggerSettingsManager::LoadTeamSettings(const char* teamName
, TeamSettings
& settings
)
72 AutoLocker
<BLocker
> locker(fLock
);
74 int32 index
= _TeamSettingsIndex(teamName
);
76 return B_ENTRY_NOT_FOUND
;
79 settings
= *fRecentTeamSettings
.ItemAt(index
);
81 } catch (std::bad_alloc
) {
88 DebuggerSettingsManager::SaveTeamSettings(const TeamSettings
& _settings
)
90 AutoLocker
<BLocker
> locker(fLock
);
92 TeamSettings
* settings
;
93 int32 index
= _TeamSettingsIndex(_settings
.TeamName());
95 settings
= fRecentTeamSettings
.RemoveItemAt(index
);
97 settings
= new(std::nothrow
) TeamSettings
;
101 // enforce recent limit
102 while (fRecentTeamSettings
.CountItems() >= kMaxRecentTeamSettings
)
103 delete fRecentTeamSettings
.RemoveItemAt(0);
106 ObjectDeleter
<TeamSettings
> settingsDeleter(settings
);
109 *settings
= _settings
;
110 if (!fRecentTeamSettings
.AddItem(settings
))
112 settingsDeleter
.Detach();
114 return _SaveSettings();
115 } catch (std::bad_alloc
) {
122 DebuggerSettingsManager::_Unset()
124 fRecentTeamSettings
.MakeEmpty();
129 DebuggerSettingsManager::_LoadSettings()
133 if (fSettingsPath
.Path() == NULL
)
134 return B_ENTRY_NOT_FOUND
;
136 // read the settings file
138 status_t error
= file
.SetTo(fSettingsPath
.Path(), B_READ_ONLY
);
143 error
= archive
.Unflatten(&file
);
147 // unarchive the recent team settings
148 BMessage childArchive
;
149 for (int32 i
= 0; archive
.FindMessage("teamSettings", i
, &childArchive
)
151 TeamSettings
* settings
= new(std::nothrow
) TeamSettings
;
152 if (settings
== NULL
)
155 error
= settings
->SetTo(childArchive
, *fUiSettingsFactory
);
161 if (!fRecentTeamSettings
.AddItem(settings
)) {
172 DebuggerSettingsManager::_SaveSettings()
174 if (fSettingsPath
.Path() == NULL
)
175 return B_ENTRY_NOT_FOUND
;
177 // archive the recent team settings
179 for (int32 i
= 0; TeamSettings
* settings
= fRecentTeamSettings
.ItemAt(i
);
181 BMessage childArchive
;
182 status_t error
= settings
->WriteTo(childArchive
);
186 error
= archive
.AddMessage("teamSettings", &childArchive
);
191 // open the settings file
193 status_t error
= file
.SetTo(fSettingsPath
.Path(),
194 B_WRITE_ONLY
| B_CREATE_FILE
| B_ERASE_FILE
);
198 return archive
.Flatten(&file
);
203 DebuggerSettingsManager::_TeamSettingsIndex(const char* teamName
) const
205 for (int32 i
= 0; TeamSettings
* settings
= fRecentTeamSettings
.ItemAt(i
);
207 if (settings
->TeamName() == teamName
)