/** * metadata.C: Metadata management * Rights to this code are documented in doc/pod/license.pod. * * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team */ #include "atheme.h" #include #include #include #include #include #include /******************* * M E T A D A T A * *******************/ has_metadata::callbacks has_metadata::callback; metadata * has_metadata::add_metadata (char const * const name, char const * const value) { bool is_private = false; char *newname = sstrdup (name); char *newvalue = sstrdup (value); metadata::map_type::iterator it = mdmap.find (newname); callback.metadata_change (this, name, value); if (it != mdmap.end ()) { metadata *md = it->second; is_private = md->is_private; mdmap.erase (it); delete md; } if (is_private || !strncmp ("private:", name, 8)) is_private = true; return mdmap[newname] = new metadata (newname, newvalue, is_private); } bool has_metadata::del_metadata (char const * const name) { metadata::map_type::iterator it = mdmap.find (name); callback.metadata_change (this, name, NULL); if (it != mdmap.end ()) { mdmap.erase (it); delete it->second; return true; } return false; } metadata * has_metadata::find_metadata (char const * const name) { metadata::map_type::iterator it = mdmap.find (name); if (it != mdmap.end ()) return it->second; return NULL; } void has_metadata::clear_metadata (void) { metadata::map_type::iterator it = mdmap.begin (); metadata::map_type::iterator et = mdmap.end (); while (it != et) { callback.metadata_change (this, it->second->key, NULL); delete it->second; ++it; } mdmap.clear (); }