1 /*****************************************************************************
2 
3   Defragment
4 
5 *****************************************************************************/
6 
7 
8 #ifndef DEFRAGMENT_H
9 #define DEFRAGMENT_H
10 
11 
12 #include "Unfrag.h"
13 #include "DriveVolume.h"
14 #include "Mutex.h"
15 
16 
17 extern int FitName (wchar_t *destination, const wchar_t *path, const wchar_t *filename, uint32 totalWidth);
18 
19 
20 typedef struct DefragReport
21 {
22     wstring    RootPath;
23     uint64    DiskSizeBytes;
24     uint64    DirsCount;
25     uint64    FilesCount;
26     uint64    FilesSizeBytes;
27     uint64    FilesSizeOnDisk;
28     uint64    FilesSizeClusters;
29     uint64    FilesSlackBytes;
30     uint32    FilesFragments;
31     double    AverageFragments;  // = FilesFragments / FilesCount
32     double    PercentFragged;
33     double    PercentSlack;
34 
35     vector<uint32> FraggedFiles;
36     vector<uint32> UnfraggedFiles;
37     vector<uint32> UnmovableFiles;
38 } DefragReport;
39 
40 
41 class Defragment
42 {
43 public:
44     Defragment (wstring Name, DefragType DefragMethod);
45     ~Defragment ();
46 
47     // Commands
48     void Start       (void);
49     void TogglePause (void);
50     void Stop        (void);
51 
52     // Info
53     bool          IsDoneYet (void);
54     bool          HasError (void);
55     wstring        GetStatusString  (void);
56     double         GetStatusPercent (void);
57     DefragType    GetDefragType    (void)  { return (Method); }
58     DefragReport &GetDefragReport  (void)  { return (Report); }
59     DriveVolume  &GetVolume        (void)  { return (Volume); }
60 
61     // Mutex
62     void Lock (void)   { DefragMutex.Lock ();   }
63     void Unlock (void) { DefragMutex.Unlock (); }
64 
65     // Limit length of status string to 70 chars?
66     bool GetDoLimitLength (void)   { return (DoLimitLength); }
67     void SetDoLimitLength (bool L) { DoLimitLength = L; }
68 
69 private:
70     void FastDefrag (void);
71     void ExtensiveDefrag (void);
72     void SetStatusString (wstring NewStatus);
73 
74     DWORD        LastBMPUpdate; // Last time volume bitmap was updated
75     DefragReport Report;
76     bool         DoLimitLength;
77     DefragType   Method;
78     wstring       DriveName;
79     DriveVolume  Volume;
80     wstring       StatusString;
81     wstring       ErrorString;
82     double        StatusPercent;
83     Mutex        DefragMutex;
84     bool         Error;
85     bool         Done;
86     bool         PleaseStop;
87     bool         PleasePause;
88     DefragType   DefragMethod;
89 };
90 
91 
92 #endif // DEFRAGMENT_H
93