1 /* 2 * Copyright (c) 2024, The OpenThread Authors. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 3. Neither the name of the copyright holder nor the 13 * names of its contributors may be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef OT_NEXUS_SETTINGS_HPP_ 30 #define OT_NEXUS_SETTINGS_HPP_ 31 32 #include "common/const_cast.hpp" 33 #include "common/owning_list.hpp" 34 #include "instance/instance.hpp" 35 36 namespace ot { 37 namespace Nexus { 38 39 struct Settings 40 { 41 enum SetAddMode : uint8_t 42 { 43 kSet, 44 kAdd, 45 }; 46 47 Error Get(uint16_t aKey, int aIndex, uint8_t *aValue, uint16_t *aValueLength) const; 48 Error SetOrAdd(SetAddMode aMode, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength); 49 Error Delete(uint16_t aKey, int aIndex); 50 void Wipe(void); 51 52 struct IndexMatcher 53 { IndexMatcherot::Nexus::Settings::IndexMatcher54 IndexMatcher(int aIndex) { mIndex = aIndex; } 55 56 int mIndex; 57 }; 58 59 struct Entry : public Heap::Allocatable<Entry>, public LinkedListEntry<Entry> 60 { 61 struct Value : public Heap::Allocatable<Value>, public LinkedListEntry<Value> 62 { Matchesot::Nexus::Settings::Entry::Value63 bool Matches(const IndexMatcher &aIndexMataher) const { return (AsNonConst(aIndexMataher).mIndex-- == 0); } 64 65 Value *mNext; 66 Heap::Data mData; 67 }; 68 Matchesot::Nexus::Settings::Entry69 bool Matches(uint16_t aKey) const { return mKey == aKey; } 70 71 Entry *mNext; 72 uint16_t mKey; 73 OwningList<Value> mValues; 74 }; 75 76 OwningList<Entry> mEntries; 77 }; 78 79 } // namespace Nexus 80 } // namespace ot 81 82 #endif // OT_NEXUS_SETTINGS_HPP_ 83