/*
* InspIRCd -- Internet Relay Chat Daemon
*
+ * Copyright (C) 2018-2019 Sadie Powell <sadie@witchery.services>
* Copyright (C) 2015 Attila Molnar <attilamolnar@hush.com>
*
* This file is part of InspIRCd. InspIRCd is free software: you can
}
extern void RemoveInvite(Invite::Invite* inv, bool remove_user, bool remove_chan);
+extern void UnserializeInvite(LocalUser* user, const std::string& value);
template<typename T, ExtensionItem::ExtensibleType ExtType>
class Invite::ExtItem : public ExtensionItem
{
+ private:
+ static std::string ToString(void* item, bool human)
+ {
+ std::string ret;
+ Store<T>* store = static_cast<Store<T>*>(item);
+ for (typename insp::intrusive_list<Invite, T>::iterator i = store->invites.begin(); i != store->invites.end(); ++i)
+ {
+ Invite* inv = *i;
+ inv->Serialize(human, (ExtType == ExtensionItem::EXT_USER), ret);
+ }
+ if (!ret.empty())
+ ret.erase(ret.length()-1);
+ return ret;
+ }
+
public:
ExtItem(Module* owner, const char* extname)
: ExtensionItem(extname, ExtType, owner)
{
void* store = unset_raw(ext);
if (store)
- free(store);
+ free(ext, store);
}
- void free(void* item) CXX11_OVERRIDE
+ void free(Extensible* container, void* item) CXX11_OVERRIDE
{
Store<T>* store = static_cast<Store<T>*>(item);
for (typename Store<T>::List::iterator i = store->invites.begin(); i != store->invites.end(); )
delete store;
}
- std::string serialize(SerializeFormat format, const Extensible* container, void* item) const CXX11_OVERRIDE
+ std::string ToHuman(const Extensible* container, void* item) const CXX11_OVERRIDE
+ {
+ return ToString(item, true);
+ }
+
+ std::string ToInternal(const Extensible* container, void* item) const CXX11_OVERRIDE
{
- return std::string();
+ return ToString(item, false);
}
- void unserialize(SerializeFormat format, Extensible* container, const std::string& value) CXX11_OVERRIDE
+ void FromInternal(Extensible* container, const std::string& value) CXX11_OVERRIDE
{
+ if (ExtType != ExtensionItem::EXT_CHANNEL)
+ UnserializeInvite(static_cast<LocalUser*>(container), value);
}
};
void RemoveAll(LocalUser* user) { userext.unset(user); }
void RemoveAll(Channel* chan) { chanext.unset(chan); }
void Destruct(Invite* inv, bool remove_chan = true, bool remove_user = true);
+ void Unserialize(LocalUser* user, const std::string& value);
};