Merge pull request #23 from openSUSE/drop_package_manager
[platform/upstream/libzypp.git] / zypp / DiskUsageCounter.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/DiskUsageCounter.h
10  *
11 */
12 #ifndef ZYPP_DISKUSAGE_COUNTER_H
13 #define ZYPP_DISKUSAGE_COUNTER_H
14
15 #include "zypp/ResPool.h"
16
17 #include <set>
18 #include <string>
19 #include <iosfwd>
20
21 ///////////////////////////////////////////////////////////////////
22 namespace zypp
23 { /////////////////////////////////////////////////////////////////
24
25   class DiskUsageCounter
26   {
27
28   public:
29
30     /**
31     * @short Mount point description
32     **/
33     struct MountPoint
34     {
35       /**
36        * Directory name
37        **/
38       std::string dir;
39
40       /**
41        * Block size of the mount point
42        **/
43       long long block_size;
44
45       /**
46        * Total size in K (1024)
47        **/
48       long long total_size;
49
50       /**
51        * Used size in K (1024)
52        **/
53       long long used_size;
54
55       /**
56        * Used size after commiting the pool (in K)
57        **/
58       mutable long long pkg_size;
59
60       bool readonly;
61
62       /**
63        * Ctor - initialize directory and package size
64        **/
65       MountPoint(std::string d = "/", long long bs = 0LL, long long total = 0LL, long long used = 0LL, long long pkg = 0LL, bool ro=false) :
66         dir(d), block_size(bs), total_size(total), used_size(used), pkg_size(pkg), readonly(ro)
67       {}
68
69       // sort by directory name
70       bool operator<( const MountPoint & rhs ) const
71       {
72         return dir < rhs.dir;
73       }
74
75       ByteCount blockSize() const
76       { return ByteCount( block_size, ByteCount::B ); }
77
78       ByteCount totalSize() const
79       { return ByteCount( total_size, ByteCount::K ); }
80
81       ByteCount usedSize() const
82       { return ByteCount( used_size, ByteCount::K ); }
83
84       ByteCount freeSize() const
85       { return ByteCount( total_size-used_size, ByteCount::K ); }
86
87       ByteCount usedAfterCommit() const
88       { return ByteCount( pkg_size, ByteCount::K ); }
89
90       ByteCount freeAfterCommit() const
91       { return ByteCount( total_size-pkg_size, ByteCount::K ); }
92
93       ByteCount commitDiff() const
94       { return ByteCount( pkg_size-used_size, ByteCount::K ); }
95     };
96
97     typedef std::set<MountPoint> MountPointSet;
98
99     DiskUsageCounter()
100     {}
101
102     DiskUsageCounter( const MountPointSet & m )
103     : mps( m )
104     {}
105
106     bool setMountPoints( const MountPointSet & m )
107     {
108         mps = m;
109         return true;
110     }
111
112     const MountPointSet & getMountPoints() const
113     {
114         return mps;
115     }
116
117     static MountPointSet detectMountPoints(const std::string &rootdir = "/");
118
119     static MountPointSet justRootPartition();
120
121     /**
122      * Compute disk usage of the pool
123      **/
124     MountPointSet disk_usage( const ResPool & pool );
125
126     /**
127      * Compute disk usage of one solvable
128      */
129     MountPointSet disk_usage( sat::Solvable solv_r );
130     /** \overload */
131     MountPointSet disk_usage( const PoolItem & pi_r  )
132     { return disk_usage( pi_r.satSolvable() ); }
133     /** \overload */
134     MountPointSet disk_usage( const ResObject::constPtr & obj_r )
135     {
136       if ( ! obj_r )
137         return MountPointSet();
138       return disk_usage( obj_r->satSolvable() );
139     }
140
141   private:
142
143     MountPointSet mps;
144   };
145   ///////////////////////////////////////////////////////////////////
146
147   /** \relates DiskUsageCounter::MountPoint Stream output */
148   std::ostream & operator<<( std::ostream & str, const DiskUsageCounter::MountPoint & obj );
149
150   /////////////////////////////////////////////////////////////////
151 } // namespace zypp
152 ///////////////////////////////////////////////////////////////////
153 #endif // ZYPP_DISKUSAGE_COUNTER_H