1/*
2 * Copyright 2015, Rene Gollent, rene@gollent.com.
3 * Distributed under the terms of the MIT License.
4 */
5#include "TeamSignalSettings.h"
6
7
8static const char* skDefaultSignalFieldName = "signal:default_disposition";
9static const char* skSignalNumberFieldName = "signal:number";
10static const char* skSignalDispositionFieldName = "signal:disposition";
11static const char* skSignalSettingName = "signal:setting";
12
13
14TeamSignalSettings::TeamSignalSettings()
15	:
16	fValues()
17{
18}
19
20
21TeamSignalSettings::~TeamSignalSettings()
22{
23}
24
25
26TeamSignalSettings&
27TeamSignalSettings::operator=(const TeamSignalSettings& other)
28{
29	fValues = other.fValues;
30
31	return *this;
32}
33
34
35const char*
36TeamSignalSettings::ID() const
37{
38	return "Signals";
39}
40
41
42status_t
43TeamSignalSettings::SetTo(const BMessage& archive)
44{
45	try {
46		fValues = archive;
47	} catch (...) {
48		return B_NO_MEMORY;
49	}
50
51	return B_OK;
52}
53
54
55status_t
56TeamSignalSettings::WriteTo(BMessage& archive) const
57{
58	try {
59		archive = fValues;
60	} catch (...) {
61		return B_NO_MEMORY;
62	}
63
64	return B_OK;
65}
66
67
68void
69TeamSignalSettings::Unset()
70{
71	fValues.MakeEmpty();
72}
73
74
75void
76TeamSignalSettings::SetDefaultSignalDisposition(int32 disposition)
77{
78	fValues.SetInt32(skDefaultSignalFieldName, disposition);
79}
80
81
82int32
83TeamSignalSettings::DefaultSignalDisposition() const
84{
85	return fValues.GetInt32(skDefaultSignalFieldName,
86		SIGNAL_DISPOSITION_IGNORE);
87}
88
89
90int32
91TeamSignalSettings::CountCustomSignalDispositions() const
92{
93	type_code type;
94	int32 count = 0;
95
96	if (fValues.GetInfo(skSignalSettingName, &type, &count) == B_OK)
97		return count;
98
99	return 0;
100}
101
102
103status_t
104TeamSignalSettings::AddCustomSignalDisposition(int32 signal, int32 disposition)
105{
106	BMessage setting;
107	if (setting.AddInt32(skSignalNumberFieldName, signal) != B_OK
108		|| setting.AddInt32(skSignalDispositionFieldName, disposition) != B_OK
109		|| fValues.AddMessage(skSignalSettingName, &setting) != B_OK) {
110		return B_NO_MEMORY;
111	}
112
113	return B_OK;
114}
115
116
117status_t
118TeamSignalSettings::RemoveCustomSignalDispositionAt(int32 index)
119{
120	return fValues.RemoveData(skSignalSettingName, index);
121}
122
123
124status_t
125TeamSignalSettings::GetCustomSignalDispositionAt(int32 index, int32& signal,
126	int32& disposition) const
127{
128	BMessage setting;
129	status_t error = fValues.FindMessage(skSignalSettingName, index, &setting);
130	if (error != B_OK)
131		return error;
132
133	error = setting.FindInt32(skSignalNumberFieldName, &signal);
134	if (error != B_OK)
135		return error;
136
137	return setting.FindInt32(skSignalDispositionFieldName, &disposition);
138}
139
140
141TeamSignalSettings*
142TeamSignalSettings::Clone() const
143{
144	TeamSignalSettings* settings = new(std::nothrow)
145		TeamSignalSettings();
146
147	if (settings == NULL)
148		return NULL;
149
150	if (settings->SetTo(fValues) != B_OK) {
151		delete settings;
152		return NULL;
153	}
154
155	return settings;
156}
157