/* Copyright (c) 2013 IOnU Security Inc. All rights reserved Created October 2013 by Kendrick Webster K2Daemon/ClientMap.cpp - implementation for ClientMap.h */ #if !defined(NDEBUG) #define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING #define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE #endif #include #include #include #include #include #include "global.h" #include "ClientMap.h" using boost::multi_index_container; using namespace boost::multi_index; namespace ClientMap { struct CMapping { id_t id; std::string urn; }; struct by_id {}; struct by_urn {}; typedef multi_index_container< CMapping, indexed_by< hashed_unique< tag, BOOST_MULTI_INDEX_MEMBER(CMapping, id_t, id) >, hashed_unique< tag, BOOST_MULTI_INDEX_MEMBER(CMapping, std::string, urn) > > > client_map_t; typedef client_map_t::index::type& id_index_t; typedef client_map_t::index::type& urn_index_t; typedef client_map_t::index::type::iterator id_iterator_t; typedef client_map_t::index::type::iterator urn_iterator_t; static client_map_t client_map; } const char* ClientMap::UrnFromId(id_t id) { id_index_t idx = client_map.get(); id_iterator_t it = idx.find(id); if (it != idx.end()) { return it->urn.c_str(); } return NULL; } ClientMap::id_t ClientMap::IdFromUrn(const char* urn) { urn_index_t idx = client_map.get(); urn_iterator_t it = idx.find(urn); if (it != idx.end()) { return it->id; } return NULL_ID; } ClientMap::id_t ClientMap::Map(const char* urn) { urn_index_t idx = client_map.get(); urn_iterator_t it = idx.find(urn); if (it != idx.end()) { return it->id; } else { static id_t next_id = 0; CMapping m; m.id = ++next_id; m.urn = urn; idx.insert(m); return m.id; } } void ClientMap::Unmap(const char* urn) { urn_index_t idx = client_map.get(); urn_iterator_t it = idx.find(urn); if (it != idx.end()) { logprintf(Log::debug2, "removing client mapping: id(%d) <--> urn(%s)", it->id, urn); idx.erase(it); } } unsigned int ClientMap::Count(void) { return client_map.size(); }