1/*
2 * Copyright 2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Ingo Weinhold <ingo_weinhold@gmx.de>
7 */
8
9
10#include <package/ActivationTransaction.h>
11
12#include <new>
13
14#include <Message.h>
15
16
17namespace BPackageKit {
18namespace BPrivate {
19
20
21BActivationTransaction::BActivationTransaction()
22	:
23	fLocation(B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT),
24	fChangeCount(0),
25	fTransactionDirectoryName(),
26	fPackagesToActivate(),
27	fPackagesToDeactivate(),
28	fFirstBootProcessing(false)
29{
30}
31
32
33BActivationTransaction::BActivationTransaction(BMessage* archive,
34	status_t* _error)
35	:
36	fLocation(B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT),
37	fChangeCount(0),
38	fTransactionDirectoryName(),
39	fPackagesToActivate(),
40	fPackagesToDeactivate(),
41	fFirstBootProcessing(false)
42{
43	status_t error;
44	int32 location;
45
46	if (archive->FindBool("first boot processing", &fFirstBootProcessing)
47			!= B_OK)
48		fFirstBootProcessing = false; // Field is optional for compatibility.
49
50	if ((error = archive->FindInt32("location", &location)) == B_OK
51		&& (error = archive->FindInt64("change count", &fChangeCount)) == B_OK
52		&& (error = archive->FindString("transaction",
53			&fTransactionDirectoryName)) == B_OK
54		&& (error = _ExtractStringList(archive, "activate",
55			fPackagesToActivate)) == B_OK
56		&& (error = _ExtractStringList(archive, "deactivate",
57			fPackagesToDeactivate)) == B_OK) {
58		if (location >= 0
59			&& location <= B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT) {
60			fLocation = (BPackageInstallationLocation)location;
61		} else
62			error = B_BAD_VALUE;
63	}
64
65	if (_error != NULL)
66		*_error = error;
67}
68
69
70BActivationTransaction::~BActivationTransaction()
71{
72}
73
74
75status_t
76BActivationTransaction::InitCheck() const
77{
78	if (fLocation < 0 || fLocation >= B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT
79		|| fTransactionDirectoryName.IsEmpty()
80		|| (fPackagesToActivate.IsEmpty() && fPackagesToDeactivate.IsEmpty())) {
81		return B_BAD_VALUE;
82	}
83	return B_OK;
84}
85
86
87status_t
88BActivationTransaction::SetTo(BPackageInstallationLocation location,
89	int64 changeCount, const BString& directoryName)
90{
91	if (location < 0 || location >= B_PACKAGE_INSTALLATION_LOCATION_ENUM_COUNT
92		|| directoryName.IsEmpty()) {
93		return B_BAD_VALUE;
94	}
95
96	fLocation = location;
97	fChangeCount = changeCount;
98	fTransactionDirectoryName = directoryName;
99	fPackagesToActivate.MakeEmpty();
100	fPackagesToDeactivate.MakeEmpty();
101	fFirstBootProcessing = false;
102
103	return B_OK;
104}
105
106
107BPackageInstallationLocation
108BActivationTransaction::Location() const
109{
110	return fLocation;
111}
112
113
114void
115BActivationTransaction::SetLocation(BPackageInstallationLocation location)
116{
117	fLocation = location;
118}
119
120
121int64
122BActivationTransaction::ChangeCount() const
123{
124	return fChangeCount;
125}
126
127
128void
129BActivationTransaction::SetChangeCount(int64 changeCount)
130{
131	fChangeCount = changeCount;
132}
133
134
135const BString&
136BActivationTransaction::TransactionDirectoryName() const
137{
138	return fTransactionDirectoryName;
139}
140
141
142void
143BActivationTransaction::SetTransactionDirectoryName(
144	const BString& directoryName)
145{
146	fTransactionDirectoryName = directoryName;
147}
148
149
150const BStringList&
151BActivationTransaction::PackagesToActivate() const
152{
153	return fPackagesToActivate;
154}
155
156
157bool
158BActivationTransaction::SetPackagesToActivate(const BStringList& packages)
159{
160	fPackagesToActivate = packages;
161	return fPackagesToActivate.CountStrings() == packages.CountStrings();
162}
163
164
165bool
166BActivationTransaction::AddPackageToActivate(const BString& package)
167{
168	return fPackagesToActivate.Add(package);
169}
170
171
172const BStringList&
173BActivationTransaction::PackagesToDeactivate() const
174{
175	return fPackagesToDeactivate;
176}
177
178
179bool
180BActivationTransaction::SetPackagesToDeactivate(const BStringList& packages)
181{
182	fPackagesToDeactivate = packages;
183	return fPackagesToDeactivate.CountStrings() == packages.CountStrings();
184}
185
186
187bool
188BActivationTransaction::AddPackageToDeactivate(const BString& package)
189{
190	return fPackagesToDeactivate.Add(package);
191}
192
193
194bool
195BActivationTransaction::FirstBootProcessing() const
196{
197	return fFirstBootProcessing;
198}
199
200
201void
202BActivationTransaction::SetFirstBootProcessing(bool processingIsOn)
203{
204	fFirstBootProcessing = processingIsOn;
205}
206
207
208status_t
209BActivationTransaction::Archive(BMessage* archive, bool deep) const
210{
211	status_t error = BArchivable::Archive(archive, deep);
212	if (error != B_OK)
213		return error;
214
215	if ((error = archive->AddInt32("location", fLocation)) != B_OK
216		|| (error = archive->AddInt64("change count", fChangeCount)) != B_OK
217		|| (error = archive->AddString("transaction",
218			fTransactionDirectoryName)) != B_OK
219		|| (error = archive->AddStrings("activate", fPackagesToActivate))
220			!= B_OK
221		|| (error = archive->AddStrings("deactivate", fPackagesToDeactivate))
222			!= B_OK
223		|| (error = archive->AddBool("first boot processing",
224			fFirstBootProcessing)) != B_OK) {
225		return error;
226	}
227
228	return B_OK;
229}
230
231
232/*static*/ BArchivable*
233BActivationTransaction::Instantiate(BMessage* archive)
234{
235	if (validate_instantiation(archive, "BActivationTransaction"))
236		return new(std::nothrow) BActivationTransaction(archive);
237	return NULL;
238}
239
240
241/*static*/ status_t
242BActivationTransaction::_ExtractStringList(BMessage* archive, const char* field,
243	BStringList& _list)
244{
245	status_t error = archive->FindStrings(field, &_list);
246	return error == B_NAME_NOT_FOUND ? B_OK : error;
247		// If the field doesn't exist, that's OK.
248}
249
250
251}	// namespace BPrivate
252}	// namespace BPackageKit
253