run timeoutcallback of ccnx wrapper in executor
provide selectors for interest callback
diff --git a/ccnx/ccnx-closure.cpp b/ccnx/ccnx-closure.cpp
index ccfeafa..5736511 100644
--- a/ccnx/ccnx-closure.cpp
+++ b/ccnx/ccnx-closure.cpp
@@ -33,15 +33,13 @@
{
}
-Closure::TimeoutCallbackReturnValue
-Closure::runTimeoutCallback(Name interest)
+void
+Closure::runTimeoutCallback(Name interest, const Closure &closure, Selectors selectors)
{
- if (m_timeoutCallback.empty ())
+ if (!m_timeoutCallback.empty ())
{
- return RESULT_OK;
+ m_timeoutCallback (interest, closure, selectors);
}
-
- return m_timeoutCallback (interest);
}
diff --git a/ccnx/ccnx-closure.h b/ccnx/ccnx-closure.h
index 9741f6b..6a1b8d8 100644
--- a/ccnx/ccnx-closure.h
+++ b/ccnx/ccnx-closure.h
@@ -24,6 +24,7 @@
#include "ccnx-common.h"
#include "ccnx-name.h"
+#include "ccnx-selectors.h"
#include "executor.h"
namespace Ccnx {
@@ -36,13 +37,7 @@
public:
typedef boost::function<void (Name, PcoPtr pco)> DataCallback;
- typedef enum
- {
- RESULT_OK,
- RESULT_REEXPRESS
- } TimeoutCallbackReturnValue;
-
- typedef boost::function<TimeoutCallbackReturnValue (Name )> TimeoutCallback;
+ typedef boost::function<void (Name, const Closure &, Selectors)> TimeoutCallback;
Closure(const DataCallback &dataCallback, const TimeoutCallback &timeoutCallback = TimeoutCallback());
virtual ~Closure();
@@ -50,8 +45,8 @@
virtual void
runDataCallback(Name name, Ccnx::PcoPtr pco);
- virtual TimeoutCallbackReturnValue
- runTimeoutCallback(Name interest);
+ virtual void
+ runTimeoutCallback(Name interest, const Closure &closure, Selectors selectors);
virtual Closure *
dup () const { return new Closure (*this); }
diff --git a/ccnx/ccnx-selectors.cpp b/ccnx/ccnx-selectors.cpp
index b349cc1..510aaa9 100644
--- a/ccnx/ccnx-selectors.cpp
+++ b/ccnx/ccnx-selectors.cpp
@@ -27,6 +27,38 @@
m_publisherPublicKeyDigest = other.m_publisherPublicKeyDigest;
}
+Selectors::Selectors(const ccn_parsed_interest *pi)
+ : m_maxSuffixComps(-1)
+ , m_minSuffixComps(-1)
+ , m_answerOriginKind(AOK_DEFAULT)
+ , m_interestLifetime(-1.0)
+ , m_scope(-1)
+ , m_childSelector(DEFAULT)
+{
+ if (pi != NULL)
+ {
+ m_maxSuffixComps = pi->max_suffix_comps;
+ m_minSuffixComps = pi->min_suffix_comps;
+ switch(pi->orderpref)
+ {
+ case 0: m_childSelector = LEFT; break;
+ case 1: m_childSelector = RIGHT; break;
+ default: break;
+ }
+ switch(pi->answerfrom)
+ {
+ case 0x1: m_answerOriginKind = AOK_CS; break;
+ case 0x2: m_answerOriginKind = AOK_NEW; break;
+ case 0x3: m_answerOriginKind = AOK_DEFAULT; break;
+ case 0x4: m_answerOriginKind = AOK_STALE; break;
+ case 0x10: m_answerOriginKind = AOK_EXPIRE; break;
+ default: break;
+ }
+ m_scope = pi->scope;
+ // scope and interest lifetime do not really matter to receiving application, it's only meaningful to routers
+ }
+}
+
bool
Selectors::operator == (const Selectors &other)
{
diff --git a/ccnx/ccnx-selectors.h b/ccnx/ccnx-selectors.h
index 56e29b5..a1125b9 100644
--- a/ccnx/ccnx-selectors.h
+++ b/ccnx/ccnx-selectors.h
@@ -33,6 +33,7 @@
{
public:
Selectors();
+ Selectors(const ccn_parsed_interest *);
Selectors(const Selectors &other);
~Selectors(){};
diff --git a/ccnx/ccnx-wrapper.cpp b/ccnx/ccnx-wrapper.cpp
index 0453789..2867ecc 100644
--- a/ccnx/ccnx-wrapper.cpp
+++ b/ccnx/ccnx-wrapper.cpp
@@ -283,8 +283,9 @@
}
Name interest(info->interest_ccnb, info->interest_comps);
+ Selectors selectors(info->pi);
- executor->execute (bind (*f, interest));
+ executor->execute (bind (*f, interest, selectors));
// this will be run in executor
// (*f) (interest);
// closure->runInterestCallback(interest);
@@ -294,7 +295,7 @@
}
static void
-deleterInDataTuple (tuple<Closure *, ExecutorPtr> *tuple)
+deleterInDataTuple (tuple<Closure *, ExecutorPtr, Selectors> *tuple)
{
delete tuple->get<0> ();
delete tuple;
@@ -308,8 +309,9 @@
// Closure *cp = static_cast<Closure *> (selfp->data);
Closure *cp;
ExecutorPtr executor;
- tuple<Closure *, ExecutorPtr> *realData = reinterpret_cast< tuple<Closure*, ExecutorPtr>* > (selfp->data);
- tie (cp, executor) = *realData;
+ Selectors selectors;
+ tuple<Closure *, ExecutorPtr, Selectors> *realData = reinterpret_cast< tuple<Closure*, ExecutorPtr, Selectors>* > (selfp->data);
+ tie (cp, executor, selectors) = *realData;
_LOG_TRACE (">> incomingData upcall");
@@ -331,14 +333,7 @@
{
_LOG_TRACE ("<< incomingData timeout");
Name interest(info->interest_ccnb, info->interest_comps);
- // We can not run timeout callback in executor, because we need the return value
- Closure::TimeoutCallbackReturnValue rv = cp->runTimeoutCallback(interest);
- switch(rv)
- {
- case Closure::RESULT_OK : return CCN_UPCALL_RESULT_OK;
- case Closure::RESULT_REEXPRESS : return CCN_UPCALL_RESULT_REEXPRESS;
- default : break;
- }
+ executor->execute (bind (&Closure::runTimeoutCallback, cp, interest, *cp, selectors));
}
else
{
@@ -394,7 +389,7 @@
// Closure *myClosure = new ExecutorClosure(closure, m_executor);
Closure *myClosure = closure.dup ();
- dataClosure->data = new tuple<Closure*, ExecutorPtr> (myClosure, m_executor);
+ dataClosure->data = new tuple<Closure*, ExecutorPtr, Selectors> (myClosure, m_executor, selectors);
dataClosure->p = &incomingData;
diff --git a/ccnx/ccnx-wrapper.h b/ccnx/ccnx-wrapper.h
index 91e28c5..32d180c 100644
--- a/ccnx/ccnx-wrapper.h
+++ b/ccnx/ccnx-wrapper.h
@@ -42,7 +42,7 @@
public:
const static int MAX_FRESHNESS = 2147; // max value for ccnx
const static int DEFAULT_FRESHNESS = 60;
- typedef boost::function<void (const Name &)> InterestCallback;
+ typedef boost::function<void (Name, Selectors)> InterestCallback;
CcnxWrapper();
virtual ~CcnxWrapper();