diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile index 4657d1d4f4..2428432ea6 100644 --- a/src/apps/debugger/Jamfile +++ b/src/apps/debugger/Jamfile @@ -208,6 +208,7 @@ Application Debugger : SettingsManager.cpp TeamFileManagerSettings.cpp TeamSettings.cpp + TeamSignalSettings.cpp TeamUiSettings.cpp TeamUiSettingsFactory.cpp diff --git a/src/apps/debugger/controllers/TeamDebugger.cpp b/src/apps/debugger/controllers/TeamDebugger.cpp index a293ac4676..9374459b5e 100644 --- a/src/apps/debugger/controllers/TeamDebugger.cpp +++ b/src/apps/debugger/controllers/TeamDebugger.cpp @@ -53,6 +53,7 @@ #include "TeamMemoryBlock.h" #include "TeamMemoryBlockManager.h" #include "TeamSettings.h" +#include "TeamSignalSettings.h" #include "TeamUiSettings.h" #include "Tracing.h" #include "ValueNode.h" @@ -2315,6 +2316,22 @@ TeamDebugger::_LoadSettings() fUserInterface->ID()); if (uiSettings != NULL) fUserInterface->LoadSettings(uiSettings); + + const TeamSignalSettings* signalSettings = fTeamSettings.SignalSettings(); + if (signalSettings != NULL) { + fTeam->SetDefaultSignalDisposition( + signalSettings->DefaultSignalDisposition()); + + int32 signal; + int32 disposition; + for (int32 i = 0; i < signalSettings->CountCustomSignalDispositions(); + i++) { + if (signalSettings->GetCustomSignalDispositionAt(i, signal, + disposition) == B_OK) { + fTeam->SetCustomSignalDisposition(signal, disposition); + } + } + } } diff --git a/src/apps/debugger/settings/TeamSettings.cpp b/src/apps/debugger/settings/TeamSettings.cpp index b77224fc07..0ce088b2f2 100644 --- a/src/apps/debugger/settings/TeamSettings.cpp +++ b/src/apps/debugger/settings/TeamSettings.cpp @@ -1,6 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. - * Copyright 2013, Rene Gollent, rene@gollent.com. + * Copyright 2013-2015, Rene Gollent, rene@gollent.com. * Distributed under the terms of the MIT License. */ @@ -17,6 +17,7 @@ #include "BreakpointSetting.h" #include "Team.h" #include "TeamFileManagerSettings.h" +#include "TeamSignalSettings.h" #include "TeamUiSettings.h" #include "TeamUiSettingsFactory.h" #include "UserBreakpoint.h" @@ -25,6 +26,7 @@ TeamSettings::TeamSettings() { fFileManagerSettings = new TeamFileManagerSettings(); + fSignalSettings = new TeamSignalSettings(); } @@ -74,6 +76,22 @@ TeamSettings::SetTo(Team* team) } } + // add signal configuration + + fSignalSettings->SetDefaultSignalDisposition( + team->DefaultSignalDisposition()); + + const SignalDispositionMappings& mappings + = team->GetSignalDispositionMappings(); + + for (SignalDispositionMappings::const_iterator it = mappings.begin(); + it != mappings.end(); ++it) { + status_t error = fSignalSettings->AddCustomSignalDisposition( + it->first, it->second); + if (error != B_OK) + return error; + } + return B_OK; } @@ -124,6 +142,12 @@ TeamSettings::SetTo(const BMessage& archive) return error; } + if (archive.FindMessage("signalsettings", &childArchive) == B_OK) { + error = fSignalSettings->SetTo(childArchive); + if (error != B_OK) + return error; + } + return B_OK; } @@ -166,6 +190,14 @@ TeamSettings::WriteTo(BMessage& archive) const if (error != B_OK) return error; + error = fSignalSettings->WriteTo(childArchive); + if (error != B_OK) + return error; + + error = archive.AddMessage("signalsettings", &childArchive); + if (error != B_OK) + return error; + return B_OK; } @@ -253,6 +285,8 @@ TeamSettings::operator=(const TeamSettings& other) *fFileManagerSettings = *other.fFileManagerSettings; + *fSignalSettings = *other.fSignalSettings; + return *this; } @@ -277,6 +311,26 @@ TeamSettings::SetFileManagerSettings(TeamFileManagerSettings* settings) } +TeamSignalSettings* +TeamSettings::SignalSettings() const +{ + return fSignalSettings; +} + + +status_t +TeamSettings::SetSignalSettings(TeamSignalSettings* settings) +{ + try { + *fSignalSettings = *settings; + } catch (...) { + return B_NO_MEMORY; + } + + return B_OK; +} + + void TeamSettings::_Unset() { @@ -290,6 +344,7 @@ TeamSettings::_Unset() fBreakpoints.MakeEmpty(); fUiSettings.MakeEmpty(); + fSignalSettings->Unset(); fTeamName.Truncate(0); } diff --git a/src/apps/debugger/settings/TeamSettings.h b/src/apps/debugger/settings/TeamSettings.h index 6f71cda7ef..1bd14f5e00 100644 --- a/src/apps/debugger/settings/TeamSettings.h +++ b/src/apps/debugger/settings/TeamSettings.h @@ -1,6 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. - * Copyright 2013, Rene Gollent, rene@gollent.com. + * Copyright 2013-2015, Rene Gollent, rene@gollent.com. * Distributed under the terms of the MIT License. */ #ifndef TEAM_SETTINGS_H @@ -13,10 +13,11 @@ class BMessage; -class Team; class BreakpointSetting; -class TeamUiSettings; +class Team; class TeamFileManagerSettings; +class TeamSignalSettings; +class TeamUiSettings; class TeamSettings { @@ -48,6 +49,10 @@ public: status_t SetFileManagerSettings( TeamFileManagerSettings* settings); + TeamSignalSettings* SignalSettings() const; + status_t SetSignalSettings( + TeamSignalSettings* settings); + private: typedef BObjectList BreakpointList; typedef BObjectList UiSettingsList; @@ -60,6 +65,7 @@ private: UiSettingsList fUiSettings; TeamFileManagerSettings* fFileManagerSettings; + TeamSignalSettings* fSignalSettings; BString fTeamName; }; diff --git a/src/apps/debugger/settings/TeamSignalSettings.cpp b/src/apps/debugger/settings/TeamSignalSettings.cpp new file mode 100644 index 0000000000..d9d83044ab --- /dev/null +++ b/src/apps/debugger/settings/TeamSignalSettings.cpp @@ -0,0 +1,156 @@ +/* + * Copyright 2015, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#include "TeamSignalSettings.h" + + +static const char* skDefaultSignalFieldName = "signal:default_disposition"; +static const char* skSignalNumberFieldName = "signal:number"; +static const char* skSignalDispositionFieldName = "signal:disposition"; +static const char* skSignalSettingName = "signal:setting"; + + +TeamSignalSettings::TeamSignalSettings() + : + fValues() +{ +} + + +TeamSignalSettings::~TeamSignalSettings() +{ +} + + +TeamSignalSettings& +TeamSignalSettings::operator=(const TeamSignalSettings& other) +{ + fValues = other.fValues; + + return *this; +} + + +const char* +TeamSignalSettings::ID() const +{ + return "Signals"; +} + + +status_t +TeamSignalSettings::SetTo(const BMessage& archive) +{ + try { + fValues = archive; + } catch (...) { + return B_NO_MEMORY; + } + + return B_OK; +} + + +status_t +TeamSignalSettings::WriteTo(BMessage& archive) const +{ + try { + archive = fValues; + } catch (...) { + return B_NO_MEMORY; + } + + return B_OK; +} + + +void +TeamSignalSettings::Unset() +{ + fValues.MakeEmpty(); +} + + +void +TeamSignalSettings::SetDefaultSignalDisposition(int32 disposition) +{ + fValues.SetInt32(skDefaultSignalFieldName, disposition); +} + + +int32 +TeamSignalSettings::DefaultSignalDisposition() const +{ + return fValues.GetInt32(skDefaultSignalFieldName, + SIGNAL_DISPOSITION_IGNORE); +} + + +int32 +TeamSignalSettings::CountCustomSignalDispositions() const +{ + type_code type; + int32 count = 0; + + if (fValues.GetInfo(skSignalSettingName, &type, &count) == B_OK) + return count; + + return 0; +} + + +status_t +TeamSignalSettings::AddCustomSignalDisposition(int32 signal, int32 disposition) +{ + BMessage setting; + if (setting.AddInt32(skSignalNumberFieldName, signal) != B_OK + || setting.AddInt32(skSignalDispositionFieldName, disposition) != B_OK + || fValues.AddMessage(skSignalSettingName, &setting) != B_OK) { + return B_NO_MEMORY; + } + + return B_OK; +} + + +status_t +TeamSignalSettings::RemoveCustomSignalDispositionAt(int32 index) +{ + return fValues.RemoveData(skSignalSettingName, index); +} + + +status_t +TeamSignalSettings::GetCustomSignalDispositionAt(int32 index, int32& signal, + int32& disposition) const +{ + BMessage setting; + status_t error = fValues.FindMessage(skSignalSettingName, index, &setting); + if (error != B_OK) + return error; + + error = setting.FindInt32(skSignalNumberFieldName, &signal); + if (error != B_OK) + return error; + + return setting.FindInt32(skSignalDispositionFieldName, &disposition); +} + + +TeamSignalSettings* +TeamSignalSettings::Clone() const +{ + TeamSignalSettings* settings = new(std::nothrow) + TeamSignalSettings(); + + if (settings == NULL) + return NULL; + + if (settings->SetTo(fValues) != B_OK) { + delete settings; + return NULL; + } + + return settings; +} diff --git a/src/apps/debugger/settings/TeamSignalSettings.h b/src/apps/debugger/settings/TeamSignalSettings.h new file mode 100644 index 0000000000..3e26383dfc --- /dev/null +++ b/src/apps/debugger/settings/TeamSignalSettings.h @@ -0,0 +1,46 @@ +/* + * Copyright 2015, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#ifndef TEAM_SIGNAL_SETTINGS_H +#define TEAM_SIGNAL_SETTINGS_H + +#include + +#include "SignalDispositionTypes.h" + + +class TeamSignalSettings { +public: + TeamSignalSettings(); + virtual ~TeamSignalSettings(); + + TeamSignalSettings& + operator=( + const TeamSignalSettings& other); + // throws std::bad_alloc; + + const char* ID() const; + status_t SetTo(const BMessage& archive); + status_t WriteTo(BMessage& archive) const; + void Unset(); + + void SetDefaultSignalDisposition(int32 disposition); + int32 DefaultSignalDisposition() const; + + int32 CountCustomSignalDispositions() const; + status_t AddCustomSignalDisposition(int32 signal, + int32 disposition); + status_t RemoveCustomSignalDispositionAt(int32 index); + status_t GetCustomSignalDispositionAt(int32 index, + int32& signal, int32& disposition) const; + + virtual TeamSignalSettings* + Clone() const; + +private: + BMessage fValues; +}; + + +#endif // TEAM_SIGNAL_SETTINGS_H