HaikuDepot: notify work status from main window
[haiku.git] / src / kits / storage / DriverSettings.cpp
blob87ba7f09285cb830ce87d4bdd0738d1c7d750782
1 /*
2 * Copyright 2007-2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * Ingo Weinhold <ingo_weinhold@gmx.de>
7 */
10 #include <DriverSettings.h>
12 #include <stdlib.h>
13 #include <string.h>
15 #include <new>
17 #include <driver_settings.h>
18 #include <Path.h>
19 #include <String.h>
21 #include <Referenceable.h>
24 // The parameter values that shall be evaluated to true.
25 static const char* const kTrueValueStrings[]
26 = { "1", "true", "yes", "on", "enable", "enabled" };
27 static const int32 kTrueValueStringCount
28 = sizeof(kTrueValueStrings) / sizeof(const char*);
31 namespace BPrivate {
34 // #pragma mark - BDriverParameterIterator
37 class BDriverParameterIterator::Delegate : public BReferenceable {
38 public:
39 Delegate() : BReferenceable() {}
40 virtual ~Delegate() {}
42 virtual Delegate* Clone() const = 0;
44 virtual bool HasNext() const = 0;
45 virtual BDriverParameter Next() = 0;
49 BDriverParameterIterator::BDriverParameterIterator()
51 fDelegate(NULL)
56 BDriverParameterIterator::BDriverParameterIterator(Delegate* delegate)
58 fDelegate(delegate)
63 BDriverParameterIterator::BDriverParameterIterator(
64 const BDriverParameterIterator& other)
66 fDelegate(NULL)
68 _SetTo(other.fDelegate, true);
72 BDriverParameterIterator::~BDriverParameterIterator()
74 _SetTo(NULL, false);
78 bool
79 BDriverParameterIterator::HasNext() const
81 return fDelegate != NULL ? fDelegate->HasNext() : false;
85 BDriverParameter
86 BDriverParameterIterator::Next()
88 if (fDelegate == NULL)
89 return BDriverParameter();
91 if (fDelegate->CountReferences() > 1) {
92 Delegate* clone = fDelegate->Clone();
93 if (clone == NULL)
94 return BDriverParameter();
95 _SetTo(clone, false);
98 return fDelegate->Next();
102 BDriverParameterIterator&
103 BDriverParameterIterator::operator=(const BDriverParameterIterator& other)
105 _SetTo(other.fDelegate, true);
106 return *this;
110 void
111 BDriverParameterIterator::_SetTo(Delegate* delegate, bool addReference)
113 if (fDelegate != NULL)
114 fDelegate->ReleaseReference();
115 fDelegate = delegate;
116 if (fDelegate != NULL && addReference)
117 fDelegate->AcquireReference();
121 // #pragma mark - BDriverParameterContainer
124 class BDriverParameterContainer::Iterator
125 : public BDriverParameterIterator::Delegate {
126 public:
127 Iterator(const driver_parameter* parameters, int32 count)
129 Delegate(),
130 fParameters(parameters),
131 fCount(count)
135 virtual ~Iterator()
139 virtual Delegate* Clone() const
141 return new(std::nothrow) Iterator(fParameters, fCount);
144 virtual bool HasNext() const
146 return fParameters != NULL && fCount > 0;
149 virtual BDriverParameter Next()
151 if (fParameters == NULL || fCount <= 0)
152 return BDriverParameter();
154 fCount--;
155 return BDriverParameter(fParameters++);
158 private:
159 const driver_parameter* fParameters;
160 int32 fCount;
164 class BDriverParameterContainer::NameIterator
165 : public BDriverParameterIterator::Delegate {
166 public:
167 NameIterator(const driver_parameter* parameters, int32 count,
168 const BString& name)
170 Delegate(),
171 fParameters(parameters),
172 fCount(count),
173 fName(name)
175 _FindNext(false);
178 virtual ~NameIterator()
182 virtual Delegate* Clone() const
184 return new(std::nothrow) NameIterator(fParameters, fCount, fName);
187 virtual bool HasNext() const
189 return fParameters != NULL && fCount > 0;
192 virtual BDriverParameter Next()
194 if (fParameters == NULL || fCount <= 0)
195 return BDriverParameter();
197 const driver_parameter* parameter = fParameters;
198 _FindNext(true);
199 return BDriverParameter(parameter);
202 private:
203 void _FindNext(bool skipCurrent)
205 if (fParameters == NULL || fCount < 1)
206 return;
207 if (skipCurrent) {
208 fParameters++;
209 fCount--;
211 while (fCount > 0 && fName != fParameters->name) {
212 fParameters++;
213 fCount--;
217 private:
218 const driver_parameter* fParameters;
219 int32 fCount;
220 BString fName;
224 BDriverParameterContainer::BDriverParameterContainer()
229 BDriverParameterContainer::~BDriverParameterContainer()
234 int32
235 BDriverParameterContainer::CountParameters() const
237 int32 count;
238 return GetParametersAndCount(count) != NULL ? count : 0;
243 const driver_parameter*
244 BDriverParameterContainer::Parameters() const
246 int32 count;
247 return GetParametersAndCount(count);
251 BDriverParameter
252 BDriverParameterContainer::ParameterAt(int32 index) const
254 int32 count;
255 const driver_parameter* parameters = GetParametersAndCount(count);
256 if (parameters == NULL || index < 0 || index >= count)
257 return BDriverParameter();
259 return BDriverParameter(parameters + index);
263 bool
264 BDriverParameterContainer::FindParameter(const char* name,
265 BDriverParameter* _parameter) const
267 if (name == NULL)
268 return false;
270 int32 count;
271 if (const driver_parameter* parameters = GetParametersAndCount(count)) {
272 for (int32 i = 0; i < count; i++) {
273 if (strcmp(name, parameters[i].name) == 0) {
274 if (_parameter != NULL)
275 _parameter->SetTo(parameters + i);
276 return true;
280 return false;
284 BDriverParameter
285 BDriverParameterContainer::GetParameter(const char* name) const
287 BDriverParameter parameter;
288 FindParameter(name, &parameter);
289 return parameter;
293 BDriverParameterIterator
294 BDriverParameterContainer::ParameterIterator() const
296 int32 count;
297 if (const driver_parameter* parameters = GetParametersAndCount(count)) {
298 if (Iterator* iterator = new(std::nothrow) Iterator(parameters, count))
299 return BDriverParameterIterator(iterator);
301 return BDriverParameterIterator();
305 BDriverParameterIterator
306 BDriverParameterContainer::ParameterIterator(const char* name) const
308 int32 count;
309 if (const driver_parameter* parameters = GetParametersAndCount(count)) {
310 NameIterator* iterator
311 = new(std::nothrow) NameIterator(parameters, count, name);
312 if (iterator != NULL)
313 return BDriverParameterIterator(iterator);
315 return BDriverParameterIterator();
319 const char*
320 BDriverParameterContainer::GetParameterValue(const char* name,
321 const char* unknownValue, const char* noValue) const
323 BDriverParameter parameter;
324 if (!FindParameter(name, &parameter))
325 return unknownValue;
326 return parameter.ValueAt(0, noValue);
330 bool
331 BDriverParameterContainer::GetBoolParameterValue(const char* name,
332 bool unknownValue, bool noValue) const
334 BDriverParameter parameter;
335 if (!FindParameter(name, &parameter))
336 return unknownValue;
337 return parameter.BoolValueAt(0, noValue);
341 int32
342 BDriverParameterContainer::GetInt32ParameterValue(const char* name,
343 int32 unknownValue, int32 noValue) const
345 BDriverParameter parameter;
346 if (!FindParameter(name, &parameter))
347 return unknownValue;
348 return parameter.Int32ValueAt(0, noValue);
352 int64
353 BDriverParameterContainer::GetInt64ParameterValue(const char* name,
354 int64 unknownValue, int64 noValue) const
356 BDriverParameter parameter;
357 if (!FindParameter(name, &parameter))
358 return unknownValue;
359 return parameter.Int64ValueAt(0, noValue);
363 // #pragma mark - BDriverSettings
366 BDriverSettings::BDriverSettings()
368 BDriverParameterContainer(),
369 fSettingsHandle(NULL),
370 fSettings(NULL)
375 BDriverSettings::~BDriverSettings()
377 Unset();
381 status_t
382 BDriverSettings::Load(const char* driverNameOrAbsolutePath)
384 Unset();
386 fSettingsHandle = load_driver_settings(driverNameOrAbsolutePath);
387 if (fSettingsHandle == NULL)
388 return B_ENTRY_NOT_FOUND;
390 fSettings = get_driver_settings(fSettingsHandle);
391 if (fSettings == NULL) {
392 Unset();
393 return B_ERROR;
396 return B_OK;
400 status_t
401 BDriverSettings::Load(const entry_ref& ref)
403 Unset();
405 BPath path;
406 status_t error = path.SetTo(&ref);
407 return error == B_OK ? Load(path.Path()) : error;
411 status_t
412 BDriverSettings::SetToString(const char* string)
414 Unset();
416 fSettingsHandle = parse_driver_settings_string(string);
417 if (fSettingsHandle == NULL)
418 return B_BAD_DATA;
420 fSettings = get_driver_settings(fSettingsHandle);
421 if (fSettings == NULL) {
422 Unset();
423 return B_ERROR;
426 return B_OK;
430 void
431 BDriverSettings::Unset()
433 if (fSettingsHandle != NULL)
434 unload_driver_settings(fSettingsHandle);
436 fSettingsHandle = NULL;
437 fSettings = NULL;
441 const driver_parameter*
442 BDriverSettings::GetParametersAndCount(int32& _count) const
444 if (fSettings == NULL)
445 return NULL;
447 _count = fSettings->parameter_count;
448 return fSettings->parameters;
452 // #pragma mark - BDriverParameter
455 BDriverParameter::BDriverParameter()
457 BDriverParameterContainer(),
458 fParameter(NULL)
463 BDriverParameter::BDriverParameter(const driver_parameter* parameter)
465 BDriverParameterContainer(),
466 fParameter(parameter)
471 BDriverParameter::BDriverParameter(const BDriverParameter& other)
473 BDriverParameterContainer(),
474 fParameter(other.fParameter)
479 BDriverParameter::~BDriverParameter()
484 void
485 BDriverParameter::SetTo(const driver_parameter* parameter)
487 fParameter = parameter;
491 bool
492 BDriverParameter::IsValid() const
494 return fParameter != NULL;
498 const char*
499 BDriverParameter::Name() const
501 return fParameter != NULL ? fParameter->name : NULL;
505 int32
506 BDriverParameter::CountValues() const
508 return fParameter != NULL ? fParameter->value_count : 0;
512 const char* const*
513 BDriverParameter::Values() const
515 return fParameter != NULL ? fParameter->values : 0;
519 const char*
520 BDriverParameter::ValueAt(int32 index, const char* noValue) const
522 if (fParameter == NULL || index < 0 || index >= fParameter->value_count)
523 return noValue;
524 return fParameter->values[index];
528 bool
529 BDriverParameter::BoolValueAt(int32 index, bool noValue) const
531 const char* value = ValueAt(index, NULL);
532 if (value == NULL)
533 return noValue;
535 for (int32 i = 0; i < kTrueValueStringCount; i++) {
536 if (strcmp(value, kTrueValueStrings[i]) == 0)
537 return true;
539 return false;
543 int32
544 BDriverParameter::Int32ValueAt(int32 index, int32 noValue) const
546 const char* value = ValueAt(index, NULL);
547 if (value == NULL)
548 return noValue;
549 return atol(value);
553 int64
554 BDriverParameter::Int64ValueAt(int32 index, int64 noValue) const
556 const char* value = ValueAt(index, NULL);
557 if (value == NULL)
558 return noValue;
559 return strtoll(value, NULL, 10);
563 const driver_parameter*
564 BDriverParameter::GetParametersAndCount(int32& _count) const
566 if (fParameter == NULL)
567 return NULL;
569 _count = fParameter->parameter_count;
570 return fParameter->parameters;
574 BDriverParameter&
575 BDriverParameter::operator=(const BDriverParameter& other)
577 fParameter = other.fParameter;
578 return *this;
582 } // namespace BPrivate