face-system.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
26 #include "face-system.hpp"
27 #include "protocol-factory.hpp"
28 #include "core/logger.hpp"
29 #include "fw/face-table.hpp"
30 
31 namespace nfd {
32 namespace face {
33 
34 NFD_LOG_INIT("FaceSystem");
35 
37  : m_faceTable(faceTable)
38 {
39  for (const std::string& id : ProtocolFactory::listRegistered()) {
40  NFD_LOG_TRACE("creating factory " << id);
41  m_factories[id] = ProtocolFactory::create(id);
42  }
43 }
44 
45 FaceSystem::~FaceSystem() = default;
46 
47 std::set<const ProtocolFactory*>
49 {
50  std::set<const ProtocolFactory*> factories;
51  for (const auto& p : m_factories) {
52  factories.insert(p.second.get());
53  }
54  return factories;
55 }
56 
58 FaceSystem::getFactoryById(const std::string& id)
59 {
60  auto found = m_factories.find(id);
61  return found == m_factories.end() ? nullptr : found->second.get();
62 }
63 
65 FaceSystem::getFactoryByScheme(const std::string& scheme)
66 {
67  auto found = m_factoryByScheme.find(scheme);
68  return found == m_factoryByScheme.end() ? nullptr : found->second;
69 }
70 
71 void
73 {
74  configFile.addSectionHandler("face_system", bind(&FaceSystem::processConfig, this, _1, _2, _3));
75 }
76 
77 void
78 FaceSystem::processConfig(const ConfigSection& configSection, bool isDryRun, const std::string& filename)
79 {
80  ConfigContext context;
81  context.isDryRun = isDryRun;
82  context.addFace = bind(&FaceTable::add, &m_faceTable, _1);
83  context.m_netifs = listNetworkInterfaces();
84 
85  // process sections in protocol factories
86  for (const auto& pair : m_factories) {
87  const std::string& sectionName = pair.first;
88  ProtocolFactory* factory = pair.second.get();
89 
90  std::set<std::string> oldProvidedSchemes = factory->getProvidedSchemes();
91  factory->processConfig(configSection.get_child_optional(sectionName), context);
92 
93  if (!isDryRun) {
94  for (const std::string& scheme : factory->getProvidedSchemes()) {
95  m_factoryByScheme[scheme] = factory;
96  if (oldProvidedSchemes.erase(scheme) == 0) {
97  NFD_LOG_TRACE("factory " << sectionName <<
98  " provides " << scheme << " FaceUri scheme");
99  }
100  }
101  for (const std::string& scheme : oldProvidedSchemes) {
102  m_factoryByScheme.erase(scheme);
103  NFD_LOG_TRACE("factory " << sectionName <<
104  " no longer provides " << scheme << " FaceUri scheme");
105  }
106  }
107  }
108 
109  // process other sections
110  std::set<std::string> seenSections;
111  for (const auto& pair : configSection) {
112  const std::string& sectionName = pair.first;
113  // const ConfigSection& subSection = pair.second;
114 
115  if (!seenSections.insert(sectionName).second) {
116  BOOST_THROW_EXCEPTION(ConfigFile::Error("Duplicate section face_system." + sectionName));
117  }
118 
119  if (m_factories.count(sectionName) > 0) {
120  continue;
121  }
122 
124 
125  BOOST_THROW_EXCEPTION(ConfigFile::Error("Unrecognized option face_system." + sectionName));
126  }
127 }
128 
129 } // namespace face
130 } // namespace nfd
void addSectionHandler(const std::string &sectionName, ConfigSectionHandler subscriber)
setup notification of configuration file sections
Definition: config-file.cpp:79
static std::set< std::string > listRegistered()
configuration file parsing utility
Definition: config-file.hpp:58
ProtocolFactory * getFactoryByScheme(const std::string &scheme)
Definition: face-system.cpp:65
container of all faces
Definition: face-table.hpp:37
void setConfigFile(ConfigFile &configFile)
register handler for face_system section of NFD configuration file
Definition: face-system.cpp:72
std::vector< NetworkInterfaceInfo > listNetworkInterfaces()
List configured network interfaces on the system and their info.
void add(shared_ptr< Face > face)
add a face
Definition: face-table.cpp:61
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...
static unique_ptr< ProtocolFactory > create(const std::string &id)
boost::property_tree::ptree ConfigSection
a config file section
Definition: config-file.hpp:37
virtual void processConfig(OptionalConfigSection configSection, FaceSystem::ConfigContext &context)
process face_system subsection that corresponds to this ProtocolFactory type
provide support for an underlying protocol
#define NFD_LOG_INIT(name)
Definition: logger.hpp:122
#define NFD_LOG_TRACE(expression)
Definition: logger.hpp:160
const std::set< std::string > & getProvidedSchemes()
FaceSystem(FaceTable &faceTable)
Definition: face-system.cpp:36
ProtocolFactory * getFactoryById(const std::string &id)
Definition: face-system.cpp:58
std::set< const ProtocolFactory * > listProtocolFactories() const
Definition: face-system.cpp:48