00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef CONTAINER_H
00024 #define CONTAINER_H
00025
00026 #include <list>
00027
00028 #include "storage/Volume.h"
00029 #include "storage/StorageTypes.h"
00030 #include "storage/StorageTmpl.h"
00031
00032
00033 namespace storage
00034 {
00035 using std::list;
00036
00037
00038 class Container : public Device
00039 {
00040 friend class Storage;
00041 protected:
00042 template<typename L1, typename L2> friend class ListListIterator;
00043
00044 typedef std::list<Volume*> VCont;
00045 typedef VCont::iterator VIter;
00046 typedef VCont::const_iterator CVIter;
00047 typedef VCont::reverse_iterator RVIter;
00048 typedef VCont::const_reverse_iterator CRVIter;
00049
00050
00051 public:
00052 bool operator== ( const Container& rhs ) const
00053 { return( typ == rhs.typ && nm == rhs.nm && del == rhs.del ); }
00054 bool operator!= ( const Container& rhs ) const
00055 { return( !(*this==rhs) ); }
00056 bool operator< ( const Container& rhs ) const
00057 {
00058 if( typ != rhs.typ )
00059 return( typ<rhs.typ );
00060 else if( nm != rhs.nm )
00061 return( nm<rhs.nm );
00062 else
00063 return( !del );
00064 }
00065 bool operator<= ( const Container& rhs ) const
00066 { return( *this<rhs || *this==rhs ); }
00067 bool operator>= ( const Container& rhs ) const
00068 { return( !(*this<rhs) ); }
00069 bool operator> ( const Container& rhs ) const
00070 { return( !(*this<=rhs) ); }
00071 virtual bool equalContent( const Container& rhs ) const;
00072
00073 void logDifference(std::ostream& log, const Container& rhs) const;
00074 virtual void logDifferenceWithVolumes(std::ostream& log, const Container& rhs) const = 0;
00075
00076 virtual void getCommitActions(list<commitAction>& l) const;
00077 virtual void getToCommit(storage::CommitStage stage, list<const Container*>& col,
00078 list<const Volume*>& vol) const;
00079
00080 virtual int commitChanges( storage::CommitStage stage );
00081 virtual int commitChanges( storage::CommitStage stage, Volume* vol );
00082 virtual void changeDeviceName( const string& old, const string& nw ) {}
00083 bool isEmpty() const;
00084 void getInfo( storage::ContainerInfo& info ) const;
00085 bool findVolume( const string& device, Volume*& vol );
00086
00087 static bool notDeleted(const Container& c) { return !c.deleted(); }
00088
00089
00090 protected:
00091
00092 template< class Pred >
00093 struct ConstVolumePI { typedef ContainerIter<Pred, CVIter> type; };
00094 template< class Pred >
00095 struct VolumePI { typedef ContainerIter<Pred, VIter> type; };
00096 template< class Pred >
00097 struct VolumeI { typedef ContainerDerIter<Pred, typename VolumePI<Pred>::type, Volume> type; };
00098 typedef CheckFnc<const Volume> CheckFncVol;
00099 typedef CheckerIterator< CheckFncVol, ConstVolumePI<CheckFncVol>::type,
00100 CVIter, Volume> ConstVolPIterator;
00101 typedef CheckerIterator< CheckFncVol, VolumePI<CheckFncVol>::type,
00102 VIter, Volume> VolPIterator;
00103 typedef DerefIterator<VolPIterator,Volume> VolIterator;
00104 typedef IterPair<VolIterator> VolPair;
00105
00106 public:
00107
00108 template< class Pred >
00109 struct ConstVolumeI { typedef ContainerDerIter<Pred, typename ConstVolumePI<Pred>::type, const Volume> type; };
00110 template< class Pred >
00111 struct VolCondIPair { typedef MakeCondIterPair<Pred, typename ConstVolumeI<Pred>::type> type;};
00112 typedef DerefIterator<ConstVolPIterator,const Volume> ConstVolIterator;
00113 typedef IterPair<ConstVolIterator> ConstVolPair;
00114
00115
00116 ConstVolPair volPair( bool (* CheckFnc)( const Volume& )=NULL ) const
00117 {
00118 return( ConstVolPair( volBegin( CheckFnc ), volEnd( CheckFnc ) ));
00119 }
00120 ConstVolIterator volBegin( bool (* CheckFnc)( const Volume& )=NULL ) const
00121 {
00122 return( ConstVolIterator( ConstVolPIterator(vols.begin(), vols.end(), CheckFnc )) );
00123 }
00124 ConstVolIterator volEnd( bool (* CheckFnc)( const Volume& )=NULL ) const
00125 {
00126 return( ConstVolIterator( ConstVolPIterator(vols.begin(), vols.end(), CheckFnc, true )) );
00127 }
00128
00129 template< class Pred > typename VolCondIPair<Pred>::type volCondPair( const Pred& p ) const
00130 {
00131 return( VolCondIPair<Pred>::type( volCondBegin( p ), volCondEnd( p ) ) );
00132 }
00133 template< class Pred > typename ConstVolumeI<Pred>::type volCondBegin( const Pred& p ) const
00134 {
00135 return( ConstVolumeI<Pred>::type( vols.begin(), vols.end(), p ) );
00136 }
00137 template< class Pred > typename ConstVolumeI<Pred>::type volCondEnd( const Pred& p ) const
00138 {
00139 return( ConstVolumeI<Pred>::type( vols.begin(), vols.end(), p, true ) );
00140 }
00141
00142 protected:
00143
00144 VolPair volPair( bool (* CheckFnc)( const Volume& )=NULL )
00145 {
00146 return( VolPair( vBegin( CheckFnc ), vEnd( CheckFnc ) ));
00147 }
00148 VolIterator vBegin( bool (* CheckFnc)( const Volume& )=NULL )
00149 {
00150 return( VolIterator( VolPIterator(vols.begin(), vols.end(), CheckFnc )) );
00151 }
00152 VolIterator vEnd( bool (* CheckFnc)( const Volume& )=NULL )
00153 {
00154 return( VolIterator( VolPIterator(vols.begin(), vols.end(), CheckFnc, true )) );
00155 }
00156
00157 public:
00158
00159 Container(Storage* s, const string& name, const string& device, CType typ);
00160 Container(Storage* s, const string& name, const string& device, CType typ,
00161 SystemInfo& systemInfo);
00162 Container(Storage* s, CType typ, const xmlNode* node);
00163 Container(const Container& c);
00164 virtual ~Container();
00165
00166 void saveData(xmlNode* node) const;
00167
00168 Storage* getStorage() const { return sto; }
00169 const Storage* getStorageConst() const { return sto; }
00170 CType type() const { return typ; }
00171 bool isPartitionable() const;
00172 static bool Partitionable( const Container&d )
00173 { return( d.isPartitionable() ); }
00174 bool isDeviceUsable() const;
00175 static bool DeviceUsable( const Container&d )
00176 { return( d.isDeviceUsable() ); }
00177
00178 bool readonly() const { return ronly; }
00179
00180 virtual Text removeText(bool doing) const;
00181 virtual Text createText(bool doing) const;
00182 virtual int resizeVolume( Volume* v, unsigned long long newSize );
00183 virtual int removeVolume( Volume* v );
00184 static storage::CType staticType() { return storage::CUNKNOWN; }
00185 friend std::ostream& operator<< (std::ostream& s, const Container &c );
00186
00187 virtual Container* getCopy() const = 0;
00188
00189 bool compareContainer(const Container& rhs, bool verbose) const;
00190 void setExtError( const string& txt ) const;
00191 void setExtError( const SystemCmd& cmd, bool serr=true ) const;
00192
00193 protected:
00194 typedef CVIter ConstPlainIterator;
00195 ConstPlainIterator begin() const { return vols.begin(); }
00196 ConstPlainIterator end() const { return vols.end(); }
00197
00198 typedef VIter PlainIterator;
00199 PlainIterator begin() { return vols.begin(); }
00200 PlainIterator end() { return vols.end(); }
00201
00202 virtual void print( std::ostream& s ) const { s << *this; }
00203 void addToList(Volume* e);
00204 bool removeFromList( Volume* e );
00205 virtual int doCreate( Volume * v );
00206 virtual int doRemove( Volume * v );
00207 virtual int doResize( Volume * v );
00208
00209 virtual void logData(const string& Dir) const {}
00210
00211 static bool stageDecrease(const Volume& v);
00212 static bool stageIncrease(const Volume& v);
00213 static bool stageFormat(const Volume& v);
00214 static bool stageMount(const Volume& v);
00215
00216 Storage* const sto;
00217 const CType typ;
00218 bool ronly;
00219
00220 VCont vols;
00221
00222 mutable storage::ContainerInfo info;
00223
00224 private:
00225
00226 Container& operator=(const Container&);
00227
00228 };
00229
00230 }
00231
00232 #endif