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