1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "TeamSettings.h"
8
9#include <new>
10
11#include <Message.h>
12
13#include <AutoLocker.h>
14
15#include "ArchivingUtils.h"
16#include "BreakpointSetting.h"
17#include "Team.h"
18#include "TeamUiSettings.h"
19#include "TeamUiSettingsFactory.h"
20#include "UserBreakpoint.h"
21
22
23TeamSettings::TeamSettings()
24{
25}
26
27
28TeamSettings::TeamSettings(const TeamSettings& other)
29{
30	try {
31		*this = other;
32	} catch (...) {
33		_Unset();
34		throw;
35	}
36}
37
38
39TeamSettings::~TeamSettings()
40{
41	_Unset();
42}
43
44
45status_t
46TeamSettings::SetTo(Team* team)
47{
48	_Unset();
49
50	AutoLocker<Team> locker(team);
51
52	fTeamName = team->Name();
53
54	// add breakpoints
55	for (UserBreakpointList::ConstIterator it
56			= team->UserBreakpoints().GetIterator();
57		UserBreakpoint* breakpoint = it.Next();) {
58		BreakpointSetting* breakpointSetting
59			= new(std::nothrow) BreakpointSetting;
60		if (breakpointSetting == NULL)
61			return B_NO_MEMORY;
62
63		status_t error = breakpointSetting->SetTo(breakpoint->Location(),
64			breakpoint->IsEnabled());
65		if (error == B_OK && !fBreakpoints.AddItem(breakpointSetting))
66			error = B_NO_MEMORY;
67		if (error != B_OK) {
68			delete breakpointSetting;
69			return error;
70		}
71	}
72
73	return B_OK;
74}
75
76
77status_t
78TeamSettings::SetTo(const BMessage& archive)
79{
80	_Unset();
81
82	status_t error = archive.FindString("teamName", &fTeamName);
83	if (error != B_OK)
84		return error;
85
86	// add breakpoints
87	BMessage childArchive;
88	for (int32 i = 0; archive.FindMessage("breakpoints", i, &childArchive)
89			== B_OK; i++) {
90		BreakpointSetting* breakpointSetting
91			= new(std::nothrow) BreakpointSetting;
92		if (breakpointSetting == NULL)
93			return B_NO_MEMORY;
94
95		error = breakpointSetting->SetTo(childArchive);
96		if (error == B_OK && !fBreakpoints.AddItem(breakpointSetting))
97			error = B_NO_MEMORY;
98		if (error != B_OK) {
99			delete breakpointSetting;
100			return error;
101		}
102	}
103
104	// add UI settings
105	for (int32 i = 0; archive.FindMessage("uisettings", i, &childArchive)
106		== B_OK; i++) {
107		TeamUiSettings* setting = NULL;
108		error = TeamUiSettingsFactory::Create(childArchive, setting);
109		if (error == B_OK && !fUiSettings.AddItem(setting))
110			error = B_NO_MEMORY;
111		if (error != B_OK) {
112			delete setting;
113			return error;
114		}
115	}
116
117	return B_OK;
118}
119
120
121status_t
122TeamSettings::WriteTo(BMessage& archive) const
123{
124	status_t error = archive.AddString("teamName", fTeamName);
125	if (error != B_OK)
126		return error;
127
128	BMessage childArchive;
129	for (int32 i = 0; BreakpointSetting* breakpoint = fBreakpoints.ItemAt(i);
130			i++) {
131		error = breakpoint->WriteTo(childArchive);
132		if (error != B_OK)
133			return error;
134
135		error = archive.AddMessage("breakpoints", &childArchive);
136		if (error != B_OK)
137			return error;
138	}
139
140	for (int32 i = 0; TeamUiSettings* uiSetting = fUiSettings.ItemAt(i);
141			i++) {
142		error = uiSetting->WriteTo(childArchive);
143		if (error != B_OK)
144			return error;
145
146		error = archive.AddMessage("uisettings", &childArchive);
147		if (error != B_OK)
148			return error;
149	}
150
151	return B_OK;
152}
153
154
155int32
156TeamSettings::CountBreakpoints() const
157{
158	return fBreakpoints.CountItems();
159}
160
161
162const BreakpointSetting*
163TeamSettings::BreakpointAt(int32 index) const
164{
165	return fBreakpoints.ItemAt(index);
166}
167
168
169int32
170TeamSettings::CountUiSettings() const
171{
172	return fUiSettings.CountItems();
173}
174
175
176const TeamUiSettings*
177TeamSettings::UiSettingAt(int32 index) const
178{
179	return fUiSettings.ItemAt(index);
180}
181
182
183const TeamUiSettings*
184TeamSettings::UiSettingFor(const char* id) const
185{
186	for (int32 i = 0; i < fUiSettings.CountItems(); i++) {
187		TeamUiSettings* settings = fUiSettings.ItemAt(i);
188		if (strcmp(settings->ID(), id) == 0)
189			return settings;
190	}
191
192	return NULL;
193}
194
195
196status_t
197TeamSettings::AddUiSettings(TeamUiSettings* settings)
198{
199	if (!fUiSettings.AddItem(settings))
200		return B_NO_MEMORY;
201
202	return B_OK;
203}
204
205
206TeamSettings&
207TeamSettings::operator=(const TeamSettings& other)
208{
209	if (this == &other)
210		return *this;
211
212	_Unset();
213
214	fTeamName = other.fTeamName;
215
216	for (int32 i = 0; BreakpointSetting* breakpoint
217			= other.fBreakpoints.ItemAt(i); i++) {
218		BreakpointSetting* clonedBreakpoint
219			= new BreakpointSetting(*breakpoint);
220		if (!fBreakpoints.AddItem(clonedBreakpoint)) {
221			delete clonedBreakpoint;
222			throw std::bad_alloc();
223		}
224	}
225
226	for (int32 i = 0; TeamUiSettings* uiSetting
227			= other.fUiSettings.ItemAt(i); i++) {
228		TeamUiSettings* clonedSetting
229			= uiSetting->Clone();
230		if (!fUiSettings.AddItem(clonedSetting)) {
231			delete clonedSetting;
232			throw std::bad_alloc();
233		}
234	}
235
236	return *this;
237}
238
239
240void
241TeamSettings::_Unset()
242{
243	for (int32 i = 0; BreakpointSetting* breakpoint = fBreakpoints.ItemAt(i);
244			i++) {
245		delete breakpoint;
246	}
247
248	for (int32 i = 0; TeamUiSettings* uiSetting = fUiSettings.ItemAt(i); i++)
249		delete uiSetting;
250
251	fBreakpoints.MakeEmpty();
252	fUiSettings.MakeEmpty();
253
254	fTeamName.Truncate(0);
255}
256