blob: dce0d985055733e2e9de6b9ec16a2c528af8492a [file] [log] [blame]
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -07001#include "ndnx-discovery.h"
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -08002#include "simple-interval-generator.h"
3#include "task.h"
4#include "periodic-task.h"
5#include <sstream>
6#include <boost/make_shared.hpp>
7#include <boost/bind.hpp>
8
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -07009using namespace Ndnx;
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080010using namespace std;
11
12const string
13TaggedFunction::CHAR_SET = string("abcdefghijklmnopqtrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
14
15TaggedFunction::TaggedFunction(const Callback &callback, const string &tag)
16 : m_callback(callback)
17 , m_tag(tag)
18{
19}
20
21string
22TaggedFunction::GetRandomTag()
23{
24 //boost::random::random_device rng;
Alexander Afanasyevf8ff5e12013-07-11 13:57:32 -070025 //boost::random::uniform_int_distribution<> dist(0, CHAR_SET.size() - 1);
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080026 ostringstream oss;
Alexander Afanasyevf8ff5e12013-07-11 13:57:32 -070027 //for (int i = 0; i < DEFAULT_TAG_SIZE; i++)
28 //{
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080029 //oss << CHAR_SET[dist(rng)];
Alexander Afanasyevf8ff5e12013-07-11 13:57:32 -070030 //}
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080031 return oss.str();
32}
33
34void
35TaggedFunction::operator()(const Name &name)
36{
37 if (!m_callback.empty())
38 {
39 m_callback(name);
40 }
41}
42
43const double
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070044NdnxDiscovery::INTERVAL = 15.0;
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080045
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070046NdnxDiscovery *
47NdnxDiscovery::instance = NULL;
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080048
49boost::mutex
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070050NdnxDiscovery::mutex;
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080051
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070052NdnxDiscovery::NdnxDiscovery()
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080053 : m_scheduler(new Scheduler())
54 , m_localPrefix("/")
55{
56 m_scheduler->start();
Alexander Afanasyevfcf81dc2013-01-25 20:36:58 -080057
58 Scheduler::scheduleOneTimeTask (m_scheduler, 0,
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070059 boost::bind(&NdnxDiscovery::poll, this), "Initial-Local-Prefix-Check");
Alexander Afanasyevfcf81dc2013-01-25 20:36:58 -080060 Scheduler::schedulePeriodicTask (m_scheduler,
61 boost::make_shared<SimpleIntervalGenerator>(INTERVAL),
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070062 boost::bind(&NdnxDiscovery::poll, this), "Local-Prefix-Check");
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080063}
64
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070065NdnxDiscovery::~NdnxDiscovery()
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080066{
67 m_scheduler->shutdown();
68}
69
70void
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070071NdnxDiscovery::addCallback(const TaggedFunction &callback)
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080072{
73 m_callbacks.push_back(callback);
74}
75
76int
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070077NdnxDiscovery::deleteCallback(const TaggedFunction &callback)
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080078{
79 List::iterator it = m_callbacks.begin();
80 while (it != m_callbacks.end())
81 {
82 if ((*it) == callback)
83 {
84 it = m_callbacks.erase(it);
85 }
86 else
87 {
88 ++it;
89 }
90 }
91 return m_callbacks.size();
92}
93
94void
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070095NdnxDiscovery::poll()
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080096{
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -070097 Name localPrefix = NdnxWrapper::getLocalPrefix();
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -080098 if (localPrefix != m_localPrefix)
99 {
100 Lock lock(mutex);
101 for (List::iterator it = m_callbacks.begin(); it != m_callbacks.end(); ++it)
102 {
103 (*it)(localPrefix);
104 }
105 m_localPrefix = localPrefix;
106 }
107}
108
109void
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -0700110NdnxDiscovery::registerCallback(const TaggedFunction &callback)
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -0800111{
112 Lock lock(mutex);
113 if (instance == NULL)
114 {
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -0700115 instance = new NdnxDiscovery();
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -0800116 }
117
118 instance->addCallback(callback);
119}
120
121void
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -0700122NdnxDiscovery::deregisterCallback(const TaggedFunction &callback)
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -0800123{
124 Lock lock(mutex);
125 if (instance == NULL)
126 {
Alexander Afanasyev1dd37ed2013-08-14 18:08:09 -0700127 cerr << "NdnxDiscovery::deregisterCallback called without instance" << endl;
Zhenkai Zhue4dc4d82013-01-23 13:17:08 -0800128 }
129 else
130 {
131 int size = instance->deleteCallback(callback);
132 if (size == 0)
133 {
134 delete instance;
135 instance = NULL;
136 }
137 }
138}
139