diff options
| author | 2021-03-17 16:07:33 +0000 | |
|---|---|---|
| committer | 2021-03-17 21:13:10 +0000 | |
| commit | a4e9ebfda34afcf6eb7602381c2f9313ab1b8b78 (patch) | |
| tree | 4f3884cc3415e3c7ef3ce4ebf30150a1dd166e20 /src/extensible.cpp | |
| parent | Move extensible code from base.cpp to extensible.cpp and cleanup. (diff) | |
Implement support for automatically syncing extension items.
Diffstat (limited to 'src/extensible.cpp')
| -rw-r--r-- | src/extensible.cpp | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/src/extensible.cpp b/src/extensible.cpp index e44f6cb6b..21d064ad1 100644 --- a/src/extensible.cpp +++ b/src/extensible.cpp @@ -128,6 +128,29 @@ void* ExtensionItem::UnsetRaw(Extensible* container) return result; } +void ExtensionItem::Sync(const Extensible* container, void* item) +{ + const std::string networkstr = ToNetwork(container, item); + if (networkstr.empty()) + return; + + switch (type) + { + case ExtensionItem::EXT_CHANNEL: + ServerInstance->PI->SendMetaData((Channel*)container, name, networkstr); + break; + + case ExtensionItem::EXT_MEMBERSHIP: + // TODO: Implement support for networking membership metadata. + // ServerInstance->PI->SendMetaData((Membership*)container, name, networkstr); + break; + + case ExtensionItem::EXT_USER: + ServerInstance->PI->SendMetaData((User*)container, name, networkstr); + break; + } +} + void ExtensionItem::FromInternal(Extensible* container, const std::string& value) noexcept { FromNetwork(container, value); @@ -172,7 +195,7 @@ void IntExtItem::Delete(Extensible* container, void* item) void IntExtItem::FromInternal(Extensible* container, const std::string& value) noexcept { - Set(container, ConvToNum<intptr_t>(value)); + Set(container, ConvToNum<intptr_t>(value), false); } void IntExtItem::FromNetwork(Extensible* container, const std::string& value) noexcept @@ -186,12 +209,15 @@ intptr_t IntExtItem::Get(const Extensible* container) const return reinterpret_cast<intptr_t>(GetRaw(container)); } -void IntExtItem::Set(Extensible* container, intptr_t value) +void IntExtItem::Set(Extensible* container, intptr_t value, bool sync) { if (value) SetRaw(container, reinterpret_cast<void*>(value)); else UnsetRaw(container); + + if (sync && synced) + Sync(container, GetRaw(container)); } std::string IntExtItem::ToInternal(const Extensible* container, void* item) const noexcept @@ -204,9 +230,11 @@ std::string IntExtItem::ToNetwork(const Extensible* container, void* item) const return synced ? ToInternal(container, item) : std::string(); } -void IntExtItem::Unset(Extensible* container) +void IntExtItem::Unset(Extensible* container, bool sync) { UnsetRaw(container); + if (sync && synced) + Sync(container, nullptr); } StringExtItem::StringExtItem(Module* owner, const std::string& key, ExtensibleType exttype, bool sync) @@ -218,9 +246,9 @@ StringExtItem::StringExtItem(Module* owner, const std::string& key, ExtensibleTy void StringExtItem::FromInternal(Extensible* container, const std::string& value) noexcept { if (value.empty()) - Unset(container); + Unset(container, false); else - Set(container, value); + Set(container, value, false); } void StringExtItem::FromNetwork(Extensible* container, const std::string& value) noexcept |
