2 * Copyright 2007-2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
6 * Ingo Weinhold <ingo_weinhold@gmx.de>
10 #include <DriverSettings.h>
17 #include <driver_settings.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*);
34 // #pragma mark - BDriverParameterIterator
37 class BDriverParameterIterator::Delegate
: public BReferenceable
{
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()
56 BDriverParameterIterator::BDriverParameterIterator(Delegate
* delegate
)
63 BDriverParameterIterator::BDriverParameterIterator(
64 const BDriverParameterIterator
& other
)
68 _SetTo(other
.fDelegate
, true);
72 BDriverParameterIterator::~BDriverParameterIterator()
79 BDriverParameterIterator::HasNext() const
81 return fDelegate
!= NULL
? fDelegate
->HasNext() : false;
86 BDriverParameterIterator::Next()
88 if (fDelegate
== NULL
)
89 return BDriverParameter();
91 if (fDelegate
->CountReferences() > 1) {
92 Delegate
* clone
= fDelegate
->Clone();
94 return BDriverParameter();
98 return fDelegate
->Next();
102 BDriverParameterIterator
&
103 BDriverParameterIterator::operator=(const BDriverParameterIterator
& other
)
105 _SetTo(other
.fDelegate
, true);
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
{
127 Iterator(const driver_parameter
* parameters
, int32 count
)
130 fParameters(parameters
),
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();
155 return BDriverParameter(fParameters
++);
159 const driver_parameter
* fParameters
;
164 class BDriverParameterContainer::NameIterator
165 : public BDriverParameterIterator::Delegate
{
167 NameIterator(const driver_parameter
* parameters
, int32 count
,
171 fParameters(parameters
),
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
;
199 return BDriverParameter(parameter
);
203 void _FindNext(bool skipCurrent
)
205 if (fParameters
== NULL
|| fCount
< 1)
211 while (fCount
> 0 && fName
!= fParameters
->name
) {
218 const driver_parameter
* fParameters
;
224 BDriverParameterContainer::BDriverParameterContainer()
229 BDriverParameterContainer::~BDriverParameterContainer()
235 BDriverParameterContainer::CountParameters() const
238 return GetParametersAndCount(count
) != NULL
? count
: 0;
243 const driver_parameter
*
244 BDriverParameterContainer::Parameters() const
247 return GetParametersAndCount(count
);
252 BDriverParameterContainer::ParameterAt(int32 index
) const
255 const driver_parameter
* parameters
= GetParametersAndCount(count
);
256 if (parameters
== NULL
|| index
< 0 || index
>= count
)
257 return BDriverParameter();
259 return BDriverParameter(parameters
+ index
);
264 BDriverParameterContainer::FindParameter(const char* name
,
265 BDriverParameter
* _parameter
) const
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
);
285 BDriverParameterContainer::GetParameter(const char* name
) const
287 BDriverParameter parameter
;
288 FindParameter(name
, ¶meter
);
293 BDriverParameterIterator
294 BDriverParameterContainer::ParameterIterator() const
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
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();
320 BDriverParameterContainer::GetParameterValue(const char* name
,
321 const char* unknownValue
, const char* noValue
) const
323 BDriverParameter parameter
;
324 if (!FindParameter(name
, ¶meter
))
326 return parameter
.ValueAt(0, noValue
);
331 BDriverParameterContainer::GetBoolParameterValue(const char* name
,
332 bool unknownValue
, bool noValue
) const
334 BDriverParameter parameter
;
335 if (!FindParameter(name
, ¶meter
))
337 return parameter
.BoolValueAt(0, noValue
);
342 BDriverParameterContainer::GetInt32ParameterValue(const char* name
,
343 int32 unknownValue
, int32 noValue
) const
345 BDriverParameter parameter
;
346 if (!FindParameter(name
, ¶meter
))
348 return parameter
.Int32ValueAt(0, noValue
);
353 BDriverParameterContainer::GetInt64ParameterValue(const char* name
,
354 int64 unknownValue
, int64 noValue
) const
356 BDriverParameter parameter
;
357 if (!FindParameter(name
, ¶meter
))
359 return parameter
.Int64ValueAt(0, noValue
);
363 // #pragma mark - BDriverSettings
366 BDriverSettings::BDriverSettings()
368 BDriverParameterContainer(),
369 fSettingsHandle(NULL
),
375 BDriverSettings::~BDriverSettings()
382 BDriverSettings::Load(const char* driverNameOrAbsolutePath
)
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
) {
401 BDriverSettings::Load(const entry_ref
& ref
)
406 status_t error
= path
.SetTo(&ref
);
407 return error
== B_OK
? Load(path
.Path()) : error
;
412 BDriverSettings::SetToString(const char* string
)
416 fSettingsHandle
= parse_driver_settings_string(string
);
417 if (fSettingsHandle
== NULL
)
420 fSettings
= get_driver_settings(fSettingsHandle
);
421 if (fSettings
== NULL
) {
431 BDriverSettings::Unset()
433 if (fSettingsHandle
!= NULL
)
434 unload_driver_settings(fSettingsHandle
);
436 fSettingsHandle
= NULL
;
441 const driver_parameter
*
442 BDriverSettings::GetParametersAndCount(int32
& _count
) const
444 if (fSettings
== NULL
)
447 _count
= fSettings
->parameter_count
;
448 return fSettings
->parameters
;
452 // #pragma mark - BDriverParameter
455 BDriverParameter::BDriverParameter()
457 BDriverParameterContainer(),
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()
485 BDriverParameter::SetTo(const driver_parameter
* parameter
)
487 fParameter
= parameter
;
492 BDriverParameter::IsValid() const
494 return fParameter
!= NULL
;
499 BDriverParameter::Name() const
501 return fParameter
!= NULL
? fParameter
->name
: NULL
;
506 BDriverParameter::CountValues() const
508 return fParameter
!= NULL
? fParameter
->value_count
: 0;
513 BDriverParameter::Values() const
515 return fParameter
!= NULL
? fParameter
->values
: 0;
520 BDriverParameter::ValueAt(int32 index
, const char* noValue
) const
522 if (fParameter
== NULL
|| index
< 0 || index
>= fParameter
->value_count
)
524 return fParameter
->values
[index
];
529 BDriverParameter::BoolValueAt(int32 index
, bool noValue
) const
531 const char* value
= ValueAt(index
, NULL
);
535 for (int32 i
= 0; i
< kTrueValueStringCount
; i
++) {
536 if (strcmp(value
, kTrueValueStrings
[i
]) == 0)
544 BDriverParameter::Int32ValueAt(int32 index
, int32 noValue
) const
546 const char* value
= ValueAt(index
, NULL
);
554 BDriverParameter::Int64ValueAt(int32 index
, int64 noValue
) const
556 const char* value
= ValueAt(index
, NULL
);
559 return strtoll(value
, NULL
, 10);
563 const driver_parameter
*
564 BDriverParameter::GetParametersAndCount(int32
& _count
) const
566 if (fParameter
== NULL
)
569 _count
= fParameter
->parameter_count
;
570 return fParameter
->parameters
;
575 BDriverParameter::operator=(const BDriverParameter
& other
)
577 fParameter
= other
.fParameter
;
582 } // namespace BPrivate