Serious refactoring. Making forwarding strategy really modular
diff --git a/model/forwarding-strategy/ccnx-forwarding-strategy.h b/model/forwarding-strategy/ccnx-forwarding-strategy.h
index 20d92a4..0683079 100644
--- a/model/forwarding-strategy/ccnx-forwarding-strategy.h
+++ b/model/forwarding-strategy/ccnx-forwarding-strategy.h
@@ -41,7 +41,8 @@
  * \ingroup ccnx
  * \brief Abstract base class for CCNx forwarding strategies
  */
-class CcnxForwardingStrategy : public Object
+class CcnxForwardingStrategy :
+    public Object
 {
 public:
   static TypeId GetTypeId (void);
@@ -80,7 +81,64 @@
           Ptr<Packet> &payload,
           const Ptr<const Packet> &packet);
     
-// protected:
+protected:
+  // events
+  virtual void
+  DidReceiveDuplicateInterest (const Ptr<CcnxFace> &face,
+                               Ptr<CcnxInterestHeader> &header,
+                               const Ptr<const Packet> &packet,
+                               Ptr<CcnxPitEntry> pitEntry);
+
+  virtual void
+  DidExhaustForwardingOptions (const Ptr<CcnxFace> &incomingFace,
+                               Ptr<CcnxInterestHeader> header,
+                               const Ptr<const Packet> &packet,
+                               Ptr<CcnxPitEntry> pitEntry);
+
+  virtual void
+  FailedToCreatePitEntry (const Ptr<CcnxFace> &incomingFace,
+                          Ptr<CcnxInterestHeader> header,
+                          const Ptr<const Packet> &packet);
+  
+  virtual void
+  DidCreatePitEntry (const Ptr<CcnxFace> &incomingFace,
+                     Ptr<CcnxInterestHeader> header,
+                     const Ptr<const Packet> &packet,
+                     Ptr<CcnxPitEntry> pitEntry);
+
+  virtual bool
+  DetectRetransmittedInterest (const Ptr<CcnxFace> &incomingFace,
+                               Ptr<CcnxPitEntry> pitEntry);
+
+  // only for data received from network
+  virtual void
+  WillSatisfyPendingInterest (const Ptr<CcnxFace> &incomingFace,
+                              Ptr<CcnxPitEntry> pitEntry);
+
+  // for data received both from network and cache
+  virtual void
+  SatisfyPendingInterest (const Ptr<CcnxFace> &incomingFace, // 0 allowed (from cache)
+                          Ptr<const CcnxContentObjectHeader> header,
+                          Ptr<const Packet> payload,
+                          const Ptr<const Packet> &packet,
+                          Ptr<CcnxPitEntry> pitEntry);
+
+  virtual void
+  DidReceiveUnsolicitedData (const Ptr<CcnxFace> &incomingFace,
+                             Ptr<const CcnxContentObjectHeader> header,
+                             Ptr<const Packet> payload);
+  
+  virtual bool
+  ShouldSuppressIncomingInterest (const Ptr<CcnxFace> &incomingFace,
+                                  Ptr<CcnxPitEntry> pitEntry);
+
+
+  virtual void
+  PropagateInterest (const Ptr<CcnxFace> &incomingFace,
+                     Ptr<CcnxInterestHeader> &header,
+                     const Ptr<const Packet> &packet,
+                     Ptr<CcnxPitEntry> pitEntry);
+  
   /**
    * @brief Base method to propagate the interest according to the forwarding strategy
    *
@@ -93,38 +151,16 @@
    * @return true if interest was successfully propagated, false if all options have failed
    */
   virtual bool
-  PropagateInterest (Ptr<CcnxPitEntry> pitEntry, 
-                     const Ptr<CcnxFace> &incomingFace,
-                     Ptr<CcnxInterestHeader> &header,
-                     const Ptr<const Packet> &packet) = 0;
+  DoPropagateInterest (const Ptr<CcnxFace> &incomingFace,
+                       Ptr<CcnxInterestHeader> &header,
+                       const Ptr<const Packet> &packet,
+                       Ptr<CcnxPitEntry> pitEntry) = 0;
 
-protected:
-  /**
-   * @brief Propagate interest via a green interface. Fail, if no green interfaces available
-   *
-   * @param pitEntry      Reference to PIT entry (reference to corresponding FIB entry inside)
-   * @param incomingFace  Incoming face
-   * @param header        CcnxInterestHeader
-   * @param packet        Original Interest packet
-   * @param sendCallback  Send callback
-   * @return true if interest was successfully propagated, false if all options have failed
-   *
-   * \see PropagateInterest
-   */
-  bool
-  PropagateInterestViaGreen (Ptr<CcnxPitEntry> pitEntry, 
-                             const Ptr<CcnxFace> &incomingFace,
-                             Ptr<CcnxInterestHeader> &header,
-                             const Ptr<const Packet> &packet);
 
-  virtual void
-  GiveUpInterest (Ptr<CcnxPitEntry> pitEntry,
-                  Ptr<CcnxInterestHeader> header);
-
-  virtual void
-  OnDataDelayed (Ptr<const CcnxContentObjectHeader> header,
-                 Ptr<const Packet> payload,
-                 const Ptr<const Packet> &packet);
+  // virtual void
+  // OnDataDelayed (Ptr<const CcnxContentObjectHeader> header,
+  //                Ptr<const Packet> payload,
+  //                const Ptr<const Packet> &packet);
   
 protected:
   // inherited from Object class                                                                                                                                                        
@@ -136,11 +172,8 @@
   Ptr<CcnxFib> m_fib; ///< \brief FIB  
   Ptr<CcnxContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)
 
-  bool m_nacksEnabled;
   bool m_cacheUnsolicitedData;
-
-  // transmittedInterestTrace is inside ForwardingStrategy
-  
+  bool m_detectRetransmissions;
   
   TracedCallback<Ptr<const CcnxInterestHeader>,
                  Ptr<const CcnxFace> > m_outInterests; ///< @brief Transmitted interests trace
@@ -155,19 +188,6 @@
   ////////////////////////////////////////////////////////////////////
   ////////////////////////////////////////////////////////////////////
 
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 Ptr<const CcnxFace> > m_outNacks; ///< @brief trace of outgoing NACKs
-
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 Ptr<const CcnxFace> > m_inNacks; ///< @brief trace of incoming NACKs
-
-  TracedCallback<Ptr<const CcnxInterestHeader>,
-                 Ptr<const CcnxFace> > m_dropNacks; ///< @brief trace of dropped NACKs
-
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-
   TracedCallback<Ptr<const CcnxContentObjectHeader>, Ptr<const Packet>,
                  bool /*from cache*/,
                  Ptr<const CcnxFace> > m_outData; ///< @brief trace of outgoing Data