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();