Partial remote event trap
authorProvidence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
Mon Dec 01 09:22:24 2008 +0100 (14 months ago)
changeset 3933aef347ebbd9c
parent 3932 4c96a7cc4b7d
child 3934 b50dbdcc13bf
Partial remote event trap
src/core/callback.h
src/mih/mih-function.cc
src/mih/mih-function.h
src/mih/mih-link-parameter-report.h
src/mih/mih-protocol.cc
src/mih/mih-remote-event-destination-trap.cc
src/mih/mih-remote-event-destination-trap.h
src/mih/mih-remote-event-source-trap.cc
src/mih/mih-remote-event-source-trap.h
src/mih/mih-session.cc
src/mih/mih-session.h
src/mih/mih-transaction.cc
src/mih/mih-transaction.h
src/mih/wscript
     1.1 --- a/src/core/callback.h	Sun Nov 30 22:53:13 2008 +0100
     1.2 +++ b/src/core/callback.h	Mon Dec 01 09:22:24 2008 +0100
     1.3 @@ -31,977 +31,977 @@
     1.4  
     1.5  namespace ns3 {
     1.6  
     1.7 -  /***
     1.8 -   * \internal
     1.9 -   * This code was originally written based on the techniques 
    1.10 -   * described in http://www.codeproject.com/cpp/TTLFunction.asp
    1.11 -   * It was subsequently rewritten to follow the architecture
    1.12 -   * outlined in "Modern C++ Design" by Andrei Alexandrescu in 
    1.13 -   * chapter 5, "Generalized Functors".
    1.14 -   *
    1.15 -   * This code uses:
    1.16 -   *   - default template parameters to saves users from having to
    1.17 -   *     specify empty parameters when the number of parameters
    1.18 -   *     is smaller than the maximum supported number
    1.19 -   *   - the pimpl idiom: the Callback class is passed around by 
    1.20 -   *     value and delegates the crux of the work to its pimpl
    1.21 -   *     pointer.
    1.22 -   *   - two pimpl implementations which derive from CallbackImpl
    1.23 -   *     FunctorCallbackImpl can be used with any functor-type
    1.24 -   *     while MemPtrCallbackImpl can be used with pointers to
    1.25 -   *     member functions.
    1.26 -   *   - a reference list implementation to implement the Callback's
    1.27 -   *     value semantics.
    1.28 -   *
    1.29 -   * This code most notably departs from the alexandrescu 
    1.30 -   * implementation in that it does not use type lists to specify
    1.31 -   * and pass around the types of the callback arguments.
    1.32 -   * Of course, it also does not use copy-destruction semantics
    1.33 -   * and relies on a reference list rather than autoPtr to hold
    1.34 -   * the pointer.
    1.35 -   */
    1.36 -  template <typename T>
    1.37 -  struct CallbackTraits;
    1.38 +/***
    1.39 + * \internal
    1.40 + * This code was originally written based on the techniques 
    1.41 + * described in http://www.codeproject.com/cpp/TTLFunction.asp
    1.42 + * It was subsequently rewritten to follow the architecture
    1.43 + * outlined in "Modern C++ Design" by Andrei Alexandrescu in 
    1.44 + * chapter 5, "Generalized Functors".
    1.45 + *
    1.46 + * This code uses:
    1.47 + *   - default template parameters to saves users from having to
    1.48 + *     specify empty parameters when the number of parameters
    1.49 + *     is smaller than the maximum supported number
    1.50 + *   - the pimpl idiom: the Callback class is passed around by 
    1.51 + *     value and delegates the crux of the work to its pimpl
    1.52 + *     pointer.
    1.53 + *   - two pimpl implementations which derive from CallbackImpl
    1.54 + *     FunctorCallbackImpl can be used with any functor-type
    1.55 + *     while MemPtrCallbackImpl can be used with pointers to
    1.56 + *     member functions.
    1.57 + *   - a reference list implementation to implement the Callback's
    1.58 + *     value semantics.
    1.59 + *
    1.60 + * This code most notably departs from the alexandrescu 
    1.61 + * implementation in that it does not use type lists to specify
    1.62 + * and pass around the types of the callback arguments.
    1.63 + * Of course, it also does not use copy-destruction semantics
    1.64 + * and relies on a reference list rather than autoPtr to hold
    1.65 + * the pointer.
    1.66 + */
    1.67 +template <typename T>
    1.68 +struct CallbackTraits;
    1.69 +
    1.70 +template <typename T>
    1.71 +struct CallbackTraits<T *>
    1.72 +{
    1.73 +  static T & GetReference (T * const p)
    1.74 +  {
    1.75 +    return *p;
    1.76 +  }
    1.77 +};
    1.78 +
    1.79 +class CallbackImplBase
    1.80 +{
    1.81 +public:
    1.82 +  CallbackImplBase ()
    1.83 +    : m_count (1) {}
    1.84 +  virtual ~CallbackImplBase () {}
    1.85 +  void Ref (void) const {
    1.86 +    m_count++;
    1.87 +  }
    1.88 +  void Unref (void) const {
    1.89 +    m_count--;
    1.90 +    if (m_count == 0) {
    1.91 +      delete this;
    1.92 +    }
    1.93 +  }
    1.94 +  uint32_t GetReferenceCount (void) const { return m_count; }
    1.95 +  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const = 0;
    1.96 +private:
    1.97 +  mutable uint32_t m_count;
    1.98 +};
    1.99 +
   1.100 +// declare the CallbackImpl class
   1.101 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
   1.102 +class CallbackImpl;
   1.103 +// define CallbackImpl for 0 params
   1.104 +template <typename R>
   1.105 +class CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.106 +public:
   1.107 +  virtual ~CallbackImpl () {}
   1.108 +  virtual R operator() (void) = 0;
   1.109 +};
   1.110 +// define CallbackImpl for 1 params
   1.111 +template <typename R, typename T1>
   1.112 +class CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.113 +public:
   1.114 +  virtual ~CallbackImpl () {}
   1.115 +  virtual R operator() (T1) = 0;
   1.116 +};
   1.117 +// define CallbackImpl for 2 params
   1.118 +template <typename R, typename T1, typename T2>
   1.119 +class CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.120 +public:
   1.121 +  virtual ~CallbackImpl () {}
   1.122 +  virtual R operator() (T1, T2) = 0;
   1.123 +};
   1.124 +// define CallbackImpl for 3 params
   1.125 +template <typename R, typename T1, typename T2, typename T3>
   1.126 +class CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.127 +public:
   1.128 +  virtual ~CallbackImpl () {}
   1.129 +  virtual R operator() (T1, T2, T3) = 0;
   1.130 +};
   1.131 +// define CallbackImpl for 4 params
   1.132 +template <typename R, typename T1, typename T2, typename T3, typename T4>
   1.133 +class CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.134 +public:
   1.135 +  virtual ~CallbackImpl () {}
   1.136 +  virtual R operator() (T1, T2, T3, T4) = 0;
   1.137 +};
   1.138 +// define CallbackImpl for 5 params
   1.139 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
   1.140 +class CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> : public CallbackImplBase {
   1.141 +public:
   1.142 +  virtual ~CallbackImpl () {}
   1.143 +  virtual R operator() (T1, T2, T3, T4, T5) = 0;
   1.144 +};
   1.145 +// define CallbackImpl for 6 params
   1.146 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
   1.147 +class CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> : public CallbackImplBase {
   1.148 +public:
   1.149 +  virtual ~CallbackImpl () {}
   1.150 +  virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;
   1.151 +};
   1.152 +// define CallbackImpl for 7 params
   1.153 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
   1.154 +class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> : public CallbackImplBase {
   1.155 +public:
   1.156 +  virtual ~CallbackImpl () {}
   1.157 +  virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;
   1.158 +};
   1.159 +// define CallbackImpl for 8 params
   1.160 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
   1.161 +class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> : public CallbackImplBase {
   1.162 +public:
   1.163 +  virtual ~CallbackImpl () {}
   1.164 +  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;
   1.165 +};
   1.166 +// define CallbackImpl for 9 params
   1.167 +template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
   1.168 +class CallbackImpl : public CallbackImplBase {
   1.169 +public:
   1.170 +  virtual ~CallbackImpl () {}
   1.171 +  virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;
   1.172 +};
   1.173 +
   1.174 +
   1.175 +// an impl for Functors:
   1.176 +template <typename T, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
   1.177 +class FunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
   1.178 +public:
   1.179 +  FunctorCallbackImpl (T const &functor)
   1.180 +    : m_functor (functor) {}
   1.181 +  virtual ~FunctorCallbackImpl () {}
   1.182 +  R operator() (void) {
   1.183 +    return m_functor ();
   1.184 +  }
   1.185 +  R operator() (T1 a1) {
   1.186 +    return m_functor (a1);
   1.187 +  }
   1.188 +  R operator() (T1 a1,T2 a2) {
   1.189 +    return m_functor (a1,a2);
   1.190 +  }
   1.191 +  R operator() (T1 a1,T2 a2,T3 a3) {
   1.192 +    return m_functor (a1,a2,a3);
   1.193 +  }
   1.194 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
   1.195 +    return m_functor (a1,a2,a3,a4);
   1.196 +  }
   1.197 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
   1.198 +    return m_functor (a1,a2,a3,a4,a5);
   1.199 +  }
   1.200 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
   1.201 +    return m_functor (a1,a2,a3,a4,a5,a6);
   1.202 +  }
   1.203 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
   1.204 +    return m_functor (a1,a2,a3,a4,a5,a6,a7);
   1.205 +  }
   1.206 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
   1.207 +    return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
   1.208 +  }
   1.209 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
   1.210 +    return m_functor (a1,a2,a3,a4,a5,a6,a7,a8,a9);
   1.211 +  }
   1.212 +  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
   1.213 +    FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived = 
   1.214 +      dynamic_cast<FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer(other));
   1.215 +    if (otherDerived == 0)
   1.216 +      {
   1.217 +        return false;
   1.218 +      }
   1.219 +    else if (otherDerived->m_functor != m_functor)
   1.220 +      {
   1.221 +        return false;
   1.222 +      }
   1.223 +    return true;
   1.224 +  }
   1.225 +private:
   1.226 +  T m_functor;
   1.227 +};
   1.228 +
   1.229 +// an impl for pointer to member functions
   1.230 +template <typename OBJ_PTR, typename MEM_PTR, typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
   1.231 +class MemPtrCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
   1.232 +public:
   1.233 +  MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR mem_ptr)
   1.234 +    : m_objPtr (objPtr), m_memPtr (mem_ptr) {}
   1.235 +  virtual ~MemPtrCallbackImpl () {}
   1.236 +  R operator() (void) {
   1.237 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) ();
   1.238 +  }
   1.239 +  R operator() (T1 a1) {
   1.240 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1);
   1.241 +  }
   1.242 +  R operator() (T1 a1,T2 a2) {
   1.243 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2);
   1.244 +  }
   1.245 +  R operator() (T1 a1,T2 a2,T3 a3) {
   1.246 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3);
   1.247 +  }
   1.248 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
   1.249 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4);
   1.250 +  }
   1.251 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
   1.252 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5);
   1.253 +  }
   1.254 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
   1.255 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6);
   1.256 +  }
   1.257 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
   1.258 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7);
   1.259 +  }
   1.260 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
   1.261 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8);
   1.262 +  }
   1.263 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
   1.264 +    return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8, a9);
   1.265 +  }
   1.266 +  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
   1.267 +    MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived = 
   1.268 +      dynamic_cast<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer (other));
   1.269 +    if (otherDerived == 0)
   1.270 +      {
   1.271 +        return false;
   1.272 +      }
   1.273 +    else if (otherDerived->m_objPtr != m_objPtr ||
   1.274 +             otherDerived->m_memPtr != m_memPtr)
   1.275 +      {
   1.276 +        return false;
   1.277 +      }
   1.278 +    return true;
   1.279 +  }
   1.280 +private:
   1.281 +  OBJ_PTR const m_objPtr;
   1.282 +  MEM_PTR m_memPtr;
   1.283 +};
   1.284 +
   1.285 +// an impl for Bound Functors:
   1.286 +template <typename T, typename R, typename TX, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
   1.287 +class BoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> {
   1.288 +public:
   1.289 +  template <typename FUNCTOR, typename ARG>
   1.290 +  BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
   1.291 +    : m_functor (functor), m_a (a) {}
   1.292 +  virtual ~BoundFunctorCallbackImpl () {}
   1.293 +  R operator() (void) {
   1.294 +    return m_functor (m_a);
   1.295 +  }
   1.296 +  R operator() (T1 a1) {
   1.297 +    return m_functor (m_a,a1);
   1.298 +  }
   1.299 +  R operator() (T1 a1,T2 a2) {
   1.300 +    return m_functor (m_a,a1,a2);
   1.301 +  }
   1.302 +  R operator() (T1 a1,T2 a2,T3 a3) {
   1.303 +    return m_functor (m_a,a1,a2,a3);
   1.304 +  }
   1.305 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
   1.306 +    return m_functor (m_a,a1,a2,a3,a4);
   1.307 +  }
   1.308 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
   1.309 +    return m_functor (m_a,a1,a2,a3,a4,a5);
   1.310 +  }
   1.311 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
   1.312 +    return m_functor (m_a,a1,a2,a3,a4,a5,a6);
   1.313 +  }
   1.314 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
   1.315 +    return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
   1.316 +  }
   1.317 +  R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
   1.318 +    return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7,a8);
   1.319 +  }
   1.320 +  virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
   1.321 +    BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *otherDerived = 
   1.322 +      dynamic_cast<BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *> (PeekPointer (other));
   1.323 +    if (otherDerived == 0)
   1.324 +      {
   1.325 +        return false;
   1.326 +      }
   1.327 +    else if (otherDerived->m_functor != m_functor ||
   1.328 +             otherDerived->m_a != m_a)
   1.329 +      {
   1.330 +        return false;
   1.331 +      }
   1.332 +    return true;
   1.333 +  }
   1.334 +private:
   1.335 +  T m_functor;
   1.336 +  typename TypeTraits<TX>::ReferencedType m_a;
   1.337 +};
   1.338 +
   1.339 +
   1.340 +class CallbackBase {
   1.341 +public:
   1.342 +  CallbackBase () : m_impl () {}
   1.343 +  Ptr<CallbackImplBase> GetImpl (void) const {return m_impl;}
   1.344 +protected:
   1.345 +  CallbackBase (Ptr<CallbackImplBase> impl) : m_impl (impl) {}
   1.346 +  Ptr<CallbackImplBase> m_impl;
   1.347 +};
   1.348 +
   1.349 +/**
   1.350 + * \brief Callback template class
   1.351 + *
   1.352 + * This class template implements the Functor Design Pattern.
   1.353 + * It is used to declare the type of a Callback:
   1.354 + *  - the first non-optional template argument represents
   1.355 + *    the return type of the callback.
   1.356 + *  - the second optional template argument represents
   1.357 + *    the type of the first argument to the callback.
   1.358 + *  - the third optional template argument represents
   1.359 + *    the type of the second argument to the callback.
   1.360 + *  - the fourth optional template argument represents
   1.361 + *    the type of the third argument to the callback.
   1.362 + *  - the fifth optional template argument represents
   1.363 + *    the type of the fourth argument to the callback.
   1.364 + *  - the sixth optional template argument represents
   1.365 + *    the type of the fifth argument to the callback.
   1.366 + *
   1.367 + * Callback instances are built with the \ref MakeCallback
   1.368 + * template functions. Callback instances have POD semantics:
   1.369 + * the memory they allocate is managed automatically, without
   1.370 + * user intervention which allows you to pass around Callback
   1.371 + * instances by value.
   1.372 + *
   1.373 + * Sample code which shows how to use this class template 
   1.374 + * as well as the function templates \ref MakeCallback :
   1.375 + * \include samples/main-callback.cc
   1.376 + */
   1.377 +
   1.378 +template<typename R, 
   1.379 +         typename T1 = empty, typename T2 = empty, 
   1.380 +         typename T3 = empty, typename T4 = empty,
   1.381 +         typename T5 = empty, typename T6 = empty,
   1.382 +         typename T7 = empty, typename T8 = empty,
   1.383 +         typename T9 = empty>
   1.384 +class Callback : public CallbackBase {
   1.385 +public:
   1.386 +  Callback () {}
   1.387 +
   1.388 +  // There are two dummy args below to ensure that this constructor is
   1.389 +  // always properly disambiguited by the c++ compiler
   1.390 +  template <typename FUNCTOR>
   1.391 +  Callback (FUNCTOR const &functor, bool, bool) 
   1.392 +    : CallbackBase (Create<FunctorCallbackImpl<FUNCTOR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (functor))
   1.393 +  {}
   1.394 +
   1.395 +  template <typename OBJ_PTR, typename MEM_PTR>
   1.396 +  Callback (OBJ_PTR const &objPtr, MEM_PTR mem_ptr)
   1.397 +    : CallbackBase (Create<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (objPtr, mem_ptr))
   1.398 +  {}
   1.399 +
   1.400 +  Callback (Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > const &impl)
   1.401 +    : CallbackBase (impl)
   1.402 +  {}
   1.403  
   1.404    template <typename T>
   1.405 -  struct CallbackTraits<T *>
   1.406 -  {
   1.407 -    static T & GetReference (T * const p)
   1.408 -    {
   1.409 -      return *p;
   1.410 -    }
   1.411 -  };
   1.412 -
   1.413 -  class CallbackImplBase
   1.414 -  {
   1.415 -  public:
   1.416 -    CallbackImplBase ()
   1.417 -      : m_count (1) {}
   1.418 -    virtual ~CallbackImplBase () {}
   1.419 -    void Ref (void) const {
   1.420 -      m_count++;
   1.421 -    }
   1.422 -    void Unref (void) const {
   1.423 -      m_count--;
   1.424 -      if (m_count == 0) {
   1.425 -        delete this;
   1.426 -      }
   1.427 -    }
   1.428 -    uint32_t GetReferenceCount (void) const { return m_count; }
   1.429 -    virtual bool IsEqual (Ptr<const CallbackImplBase> other) const = 0;
   1.430 -  private:
   1.431 -    mutable uint32_t m_count;
   1.432 -  };
   1.433 -
   1.434 -  // declare the CallbackImpl class
   1.435 -  template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
   1.436 -  class CallbackImpl;
   1.437 -  // define CallbackImpl for 0 params
   1.438 -  template <typename R>
   1.439 -  class CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.440 -  public:
   1.441 -    virtual ~CallbackImpl () {}
   1.442 -    virtual R operator() (void) = 0;
   1.443 -  };
   1.444 -  // define CallbackImpl for 1 params
   1.445 -  template <typename R, typename T1>
   1.446 -  class CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.447 -  public:
   1.448 -    virtual ~CallbackImpl () {}
   1.449 -    virtual R operator() (T1) = 0;
   1.450 -  };
   1.451 -  // define CallbackImpl for 2 params
   1.452 -  template <typename R, typename T1, typename T2>
   1.453 -  class CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.454 -  public:
   1.455 -    virtual ~CallbackImpl () {}
   1.456 -    virtual R operator() (T1, T2) = 0;
   1.457 -  };
   1.458 -  // define CallbackImpl for 3 params
   1.459 -  template <typename R, typename T1, typename T2, typename T3>
   1.460 -  class CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.461 -  public:
   1.462 -    virtual ~CallbackImpl () {}
   1.463 -    virtual R operator() (T1, T2, T3) = 0;
   1.464 -  };
   1.465 -  // define CallbackImpl for 4 params
   1.466 -  template <typename R, typename T1, typename T2, typename T3, typename T4>
   1.467 -  class CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> : public CallbackImplBase {
   1.468 -  public:
   1.469 -    virtual ~CallbackImpl () {}
   1.470 -    virtual R operator() (T1, T2, T3, T4) = 0;
   1.471 -  };
   1.472 -  // define CallbackImpl for 5 params
   1.473 -  template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5>
   1.474 -  class CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> : public CallbackImplBase {
   1.475 -  public:
   1.476 -    virtual ~CallbackImpl () {}
   1.477 -    virtual R operator() (T1, T2, T3, T4, T5) = 0;
   1.478 -  };
   1.479 -  // define CallbackImpl for 6 params
   1.480 -  template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
   1.481 -  class CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> : public CallbackImplBase {
   1.482 -  public:
   1.483 -    virtual ~CallbackImpl () {}
   1.484 -    virtual R operator() (T1, T2, T3, T4, T5, T6) = 0;
   1.485 -  };
   1.486 -  // define CallbackImpl for 7 params
   1.487 -  template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
   1.488 -  class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> : public CallbackImplBase {
   1.489 -  public:
   1.490 -    virtual ~CallbackImpl () {}
   1.491 -    virtual R operator() (T1, T2, T3, T4, T5, T6, T7) = 0;
   1.492 -  };
   1.493 -  // define CallbackImpl for 8 params
   1.494 -  template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
   1.495 -  class CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> : public CallbackImplBase {
   1.496 -  public:
   1.497 -    virtual ~CallbackImpl () {}
   1.498 -    virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8) = 0;
   1.499 -  };
   1.500 -  // define CallbackImpl for 9 params
   1.501 -  template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
   1.502 -  class CallbackImpl : public CallbackImplBase {
   1.503 -  public:
   1.504 -    virtual ~CallbackImpl () {}
   1.505 -    virtual R operator() (T1, T2, T3, T4, T5, T6, T7, T8, T9) = 0;
   1.506 -  };
   1.507 -
   1.508 -
   1.509 -  // an impl for Functors:
   1.510 -  template <typename T, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
   1.511 -  class FunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
   1.512 -  public:
   1.513 -    FunctorCallbackImpl (T const &functor)
   1.514 -      : m_functor (functor) {}
   1.515 -    virtual ~FunctorCallbackImpl () {}
   1.516 -    R operator() (void) {
   1.517 -      return m_functor ();
   1.518 -    }
   1.519 -    R operator() (T1 a1) {
   1.520 -      return m_functor (a1);
   1.521 -    }
   1.522 -    R operator() (T1 a1,T2 a2) {
   1.523 -      return m_functor (a1,a2);
   1.524 -    }
   1.525 -    R operator() (T1 a1,T2 a2,T3 a3) {
   1.526 -      return m_functor (a1,a2,a3);
   1.527 -    }
   1.528 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
   1.529 -      return m_functor (a1,a2,a3,a4);
   1.530 -    }
   1.531 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
   1.532 -      return m_functor (a1,a2,a3,a4,a5);
   1.533 -    }
   1.534 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
   1.535 -      return m_functor (a1,a2,a3,a4,a5,a6);
   1.536 -    }
   1.537 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
   1.538 -      return m_functor (a1,a2,a3,a4,a5,a6,a7);
   1.539 -    }
   1.540 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
   1.541 -      return m_functor (a1,a2,a3,a4,a5,a6,a7,a8);
   1.542 -    }
   1.543 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) {
   1.544 -      return m_functor (a1,a2,a3,a4,a5,a6,a7,a8,a9);
   1.545 -    }
   1.546 -    virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
   1.547 -      FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived = 
   1.548 -        dynamic_cast<FunctorCallbackImpl<T,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer(other));
   1.549 -      if (otherDerived == 0)
   1.550 -        {
   1.551 -          return false;
   1.552 -        }
   1.553 -      else if (otherDerived->m_functor != m_functor)
   1.554 -        {
   1.555 -          return false;
   1.556 -        }
   1.557 -      return true;
   1.558 -    }
   1.559 -  private:
   1.560 -    T m_functor;
   1.561 -  };
   1.562 -
   1.563 -  // an impl for pointer to member functions
   1.564 -  template <typename OBJ_PTR, typename MEM_PTR, typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
   1.565 -  class MemPtrCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> {
   1.566 -  public:
   1.567 -    MemPtrCallbackImpl (OBJ_PTR const&objPtr, MEM_PTR mem_ptr)
   1.568 -      : m_objPtr (objPtr), m_memPtr (mem_ptr) {}
   1.569 -    virtual ~MemPtrCallbackImpl () {}
   1.570 -    R operator() (void) {
   1.571 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) ();
   1.572 -    }
   1.573 -    R operator() (T1 a1) {
   1.574 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1);
   1.575 -    }
   1.576 -    R operator() (T1 a1,T2 a2) {
   1.577 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2);
   1.578 -    }
   1.579 -    R operator() (T1 a1,T2 a2,T3 a3) {
   1.580 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3);
   1.581 -    }
   1.582 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
   1.583 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4);
   1.584 -    }
   1.585 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
   1.586 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5);
   1.587 -    }
   1.588 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
   1.589 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6);
   1.590 -    }
   1.591 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
   1.592 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7);
   1.593 -    }
   1.594 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
   1.595 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8);
   1.596 -    }
   1.597 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) {
   1.598 -      return ((CallbackTraits<OBJ_PTR>::GetReference (m_objPtr)).*m_memPtr) (a1, a2, a3, a4, a5, a6, a7, a8, a9);
   1.599 -    }
   1.600 -    virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
   1.601 -      MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *otherDerived = 
   1.602 -        dynamic_cast<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> const *> (PeekPointer (other));
   1.603 -      if (otherDerived == 0)
   1.604 -        {
   1.605 -          return false;
   1.606 -        }
   1.607 -      else if (otherDerived->m_objPtr != m_objPtr ||
   1.608 -               otherDerived->m_memPtr != m_memPtr)
   1.609 -        {
   1.610 -          return false;
   1.611 -        }
   1.612 -      return true;
   1.613 -    }
   1.614 -  private:
   1.615 -    OBJ_PTR const m_objPtr;
   1.616 -    MEM_PTR m_memPtr;
   1.617 -  };
   1.618 -
   1.619 -  // an impl for Bound Functors:
   1.620 -  template <typename T, typename R, typename TX, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
   1.621 -  class BoundFunctorCallbackImpl : public CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> {
   1.622 -  public:
   1.623 -    template <typename FUNCTOR, typename ARG>
   1.624 -    BoundFunctorCallbackImpl (FUNCTOR functor, ARG a)
   1.625 -      : m_functor (functor), m_a (a) {}
   1.626 -    virtual ~BoundFunctorCallbackImpl () {}
   1.627 -    R operator() (void) {
   1.628 -      return m_functor (m_a);
   1.629 -    }
   1.630 -    R operator() (T1 a1) {
   1.631 -      return m_functor (m_a,a1);
   1.632 -    }
   1.633 -    R operator() (T1 a1,T2 a2) {
   1.634 -      return m_functor (m_a,a1,a2);
   1.635 -    }
   1.636 -    R operator() (T1 a1,T2 a2,T3 a3) {
   1.637 -      return m_functor (m_a,a1,a2,a3);
   1.638 -    }
   1.639 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4) {
   1.640 -      return m_functor (m_a,a1,a2,a3,a4);
   1.641 -    }
   1.642 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) {
   1.643 -      return m_functor (m_a,a1,a2,a3,a4,a5);
   1.644 -    }
   1.645 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) {
   1.646 -      return m_functor (m_a,a1,a2,a3,a4,a5,a6);
   1.647 -    }
   1.648 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) {
   1.649 -      return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7);
   1.650 -    }
   1.651 -    R operator() (T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) {
   1.652 -      return m_functor (m_a,a1,a2,a3,a4,a5,a6,a7,a8);
   1.653 -    }
   1.654 -    virtual bool IsEqual (Ptr<const CallbackImplBase> other) const {
   1.655 -      BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *otherDerived = 
   1.656 -        dynamic_cast<BoundFunctorCallbackImpl<T,R,TX,T1,T2,T3,T4,T5,T6,T7,T8> const *> (PeekPointer (other));
   1.657 -      if (otherDerived == 0)
   1.658 -        {
   1.659 -          return false;
   1.660 -        }
   1.661 -      else if (otherDerived->m_functor != m_functor ||
   1.662 -               otherDerived->m_a != m_a)
   1.663 -        {
   1.664 -          return false;
   1.665 -        }
   1.666 -      return true;
   1.667 -    }
   1.668 -  private:
   1.669 -    T m_functor;
   1.670 -    typename TypeTraits<TX>::ReferencedType m_a;
   1.671 -  };
   1.672 -
   1.673 -
   1.674 -  class CallbackBase {
   1.675 -  public:
   1.676 -    CallbackBase () : m_impl () {}
   1.677 -    Ptr<CallbackImplBase> GetImpl (void) const {return m_impl;}
   1.678 -  protected:
   1.679 -    CallbackBase (Ptr<CallbackImplBase> impl) : m_impl (impl) {}
   1.680 -    Ptr<CallbackImplBase> m_impl;
   1.681 -  };
   1.682 -
   1.683 -  /**
   1.684 -   * \brief Callback template class
   1.685 -   *
   1.686 -   * This class template implements the Functor Design Pattern.
   1.687 -   * It is used to declare the type of a Callback:
   1.688 -   *  - the first non-optional template argument represents
   1.689 -   *    the return type of the callback.
   1.690 -   *  - the second optional template argument represents
   1.691 -   *    the type of the first argument to the callback.
   1.692 -   *  - the third optional template argument represents
   1.693 -   *    the type of the second argument to the callback.
   1.694 -   *  - the fourth optional template argument represents
   1.695 -   *    the type of the third argument to the callback.
   1.696 -   *  - the fifth optional template argument represents
   1.697 -   *    the type of the fourth argument to the callback.
   1.698 -   *  - the sixth optional template argument represents
   1.699 -   *    the type of the fifth argument to the callback.
   1.700 -   *
   1.701 -   * Callback instances are built with the \ref MakeCallback
   1.702 -   * template functions. Callback instances have POD semantics:
   1.703 -   * the memory they allocate is managed automatically, without
   1.704 -   * user intervention which allows you to pass around Callback
   1.705 -   * instances by value.
   1.706 -   *
   1.707 -   * Sample code which shows how to use this class template 
   1.708 -   * as well as the function templates \ref MakeCallback :
   1.709 -   * \include samples/main-callback.cc
   1.710 -   */
   1.711 -
   1.712 -  template<typename R, 
   1.713 -           typename T1 = empty, typename T2 = empty, 
   1.714 -           typename T3 = empty, typename T4 = empty,
   1.715 -           typename T5 = empty, typename T6 = empty,
   1.716 -           typename T7 = empty, typename T8 = empty,
   1.717 -           typename T9 = empty>
   1.718 -  class Callback : public CallbackBase {
   1.719 -  public:
   1.720 -    Callback () {}
   1.721 -
   1.722 -    // There are two dummy args below to ensure that this constructor is
   1.723 -    // always properly disambiguited by the c++ compiler
   1.724 -    template <typename FUNCTOR>
   1.725 -    Callback (FUNCTOR const &functor, bool, bool) 
   1.726 -      : CallbackBase (Create<FunctorCallbackImpl<FUNCTOR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (functor))
   1.727 -    {}
   1.728 -
   1.729 -    template <typename OBJ_PTR, typename MEM_PTR>
   1.730 -    Callback (OBJ_PTR const &objPtr, MEM_PTR mem_ptr)
   1.731 -      : CallbackBase (Create<MemPtrCallbackImpl<OBJ_PTR,MEM_PTR,R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > (objPtr, mem_ptr))
   1.732 -    {}
   1.733 -
   1.734 -    Callback (Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> > const &impl)
   1.735 -      : CallbackBase (impl)
   1.736 -    {}
   1.737 -
   1.738 -    template <typename T>
   1.739 -    Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> Bind (T a) {
   1.740 -      Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > impl =
   1.741 -        Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > (
   1.742 -                                                    new BoundFunctorCallbackImpl<
   1.743 -                                                    Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9>,
   1.744 -                                                    R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a), false);
   1.745 -      return Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> (impl);
   1.746 -    }
   1.747 -
   1.748 -    bool IsNull (void) const {
   1.749 -      return (DoPeekImpl () == 0)?true:false;
   1.750 -    }
   1.751 -    void Nullify (void) {
   1.752 -      m_impl = 0;
   1.753 -    }
   1.754 -
   1.755 -    R operator() (void) const {
   1.756 -      return (*(DoPeekImpl ())) ();
   1.757 -    }
   1.758 -    R operator() (T1 a1) const {
   1.759 -      return (*(DoPeekImpl ())) (a1);
   1.760 -    }
   1.761 -    R operator() (T1 a1, T2 a2) const {
   1.762 -      return (*(DoPeekImpl ())) (a1,a2);
   1.763 -    }
   1.764 -    R operator() (T1 a1, T2 a2, T3 a3) const {
   1.765 -      return (*(DoPeekImpl ())) (a1,a2,a3);
   1.766 -    }
   1.767 -    R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
   1.768 -      return (*(DoPeekImpl ())) (a1,a2,a3,a4);
   1.769 -    }
   1.770 -    R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
   1.771 -      return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5);
   1.772 -    }
   1.773 -    R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
   1.774 -      return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6);
   1.775 -    }
   1.776 -    R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
   1.777 -      return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7);
   1.778 -    }
   1.779 -    R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
   1.780 -      return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8);
   1.781 -    }
   1.782 -    R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
   1.783 -      return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8,a9);
   1.784 -    }
   1.785 -
   1.786 -    bool IsEqual (const CallbackBase &other) const {
   1.787 -      return m_impl->IsEqual (other.GetImpl ());
   1.788 -    }
   1.789 -
   1.790 -    bool CheckType (const CallbackBase & other) const {
   1.791 -      return DoCheckType (other.GetImpl ());
   1.792 -    }
   1.793 -    void Assign (const CallbackBase &other) {
   1.794 -      DoAssign (other.GetImpl ());
   1.795 -    }
   1.796 -  private:
   1.797 -    CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *DoPeekImpl (void) const {
   1.798 -      return static_cast<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (m_impl));
   1.799 -    }
   1.800 -    bool DoCheckType (Ptr<const CallbackImplBase> other) const {
   1.801 -      if (other != 0 && dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
   1.802 -        {
   1.803 -          return true;
   1.804 -        }
   1.805 -      else if (other == 0)
   1.806 -        {
   1.807 -          return true;
   1.808 -        }
   1.809 -      else
   1.810 -        {
   1.811 -          return false;
   1.812 -        }
   1.813 -    }
   1.814 -    void DoAssign (Ptr<const CallbackImplBase> other) {
   1.815 -      if (!DoCheckType (other))
   1.816 -        {
   1.817 -          NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\")"
   1.818 -                          " got=" << typeid (*other).name () << 
   1.819 -                          ", expected=" << typeid (CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *).name ());
   1.820 -        }
   1.821 -      m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
   1.822 -    }
   1.823 -  };
   1.824 -
   1.825 -
   1.826 -  template <typename R, typename T1, typename T2,
   1.827 -            typename T3, typename T4,
   1.828 -            typename T5, typename T6,
   1.829 -            typename T7, typename T8,
   1.830 -            typename T9>
   1.831 -  bool operator != (Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> a, Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> b)
   1.832 -  {
   1.833 -    return !a.IsEqual (b);
   1.834 +  Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> Bind (T a) {
   1.835 +    Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > impl =
   1.836 +      Ptr<CallbackImpl<R,T2,T3,T4,T5,T6,T7,T8,T9,empty> > (
   1.837 +                                                  new BoundFunctorCallbackImpl<
   1.838 +                                                  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9>,
   1.839 +                                                  R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (*this, a), false);
   1.840 +    return Callback<R,T2,T3,T4,T5,T6,T7,T8,T9> (impl);
   1.841    }
   1.842  
   1.843 -  /**
   1.844 -   * \ingroup core
   1.845 -   * \defgroup MakeCallback MakeCallback
   1.846 -   *
   1.847 -   */
   1.848 -
   1.849 -  /**
   1.850 -   * \ingroup MakeCallback
   1.851 -   * \param memPtr class method member pointer
   1.852 -   * \param objPtr class instance
   1.853 -   * \return a wrapper Callback
   1.854 -   * Build Callbacks for class method members which takes no arguments
   1.855 -   * and potentially return a value.
   1.856 -   */
   1.857 -  template <typename T, typename OBJ, typename R>
   1.858 -  Callback<R> MakeCallback (R (T::*memPtr) (void), OBJ objPtr) {
   1.859 -    return Callback<R> (objPtr, memPtr);
   1.860 +  bool IsNull (void) const {
   1.861 +    return (DoPeekImpl () == 0)?true:false;
   1.862    }
   1.863 -  template <typename T, typename OBJ, typename R>
   1.864 -  Callback<R> MakeCallback (R (T::*mem_ptr) () const, OBJ objPtr) {
   1.865 -    return Callback<R> (objPtr, mem_ptr);
   1.866 -  }
   1.867 -  /**
   1.868 -   * \ingroup MakeCallback
   1.869 -   * \param mem_ptr class method member pointer
   1.870 -   * \param objPtr class instance
   1.871 -   * \return a wrapper Callback
   1.872 -   * Build Callbacks for class method members which takes one argument
   1.873 -   * and potentially return a value.
   1.874 -   */
   1.875 -  template <typename T, typename OBJ, typename R, typename T1>
   1.876 -  Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1), OBJ objPtr) {
   1.877 -    return Callback<R,T1> (objPtr, mem_ptr);
   1.878 -  }
   1.879 -  template <typename T, typename OBJ, typename R, typename T1>
   1.880 -  Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1) const, OBJ objPtr) {
   1.881 -    return Callback<R,T1> (objPtr, mem_ptr);
   1.882 -  }
   1.883 -  /**
   1.884 -   * \ingroup MakeCallback
   1.885 -   * \param mem_ptr class method member pointer
   1.886 -   * \param objPtr class instance
   1.887 -   * \return a wrapper Callback
   1.888 -   * Build Callbacks for class method members which takes two arguments
   1.889 -   * and potentially return a value.
   1.890 -   */
   1.891 -  template <typename T, typename OBJ, typename R, typename T1, typename T2>
   1.892 -  Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2), OBJ objPtr) {
   1.893 -    return Callback<R,T1,T2> (objPtr, mem_ptr);
   1.894 -  }
   1.895 -  template <typename T, typename OBJ, typename R, typename T1, typename T2>
   1.896 -  Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2) const, OBJ objPtr) {
   1.897 -    return Callback<R,T1,T2> (objPtr, mem_ptr);
   1.898 -  }
   1.899 -  /**
   1.900 -   * \ingroup MakeCallback
   1.901 -   * \param mem_ptr class method member pointer
   1.902 -   * \param objPtr class instance
   1.903 -   * \return a wrapper Callback
   1.904 -   * Build Callbacks for class method members which takes three arguments
   1.905 -   * and potentially return a value.
   1.906 -   */
   1.907 -  template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
   1.908 -  Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3), OBJ objPtr) {
   1.909 -    return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
   1.910 -  }
   1.911 -  template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
   1.912 -  Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3) const, OBJ objPtr) {
   1.913 -    return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
   1.914 -  }
   1.915 -  /**
   1.916 -   * \ingroup MakeCallback
   1.917 -   * \param mem_ptr class method member pointer
   1.918 -   * \param objPtr class instance
   1.919 -   * \return a wrapper Callback
   1.920 -   * Build Callbacks for class method members which takes four arguments
   1.921 -   * and potentially return a value.
   1.922 -   */
   1.923 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
   1.924 -  Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4), OBJ objPtr) {
   1.925 -    return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
   1.926 -  }
   1.927 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
   1.928 -  Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4) const, OBJ objPtr) {
   1.929 -    return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
   1.930 -  }
   1.931 -  /**
   1.932 -   * \ingroup MakeCallback
   1.933 -   * \param mem_ptr class method member pointer
   1.934 -   * \param objPtr class instance
   1.935 -   * \return a wrapper Callback
   1.936 -   * Build Callbacks for class method members which takes five arguments
   1.937 -   * and potentially return a value.
   1.938 -   */
   1.939 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
   1.940 -  Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ objPtr) {
   1.941 -    return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
   1.942 -  }
   1.943 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
   1.944 -  Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5) const, OBJ objPtr) {
   1.945 -    return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
   1.946 -  }
   1.947 -  /**
   1.948 -   * \ingroup MakeCallback
   1.949 -   * \param mem_ptr class method member pointer
   1.950 -   * \param objPtr class instance
   1.951 -   * \return a wrapper Callback
   1.952 -   * Build Callbacks for class method members which takes six arguments
   1.953 -   * and potentially return a value.
   1.954 -   */
   1.955 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6>
   1.956 -  Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6), OBJ objPtr) {
   1.957 -    return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
   1.958 -  }
   1.959 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
   1.960 -  Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6) const, OBJ objPtr) {
   1.961 -    return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
   1.962 +  void Nullify (void) {
   1.963 +    m_impl = 0;
   1.964    }
   1.965  
   1.966 -  /**
   1.967 -   * \ingroup MakeCallback
   1.968 -   * \param mem_ptr class method member pointer
   1.969 -   * \param objPtr class instance
   1.970 -   * \return a wrapper Callback
   1.971 -   * Build Callbacks for class method members which takes seven arguments
   1.972 -   * and potentially return a value.
   1.973 -   */
   1.974 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7>
   1.975 -  Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7), OBJ objPtr) {
   1.976 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
   1.977 +  R operator() (void) const {
   1.978 +    return (*(DoPeekImpl ())) ();
   1.979    }
   1.980 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
   1.981 -  Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7) const, OBJ objPtr) {
   1.982 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
   1.983 +  R operator() (T1 a1) const {
   1.984 +    return (*(DoPeekImpl ())) (a1);
   1.985 +  }
   1.986 +  R operator() (T1 a1, T2 a2) const {
   1.987 +    return (*(DoPeekImpl ())) (a1,a2);
   1.988 +  }
   1.989 +  R operator() (T1 a1, T2 a2, T3 a3) const {
   1.990 +    return (*(DoPeekImpl ())) (a1,a2,a3);
   1.991 +  }
   1.992 +  R operator() (T1 a1, T2 a2, T3 a3, T4 a4) const {
   1.993 +    return (*(DoPeekImpl ())) (a1,a2,a3,a4);
   1.994 +  }
   1.995 +  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5) const {
   1.996 +    return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5);
   1.997 +  }
   1.998 +  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6) const {
   1.999 +    return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6);
  1.1000 +  }
  1.1001 +  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7) const {
  1.1002 +    return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7);
  1.1003 +  }
  1.1004 +  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) const {
  1.1005 +    return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8);
  1.1006 +  }
  1.1007 +  R operator() (T1 a1, T2 a2, T3 a3, T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, T9 a9) const {
  1.1008 +    return (*(DoPeekImpl ())) (a1,a2,a3,a4,a5,a6,a7,a8,a9);
  1.1009    }
  1.1010  
  1.1011 -
  1.1012 -  /**
  1.1013 -   * \ingroup MakeCallback
  1.1014 -   * \param mem_ptr class method member pointer
  1.1015 -   * \param objPtr class instance
  1.1016 -   * \return a wrapper Callback
  1.1017 -   * Build Callbacks for class method members which takes eight arguments
  1.1018 -   * and potentially return a value.
  1.1019 -   */
  1.1020 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8>
  1.1021 -  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8), OBJ objPtr) {
  1.1022 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
  1.1023 -  }
  1.1024 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
  1.1025 -  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8) const, OBJ objPtr) {
  1.1026 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
  1.1027 +  bool IsEqual (const CallbackBase &other) const {
  1.1028 +    return m_impl->IsEqual (other.GetImpl ());
  1.1029    }
  1.1030  
  1.1031 -  /**
  1.1032 -   * \ingroup MakeCallback
  1.1033 -   * \param mem_ptr class method member pointer
  1.1034 -   * \param objPtr class instance
  1.1035 -   * \return a wrapper Callback
  1.1036 -   * Build Callbacks for class method members which takes nine arguments
  1.1037 -   * and potentially return a value.
  1.1038 -   */
  1.1039 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
  1.1040 -  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8,T9), OBJ objPtr) {
  1.1041 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
  1.1042 +  bool CheckType (const CallbackBase & other) const {
  1.1043 +    return DoCheckType (other.GetImpl ());
  1.1044    }
  1.1045 -  template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
  1.1046 -  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8,T9) const, OBJ objPtr) {
  1.1047 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
  1.1048 +  void Assign (const CallbackBase &other) {
  1.1049 +    DoAssign (other.GetImpl ());
  1.1050    }
  1.1051 +private:
  1.1052 +  CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *DoPeekImpl (void) const {
  1.1053 +    return static_cast<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (m_impl));
  1.1054 +  }
  1.1055 +  bool DoCheckType (Ptr<const CallbackImplBase> other) const {
  1.1056 +    if (other != 0 && dynamic_cast<const CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *> (PeekPointer (other)) != 0)
  1.1057 +      {
  1.1058 +        return true;
  1.1059 +      }
  1.1060 +    else if (other == 0)
  1.1061 +      {
  1.1062 +        return true;
  1.1063 +      }
  1.1064 +    else
  1.1065 +      {
  1.1066 +        return false;
  1.1067 +      }
  1.1068 +  }
  1.1069 +  void DoAssign (Ptr<const CallbackImplBase> other) {
  1.1070 +    if (!DoCheckType (other))
  1.1071 +      {
  1.1072 +        NS_FATAL_ERROR ("Incompatible types. (feed to \"c++filt -t\")"
  1.1073 +                        " got=" << typeid (*other).name () << 
  1.1074 +                        ", expected=" << typeid (CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> *).name ());
  1.1075 +      }
  1.1076 +    m_impl = const_cast<CallbackImplBase *> (PeekPointer (other));
  1.1077 +  }
  1.1078 +};
  1.1079  
  1.1080 -  /**
  1.1081 -   * \ingroup MakeCallback
  1.1082 -   * \param fnPtr function pointer
  1.1083 -   * \return a wrapper Callback
  1.1084 -   * Build Callbacks for functions which takes no arguments
  1.1085 -   * and potentially return a value.
  1.1086 -   */
  1.1087 -  template <typename R>
  1.1088 -  Callback<R> MakeCallback (R (*fnPtr) ()) {
  1.1089 -    return Callback<R> (fnPtr, true, true);
  1.1090 -  }
  1.1091 -  /**
  1.1092 -   * \ingroup MakeCallback
  1.1093 -   * \param fnPtr function pointer
  1.1094 -   * \return a wrapper Callback
  1.1095 -   * Build Callbacks for functions which takes one argument
  1.1096 -   * and potentially return a value.
  1.1097 -   */
  1.1098 -  template <typename R, typename T1>
  1.1099 -  Callback<R,T1> MakeCallback (R (*fnPtr) (T1)) {
  1.1100 -    return Callback<R,T1> (fnPtr, true, true);
  1.1101 -  }
  1.1102 -  /**
  1.1103 -   * \ingroup MakeCallback
  1.1104 -   * \param fnPtr function pointer
  1.1105 -   * \return a wrapper Callback
  1.1106 -   * Build Callbacks for functions which takes two arguments
  1.1107 -   * and potentially return a value.
  1.1108 -   */
  1.1109 -  template <typename R, typename T1, typename T2>
  1.1110 -  Callback<R,T1,T2> MakeCallback (R (*fnPtr) (T1,T2)) {
  1.1111 -    return Callback<R,T1,T2> (fnPtr, true, true);
  1.1112 -  }
  1.1113 -  /**
  1.1114 -   * \ingroup MakeCallback
  1.1115 -   * \param fnPtr function pointer
  1.1116 -   * \return a wrapper Callback
  1.1117 -   * Build Callbacks for functions which takes three arguments
  1.1118 -   * and potentially return a value.
  1.1119 -   */
  1.1120 -  template <typename R, typename T1, typename T2,typename T3>
  1.1121 -  Callback<R,T1,T2,T3> MakeCallback (R (*fnPtr) (T1,T2,T3)) {
  1.1122 -    return Callback<R,T1,T2,T3> (fnPtr, true, true);
  1.1123 -  }
  1.1124 -  /**
  1.1125 -   * \ingroup MakeCallback
  1.1126 -   * \param fnPtr function pointer
  1.1127 -   * \return a wrapper Callback
  1.1128 -   * Build Callbacks for functions which takes four arguments
  1.1129 -   * and potentially return a value.
  1.1130 -   */
  1.1131 -  template <typename R, typename T1, typename T2,typename T3,typename T4>
  1.1132 -  Callback<R,T1,T2,T3,T4> MakeCallback (R (*fnPtr) (T1,T2,T3,T4)) {
  1.1133 -    return Callback<R,T1,T2,T3,T4> (fnPtr, true, true);
  1.1134 -  }
  1.1135 -  /**
  1.1136 -   * \ingroup MakeCallback
  1.1137 -   * \param fnPtr function pointer
  1.1138 -   * \return a wrapper Callback
  1.1139 -   * Build Callbacks for functions which takes five arguments
  1.1140 -   * and potentially return a value.
  1.1141 -   */
  1.1142 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
  1.1143 -  Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5)) {
  1.1144 -    return Callback<R,T1,T2,T3,T4,T5> (fnPtr, true, true);
  1.1145 -  }
  1.1146 -  /**
  1.1147 -   * \ingroup MakeCallback
  1.1148 -   * \param fnPtr function pointer
  1.1149 -   * \return a wrapper Callback
  1.1150 -   * Build Callbacks for functions which takes six arguments
  1.1151 -   * and potentially return a value.
  1.1152 -   */
  1.1153 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
  1.1154 -  Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6)) {
  1.1155 -    return Callback<R,T1,T2,T3,T4,T5,T6> (fnPtr, true, true);
  1.1156 -  }
  1.1157  
  1.1158 -  /**
  1.1159 -   * \ingroup MakeCallback
  1.1160 -   * \param fnPtr function pointer
  1.1161 -   * \return a wrapper Callback
  1.1162 -   * Build Callbacks for functions which takes seven arguments
  1.1163 -   * and potentially return a value.
  1.1164 -   */
  1.1165 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
  1.1166 -  Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7)) {
  1.1167 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7> (fnPtr, true, true);
  1.1168 -  }
  1.1169 +template <typename R, typename T1, typename T2,
  1.1170 +          typename T3, typename T4,
  1.1171 +          typename T5, typename T6,
  1.1172 +          typename T7, typename T8,
  1.1173 +          typename T9>
  1.1174 +bool operator != (Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> a, Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> b)
  1.1175 +{
  1.1176 +  return !a.IsEqual (b);
  1.1177 +}
  1.1178  
  1.1179 -  /**
  1.1180 -   * \ingroup MakeCallback
  1.1181 -   * \param fnPtr function pointer
  1.1182 -   * \return a wrapper Callback
  1.1183 -   * Build Callbacks for functions which takes eight arguments
  1.1184 -   * and potentially return a value.
  1.1185 -   */
  1.1186 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
  1.1187 -  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8)) {
  1.1188 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (fnPtr, true, true);
  1.1189 -  }
  1.1190 +/**
  1.1191 + * \ingroup core
  1.1192 + * \defgroup MakeCallback MakeCallback
  1.1193 + *
  1.1194 + */
  1.1195  
  1.1196 -  /**
  1.1197 -   * \ingroup MakeCallback
  1.1198 -   * \param fnPtr function pointer
  1.1199 -   * \return a wrapper Callback
  1.1200 -   * Build Callbacks for functions which takes nine arguments
  1.1201 -   * and potentially return a value.
  1.1202 -   */
  1.1203 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
  1.1204 -  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8,T9)) {
  1.1205 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (fnPtr, true, true);
  1.1206 -  }
  1.1207 +/**
  1.1208 + * \ingroup MakeCallback
  1.1209 + * \param memPtr class method member pointer
  1.1210 + * \param objPtr class instance
  1.1211 + * \return a wrapper Callback
  1.1212 + * Build Callbacks for class method members which takes no arguments
  1.1213 + * and potentially return a value.
  1.1214 + */
  1.1215 +template <typename T, typename OBJ, typename R>
  1.1216 +Callback<R> MakeCallback (R (T::*memPtr) (void), OBJ objPtr) {
  1.1217 +  return Callback<R> (objPtr, memPtr);
  1.1218 +}
  1.1219 +template <typename T, typename OBJ, typename R>
  1.1220 +Callback<R> MakeCallback (R (T::*mem_ptr) () const, OBJ objPtr) {
  1.1221 +  return Callback<R> (objPtr, mem_ptr);
  1.1222 +}
  1.1223 +/**
  1.1224 + * \ingroup MakeCallback
  1.1225 + * \param mem_ptr class method member pointer
  1.1226 + * \param objPtr class instance
  1.1227 + * \return a wrapper Callback
  1.1228 + * Build Callbacks for class method members which takes one argument
  1.1229 + * and potentially return a value.
  1.1230 + */
  1.1231 +template <typename T, typename OBJ, typename R, typename T1>
  1.1232 +Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1), OBJ objPtr) {
  1.1233 +  return Callback<R,T1> (objPtr, mem_ptr);
  1.1234 +}
  1.1235 +template <typename T, typename OBJ, typename R, typename T1>
  1.1236 +Callback<R,T1> MakeCallback (R (T::*mem_ptr) (T1) const, OBJ objPtr) {
  1.1237 +  return Callback<R,T1> (objPtr, mem_ptr);
  1.1238 +}
  1.1239 +/**
  1.1240 + * \ingroup MakeCallback
  1.1241 + * \param mem_ptr class method member pointer
  1.1242 + * \param objPtr class instance
  1.1243 + * \return a wrapper Callback
  1.1244 + * Build Callbacks for class method members which takes two arguments
  1.1245 + * and potentially return a value.
  1.1246 + */
  1.1247 +template <typename T, typename OBJ, typename R, typename T1, typename T2>
  1.1248 +Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2), OBJ objPtr) {
  1.1249 +  return Callback<R,T1,T2> (objPtr, mem_ptr);
  1.1250 +}
  1.1251 +template <typename T, typename OBJ, typename R, typename T1, typename T2>
  1.1252 +Callback<R,T1,T2> MakeCallback (R (T::*mem_ptr) (T1,T2) const, OBJ objPtr) {
  1.1253 +  return Callback<R,T1,T2> (objPtr, mem_ptr);
  1.1254 +}
  1.1255 +/**
  1.1256 + * \ingroup MakeCallback
  1.1257 + * \param mem_ptr class method member pointer
  1.1258 + * \param objPtr class instance
  1.1259 + * \return a wrapper Callback
  1.1260 + * Build Callbacks for class method members which takes three arguments
  1.1261 + * and potentially return a value.
  1.1262 + */
  1.1263 +template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
  1.1264 +Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3), OBJ objPtr) {
  1.1265 +  return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
  1.1266 +}
  1.1267 +template <typename T, typename OBJ, typename R, typename T1,typename T2, typename T3>
  1.1268 +Callback<R,T1,T2,T3> MakeCallback (R (T::*mem_ptr) (T1,T2,T3) const, OBJ objPtr) {
  1.1269 +  return Callback<R,T1,T2,T3> (objPtr, mem_ptr);
  1.1270 +}
  1.1271 +/**
  1.1272 + * \ingroup MakeCallback
  1.1273 + * \param mem_ptr class method member pointer
  1.1274 + * \param objPtr class instance
  1.1275 + * \return a wrapper Callback
  1.1276 + * Build Callbacks for class method members which takes four arguments
  1.1277 + * and potentially return a value.
  1.1278 + */
  1.1279 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
  1.1280 +Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4), OBJ objPtr) {
  1.1281 +  return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
  1.1282 +}
  1.1283 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4>
  1.1284 +Callback<R,T1,T2,T3,T4> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4) const, OBJ objPtr) {
  1.1285 +  return Callback<R,T1,T2,T3,T4> (objPtr, mem_ptr);
  1.1286 +}
  1.1287 +/**
  1.1288 + * \ingroup MakeCallback
  1.1289 + * \param mem_ptr class method member pointer
  1.1290 + * \param objPtr class instance
  1.1291 + * \return a wrapper Callback
  1.1292 + * Build Callbacks for class method members which takes five arguments
  1.1293 + * and potentially return a value.
  1.1294 + */
  1.1295 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
  1.1296 +Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5), OBJ objPtr) {
  1.1297 +  return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
  1.1298 +}
  1.1299 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5>
  1.1300 +Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5) const, OBJ objPtr) {
  1.1301 +  return Callback<R,T1,T2,T3,T4,T5> (objPtr, mem_ptr);
  1.1302 +}
  1.1303 +/**
  1.1304 + * \ingroup MakeCallback
  1.1305 + * \param mem_ptr class method member pointer
  1.1306 + * \param objPtr class instance
  1.1307 + * \return a wrapper Callback
  1.1308 + * Build Callbacks for class method members which takes six arguments
  1.1309 + * and potentially return a value.
  1.1310 + */
  1.1311 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6>
  1.1312 +Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6), OBJ objPtr) {
  1.1313 +  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
  1.1314 +}
  1.1315 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6>
  1.1316 +Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6) const, OBJ objPtr) {
  1.1317 +  return Callback<R,T1,T2,T3,T4,T5,T6> (objPtr, mem_ptr);
  1.1318 +}
  1.1319  
  1.1320 +/**
  1.1321 + * \ingroup MakeCallback
  1.1322 + * \param mem_ptr class method member pointer
  1.1323 + * \param objPtr class instance
  1.1324 + * \return a wrapper Callback
  1.1325 + * Build Callbacks for class method members which takes seven arguments
  1.1326 + * and potentially return a value.
  1.1327 + */
  1.1328 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7>
  1.1329 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7), OBJ objPtr) {
  1.1330 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
  1.1331 +}
  1.1332 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7>
  1.1333 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7) const, OBJ objPtr) {
  1.1334 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (objPtr, mem_ptr);
  1.1335 +}
  1.1336  
  1.1337  
  1.1338 -  /**
  1.1339 -   * \ingroup MakeCallback
  1.1340 -   * \return a wrapper Callback
  1.1341 -   * Build a null callback which takes no arguments
  1.1342 -   * and potentially return a value.
  1.1343 -   */
  1.1344 -  template <typename R>
  1.1345 -  Callback<R> MakeNullCallback (void) {
  1.1346 -    return Callback<R> ();
  1.1347 -  }
  1.1348 -  /**
  1.1349 -   * \ingroup MakeCallback
  1.1350 -   * \overload Callback<R> MakeNullCallback (void)
  1.1351 -   * \return a wrapper Callback
  1.1352 -   * Build a null callback which takes one argument
  1.1353 -   * and potentially return a value.
  1.1354 -   */
  1.1355 -  template <typename R, typename T1>
  1.1356 -  Callback<R,T1> MakeNullCallback (void) {
  1.1357 -    return Callback<R,T1> ();
  1.1358 -  }
  1.1359 -  /**
  1.1360 -   * \ingroup MakeCallback
  1.1361 -   * \overload Callback<R> MakeNullCallback (void)
  1.1362 -   * \return a wrapper Callback
  1.1363 -   * Build a null callback which takes two arguments
  1.1364 -   * and potentially return a value.
  1.1365 -   */
  1.1366 -  template <typename R, typename T1, typename T2>
  1.1367 -  Callback<R,T1,T2> MakeNullCallback (void) {
  1.1368 -    return Callback<R,T1,T2> ();
  1.1369 -  }
  1.1370 -  /**
  1.1371 -   * \ingroup MakeCallback
  1.1372 -   * \overload Callback<R> MakeNullCallback (void)
  1.1373 -   * \return a wrapper Callback
  1.1374 -   * Build a null callback which takes three arguments
  1.1375 -   * and potentially return a value.
  1.1376 -   */
  1.1377 -  template <typename R, typename T1, typename T2,typename T3>
  1.1378 -  Callback<R,T1,T2,T3> MakeNullCallback (void) {
  1.1379 -    return Callback<R,T1,T2,T3> ();
  1.1380 -  }
  1.1381 -  /**
  1.1382 -   * \ingroup MakeCallback
  1.1383 -   * \overload Callback<R> MakeNullCallback (void)
  1.1384 -   * \return a wrapper Callback
  1.1385 -   * Build a null callback which takes four arguments
  1.1386 -   * and potentially return a value.
  1.1387 -   */
  1.1388 -  template <typename R, typename T1, typename T2,typename T3,typename T4>
  1.1389 -  Callback<R,T1,T2,T3,T4> MakeNullCallback (void) {
  1.1390 -    return Callback<R,T1,T2,T3,T4> ();
  1.1391 -  }
  1.1392 -  /**
  1.1393 -   * \ingroup MakeCallback
  1.1394 -   * \overload Callback<R> MakeNullCallback (void)
  1.1395 -   * \return a wrapper Callback
  1.1396 -   * Build a null callback which takes five arguments
  1.1397 -   * and potentially return a value.
  1.1398 -   */
  1.1399 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
  1.1400 -  Callback<R,T1,T2,T3,T4,T5> MakeNullCallback (void) {
  1.1401 -    return Callback<R,T1,T2,T3,T4,T5> ();
  1.1402 -  }
  1.1403 -  /**
  1.1404 -   * \ingroup MakeCallback
  1.1405 -   * \overload Callback<R> MakeNullCallback (void)
  1.1406 -   * \return a wrapper Callback
  1.1407 -   * Build a null callback which takes six arguments
  1.1408 -   * and potentially return a value.
  1.1409 -   */
  1.1410 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
  1.1411 -  Callback<R,T1,T2,T3,T4,T5,T6> MakeNullCallback (void) {
  1.1412 -    return Callback<R,T1,T2,T3,T4,T5,T6> ();
  1.1413 -  }
  1.1414 +/**
  1.1415 + * \ingroup MakeCallback
  1.1416 + * \param mem_ptr class method member pointer
  1.1417 + * \param objPtr class instance
  1.1418 + * \return a wrapper Callback
  1.1419 + * Build Callbacks for class method members which takes eight arguments
  1.1420 + * and potentially return a value.
  1.1421 + */
  1.1422 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8>
  1.1423 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8), OBJ objPtr) {
  1.1424 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
  1.1425 +}
  1.1426 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8>
  1.1427 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8) const, OBJ objPtr) {
  1.1428 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (objPtr, mem_ptr);
  1.1429 +}
  1.1430  
  1.1431 -  /**
  1.1432 -   * \ingroup MakeCallback
  1.1433 -   * \overload Callback<R> MakeNullCallback (void)
  1.1434 -   * \return a wrapper Callback
  1.1435 -   * Build a null callback which takes seven arguments
  1.1436 -   * and potentially return a value.
  1.1437 -   */
  1.1438 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
  1.1439 -  Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeNullCallback (void) {
  1.1440 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7> ();
  1.1441 -  }
  1.1442 +/**
  1.1443 + * \ingroup MakeCallback
  1.1444 + * \param mem_ptr class method member pointer
  1.1445 + * \param objPtr class instance
  1.1446 + * \return a wrapper Callback
  1.1447 + * Build Callbacks for class method members which takes nine arguments
  1.1448 + * and potentially return a value.
  1.1449 + */
  1.1450 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
  1.1451 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8,T9), OBJ objPtr) {
  1.1452 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
  1.1453 +}
  1.1454 +template <typename T, typename OBJ, typename R, typename T1, typename T2, typename T3, typename T4,typename T5, typename T6, typename T7, typename T8, typename T9>
  1.1455 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (T::*mem_ptr) (T1,T2,T3,T4,T5,T6,T7,T8,T9) const, OBJ objPtr) {
  1.1456 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (objPtr, mem_ptr);
  1.1457 +}
  1.1458  
  1.1459 -  /**
  1.1460 -   * \ingroup MakeCallback
  1.1461 -   * \overload Callback<R> MakeNullCallback (void)
  1.1462 -   * \return a wrapper Callback
  1.1463 -   * Build a null callback which takes eight arguments
  1.1464 -   * and potentially return a value.
  1.1465 -   */
  1.1466 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
  1.1467 -  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeNullCallback (void) {
  1.1468 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> ();
  1.1469 -  }
  1.1470 +/**
  1.1471 + * \ingroup MakeCallback
  1.1472 + * \param fnPtr function pointer
  1.1473 + * \return a wrapper Callback
  1.1474 + * Build Callbacks for functions which takes no arguments
  1.1475 + * and potentially return a value.
  1.1476 + */
  1.1477 +template <typename R>
  1.1478 +Callback<R> MakeCallback (R (*fnPtr) ()) {
  1.1479 +  return Callback<R> (fnPtr, true, true);
  1.1480 +}
  1.1481 +/**
  1.1482 + * \ingroup MakeCallback
  1.1483 + * \param fnPtr function pointer
  1.1484 + * \return a wrapper Callback
  1.1485 + * Build Callbacks for functions which takes one argument
  1.1486 + * and potentially return a value.
  1.1487 + */
  1.1488 +template <typename R, typename T1>
  1.1489 +Callback<R,T1> MakeCallback (R (*fnPtr) (T1)) {
  1.1490 +  return Callback<R,T1> (fnPtr, true, true);
  1.1491 +}
  1.1492 +/**
  1.1493 + * \ingroup MakeCallback
  1.1494 + * \param fnPtr function pointer
  1.1495 + * \return a wrapper Callback
  1.1496 + * Build Callbacks for functions which takes two arguments
  1.1497 + * and potentially return a value.
  1.1498 + */
  1.1499 +template <typename R, typename T1, typename T2>
  1.1500 +Callback<R,T1,T2> MakeCallback (R (*fnPtr) (T1,T2)) {
  1.1501 +  return Callback<R,T1,T2> (fnPtr, true, true);
  1.1502 +}
  1.1503 +/**
  1.1504 + * \ingroup MakeCallback
  1.1505 + * \param fnPtr function pointer
  1.1506 + * \return a wrapper Callback
  1.1507 + * Build Callbacks for functions which takes three arguments
  1.1508 + * and potentially return a value.
  1.1509 + */
  1.1510 +template <typename R, typename T1, typename T2,typename T3>
  1.1511 +Callback<R,T1,T2,T3> MakeCallback (R (*fnPtr) (T1,T2,T3)) {
  1.1512 +  return Callback<R,T1,T2,T3> (fnPtr, true, true);
  1.1513 +}
  1.1514 +/**
  1.1515 + * \ingroup MakeCallback
  1.1516 + * \param fnPtr function pointer
  1.1517 + * \return a wrapper Callback
  1.1518 + * Build Callbacks for functions which takes four arguments
  1.1519 + * and potentially return a value.
  1.1520 + */
  1.1521 +template <typename R, typename T1, typename T2,typename T3,typename T4>
  1.1522 +Callback<R,T1,T2,T3,T4> MakeCallback (R (*fnPtr) (T1,T2,T3,T4)) {
  1.1523 +  return Callback<R,T1,T2,T3,T4> (fnPtr, true, true);
  1.1524 +}
  1.1525 +/**
  1.1526 + * \ingroup MakeCallback
  1.1527 + * \param fnPtr function pointer
  1.1528 + * \return a wrapper Callback
  1.1529 + * Build Callbacks for functions which takes five arguments
  1.1530 + * and potentially return a value.
  1.1531 + */
  1.1532 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
  1.1533 +Callback<R,T1,T2,T3,T4,T5> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5)) {
  1.1534 +  return Callback<R,T1,T2,T3,T4,T5> (fnPtr, true, true);
  1.1535 +}
  1.1536 +/**
  1.1537 + * \ingroup MakeCallback
  1.1538 + * \param fnPtr function pointer
  1.1539 + * \return a wrapper Callback
  1.1540 + * Build Callbacks for functions which takes six arguments
  1.1541 + * and potentially return a value.
  1.1542 + */
  1.1543 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
  1.1544 +Callback<R,T1,T2,T3,T4,T5,T6> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6)) {
  1.1545 +  return Callback<R,T1,T2,T3,T4,T5,T6> (fnPtr, true, true);
  1.1546 +}
  1.1547  
  1.1548 -  /**
  1.1549 -   * \ingroup MakeCallback
  1.1550 -   * \overload Callback<R> MakeNullCallback (void)
  1.1551 -   * \return a wrapper Callback
  1.1552 -   * Build a null callback which takes nine arguments
  1.1553 -   * and potentially return a value.
  1.1554 -   */
  1.1555 -  template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
  1.1556 -  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeNullCallback (void) {
  1.1557 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> ();
  1.1558 -  }
  1.1559 +/**
  1.1560 + * \ingroup MakeCallback
  1.1561 + * \param fnPtr function pointer
  1.1562 + * \return a wrapper Callback
  1.1563 + * Build Callbacks for functions which takes seven arguments
  1.1564 + * and potentially return a value.
  1.1565 + */
  1.1566 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
  1.1567 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7)) {
  1.1568 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (fnPtr, true, true);
  1.1569 +}
  1.1570  
  1.1571 +/**
  1.1572 + * \ingroup MakeCallback
  1.1573 + * \param fnPtr function pointer
  1.1574 + * \return a wrapper Callback
  1.1575 + * Build Callbacks for functions which takes eight arguments
  1.1576 + * and potentially return a value.
  1.1577 + */
  1.1578 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
  1.1579 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8)) {
  1.1580 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (fnPtr, true, true);
  1.1581 +}
  1.1582  
  1.1583 -  /*
  1.1584 -   * The following is experimental code. It works but we have
  1.1585 -   * not yet determined whether or not it is really useful and whether
  1.1586 -   * or not we really want to use it.
  1.1587 -   */
  1.1588 +/**
  1.1589 + * \ingroup MakeCallback
  1.1590 + * \param fnPtr function pointer
  1.1591 + * \return a wrapper Callback
  1.1592 + * Build Callbacks for functions which takes nine arguments
  1.1593 + * and potentially return a value.
  1.1594 + */
  1.1595 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
  1.1596 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeCallback (R (*fnPtr) (T1,T2,T3,T4,T5,T6,T7,T8,T9)) {
  1.1597 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> (fnPtr, true, true);
  1.1598 +}
  1.1599  
  1.1600 -  template <typename R, typename TX, typename ARG>
  1.1601 -  Callback<R> MakeBoundCallback (R (*fnPtr) (TX), ARG a) {
  1.1602 -    Ptr<CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
  1.1603 -      Create<BoundFunctorCallbackImpl<R (*) (TX),R,TX,empty,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a);
  1.1604 -    return Callback<R> (impl);
  1.1605 -  }
  1.1606  
  1.1607 -  template <typename R, typename TX, typename ARG, 
  1.1608 -            typename T1>
  1.1609 -  Callback<R,T1> MakeBoundCallback (R (*fnPtr) (TX,T1), ARG a) {
  1.1610 -    Ptr<CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
  1.1611 -      Create<BoundFunctorCallbackImpl<R (*) (TX,T1),R,TX,T1,empty,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
  1.1612 -    return Callback<R,T1> (impl);
  1.1613 -  }
  1.1614 -  template <typename R, typename TX, typename ARG, 
  1.1615 -            typename T1, typename T2>
  1.1616 -  Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr) (TX,T1,T2), ARG a) {
  1.1617 -    Ptr<CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> > impl =
  1.1618 -      Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2),R,TX,T1,T2,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
  1.1619 -    return Callback<R,T1,T2> (impl);
  1.1620 -  }
  1.1621 -  template <typename R, typename TX, typename ARG,
  1.1622 -            typename T1, typename T2,typename T3>
  1.1623 -  Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3), ARG a) {
  1.1624 -    Ptr<CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> > impl =
  1.1625 -      Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3),R,TX,T1,T2,T3,empty,empty,empty,empty,empty> > (fnPtr, a);
  1.1626 -    return Callback<R,T1,T2,T3> (impl);
  1.1627 -  }
  1.1628 -  template <typename R, typename TX, typename ARG,
  1.1629 -            typename T1, typename T2,typename T3,typename T4>
  1.1630 -  Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4), ARG a) {
  1.1631 -    Ptr<CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> > impl =
  1.1632 -      Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4),R,TX,T1,T2,T3,T4,empty,empty,empty,empty> > (fnPtr, a);
  1.1633 -    return Callback<R,T1,T2,T3,T4> (impl);
  1.1634 -  }
  1.1635 -  template <typename R, typename TX, typename ARG,
  1.1636 -            typename T1, typename T2,typename T3,typename T4,typename T5>
  1.1637 -  Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5), ARG a) {
  1.1638 -    Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> > impl =
  1.1639 -      Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5),R,TX,T1,T2,T3,T4,T5,empty,empty,empty> > (fnPtr, a);
  1.1640 -    return Callback<R,T1,T2,T3,T4,T5> (impl);
  1.1641 -  }
  1.1642 -  template <typename R, typename TX, typename ARG,
  1.1643 -            typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
  1.1644 -  Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6), ARG a) {
  1.1645 -    Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> > impl =
  1.1646 -      Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6),R,TX,T1,T2,T3,T4,T5,T6,empty,empty> > (fnPtr, a);
  1.1647 -    return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
  1.1648 -  }
  1.1649 -  template <typename R, typename TX, typename ARG,
  1.1650 -            typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
  1.1651 -  Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7), ARG a) {
  1.1652 -    Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> > impl =
  1.1653 -      Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7),R,TX,T1,T2,T3,T4,T5,T6,T7,empty> > (fnPtr, a);
  1.1654 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
  1.1655 -  }
  1.1656 -  template <typename R, typename TX, typename ARG,
  1.1657 -            typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7, typename T8>
  1.1658 -  Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7,T8), ARG a) {
  1.1659 -    Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> > impl =
  1.1660 -      Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7,T8),R,TX,T1,T2,T3,T4,T5,T6,T7,T8> > (fnPtr, a);
  1.1661 -    return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (impl);
  1.1662 -  }
  1.1663 +
  1.1664 +/**
  1.1665 + * \ingroup MakeCallback
  1.1666 + * \return a wrapper Callback
  1.1667 + * Build a null callback which takes no arguments
  1.1668 + * and potentially return a value.
  1.1669 + */
  1.1670 +template <typename R>
  1.1671 +Callback<R> MakeNullCallback (void) {
  1.1672 +  return Callback<R> ();
  1.1673 +}
  1.1674 +/**
  1.1675 + * \ingroup MakeCallback
  1.1676 + * \overload Callback<R> MakeNullCallback (void)
  1.1677 + * \return a wrapper Callback
  1.1678 + * Build a null callback which takes one argument
  1.1679 + * and potentially return a value.
  1.1680 + */
  1.1681 +template <typename R, typename T1>
  1.1682 +Callback<R,T1> MakeNullCallback (void) {
  1.1683 +  return Callback<R,T1> ();
  1.1684 +}
  1.1685 +/**
  1.1686 + * \ingroup MakeCallback
  1.1687 + * \overload Callback<R> MakeNullCallback (void)
  1.1688 + * \return a wrapper Callback
  1.1689 + * Build a null callback which takes two arguments
  1.1690 + * and potentially return a value.
  1.1691 + */
  1.1692 +template <typename R, typename T1, typename T2>
  1.1693 +Callback<R,T1,T2> MakeNullCallback (void) {
  1.1694 +  return Callback<R,T1,T2> ();
  1.1695 +}
  1.1696 +/**
  1.1697 + * \ingroup MakeCallback
  1.1698 + * \overload Callback<R> MakeNullCallback (void)
  1.1699 + * \return a wrapper Callback
  1.1700 + * Build a null callback which takes three arguments
  1.1701 + * and potentially return a value.
  1.1702 + */
  1.1703 +template <typename R, typename T1, typename T2,typename T3>
  1.1704 +Callback<R,T1,T2,T3> MakeNullCallback (void) {
  1.1705 +  return Callback<R,T1,T2,T3> ();
  1.1706 +}
  1.1707 +/**
  1.1708 + * \ingroup MakeCallback
  1.1709 + * \overload Callback<R> MakeNullCallback (void)
  1.1710 + * \return a wrapper Callback
  1.1711 + * Build a null callback which takes four arguments
  1.1712 + * and potentially return a value.
  1.1713 + */
  1.1714 +template <typename R, typename T1, typename T2,typename T3,typename T4>
  1.1715 +Callback<R,T1,T2,T3,T4> MakeNullCallback (void) {
  1.1716 +  return Callback<R,T1,T2,T3,T4> ();
  1.1717 +}
  1.1718 +/**
  1.1719 + * \ingroup MakeCallback
  1.1720 + * \overload Callback<R> MakeNullCallback (void)
  1.1721 + * \return a wrapper Callback
  1.1722 + * Build a null callback which takes five arguments
  1.1723 + * and potentially return a value.
  1.1724 + */
  1.1725 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5>
  1.1726 +Callback<R,T1,T2,T3,T4,T5> MakeNullCallback (void) {
  1.1727 +  return Callback<R,T1,T2,T3,T4,T5> ();
  1.1728 +}
  1.1729 +/**
  1.1730 + * \ingroup MakeCallback
  1.1731 + * \overload Callback<R> MakeNullCallback (void)
  1.1732 + * \return a wrapper Callback
  1.1733 + * Build a null callback which takes six arguments
  1.1734 + * and potentially return a value.
  1.1735 + */
  1.1736 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6>
  1.1737 +Callback<R,T1,T2,T3,T4,T5,T6> MakeNullCallback (void) {
  1.1738 +  return Callback<R,T1,T2,T3,T4,T5,T6> ();
  1.1739 +}
  1.1740 +
  1.1741 +/**
  1.1742 + * \ingroup MakeCallback
  1.1743 + * \overload Callback<R> MakeNullCallback (void)
  1.1744 + * \return a wrapper Callback
  1.1745 + * Build a null callback which takes seven arguments
  1.1746 + * and potentially return a value.
  1.1747 + */
  1.1748 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7>
  1.1749 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeNullCallback (void) {
  1.1750 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7> ();
  1.1751 +}
  1.1752 +
  1.1753 +/**
  1.1754 + * \ingroup MakeCallback
  1.1755 + * \overload Callback<R> MakeNullCallback (void)
  1.1756 + * \return a wrapper Callback
  1.1757 + * Build a null callback which takes eight arguments
  1.1758 + * and potentially return a value.
  1.1759 + */
  1.1760 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8>
  1.1761 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeNullCallback (void) {
  1.1762 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> ();
  1.1763 +}
  1.1764 +
  1.1765 +/**
  1.1766 + * \ingroup MakeCallback
  1.1767 + * \overload Callback<R> MakeNullCallback (void)
  1.1768 + * \return a wrapper Callback
  1.1769 + * Build a null callback which takes nine arguments
  1.1770 + * and potentially return a value.
  1.1771 + */
  1.1772 +template <typename R, typename T1, typename T2,typename T3,typename T4,typename T5,typename T6, typename T7, typename T8, typename T9>
  1.1773 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> MakeNullCallback (void) {
  1.1774 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8,T9> ();
  1.1775 +}
  1.1776 +
  1.1777 +
  1.1778 +/*
  1.1779 + * The following is experimental code. It works but we have
  1.1780 + * not yet determined whether or not it is really useful and whether
  1.1781 + * or not we really want to use it.
  1.1782 + */
  1.1783 +
  1.1784 +template <typename R, typename TX, typename ARG>
  1.1785 +Callback<R> MakeBoundCallback (R (*fnPtr) (TX), ARG a) {
  1.1786 +  Ptr<CallbackImpl<R,empty,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
  1.1787 +    Create<BoundFunctorCallbackImpl<R (*) (TX),R,TX,empty,empty,empty,empty,empty,empty,empty,empty> >(fnPtr, a);
  1.1788 +  return Callback<R> (impl);
  1.1789 +}
  1.1790 +
  1.1791 +template <typename R, typename TX, typename ARG, 
  1.1792 +          typename T1>
  1.1793 +Callback<R,T1> MakeBoundCallback (R (*fnPtr) (TX,T1), ARG a) {
  1.1794 +  Ptr<CallbackImpl<R,T1,empty,empty,empty,empty,empty,empty,empty,empty> > impl =
  1.1795 +    Create<BoundFunctorCallbackImpl<R (*) (TX,T1),R,TX,T1,empty,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
  1.1796 +  return Callback<R,T1> (impl);
  1.1797 +}
  1.1798 +template <typename R, typename TX, typename ARG, 
  1.1799 +          typename T1, typename T2>
  1.1800 +Callback<R,T1,T2> MakeBoundCallback (R (*fnPtr) (TX,T1,T2), ARG a) {
  1.1801 +  Ptr<CallbackImpl<R,T1,T2,empty,empty,empty,empty,empty,empty,empty> > impl =
  1.1802 +    Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2),R,TX,T1,T2,empty,empty,empty,empty,empty,empty> > (fnPtr, a);
  1.1803 +  return Callback<R,T1,T2> (impl);
  1.1804 +}
  1.1805 +template <typename R, typename TX, typename ARG,
  1.1806 +          typename T1, typename T2,typename T3>
  1.1807 +Callback<R,T1,T2,T3> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3), ARG a) {
  1.1808 +  Ptr<CallbackImpl<R,T1,T2,T3,empty,empty,empty,empty,empty,empty> > impl =
  1.1809 +    Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3),R,TX,T1,T2,T3,empty,empty,empty,empty,empty> > (fnPtr, a);
  1.1810 +  return Callback<R,T1,T2,T3> (impl);
  1.1811 +}
  1.1812 +template <typename R, typename TX, typename ARG,
  1.1813 +          typename T1, typename T2,typename T3,typename T4>
  1.1814 +Callback<R,T1,T2,T3,T4> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4), ARG a) {
  1.1815 +  Ptr<CallbackImpl<R,T1,T2,T3,T4,empty,empty,empty,empty,empty> > impl =
  1.1816 +    Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4),R,TX,T1,T2,T3,T4,empty,empty,empty,empty> > (fnPtr, a);
  1.1817 +  return Callback<R,T1,T2,T3,T4> (impl);
  1.1818 +}
  1.1819 +template <typename R, typename TX, typename ARG,
  1.1820 +          typename T1, typename T2,typename T3,typename T4,typename T5>
  1.1821 +Callback<R,T1,T2,T3,T4,T5> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5), ARG a) {
  1.1822 +  Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,empty,empty,empty,empty> > impl =
  1.1823 +    Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5),R,TX,T1,T2,T3,T4,T5,empty,empty,empty> > (fnPtr, a);
  1.1824 +  return Callback<R,T1,T2,T3,T4,T5> (impl);
  1.1825 +}
  1.1826 +template <typename R, typename TX, typename ARG,
  1.1827 +          typename T1, typename T2,typename T3,typename T4,typename T5, typename T6>
  1.1828 +Callback<R,T1,T2,T3,T4,T5,T6> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6), ARG a) {
  1.1829 +  Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,empty,empty,empty> > impl =
  1.1830 +    Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6),R,TX,T1,T2,T3,T4,T5,T6,empty,empty> > (fnPtr, a);
  1.1831 +  return Callback<R,T1,T2,T3,T4,T5,T6> (impl);
  1.1832 +}
  1.1833 +template <typename R, typename TX, typename ARG,
  1.1834 +          typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7>
  1.1835 +Callback<R,T1,T2,T3,T4,T5,T6,T7> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7), ARG a) {
  1.1836 +  Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,empty,empty> > impl =
  1.1837 +    Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7),R,TX,T1,T2,T3,T4,T5,T6,T7,empty> > (fnPtr, a);
  1.1838 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7> (impl);
  1.1839 +}
  1.1840 +template <typename R, typename TX, typename ARG,
  1.1841 +          typename T1, typename T2,typename T3,typename T4,typename T5, typename T6, typename T7, typename T8>
  1.1842 +Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> MakeBoundCallback (R (*fnPtr) (TX,T1,T2,T3,T4,T5,T6,T7,T8), ARG a) {
  1.1843 +  Ptr<CallbackImpl<R,T1,T2,T3,T4,T5,T6,T7,T8,empty> > impl =
  1.1844 +    Create<BoundFunctorCallbackImpl<R (*) (TX,T1,T2,T3,T4,T5,T6,T7,T8),R,TX,T1,T2,T3,T4,T5,T6,T7,T8> > (fnPtr, a);
  1.1845 +  return Callback<R,T1,T2,T3,T4,T5,T6,T7,T8> (impl);
  1.1846 +}
  1.1847  } // namespace ns3
  1.1848  
  1.1849  namespace ns3 {
  1.1850  
  1.1851 -  class CallbackValue : public AttributeValue
  1.1852 -  {
  1.1853 -  public:
  1.1854 -    CallbackValue ();
  1.1855 -    CallbackValue (const CallbackBase &base);
  1.1856 -    virtual ~CallbackValue ();
  1.1857 -    void Set (CallbackBase base);
  1.1858 -    template <typename T>
  1.1859 -    bool GetAccessor (T &value) const;
  1.1860 -    virtual Ptr<AttributeValue> Copy (void) const;
  1.1861 -    virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
  1.1862 -    virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
  1.1863 -  private:
  1.1864 -    CallbackBase m_value;
  1.1865 -  };
  1.1866 +class CallbackValue : public AttributeValue
  1.1867 +{
  1.1868 +public:
  1.1869 +  CallbackValue ();
  1.1870 +  CallbackValue (const CallbackBase &base);
  1.1871 +  virtual ~CallbackValue ();
  1.1872 +  void Set (CallbackBase base);
  1.1873 +  template <typename T>
  1.1874 +  bool GetAccessor (T &value) const;
  1.1875 +  virtual Ptr<AttributeValue> Copy (void) const;
  1.1876 +  virtual std::string SerializeToString (Ptr<const AttributeChecker> checker) const;
  1.1877 +  virtual bool DeserializeFromString (std::string value, Ptr<const AttributeChecker> checker);
  1.1878 +private:
  1.1879 +  CallbackBase m_value;
  1.1880 +};
  1.1881  
  1.1882 -  ATTRIBUTE_ACCESSOR_DEFINE(Callback);
  1.1883 -  ATTRIBUTE_CHECKER_DEFINE (Callback);
  1.1884 +ATTRIBUTE_ACCESSOR_DEFINE(Callback);
  1.1885 +ATTRIBUTE_CHECKER_DEFINE (Callback);
  1.1886  
  1.1887  } // namespace ns3
  1.1888  
  1.1889  namespace ns3 {
  1.1890  
  1.1891 -  template <typename T>
  1.1892 -  bool CallbackValue::GetAccessor (T &value) const
  1.1893 -  {
  1.1894 -    if (value.CheckType (m_value))
  1.1895 -      {
  1.1896 -        value.Assign (m_value);
  1.1897 -        return true;
  1.1898 -      }
  1.1899 -    return false;
  1.1900 -  }
  1.1901 +template <typename T>
  1.1902 +bool CallbackValue::GetAccessor (T &value) const
  1.1903 +{
  1.1904 +  if (value.CheckType (m_value))
  1.1905 +    {
  1.1906 +      value.Assign (m_value);
  1.1907 +      return true;
  1.1908 +    }
  1.1909 +  return false;
  1.1910 +}
  1.1911  
  1.1912  } // namespace ns3
  1.1913  
     2.1 --- a/src/mih/mih-function.cc	Sun Nov 30 22:53:13 2008 +0100
     2.2 +++ b/src/mih/mih-function.cc	Mon Dec 01 09:22:24 2008 +0100
     2.3 @@ -230,7 +230,6 @@
     2.4            NS_ASSERT_MSG (configurationInformation.GetLinkDetectedConfigurationN () == 0 && 
     2.5                           configurationInformation.GetLinkConfigurationParameterN () == 0, 
     2.6                           "Additional configuration information is not supported yet!");
     2.7 -//           NS_ASSERT_MSG (FindMihLinkSap (linkIdentifier, mihLinkSapI), "Illegal MihLinkSap search!");
     2.8            EventList events (EventList::INVALID);
     2.9            if (!FindMihLinkSap (linkIdentifier, mihLinkSapI))
    2.10              {
     3.1 --- a/src/mih/mih-function.h	Sun Nov 30 22:53:13 2008 +0100
     3.2 +++ b/src/mih/mih-function.h	Mon Dec 01 09:22:24 2008 +0100
     3.3 @@ -151,7 +151,6 @@
     3.4                                           TransportSupportList transportSupports,
     3.5                                           MakeBeforeBreakSupportList makeBeforeBreakSupports,
     3.6                                           MihCapabilityDiscoverResponseCallback capabilityDiscoverResponseCallback);
     3.7 -      
     3.8      };
     3.9    } // namespace mih
    3.10  } // namespace ns3
     4.1 --- a/src/mih/mih-link-parameter-report.h	Sun Nov 30 22:53:13 2008 +0100
     4.2 +++ b/src/mih/mih-link-parameter-report.h	Mon Dec 01 09:22:24 2008 +0100
     4.3 @@ -23,12 +23,13 @@
     4.4  
     4.5  #include <vector>
     4.6  #include "ns3/ptr.h"
     4.7 +#include "ns3/ref-count-base.h"
     4.8  #include "mih-link-parameter.h"
     4.9  #include "mih-threshold.h"
    4.10  
    4.11  namespace ns3 {
    4.12    namespace mih {
    4.13 -    class LinkParameterReport {
    4.14 +    class LinkParameterReport : public RefCountBase {
    4.15      public:
    4.16        LinkParameterReport (Threshold threshold, 
    4.17                             LinkParameter *linkParameter);
     5.1 --- a/src/mih/mih-protocol.cc	Sun Nov 30 22:53:13 2008 +0100
     5.2 +++ b/src/mih/mih-protocol.cc	Mon Dec 01 09:22:24 2008 +0100
     5.3 @@ -24,6 +24,7 @@
     5.4  #include "mih-function.h"
     5.5  #include "mih-protocol.h"
     5.6  #include "mih-header.h"
     5.7 +#include "mih-remote-event-source-trap.h"
     5.8  
     5.9  NS_LOG_COMPONENT_DEFINE ("ns3::mih::MihProtocol");
    5.10  
    5.11 @@ -57,7 +58,11 @@
    5.12        return found;
    5.13      }
    5.14      Ptr<Session>
    5.15 -    MihProtocol::GetSession (MihfId fromMihfid, Address from, MihfId toMihfId, Address to, Ptr<Socket> serverSocket)
    5.16 +    MihProtocol::GetSession (MihfId fromMihfid,
    5.17 +                             Address from,
    5.18 +                             MihfId toMihfId, 
    5.19 +                             Address to, 
    5.20 +                             Ptr<Socket> serverSocket)
    5.21      {
    5.22        NS_LOG_WARN ("Arm a destructor event for this session!");
    5.23        SessionListI i;
    5.24 @@ -65,7 +70,11 @@
    5.25          {
    5.26            return (*i);
    5.27          }
    5.28 -      Ptr<Session> session = Create<Session> (fromMihfid, from, toMihfId, to, serverSocket);
    5.29 +      Ptr<Session> session = Create<Session> (fromMihfid, 
    5.30 +                                              from, 
    5.31 +                                              toMihfId,
    5.32 +                                              to,
    5.33 +                                              serverSocket);
    5.34        m_sessions.push_back (session);
    5.35        return session;
    5.36      }
    5.37 @@ -151,7 +160,43 @@
    5.38                    NS_ASSERT_MSG (0, "Not implemented yet!");
    5.39                    break;
    5.40                  case MihHeader::MIH_EVENT_SUBSCRIBE :
    5.41 -                  NS_ASSERT_MSG (0, "Not implemented yet!");
    5.42 +                  if (mihHeader.GetOpCode () == MihHeader::REQUEST)
    5.43 +                    {
    5.44 +                      LinkIdentifier linkIdentifier;
    5.45 +                      EventList events;
    5.46 +                      linkIdentifier.TlvDeserialize (buffer);
    5.47 +                      events.TlvDeserialize (buffer);
    5.48 +                      session = GetSession (toMihfId, Address (), fromMihfId, from, socket);
    5.49 +                      RemoteEventSourceTrap remoteEventSourceTrap = session->GetRemoteEventSourceTrap ();
    5.50 +
    5.51 +                      mihFunction->EventSubcribe (toMihfId,
    5.52 +                                                  linkIdentifier,
    5.53 +                                                  EventConfigurationInformation (),
    5.54 +                                                  events.GetEventList () & EventList::LINK_DETECTED ? EventList::LINK_DETECTED : EventList::INVALID,
    5.55 +                                                  events.GetEventList () & EventList::LINK_DETECTED ? MakeCallback (&RemoteEventSourceTrap::LinkDetected, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkDetectedInformation> (),
    5.56 +                                                  events.GetEventList () & EventList::LINK_UP ? EventList::LINK_UP : EventList::INVALID,
    5.57 +                                                  events.GetEventList () & EventList::LINK_UP ? MakeCallback (&RemoteEventSourceTrap::LinkUp, &remoteEventSourceTrap): MakeNullCallback<void, MihfId, LinkIdentifier, Address, Address, bool, MobilityManagementSupport> (),
    5.58 +                                                  events.GetEventList () & EventList::LINK_DOWN ? EventList::LINK_DOWN : EventList::INVALID,
    5.59 +                                                  events.GetEventList () & EventList::LINK_DOWN ? MakeCallback (&RemoteEventSourceTrap::LinkDown, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, Address, LinkDownReason> (),
    5.60 +                                                  events.GetEventList () & EventList::LINK_PARAMETERS_REPORT ? EventList::LINK_PARAMETERS_REPORT : EventList::INVALID,
    5.61 +                                                  events.GetEventList () & EventList::LINK_PARAMETERS_REPORT ? MakeCallback (&RemoteEventSourceTrap::LinkParametersReport, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, Address, LinkDownReason> (),
    5.62 +                                                  events.GetEventList () & EventList::LINK_GOING_DOWN ? EventList::LINK_GOING_DOWN : EventList::INVALID,
    5.63 +                                                  events.GetEventList () & EventList::LINK_GOING_DOWN ? MakeCallback (&RemoteEventSourceTrap::LinkGoingDown, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, uint64_t, LinkGoingDownReason> (),
    5.64 +                                                  events.GetEventList () & EventList::LINK_HANDOVER_IMMINENT ? EventList::LINK_HANDOVER_IMMINENT : EventList::INVALID,
    5.65 +                                                  events.GetEventList () & EventList::LINK_HANDOVER_IMMINENT ? MakeCallback (&RemoteEventSourceTrap::LinkHandoverImminent, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, LinkIdentifier, Address, Address> (),
    5.66 +                                                  events.GetEventList () & EventList::LINK_HANDOVER_COMPLETE ? EventList::LINK_HANDOVER_COMPLETE : EventList::INVALID,
    5.67 +                                                  events.GetEventList () & EventList::LINK_HANDOVER_COMPLETE ? MakeCallback (&RemoteEventSourceTrap::LinkHandoverComplete, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, LinkIdentifier, Address, Address, Status> (),
    5.68 +                                                  events.GetEventList () & EventList::LINK_PDU_TRANSMIT_STATUS ? EventList::LINK_PDU_TRANSMIT_STATUS : EventList::INVALID,
    5.69 +                                                  events.GetEventList () & EventList::LINK_PDU_TRANSMIT_STATUS ? MakeCallback (&RemoteEventSourceTrap::LinkPduTxStatus, &remoteEventSourceTrap) : MakeNullCallback<void, MihfId, LinkIdentifier, uint16_t, bool> (),
    5.70 +                                                  session->ReceiveEventSubscribeRequest (packet, mihHeader.GetTransactionId ()));
    5.71 +                    }
    5.72 +                  else if (mihHeader.GetOpCode () == MihHeader::RESPONSE)
    5.73 +                    {
    5.74 +                    }
    5.75 +                  else
    5.76 +                    {
    5.77 +                      NS_ASSERT_MSG (0, "Illegal MihHeader::MIH_EVENT_SUBSCRIBE opcode!");
    5.78 +                    }
    5.79                    break;
    5.80                  case MihHeader::MIH_EVENT_UNSUBSCRIBE :
    5.81                    NS_ASSERT_MSG (0, "Not implemented yet!");
    5.82 @@ -200,7 +245,10 @@
    5.83                        miisQueries.TlvDeserialize (buffer);
    5.84                        transportOptions.TlvDeserialize (buffer);
    5.85                        TlvDeserialize (buffer, mbbSupportList);
    5.86 -                      session = GetSession (toMihfId, Address (), fromMihfId, from);
    5.87 +                      session = GetSession (toMihfId, 
    5.88 +                                            Address (), 
    5.89 +                                            fromMihfId,
    5.90 +                                            from);
    5.91                        NS_ASSERT_MSG (session != 0, "An error occured while retrieving a session!");
    5.92                        session->ReceiveCapabilityDiscoverResponse (fromMihfId,
    5.93                                                                    status,
    5.94 @@ -406,8 +454,50 @@
    5.95        NS_ASSERT_MSG (configurationInformation.GetLinkDetectedConfigurationN () == 0 && 
    5.96                       configurationInformation.GetLinkConfigurationParameterN () == 0, 
    5.97                       "Additional configuration information is not supported yet!");
    5.98 -      
    5.99 +      MihfId selfMihfid = GetObject<MihFunction> ()->GetMihfId ();
   5.100 +      Buffer buffer;
   5.101 +      Address to = ResolveMihfIdToAddress (destinationIdentifier);
   5.102 +      Address from = ResolveMihfIdToAddress (selfMihfid);
   5.103 +      Ptr<Packet> packet;
   5.104 +      Ptr<Session> session;
   5.105 +      // Mih Event List to send in the request;
   5.106 +      EventList events (EventList::INVALID);
   5.107 +      events.SetEventList (events.GetEventList () | linkDetectedEventType1);
   5.108 +      events.SetEventList (events.GetEventList () | linkUpEventType2);
   5.109 +      events.SetEventList (events.GetEventList () | linkDownEventType3);
   5.110 +      events.SetEventList (events.GetEventList () | linkParamReportEventType4);
   5.111 +      events.SetEventList (events.GetEventList () | linkGoingDownEventType5);
   5.112 +      events.SetEventList (events.GetEventList () | linkHOImminentEventType6);
   5.113 +      events.SetEventList (events.GetEventList () | linkHOCompleteEventType7);
   5.114 +      events.SetEventList (events.GetEventList () | linkPduTxStatusEventType8);
   5.115 +      // Create room at start of buffer;
   5.116 +      buffer.AddAtStart (selfMihfid.GetTlvSerializedSize () +
   5.117 +                         destinationIdentifier.GetTlvSerializedSize () + 
   5.118 +                         linkIdentifier.GetTlvSerializedSize () + 
   5.119 +                         events.GetTlvSerializedSize ()); // Option
   5.120 +                                                          // event
   5.121 +                                                          // configuration
   5.122 +                                                          // info list
   5.123 +                                                          // left aside.
   5.124 +      // TLV-Serialize in buffer;
   5.125 +      selfMihfid.TlvSerialize (buffer);
   5.126 +      destinationIdentifier.TlvSerialize (buffer);
   5.127 +      linkIdentifier.TlvSerialize (buffer);
   5.128 +      events.TlvSerialize (buffer);
   5.129 +      // Fill the packet with payload from buffer;
   5.130 +      packet = Create<Packet> (buffer.PeekData (), buffer.GetSize ());
   5.131 +      session = GetSession (selfMihfid, from, destinationIdentifier, to);
   5.132 +      session->SendEventSubscribe (packet, 
   5.133 +                                   events, 
   5.134 +                                   linkDetectedEventCallback1,
   5.135 +                                   linkUpEventCallback2,
   5.136 +                                   linkDownEventCallback3,
   5.137 +                                   linkParamReportEventCallback4,
   5.138 +                                   linkGoingDownEventCallback5,
   5.139 +                                   linkHOImminentEventCallback6,
   5.140 +                                   linkHOCompleteEventCallback7,
   5.141 +                                   linkPduTxStatusEventCallback8,
   5.142 +                                   subscribeConfirmCallback);
   5.143      }
   5.144 -    
   5.145    } // namespace mih
   5.146  } // namespace ns3
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/src/mih/mih-remote-event-destination-trap.cc	Mon Dec 01 09:22:24 2008 +0100
     6.3 @@ -0,0 +1,203 @@
     6.4 +/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */            
     6.5 +/*
     6.6 + * Copyright (c) 2008 IT-SUDPARIS
     6.7 + *
     6.8 + * This program is free software; you can redistribute it and/or modify
     6.9 + * it under the terms of the GNU General Public License version 2 as
    6.10 + * published by the Free Software Foundation;
    6.11 + *
    6.12 + * This program is distributed in the hope that it will be useful,
    6.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    6.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    6.15 + * GNU General Public License for more details.
    6.16 + *
    6.17 + * You should have received a copy of the GNU General Public License
    6.18 + * along with this program; if not, write to the Free Software
    6.19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    6.20 + *
    6.21 + * Author: Providence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
    6.22 + */
    6.23 +
    6.24 +#include "mih-remote-event-destination-trap.h"
    6.25 +
    6.26 +namespace ns3 {
    6.27 +  namespace mih {
    6.28 +    RemoteEventDestinationTrap::RemoteEventDestinationTrap (void)
    6.29 +    {
    6.30 +    }
    6.31 +    // AddRemove callback methods;
    6.32 +    void 
    6.33 +    RemoteEventDestinationTrap::AddLinkDetectedCallback (MihLinkDetectedIndicationCallback linkDetectedCb)
    6.34 +    {
    6.35 +      m_linkDetectedIndication.ConnectWithoutContext (linkDetectedCb);
    6.36 +    }
    6.37 +    void
    6.38 +    RemoteEventDestinationTrap::RemoveLinkDetectedCallback (MihLinkDetectedIndicationCallback linkDetectedCb)
    6.39 +    {
    6.40 +      m_linkDetectedIndication.DisconnectWithoutContext (linkDetectedCb);
    6.41 +    }
    6.42 +    void
    6.43 +    RemoteEventDestinationTrap::AddLinkUpCallback (MihLinkUpIndicationCallback linkUpCb)
    6.44 +    {
    6.45 +      m_linkUpIndication.ConnectWithoutContext (linkUpCb);
    6.46 +    }
    6.47 +    void
    6.48 +    RemoteEventDestinationTrap::RemoveLinkUpCallback (MihLinkUpIndicationCallback linkUpCb)
    6.49 +    {
    6.50 +      m_linkUpIndication.DisconnectWithoutContext (linkUpCb);
    6.51 +    }
    6.52 +    void
    6.53 +    RemoteEventDestinationTrap::AddLinkDownCallback (MihLinkDownIndicationCallback linkDownCb)
    6.54 +    {
    6.55 +      m_linkDownIndication.ConnectWithoutContext (linkDownCb);
    6.56 +    }
    6.57 +    void
    6.58 +    RemoteEventDestinationTrap::RemoveLinkDownCallback (MihLinkDownIndicationCallback linkDownCb)
    6.59 +    {
    6.60 +      m_linkDownIndication.DisconnectWithoutContext (linkDownCb);
    6.61 +    }
    6.62 +    void
    6.63 +    RemoteEventDestinationTrap::AddLinkParamatersReportCallback (MihLinkParametersReportIndicationCallback parametersReportCb)
    6.64 +    {
    6.65 +      m_linkParametersReportIndication.ConnectWithoutContext (parametersReportCb);
    6.66 +    }
    6.67 +    void
    6.68 +    RemoteEventDestinationTrap::RemoveLinkParametersReportCallback (MihLinkParametersReportIndicationCallback parametersReportCb)
    6.69 +    {
    6.70 +      m_linkParametersReportIndication.DisconnectWithoutContext (parametersReportCb);
    6.71 +    }
    6.72 +    void
    6.73 +    RemoteEventDestinationTrap::AddLinkGoingDownCallback (MihLinkGoingDownIndicationCallback linkGoingDownCb)
    6.74 +    {
    6.75 +      m_linkGoingDownIndication.ConnectWithoutContext (linkGoingDownCb);
    6.76 +    }
    6.77 +    void
    6.78 +    RemoteEventDestinationTrap::RemoveLinkGoingDownCallback (MihLinkGoingDownIndicationCallback linkGoingDownCb)
    6.79 +    {
    6.80 +      m_linkGoingDownIndication.DisconnectWithoutContext (linkGoingDownCb);
    6.81 +    }
    6.82 +    void
    6.83 +    RemoteEventDestinationTrap::AddLinkHandoverImminentCallback (MihLinkHandoverImminentIndicationCallback linkHOImminentCb)
    6.84 +    {
    6.85 +      m_linkHandoverImminentIndication.ConnectWithoutContext (linkHOImminentCb);
    6.86 +    }
    6.87 +    void 
    6.88 +    RemoteEventDestinationTrap::RemoveLinkHandoverImminentCallback (MihLinkHandoverImminentIndicationCallback linkHOImminentCb)
    6.89 +    {
    6.90 +      m_linkHandoverImminentIndication.DisconnectWithoutContext (linkHOImminentCb);
    6.91 +    }
    6.92 +    void
    6.93 +    RemoteEventDestinationTrap::AddLinkHandoverCompleteCallback (MihLinkHandoverCompleteIndicationCallback linkHOCompleteCb)
    6.94 +    {
    6.95 +      m_linkHandoverCompleteIndication.ConnectWithoutContext (linkHOCompleteCb);
    6.96 +    }
    6.97 +    void
    6.98 +    RemoteEventDestinationTrap::RemoveLinkHandoverCompleteCallback (MihLinkHandoverCompleteIndicationCallback linkHOCompleteCb)
    6.99 +    {
   6.100 +      m_linkHandoverCompleteIndication.DisconnectWithoutContext (linkHOCompleteCb);
   6.101 +    }
   6.102 +    void
   6.103 +    RemoteEventDestinationTrap::AddLinkPduTxStatusCallback (MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusCb)
   6.104 +    {
   6.105 +      m_linkPduTransmitStatusIndication.ConnectWithoutContext (linkPduTxStatusCb);
   6.106 +    }
   6.107 +    void
   6.108 +    RemoteEventDestinationTrap::RemoveLinkPduTxStatusCallback (MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusCb)
   6.109 +    {
   6.110 +      m_linkPduTransmitStatusIndication.DisconnectWithoutContext (linkPduTxStatusCb);
   6.111 +
   6.112 +    }
   6.113 +    // Callback accessors;
   6.114 +    void
   6.115 +    RemoteEventDestinationTrap::LinkDetected (MihfId mihfId,
   6.116 +					      LinkDetectedInformation linkDetectedInfo)
   6.117 +    {
   6.118 +      m_linkDetectedIndication (mihfId, linkDetectedInfo);
   6.119 +    }
   6.120 +    void
   6.121 +    RemoteEventDestinationTrap::LinkUp (MihfId mihfId, 
   6.122 +					LinkIdentifier linkIdentifier,
   6.123 +					Address oldAR,
   6.124 +					Address newAR, 
   6.125 +					bool ipRenewalFlag, 
   6.126 +					MobilityManagementSupport mobilitySupport)
   6.127 +    {
   6.128 +      m_linkUpIndication (mihfId,
   6.129 +			  linkIdentifier,
   6.130 +			  oldAR,
   6.131 +			  newAR,
   6.132 +			  ipRenewalFlag,
   6.133 +			  mobilitySupport);
   6.134 +    }
   6.135 +    void
   6.136 +    RemoteEventDestinationTrap::LinkDown (MihfId mihfId, 
   6.137 +					  LinkIdentifier linkIdentifier,
   6.138 +					  Address oldAR, 
   6.139 +					  LinkDownReason reasonCode)
   6.140 +    {
   6.141 +      m_linkDownIndication (mihfId,
   6.142 +			    linkIdentifier,
   6.143 +			    oldAR,
   6.144 +			    reasonCode);
   6.145 +    }
   6.146 +    void
   6.147 +    RemoteEventDestinationTrap::LinkParametersReport (MihfId mihfId,
   6.148 +						      LinkIdentifier linkIdentifier,
   6.149 +						      LinkParameterReportList params)
   6.150 +    {
   6.151 +      m_linkParametersReportIndication (mihfId,
   6.152 +					linkIdentifier,
   6.153 +					params);
   6.154 +    }
   6.155 +    void
   6.156 +    RemoteEventDestinationTrap::LinkGoingDown (MihfId mihfId,
   6.157 +					       LinkIdentifier linkIdentifier, 
   6.158 +					       uint64_t timeInterval,
   6.159 +					       LinkGoingDownReason reasonCode)
   6.160 +    {
   6.161 +      m_linkGoingDownIndication (mihfId,
   6.162 +				 linkIdentifier,
   6.163 +				 timeInterval,
   6.164 +				 reasonCode);
   6.165 +    }
   6.166 +    void
   6.167 +    RemoteEventDestinationTrap::LinkHandoverImminent (MihfId mihfId, 
   6.168 +						      LinkIdentifier oldLinkIdentifier, 
   6.169 +						      LinkIdentifier newLinkidentifier,
   6.170 +						      Address oldAR, 
   6.171 +						      Address newAR)
   6.172 +    {
   6.173 +      m_linkHandoverImminentIndication (mihfId,
   6.174 +					oldLinkIdentifier,
   6.175 +					newLinkidentifier,
   6.176 +					oldAR,
   6.177 +					newAR);
   6.178 +    }
   6.179 +    void
   6.180 +    RemoteEventDestinationTrap::LinkHandoverComplete (MihfId mihfId, 
   6.181 +						      LinkIdentifier oldLinkIdentifier, 
   6.182 +						      LinkIdentifier newLinkIdentifier,
   6.183 +						      Address oldAR, 
   6.184 +						      Address newAR,
   6.185 +						      Status handoverStatus)
   6.186 +    {
   6.187 +      m_linkHandoverCompleteIndication (mihfId,
   6.188 +					oldLinkIdentifier,
   6.189 +					newLinkIdentifier,
   6.190 +					oldAR,
   6.191 +					newAR,
   6.192 +					handoverStatus);
   6.193 +    }
   6.194 +    void
   6.195 +    RemoteEventDestinationTrap::LinkPduTxStatus (MihfId mihfId, 
   6.196 +						 LinkIdentifier linkIdentifier, 
   6.197 +						 uint16_t packetIdentifier,
   6.198 +						 bool transmissionStatus) 
   6.199 +    {
   6.200 +      m_linkPduTransmitStatusIndication (mihfId,
   6.201 +					 linkIdentifier,
   6.202 +					 packetIdentifier,
   6.203 +					 transmissionStatus);
   6.204 +    }
   6.205 +  }
   6.206 +}
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/src/mih/mih-remote-event-destination-trap.h	Mon Dec 01 09:22:24 2008 +0100
     7.3 @@ -0,0 +1,98 @@
     7.4 +/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */            
     7.5 +/*
     7.6 + * Copyright (c) 2008 IT-SUDPARIS
     7.7 + *
     7.8 + * This program is free software; you can redistribute it and/or modify
     7.9 + * it under the terms of the GNU General Public License version 2 as 
    7.10 + * published by the Free Software Foundation;
    7.11 + *
    7.12 + * This program is distributed in the hope that it will be useful,
    7.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    7.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    7.15 + * GNU General Public License for more details.
    7.16 + *
    7.17 + * You should have received a copy of the GNU General Public License
    7.18 + * along with this program; if not, write to the Free Software
    7.19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    7.20 + *
    7.21 + * Author: Providence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
    7.22 + */
    7.23 +
    7.24 +#ifndef   	MIH_REMOTE_EVENT_DESTINATION_TRAP_H
    7.25 +#define   	MIH_REMOTE_EVENT_DESTINATION_TRAP_H
    7.26 +
    7.27 +#include "ns3/ref-count-base.h"
    7.28 +#include "mih-callbacks.h"
    7.29 +
    7.30 +namespace ns3 {
    7.31 +  namespace mih {
    7.32 +    class RemoteEventDestinationTrap : public RefCountBase {
    7.33 +    public:
    7.34 +      RemoteEventDestinationTrap (void);
    7.35 +      // AddRemove callback methods;
    7.36 +      void AddLinkDetectedCallback (MihLinkDetectedIndicationCallback linkDetectedCb);
    7.37 +      void RemoveLinkDetectedCallback (MihLinkDetectedIndicationCallback linkDetectedCb);
    7.38 +      void AddLinkUpCallback (MihLinkUpIndicationCallback linkUpCb);
    7.39 +      void RemoveLinkUpCallback (MihLinkUpIndicationCallback linkUpCb);
    7.40 +      void AddLinkDownCallback (MihLinkDownIndicationCallback linkDownCb);
    7.41 +      void RemoveLinkDownCallback (MihLinkDownIndicationCallback linkDownCb);
    7.42 +      void AddLinkParamatersReportCallback (MihLinkParametersReportIndicationCallback parametersReportCb);
    7.43 +      void RemoveLinkParametersReportCallback (MihLinkParametersReportIndicationCallback parametersReportCb);
    7.44 +      void AddLinkGoingDownCallback (MihLinkGoingDownIndicationCallback linkGoingDownCb);
    7.45 +      void RemoveLinkGoingDownCallback (MihLinkGoingDownIndicationCallback linkGoingDownCb);
    7.46 +      void AddLinkHandoverImminentCallback (MihLinkHandoverImminentIndicationCallback linkHOImminentCb);
    7.47 +      void RemoveLinkHandoverImminentCallback (MihLinkHandoverImminentIndicationCallback linkHOImminentCb);
    7.48 +      void AddLinkHandoverCompleteCallback (MihLinkHandoverCompleteIndicationCallback linkHOCompleteCb);
    7.49 +      void RemoveLinkHandoverCompleteCallback (MihLinkHandoverCompleteIndicationCallback linkHOCompleteCb);
    7.50 +      void AddLinkPduTxStatusCallback (MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusCb);
    7.51 +      void RemoveLinkPduTxStatusCallback (MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusCb);
    7.52 +      // Callback accessors;
    7.53 +      void LinkDetected (MihfId mihfId, 
    7.54 +			 LinkDetectedInformation linkDetectedInfo);
    7.55 +      void LinkUp (MihfId mihfId, 
    7.56 +		   LinkIdentifier linkIdentifier, 
    7.57 +		   Address oldAR, 
    7.58 +		   Address newAR, 
    7.59 +		   bool ipRenewalFlag,
    7.60 +		   MobilityManagementSupport mobilitySupport);
    7.61 +      void LinkDown (MihfId mihfId, 
    7.62 +		     LinkIdentifier linkIdentifier, 
    7.63 +		     Address oldAR, 
    7.64 +		     LinkDownReason reasonCode);
    7.65 +      void LinkParametersReport (MihfId mihfId,
    7.66 +				 LinkIdentifier linkIdentifier,
    7.67 +				 LinkParameterReportList params);
    7.68 +      void LinkGoingDown (MihfId mihfId, 
    7.69 +			  LinkIdentifier linkIdentifier, 
    7.70 +			  uint64_t timeInterval, 
    7.71 +			  LinkGoingDownReason reasonCode);
    7.72 +      void LinkHandoverImminent (MihfId mihfId, 
    7.73 +				 LinkIdentifier oldLinkIdentifier,
    7.74 +				 LinkIdentifier newLinkidentifier, 
    7.75 +				 Address oldAR, 
    7.76 +				 Address newAR);
    7.77 +      void LinkHandoverComplete (MihfId mihfId, 
    7.78 +				 LinkIdentifier oldLinkIdentifier, 
    7.79 +				 LinkIdentifier newLinkIdentifier,
    7.80 +				 Address oldAR, 
    7.81 +				 Address newAR, 
    7.82 +				 Status handoverStatus);
    7.83 +      void LinkPduTxStatus (MihfId mihfId, 
    7.84 +			    LinkIdentifier linkIdentifier, 
    7.85 +			    uint16_t packetIdentifier, 
    7.86 +			    bool transmissionStatus);
    7.87 +      
    7.88 +    protected:
    7.89 +      MihLinkDetectedIndicationTracedCallback m_linkDetectedIndication;
    7.90 +      MihLinkUpIndicationTracedCallback m_linkUpIndication;
    7.91 +      MihLinkDownIndicationTracedCallback m_linkDownIndication;
    7.92 +      MihLinkParametersReportIndicationTracedCallback m_linkParametersReportIndication;
    7.93 +      MihLinkGoingDownIndicationTracedCallback m_linkGoingDownIndication;
    7.94 +      MihLinkHandoverImminentIndicationTracedCallback m_linkHandoverImminentIndication;
    7.95 +      MihLinkHandoverCompleteIndicationTracedCallback m_linkHandoverCompleteIndication;
    7.96 +      MihLinkPduTransmitStatusIndicationTracedCallback m_linkPduTransmitStatusIndication;
    7.97 +    };
    7.98 +  }
    7.99 +}
   7.100 +
   7.101 +#endif 	    /* !MIH_REMOTE_EVENT_DESTINATION_TRAP_H */
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/src/mih/mih-remote-event-source-trap.cc	Mon Dec 01 09:22:24 2008 +0100
     8.3 @@ -0,0 +1,98 @@
     8.4 +/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */            
     8.5 +/*
     8.6 + * Copyright (c) 2008 IT-SUDPARIS
     8.7 + *
     8.8 + * This program is free software; you can redistribute it and/or modify
     8.9 + * it under the terms of the GNU General Public License version 2 as
    8.10 + * published by the Free Software Foundation;
    8.11 + *
    8.12 + * This program is distributed in the hope that it will be useful,
    8.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    8.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    8.15 + * GNU General Public License for more details.
    8.16 + *
    8.17 + * You should have received a copy of the GNU General Public License
    8.18 + * along with this program; if not, write to the Free Software
    8.19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    8.20 + *
    8.21 + * Author: Providence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
    8.22 + */
    8.23 +
    8.24 +#include "mih-session.h"
    8.25 +#include "mih-remote-event-source-trap.h"
    8.26 +
    8.27 +namespace ns3 {
    8.28 +  namespace mih {
    8.29 +    RemoteEventSourceTrap::RemoteEventSourceTrap (void)
    8.30 +    {}
    8.31 +    RemoteEventSourceTrap::~RemoteEventSourceTrap (void)
    8.32 +    {
    8.33 +      m_session = 0;
    8.34 +    }
    8.35 +    void 
    8.36 +    RemoteEventSourceTrap::SetSession (Ptr<Session> session)
    8.37 +    {
    8.38 +      m_session = session;
    8.39 +    }
    8.40 +      // Callback accessors;
    8.41 +    void 
    8.42 +    RemoteEventSourceTrap::LinkDetected (MihfId, 
    8.43 +					 LinkDetectedInformation)
    8.44 +    {
    8.45 +      
    8.46 +    }
    8.47 +    void 
    8.48 +    RemoteEventSourceTrap::LinkUp (MihfId,
    8.49 +				   LinkIdentifier, 
    8.50 +				   Address,
    8.51 +				   Address, 
    8.52 +				   bool, 
    8.53 +				   MobilityManagementSupport)
    8.54 +    {
    8.55 +    }
    8.56 +    void
    8.57 +    RemoteEventSourceTrap::LinkDown (MihfId, 
    8.58 +				     LinkIdentifier,
    8.59 +				     Address,
    8.60 +				     LinkDownReason)
    8.61 +    {
    8.62 +    }
    8.63 +    void
    8.64 +    RemoteEventSourceTrap::LinkParametersReport (MihfId, 
    8.65 +						 LinkIdentifier, 
    8.66 +						 LinkParameterReportList)
    8.67 +    {
    8.68 +    }
    8.69 +    void
    8.70 +    RemoteEventSourceTrap::LinkGoingDown (MihfId, 
    8.71 +					  LinkIdentifier,
    8.72 +					  uint64_t,
    8.73 +					  LinkGoingDownReason)
    8.74 +    {
    8.75 +    }
    8.76 +    void 
    8.77 +    RemoteEventSourceTrap::LinkHandoverImminent (MihfId,
    8.78 +						 LinkIdentifier,
    8.79 +						 LinkIdentifier, 
    8.80 +						 Address, 
    8.81 +						 Address)
    8.82 +    {
    8.83 +    }
    8.84 +    void
    8.85 +    RemoteEventSourceTrap::LinkHandoverComplete (MihfId, 
    8.86 +						 LinkIdentifier, 
    8.87 +						      LinkIdentifier, 
    8.88 +						 Address, 
    8.89 +						 Address, 
    8.90 +						 Status)
    8.91 +    {
    8.92 +    }
    8.93 +    void
    8.94 +    RemoteEventSourceTrap::LinkPduTxStatus (MihfId, 
    8.95 +					    LinkIdentifier,
    8.96 +					    uint16_t, 
    8.97 +					    bool)
    8.98 +    {
    8.99 +    }
   8.100 +  }
   8.101 +}
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/src/mih/mih-remote-event-source-trap.h	Mon Dec 01 09:22:24 2008 +0100
     9.3 @@ -0,0 +1,79 @@
     9.4 +/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */            
     9.5 +/*
     9.6 + * Copyright (c) 2008 IT-SUDPARIS
     9.7 + *
     9.8 + * This program is free software; you can redistribute it and/or modify
     9.9 + * it under the terms of the GNU General Public License version 2 as 
    9.10 + * published by the Free Software Foundation;
    9.11 + *
    9.12 + * This program is distributed in the hope that it will be useful,
    9.13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    9.14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    9.15 + * GNU General Public License for more details.
    9.16 + *
    9.17 + * You should have received a copy of the GNU General Public License
    9.18 + * along with this program; if not, write to the Free Software
    9.19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    9.20 + *
    9.21 + * Author: Providence SALUMU M. <Providence.Salumu_Munga@it-sudparis.eu>
    9.22 + */
    9.23 +
    9.24 +#ifndef   	MIH_REMOTE_EVENT_SOURCE_TRAP_H
    9.25 +#define   	MIH_REMOTE_EVENT_SOURCE_TRAP_H
    9.26 +
    9.27 +#include "ns3/ptr.h"
    9.28 +#include "ns3/ref-count-base.h"
    9.29 +#include "mih-callbacks.h"
    9.30 +
    9.31 +namespace ns3 {
    9.32 +  namespace mih {
    9.33 +    
    9.34 +    class Session;
    9.35 +    
    9.36 +    class RemoteEventSourceTrap : public RefCountBase {
    9.37 +    public:
    9.38 +      RemoteEventSourceTrap (void);
    9.39 +      virtual ~RemoteEventSourceTrap (void);
    9.40 +      void SetSession (Ptr<Session> session);
    9.41 +      // Callback accessors;
    9.42 +      void LinkDetected (MihfId, 
    9.43 +			 LinkDetectedInformation);
    9.44 +      void LinkUp (MihfId,
    9.45 +		   LinkIdentifier, 
    9.46 +		   Address,
    9.47 +		   Address, 
    9.48 +		   bool, 
    9.49 +		   MobilityManagementSupport);
    9.50 +      void LinkDown (MihfId, 
    9.51 +		     LinkIdentifier,
    9.52 +		     Address,
    9.53 +		     LinkDownReason);
    9.54 +      void LinkParametersReport (MihfId, 
    9.55 +				 LinkIdentifier, 
    9.56 +				 LinkParameterReportList);
    9.57 +      void LinkGoingDown (MihfId, 
    9.58 +			  LinkIdentifier,
    9.59 +			  uint64_t,
    9.60 +			  LinkGoingDownReason);
    9.61 +      void LinkHandoverImminent (MihfId,
    9.62 +				 LinkIdentifier,
    9.63 +				 LinkIdentifier, 
    9.64 +				 Address, 
    9.65 +				 Address);
    9.66 +      void LinkHandoverComplete (MihfId, 
    9.67 +				 LinkIdentifier, 
    9.68 +				 LinkIdentifier, 
    9.69 +				 Address, 
    9.70 +				 Address, 
    9.71 +				 Status);
    9.72 +      void LinkPduTxStatus (MihfId, 
    9.73 +			    LinkIdentifier,
    9.74 +			    uint16_t, 
    9.75 +			    bool);
    9.76 +    protected:
    9.77 +      Ptr<Session> m_session;
    9.78 +    };
    9.79 +  }
    9.80 +}
    9.81 +
    9.82 +#endif 	    /* !MIH_REMOTE_EVENT_SOURCE_TRAP_H */
    10.1 --- a/src/mih/mih-session.cc	Sun Nov 30 22:53:13 2008 +0100
    10.2 +++ b/src/mih/mih-session.cc	Mon Dec 01 09:22:24 2008 +0100
    10.3 @@ -111,6 +111,17 @@
    10.4            m_socket->SendTo (m_currentTransaction->GetPacket (), 0, m_destinationInetSocketAddress);
    10.5          }
    10.6      }
    10.7 +      // Remote events access methods;
    10.8 +    RemoteEventSourceTrap&
    10.9 +    Session::GetRemoteEventSourceTrap (void)
   10.10 +    {
   10.11 +      return m_remoteEventSourceTrap;
   10.12 +    }
   10.13 +    RemoteEventDestinationTrap& 
   10.14 +    Session::GetRemoteEventDestinationTrap (void)
   10.15 +    {
   10.16 +      return m_remoteEventDestinationTrap;
   10.17 +    }
   10.18      void 
   10.19      Session::SendRegisterRequest (Ptr<Packet> packet, 
   10.20  				  MihRegisterConfirmCallback registerConfirmCallback)
   10.21 @@ -233,5 +244,67 @@
   10.22        transaction->SetState (Transaction::SUCCESS);
   10.23        transaction->SetToBeDeleted ();
   10.24      }
   10.25 +    void
   10.26 +    Session::SendEventSubscribe (Ptr<Packet> packet,
   10.27 +                                 EventList events,
   10.28 +                                 MihLinkDetectedIndicationCallback linkDetectedEventCallback1,
   10.29 +                                 MihLinkUpIndicationCallback linkUpEventCallback2,
   10.30 +                                 MihLinkDownIndicationCallback linkDownEventCallback3,
   10.31 +                                 MihLinkParametersReportIndicationCallback linkParamReportEventCallback4,
   10.32 +                                 MihLinkGoingDownIndicationCallback linkGoingDownEventCallback5,
   10.33 +                                 MihLinkHandoverImminentIndicationCallback linkHOImminentEventCallback6,
   10.34 +                                 MihLinkHandoverCompleteIndicationCallback linkHOCompleteEventCallback7,
   10.35 +                                 MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusEventCallback8,
   10.36 +                                 MihEventSubscribeConfirmCallback subscribeConfirmCallback)
   10.37 +    {
   10.38 +      MihHeader mihHeader;
   10.39 +      uint16_t transactionId = m_nextTransactionId;
   10.40 +      m_nextTransactionId++;
   10.41 +      mihHeader.SetVersion (MihHeader::VERSION_ONE);
   10.42 +      mihHeader.SetServiceId (MihHeader::COMMAND);
   10.43 +      mihHeader.SetOpCode (MihHeader::REQUEST);
   10.44 +      mihHeader.SetActionId (MihHeader::MIH_EVENT_SUBSCRIBE);
   10.45 +      mihHeader.SetTransactionId (transactionId);
   10.46 +      mihHeader.SetPayloadLength (packet->GetSize ());
   10.47 +      packet->AddHeader (mihHeader);
   10.48 +
   10.49 +      Ptr<EventSubscribeRequestTransaction> eventSubscribeRequestTransaction = Create<EventSubscribeRequestTransaction> (packet,
   10.50 +                                                                                                                         GetFromMihfId (), 
   10.51 +                                                                                                                         GetToMihfId (), 
   10.52 +                                                                                                                         GetToAddress (), 
   10.53 +                                                                                                                         transactionId,
   10.54 +                                                                                                                         subscribeConfirmCallback);
   10.55 +      
   10.56 +      eventSubscribeRequestTransaction->SetNotifyDoneCallback (MakeCallback (&Session::NotifyPendingCurrentRequestDone, this));
   10.57 +      m_pendingRequestQueue.push_back (eventSubscribeRequestTransaction);
   10.58 +
   10.59 +      // Fill RemoteEventDestinationTrap;
   10.60 +      m_remoteEventDestinationTrap.AddLinkDetectedCallback (linkDetectedEventCallback1);
   10.61 +      m_remoteEventDestinationTrap.AddLinkUpCallback (linkUpEventCallback2);
   10.62 +      m_remoteEventDestinationTrap.AddLinkDownCallback (linkDownEventCallback3) ;
   10.63 +      m_remoteEventDestinationTrap.AddLinkParamatersReportCallback (linkParamReportEventCallback4) ;
   10.64 +      m_remoteEventDestinationTrap.AddLinkGoingDownCallback (linkGoingDownEventCallback5) ;
   10.65 +      m_remoteEventDestinationTrap.AddLinkHandoverImminentCallback (linkHOImminentEventCallback6) ;
   10.66 +      m_remoteEventDestinationTrap.AddLinkHandoverCompleteCallback (linkHOCompleteEventCallback7) ;
   10.67 +      m_remoteEventDestinationTrap.AddLinkPduTxStatusCallback (linkPduTxStatusEventCallback8) ;
   10.68 +
   10.69 +      NotifyNewPendingRequest ();
   10.70 +    }
   10.71 +    MihEventSubscribeConfirmCallback 
   10.72 +    Session::ReceiveEventSubscribeRequest (Ptr<Packet> packet, 
   10.73 +                                           uint16_t transactionId)
   10.74 +    {
   10.75 +      Ptr<EventSubscribeResponseTransaction> eventSubscribeResponseTransaction = Create<EventSubscribeResponseTransaction> (packet,
   10.76 +                                                                                                                            GetFromMihfId (), 
   10.77 +                                                                                                                            GetToMihfId (), 
   10.78 +                                                                                                                            GetToAddress (), 
   10.79 +                                                                                                                            transactionId,
   10.80 +                                                                                                                            m_socket);
   10.81 +      eventSubscribeResponseTransaction->SetNotifyDoneCallback (MakeCallback (&Session::NotifyPendingResponseDone, this));
   10.82 +      NS_ASSERT_MSG (m_pendingResponseTransaction == 0, "Received Request while a pending Response is in the queue!");
   10.83 +      m_pendingResponseTransaction = eventSubscribeResponseTransaction;
   10.84 +      return MakeCallback (&EventSubscribeResponseTransaction::SendEventSubcribeResponse, eventSubscribeResponseTransaction);
   10.85 +    }
   10.86 +
   10.87    } // namespace mih
   10.88  } // namespace ns3
    11.1 --- a/src/mih/mih-session.h	Sun Nov 30 22:53:13 2008 +0100
    11.2 +++ b/src/mih/mih-session.h	Mon Dec 01 09:22:24 2008 +0100
    11.3 @@ -27,6 +27,8 @@
    11.4  #include "ns3/socket.h"
    11.5  #include "mih-transaction.h"
    11.6  #include "mih-callbacks.h"
    11.7 +#include "mih-remote-event-destination-trap.h"
    11.8 +#include "mih-remote-event-source-trap.h"
    11.9  
   11.10  namespace ns3 {
   11.11    namespace mih {
   11.12 @@ -41,6 +43,7 @@
   11.13        MihfId GetFromMihfId (void);
   11.14        Address GetFromAddress (void);
   11.15        void SetSocket (Ptr<Socket> socket);
   11.16 +      // Register
   11.17        void SendRegisterRequest (Ptr<Packet> packet, 
   11.18  				MihRegisterConfirmCallback registerConfirmCallback);
   11.19        MihRegisterResponseCallback ReceiveRegisterRequest (Ptr<Packet> packet, 
   11.20 @@ -48,6 +51,7 @@
   11.21        void ReceiveRegisterResponse (MihfId from, 
   11.22                                      Status status, 
   11.23                                      uint32_t validLifeTime = 0);
   11.24 +      // Capability Discover
   11.25        void SendCapabilityDiscoverRequest (Ptr<Packet> packet, 
   11.26                                            MihCapabilityDiscoverConfirmCallback capabilityDiscoverConfirmCallback);
   11.27        MihCapabilityDiscoverResponseCallback ReceiveCapabilityDiscoverRequest (Ptr<Packet> packet, 
   11.28 @@ -60,6 +64,24 @@
   11.29                                                InformationServiceQueryTypeList miisQueries,
   11.30                                                TransportSupportList transportOptions,
   11.31                                                MakeBeforeBreakSupportList mbbSupportList);
   11.32 +      // Event Subscribe
   11.33 +      void SendEventSubscribe (Ptr<Packet> packet,
   11.34 +                               EventList events,
   11.35 +                               MihLinkDetectedIndicationCallback linkDetectedEventCallback1,
   11.36 +                               MihLinkUpIndicationCallback linkUpEventCallback2,
   11.37 +                               MihLinkDownIndicationCallback linkDownEventCallback3,
   11.38 +                               MihLinkParametersReportIndicationCallback linkParamReportEventCallback4,
   11.39 +                               MihLinkGoingDownIndicationCallback linkGoingDownEventCallback5,
   11.40 +                               MihLinkHandoverImminentIndicationCallback linkHOImminentEventCallback6,
   11.41 +                               MihLinkHandoverCompleteIndicationCallback linkHOCompleteEventCallback7,
   11.42 +                               MihLinkPduTransmitStatusIndicationCallback linkPduTxStatusEventCallback8,
   11.43 +                               MihEventSubscribeConfirmCallback subscribeConfirmCallback);
   11.44 +      MihEventSubscribeConfirmCallback ReceiveEventSubscribeRequest (Ptr<Packet> packet, 
   11.45 +                                                                     uint16_t transactionId);
   11.46 +
   11.47 +      // Remote events access methods;
   11.48 +      RemoteEventSourceTrap& GetRemoteEventSourceTrap (void);
   11.49 +      RemoteEventDestinationTrap& GetRemoteEventDestinationTrap (void);
   11.50      protected:
   11.51        
   11.52  /*       void Enqueue (Ptr<Transaction> transaction, TransactionQueue queue); */
   11.53 @@ -89,6 +111,9 @@
   11.54        Ptr<Transaction> m_currentTransaction;
   11.55        Ptr<Transaction> m_pendingResponseTransaction;
   11.56        TransactionQueue m_pendingEventQueue;
   11.57 +
   11.58 +      RemoteEventDestinationTrap m_remoteEventDestinationTrap;
   11.59 +      RemoteEventSourceTrap m_remoteEventSourceTrap;
   11.60      };
   11.61      typedef std::vector<Ptr<Session> > SessionList;
   11.62      typedef SessionList::iterator SessionListI;
    12.1 --- a/src/mih/mih-transaction.cc	Sun Nov 30 22:53:13 2008 +0100
    12.2 +++ b/src/mih/mih-transaction.cc	Mon Dec 01 09:22:24 2008 +0100
    12.3 @@ -251,5 +251,78 @@
    12.4        m_socket->SendTo (packet, 0, m_to);
    12.5        SetToBeDeleted ();
    12.6      }
    12.7 +    //class EventSubscribeRequestTransaction;
    12.8 +    EventSubscribeRequestTransaction::EventSubscribeRequestTransaction (Ptr<Packet> packet, 
    12.9 +                                                                        MihfId fromMihfid, 
   12.10 +                                                                        MihfId toMihfid, 
   12.11 +                                                                        Address to, 
   12.12 +                                                                        uint16_t tid,
   12.13 +                                                                        MihEventSubscribeConfirmCallback subscribeConfirmCallback) :
   12.14 +      Transaction (packet, fromMihfid, toMihfid, to, tid),
   12.15 +      m_subscribeConfirmCallback (subscribeConfirmCallback)
   12.16 +    {
   12.17 +    }
   12.18 +    EventSubscribeRequestTransaction::~EventSubscribeRequestTransaction (void)
   12.19 +    {}
   12.20 +    void
   12.21 +    EventSubscribeRequestTransaction::EventSubscribeConfirm (MihfId mihfId, 
   12.22 +                                  Status status, 
   12.23 +                                  LinkIdentifier linkIdentifier, 
   12.24 +                                  EventList events)
   12.25 +    {
   12.26 +      m_subscribeConfirmCallback (mihfId, status,
   12.27 +                                  linkIdentifier, events);
   12.28 +    }
   12.29 +    //    class EventSubscribeResponseTransaction;
   12.30 +    EventSubscribeResponseTransaction::EventSubscribeResponseTransaction (Ptr<Packet> packet, 
   12.31 +                                                                          MihfId fromMihfid, 
   12.32 +                                                                          MihfId toMihfid, 
   12.33 +                                                                          Address to, 
   12.34 +                                                                          uint16_t tid,
   12.35 +                                                                          Ptr<Socket> socket) :
   12.36 +      Transaction (packet, fromMihfid, toMihfid, to, tid),
   12.37 +      m_socket (socket)
   12.38 +    {}
   12.39 +    EventSubscribeResponseTransaction::~EventSubscribeResponseTransaction (void)
   12.40 +    {
   12.41 +      m_socket = 0;
   12.42 +    }
   12.43 +    void
   12.44 +    EventSubscribeResponseTransaction::SendEventSubcribeResponse (MihfId mihfId,
   12.45 +                                                                  Status status,
   12.46 +                                                                  LinkIdentifier linkIdentifier,
   12.47 +                                                                  EventList events)
   12.48 +    {
   12.49 +      NS_ASSERT_MSG (mihfId == m_toMihfId, "Destination transaction MihfId and required one mismatch!");
   12.50 +      Buffer buffer;
   12.51 +      Ptr<Packet> packet;
   12.52 +      // Create room at start of buffer;
   12.53 +      buffer.AddAtStart (m_fromMihfId.GetTlvSerializedSize () +
   12.54 +                         mihfId.GetTlvSerializedSize () +
   12.55 +                         status.GetTlvSerializedSize () +
   12.56 +                         linkIdentifier.GetTlvSerializedSize () +
   12.57 +                         events.GetTlvSerializedSize ());
   12.58 +      // TLV-Serialize in buffer;
   12.59 +      m_fromMihfId.TlvSerialize (buffer);
   12.60 +      mihfId.TlvSerialize (buffer);
   12.61 +      status.TlvSerialize (buffer);
   12.62 +      linkIdentifier.TlvSerialize (buffer);
   12.63 +      events.TlvSerialize (buffer);
   12.64 +      // Fill the packet with payload from buffer
   12.65 +      packet = Create<Packet> (buffer.PeekData (), buffer.GetSize ());
   12.66 +      // Mih Header;
   12.67 +      MihHeader mihHeader;
   12.68 +      mihHeader.SetVersion (MihHeader::VERSION_ONE);
   12.69 +      mihHeader.SetServiceId (MihHeader::COMMAND);
   12.70 +      mihHeader.SetOpCode (MihHeader::RESPONSE);
   12.71 +      mihHeader.SetActionId (MihHeader::MIH_EVENT_SUBSCRIBE);
   12.72 +      mihHeader.SetTransactionId (GetTransactionId ());
   12.73 +      mihHeader.SetPayloadLength (packet->GetSize ());
   12.74 +      packet->AddHeader (mihHeader);
   12.75 +      // Send via socket;
   12.76 +      // Add possibilities to select the source interface
   12.77 +      m_socket->SendTo (packet, 0, m_to);
   12.78 +      SetToBeDeleted ();
   12.79 +    }
   12.80    } // namespace mih
   12.81  } // namespace ns3
    13.1 --- a/src/mih/mih-transaction.h	Sun Nov 30 22:53:13 2008 +0100
    13.2 +++ b/src/mih/mih-transaction.h	Mon Dec 01 09:22:24 2008 +0100
    13.3 @@ -139,6 +139,39 @@
    13.4      protected:
    13.5        Ptr<Socket> m_socket;
    13.6      };
    13.7 +    class EventSubscribeRequestTransaction : public Transaction {
    13.8 +    public:
    13.9 +      EventSubscribeRequestTransaction (Ptr<Packet> packet, 
   13.10 +                                        MihfId fromMihfid, 
   13.11 +                                        MihfId toMihfid, 
   13.12 +                                        Address to, 
   13.13 +                                        uint16_t tid,
   13.14 +                                        MihEventSubscribeConfirmCallback subscribeConfirmCallback);
   13.15 +      virtual ~EventSubscribeRequestTransaction (void);
   13.16 +      void EventSubscribeConfirm (MihfId mihfId, 
   13.17 +                                  Status status, 
   13.18 +                                  LinkIdentifier linkIdentifier, 
   13.19 +                                  EventList events);
   13.20 +    protected:
   13.21 +      MihEventSubscribeConfirmCallback m_subscribeConfirmCallback;
   13.22 +    };
   13.23 +    class EventSubscribeResponseTransaction : public Transaction {
   13.24 +    public:
   13.25 +      EventSubscribeResponseTransaction (Ptr<Packet> packet, 
   13.26 +                                         MihfId fromMihfid, 
   13.27 +                                         MihfId toMihfid, 
   13.28 +                                         Address to, 
   13.29 +                                         uint16_t tid,
   13.30 +                                         Ptr<Socket> socket);
   13.31 +      virtual ~EventSubscribeResponseTransaction (void);
   13.32 +      void SendEventSubcribeResponse (MihfId mihfId,
   13.33 +                                      Status status,
   13.34 +                                      LinkIdentifier linkIdentifier,
   13.35 +                                      EventList events);
   13.36 +      
   13.37 +    protected:
   13.38 +      Ptr<Socket> m_socket;
   13.39 +    };
   13.40      typedef std::deque<Ptr<Transaction> > TransactionQueue;
   13.41      typedef TransactionQueue::reverse_iterator TransactionQueueRI;
   13.42      typedef TransactionQueue::iterator TransactionQueueI;
    14.1 --- a/src/mih/wscript	Sun Nov 30 22:53:13 2008 +0100
    14.2 +++ b/src/mih/wscript	Mon Dec 01 09:22:24 2008 +0100
    14.3 @@ -64,6 +64,8 @@
    14.4          'mih-link-capability-discover.cc',
    14.5          'mih-link-sap.cc',
    14.6          'mih-header.cc',
    14.7 +        'mih-remote-event-destination-trap.cc',
    14.8 +        'mih-remote-event-source-trap.cc',
    14.9          'mih-transaction.cc',
   14.10          'mih-session.cc',
   14.11          'mih-function.cc',
   14.12 @@ -135,6 +137,8 @@
   14.13          'mih-link-capability-discover.h',
   14.14          'mih-link-sap.h',
   14.15          'mih-header.h',
   14.16 +        'mih-remote-event-destination-trap.h',
   14.17 +        'mih-remote-event-source-trap.h',
   14.18          'mih-transaction.h',
   14.19          'mih-session.h',
   14.20          'mih-function.h',