00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _REGISTRATION_H_
00018 #define _REGISTRATION_H_
00019
00020 #include <list>
00021 #include <string>
00022
00023 #include <oasys/debug/Log.h>
00024 #include <oasys/serialize/Serialize.h>
00025 #include <oasys/thread/Timer.h>
00026
00027 #include "../bundling/BundleInfoCache.h"
00028 #include "../naming/EndpointID.h"
00029
00030 namespace dtn {
00031
00032 class Bundle;
00033
00043 class Registration : public oasys::Formatter,
00044 public oasys::SerializableObject,
00045 public oasys::Logger
00046 {
00047 public:
00051 static const u_int32_t ADMIN_REGID = 0;
00052 static const u_int32_t LINKSTATEROUTER_REGID = 1;
00053 static const u_int32_t PING_REGID = 2;
00054 static const u_int32_t EXTERNALROUTER_REGID = 3;
00055 static const u_int32_t DTLSR_REGID = 4;
00056 static const u_int32_t MAX_RESERVED_REGID = 9;
00057
00062 typedef enum {
00063 DROP,
00064 DEFER,
00065 EXEC
00066 } failure_action_t;
00067
00071 static const char* failure_action_toa(failure_action_t action);
00072
00076 Registration(const oasys::Builder&);
00077
00081 Registration(u_int32_t regid,
00082 const EndpointIDPattern& endpoint,
00083 u_int32_t failure_action,
00084 u_int32_t session_flags,
00085 u_int32_t expiration,
00086 const std::string& script = "");
00087
00091 virtual ~Registration();
00092
00096 virtual void deliver_bundle(Bundle* bundle) = 0;
00097
00101 bool deliver_if_not_duplicate(Bundle* bundle);
00102
00109 virtual void session_notify(Bundle* bundle);
00110
00112
00113 const u_int32_t durable_key() const { return regid_; }
00114 const u_int32_t regid() const { return regid_; }
00115 const EndpointIDPattern& endpoint() const { return endpoint_; }
00116 failure_action_t failure_action() const
00117 {
00118 return static_cast<failure_action_t>(failure_action_);
00119 }
00120 const u_int32_t session_flags() const { return session_flags_; }
00121 const std::string& script() const { return script_; }
00122 const u_int32_t expiration() const { return expiration_; }
00123 const bool active() const { return active_; }
00124 const bool expired() const { return expired_; }
00125
00126 void set_active(bool a) { active_ = a; }
00127 void set_expired(bool e) { expired_ = e; }
00129
00133 int format(char* buf, size_t sz) const;
00134
00138 void serialize(oasys::SerializeAction* a);
00139
00146 void force_expire();
00147
00148 protected:
00152 class ExpirationTimer : public oasys::Timer {
00153 public:
00154 ExpirationTimer(Registration* reg)
00155 : reg_(reg) {}
00156
00157 void timeout(const struct timeval& now);
00158
00159 Registration* reg_;
00160 };
00161
00162 void init_expiration_timer();
00163 void cleanup_expiration_timer();
00164
00165 u_int32_t regid_;
00166 EndpointIDPattern endpoint_;
00167 u_int32_t failure_action_;
00168 u_int32_t session_flags_;
00169 std::string script_;
00170 u_int32_t expiration_;
00171 u_int32_t creation_time_;
00172 ExpirationTimer* expiration_timer_;
00173 bool active_;
00174 bool bound_;
00175 bool expired_;
00176 BundleInfoCache delivery_cache_;
00177 };
00178
00182 class RegistrationList : public std::list<Registration*> {};
00183
00184 }
00185
00186 #endif