1 #include "ReportDialog.h" 2 #include "Unfrag.h" 3 #include "Fraginator.h" 4 #include "DriveVolume.h" 5 #include "Defragment.h" 6 #include "resource.h" 7 8 9 void SetReportInfo (HWND Dlg, DefragReport &Report, uint32 BytesDivisor, const wchar_t *BytesUnits, bool Fractional) 10 { 11 wchar_t Text[1000]; 12 wchar_t Text2[1000]; 13 wchar_t Text3[1000]; 14 15 memset (Text, 0, sizeof (Text)); 16 17 // Volume name 18 SetDlgItemText (Dlg, IDC_DRIVELETTER, Report.RootPath.c_str()); 19 20 // Volume label 21 SetDlgItemText (Dlg, IDC_VOLUMELABEL, Defrag->GetVolume().GetVolumeInfo().Name.c_str()); 22 23 // Volume Serial 24 SetDlgItemText (Dlg, IDC_VOLUMESERIAL, Defrag->GetVolume().GetVolumeInfo().Serial.c_str()); 25 26 // File System 27 SetDlgItemText (Dlg, IDC_FILESYSTEM, Defrag->GetVolume().GetVolumeInfo().FileSystem.c_str()); 28 29 // DiskSizeBytes 30 if (Fractional) 31 { 32 swprintf (Text, L"%.2f %s", (double)(signed)(Report.DiskSizeBytes / 33 (BytesDivisor / 1024)) / 1024.0, BytesUnits); 34 } 35 else 36 { 37 AddCommas (Text, Report.DiskSizeBytes / BytesDivisor); 38 wcscat (Text, L" "); 39 wcscat (Text, BytesUnits); 40 } 41 42 SetDlgItemText (Dlg, IDC_DISKSIZEBYTES, Text); 43 44 // DiskFreeBytes 45 if (Fractional) 46 { 47 swprintf (Text, L"%.2f %s", (double)(signed)(Defrag->GetVolume().GetVolumeInfo().FreeBytes / 48 (BytesDivisor / 1024)) / 1024.0, BytesUnits); 49 } 50 else 51 { 52 AddCommas (Text, Defrag->GetVolume().GetVolumeInfo().FreeBytes / BytesDivisor); 53 wcscat (Text, L" "); 54 wcscat (Text, BytesUnits); 55 } 56 SetDlgItemText (Dlg, IDC_DISKFREEBYTES, Text); 57 58 // DiskSizeClusters 59 AddCommas (Text, Defrag->GetVolume().GetVolumeInfo().ClusterCount); 60 wcscat (Text, L" clusters"); 61 SetDlgItemText (Dlg, IDC_DISKSIZECLUSTERS, Text); 62 63 // DiskClusterSize 64 swprintf (Text, L"%u bytes", Defrag->GetVolume().GetVolumeInfo().ClusterSize); 65 SetDlgItemText (Dlg, IDC_DISKCLUSTERSIZE, Text); 66 67 // DirsCount 68 AddCommas (Text, Report.DirsCount); 69 SetDlgItemText (Dlg, IDC_DIRSCOUNT, Text); 70 71 // FilesCount 72 AddCommas (Text, Report.FilesCount); 73 SetDlgItemText (Dlg, IDC_FILESCOUNT, Text); 74 75 // FilesFragged 76 swprintf (Text, L"(%.2f%%)", Report.PercentFragged); 77 AddCommas (Text2, Report.FraggedFiles.size()); 78 swprintf (Text3, L"%s %s", Text, Text2); 79 SetDlgItemText (Dlg, IDC_FILESFRAGGED, Text3); 80 81 // Average Frags 82 swprintf (Text, L"%.2f", Report.AverageFragments); 83 SetDlgItemText (Dlg, IDC_AVERAGEFRAGS, Text); 84 85 // FilesSizeBytes 86 if (Fractional) 87 { 88 swprintf (Text, L"%.2f %s", (double)(signed)(Report.FilesSizeBytes / 89 (BytesDivisor / 1024)) / 1024.0, BytesUnits); 90 } 91 else 92 { 93 AddCommas (Text, Report.FilesSizeBytes / (uint64)BytesDivisor); 94 wcscat (Text, L" "); 95 wcscat (Text, BytesUnits); 96 } 97 SetDlgItemText (Dlg, IDC_FILESSIZEBYTES, Text); 98 99 // Files SizeOnDisk 100 if (Fractional) 101 { 102 swprintf (Text, L"%.2f %s", (double)(signed)((Report.FilesSizeBytes + Report.FilesSlackBytes) / 103 (BytesDivisor / 1024)) / 1024.0, BytesUnits); 104 } 105 else 106 { 107 AddCommas (Text, (Report.FilesSizeBytes + Report.FilesSlackBytes) / (uint64)BytesDivisor); 108 wcscat (Text, L" "); 109 wcscat (Text, BytesUnits); 110 111 } 112 SetDlgItemText (Dlg, IDC_FILESSIZEONDISK, Text); 113 114 // FilesSlackBytes 115 if (Fractional) 116 { 117 swprintf (Text, L"%.2f %s", (double)(signed)(Report.FilesSlackBytes / 118 (BytesDivisor / 1024)) / 1024.0, BytesUnits); 119 } 120 else 121 { 122 AddCommas (Text, Report.FilesSlackBytes / BytesDivisor); 123 wcscat (Text, L" "); 124 wcscat (Text, BytesUnits); 125 } 126 swprintf (Text2, L"(%.2f%%)", Report.PercentSlack); 127 swprintf (Text3, L"%s %s", Text2, Text); 128 SetDlgItemText (Dlg, IDC_FILESSLACKBYTES, Text3); 129 130 // Recommendation 131 bool PFRec = false; // Recommend based off percent fragged files? 132 bool AFRec = false; // Recommend based off average fragments per file? 133 134 if (Report.PercentFragged >= 5.0f) 135 PFRec = true; 136 137 if (Report.AverageFragments >= 1.1f) 138 AFRec = true; 139 140 wcscpy (Text, L"* "); 141 142 if (PFRec) 143 { 144 swprintf 145 ( 146 Text2, 147 L"%.2f%% of the files on this volume are fragmented. ", 148 Report.PercentFragged 149 ); 150 151 wcscat (Text, Text2); 152 } 153 154 if (AFRec) 155 { 156 swprintf 157 ( 158 Text2, 159 L"The average fragments per file (%.2f) indicates a high degree of fragmentation. ", 160 Report.AverageFragments 161 ); 162 163 wcscat (Text, Text2); 164 } 165 166 if (Report.PercentFragged < 5.0f && Report.AverageFragments < 1.1f) 167 swprintf (Text, L"* No defragmentation is necessary at this point."); 168 else 169 if (Report.PercentFragged < 15.0f && Report.AverageFragments < 1.3f) 170 wcscat (Text, L"It is recommended that you perform a Fast Defrag."); 171 else 172 wcscat (Text, L"It is recommended that you perform an Extensive Defrag."); 173 174 // Should we recommend a smaller cluster size? 175 if (Report.PercentSlack >= 10.0f) 176 { 177 swprintf 178 ( 179 Text2, 180 L"\n* A large amount of disk space (%.2f%%) is being lost " 181 L"due to a large (%u bytes) cluster size. It is recommended " 182 L"that you use a disk utility such as Partition Magic to " 183 L"reduce the cluster size of this volume.", 184 Report.PercentSlack, 185 Defrag->GetVolume().GetVolumeInfo().ClusterSize 186 ); 187 188 wcscat (Text, Text2); 189 } 190 191 SetDlgItemText (Dlg, IDC_RECOMMEND, Text); 192 193 return; 194 } 195 196 197 INT_PTR CALLBACK ReportDialogProc (HWND Dlg, UINT Msg, WPARAM WParam, LPARAM LParam) 198 { 199 switch (Msg) 200 { 201 case WM_INITDIALOG: 202 SetReportInfo (Dlg, Defrag->GetDefragReport (), 1, L"bytes", false); 203 return (1); 204 205 case WM_COMMAND: 206 switch (LOWORD(WParam)) 207 { 208 case IDC_REPORTOK: 209 EndDialog (Dlg, 0); 210 return (1); 211 212 case IDC_GIGABYTES: 213 SetReportInfo (Dlg, Defrag->GetDefragReport (), 1024*1024*1024, L"GB", true); 214 return (1); 215 216 case IDC_MEGABYTES: 217 SetReportInfo (Dlg, Defrag->GetDefragReport (), 1024*1024, L"MB", false); 218 return (1); 219 220 case IDC_KILOBYTES: 221 SetReportInfo (Dlg, Defrag->GetDefragReport (), 1024, L"KB", false); 222 return (1); 223 224 case IDC_BYTES: 225 SetReportInfo (Dlg, Defrag->GetDefragReport (), 1, L"bytes", false); 226 return (1); 227 } 228 } 229 230 return (0); 231 } 232