IBR-DTNSuite 0.6

daemon/src/core/SimpleBundleStorage.h

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                         // 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_*/