|
IBR-DTNSuite 0.6
|
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 // This object manage data stored on disk 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 /*SIMPLEBUNDLESTORAGE_H_*/