Go to the documentation of this file.00001 #ifndef SIMPLEBUNDLESTORAGE_H_
00002 #define SIMPLEBUNDLESTORAGE_H_
00003
00004 #include "Component.h"
00005 #include "core/BundleCore.h"
00006 #include "core/BundleStorage.h"
00007 #include "core/Node.h"
00008 #include "core/EventReceiver.h"
00009
00010 #include "core/DataStorage.h"
00011
00012 #include <ibrcommon/thread/Conditional.h>
00013 #include <ibrcommon/thread/AtomicCounter.h>
00014 #include <ibrcommon/thread/Mutex.h>
00015
00016 #include <ibrcommon/data/File.h>
00017 #include <ibrdtn/data/Bundle.h>
00018 #include <ibrdtn/data/BundleList.h>
00019 #include <ibrcommon/thread/Queue.h>
00020
00021 #include <set>
00022 #include <map>
00023
00024 using namespace dtn::data;
00025
00026 namespace dtn
00027 {
00028 namespace core
00029 {
00033 class SimpleBundleStorage : public DataStorage::Callback, public BundleStorage, public EventReceiver, public dtn::daemon::IntegratedComponent, private dtn::data::BundleList
00034 {
00035 public:
00039 SimpleBundleStorage(const ibrcommon::File &workdir, size_t maxsize = 0, size_t buffer_limit = 0);
00040
00044 virtual ~SimpleBundleStorage();
00045
00050 virtual void store(const dtn::data::Bundle &bundle);
00051
00058 virtual dtn::data::Bundle get(const dtn::data::BundleID &id);
00059
00063 virtual const std::list<dtn::data::MetaBundle> get(BundleFilterCallback &cb);
00064
00070 void remove(const dtn::data::BundleID &id);
00071
00077 dtn::data::MetaBundle remove(const ibrcommon::BloomFilter &filter);
00078
00082 void clear();
00083
00087 bool empty();
00088
00092 unsigned int count();
00093
00097 size_t size() const;
00098
00102 void releaseCustody(const dtn::data::EID &custodian, const dtn::data::BundleID &id);
00103
00108 void raiseEvent(const Event *evt);
00109
00113 virtual const std::string getName() const;
00114
00115 virtual void eventDataStorageStored(const dtn::core::DataStorage::Hash &hash);
00116 virtual void eventDataStorageStoreFailed(const dtn::core::DataStorage::Hash &hash, const ibrcommon::Exception&);
00117 virtual void eventDataStorageRemoved(const dtn::core::DataStorage::Hash &hash);
00118 virtual void eventDataStorageRemoveFailed(const dtn::core::DataStorage::Hash &hash, const ibrcommon::Exception&);
00119 virtual void iterateDataStorage(const dtn::core::DataStorage::Hash &hash, dtn::core::DataStorage::istream &stream);
00120
00121 protected:
00122 virtual void componentUp();
00123 virtual void componentDown();
00124 virtual void eventBundleExpired(const ExpiringBundle &b);
00125
00126 private:
00127 class BundleContainer : public DataStorage::Container
00128 {
00129 public:
00130 BundleContainer(const dtn::data::Bundle &b);
00131 virtual ~BundleContainer();
00132
00133 std::string getKey() const;
00134 std::ostream& serialize(std::ostream &stream);
00135
00136 private:
00137 const dtn::data::Bundle _bundle;
00138 };
00139
00140 dtn::data::Bundle __get(const dtn::data::MetaBundle&);
00141
00142
00143 DataStorage _datastore;
00144
00145 ibrcommon::Mutex _bundleslock;
00146 std::map<DataStorage::Hash, dtn::data::Bundle> _pending_bundles;
00147 std::map<dtn::data::MetaBundle, DataStorage::Hash> _stored_bundles;
00148
00149 std::map<dtn::data::MetaBundle, size_t> _bundle_size;
00150
00151 struct CMP_BUNDLE_PRIORITY
00152 {
00153 bool operator() (const dtn::data::MetaBundle& lhs, const dtn::data::MetaBundle& rhs) const
00154 {
00155 if (lhs.getPriority() == rhs.getPriority())
00156 return rhs > lhs;
00157
00158 return (lhs.getPriority() > rhs.getPriority());
00159 }
00160 };
00161
00162 std::set<dtn::data::MetaBundle, CMP_BUNDLE_PRIORITY> _priority_index;
00163
00164 size_t _maxsize;
00165 size_t _currentsize;
00166 };
00167 }
00168 }
00169
00170 #endif