IBR-DTNSuite  0.8
daemon/src/storage/MemoryBundleStorage.h
Go to the documentation of this file.
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_ */