IBR-DTNSuite
0.8
|
00001 /* 00002 * MemoryBundleStorage.h 00003 * 00004 * Created on: 22.11.2010 00005 * Author: morgenro 00006 */ 00007 00008 #ifndef MEMORYBUNDLESTORAGE_H_ 00009 #define MEMORYBUNDLESTORAGE_H_ 00010 00011 #include "Component.h" 00012 #include "core/BundleCore.h" 00013 #include "storage/BundleStorage.h" 00014 #include "core/Node.h" 00015 #include "core/EventReceiver.h" 00016 00017 #include <ibrdtn/data/Bundle.h> 00018 #include <ibrdtn/data/BundleList.h> 00019 00020 namespace dtn 00021 { 00022 namespace storage 00023 { 00024 class MemoryBundleStorage : public BundleStorage, public dtn::core::EventReceiver, public dtn::daemon::IntegratedComponent, private dtn::data::BundleList 00025 { 00026 public: 00027 MemoryBundleStorage(size_t maxsize = 0); 00028 virtual ~MemoryBundleStorage(); 00029 00034 virtual void store(const dtn::data::Bundle &bundle); 00035 00042 virtual dtn::data::Bundle get(const dtn::data::BundleID &id); 00043 00047 virtual const std::list<dtn::data::MetaBundle> get(BundleFilterCallback &cb); 00048 00052 virtual const std::set<dtn::data::EID> getDistinctDestinations(); 00053 00059 void remove(const dtn::data::BundleID &id); 00060 00066 dtn::data::MetaBundle remove(const ibrcommon::BloomFilter &filter); 00067 00071 void clear(); 00072 00076 bool empty(); 00077 00081 unsigned int count(); 00082 00086 size_t size() const; 00087 00091 void releaseCustody(const dtn::data::EID &custodian, const dtn::data::BundleID &id); 00092 00097 void raiseEvent(const dtn::core::Event *evt); 00098 00102 virtual const std::string getName() const; 00103 00104 protected: 00105 virtual void componentUp(); 00106 virtual void componentDown(); 00107 00108 virtual void eventBundleExpired(const ExpiringBundle &b); 00109 00110 private: 00111 ibrcommon::Mutex _bundleslock; 00112 std::set<dtn::data::Bundle> _bundles; 00113 00114 struct CMP_BUNDLE_PRIORITY 00115 { 00116 bool operator() (const dtn::data::MetaBundle& lhs, const dtn::data::MetaBundle& rhs) const 00117 { 00118 if (lhs.getPriority() == rhs.getPriority()) 00119 return rhs > lhs; 00120 00121 return (lhs.getPriority() > rhs.getPriority()); 00122 } 00123 }; 00124 00125 std::set<dtn::data::MetaBundle, CMP_BUNDLE_PRIORITY> _priority_index; 00126 std::map<dtn::data::BundleID, ssize_t> _bundle_lengths; 00127 00128 size_t _maxsize; 00129 size_t _currentsize; 00130 }; 00131 } 00132 } 00133 00134 #endif /* MEMORYBUNDLESTORAGE_H_ */