- Start rosapps rearrange and cleanup process.
[reactos.git] / rosapps / applications / fraginator / ReportDialog.cpp
diff --git a/rosapps/applications/fraginator/ReportDialog.cpp b/rosapps/applications/fraginator/ReportDialog.cpp
new file mode 100644 (file)
index 0000000..6d2caaa
--- /dev/null
@@ -0,0 +1,231 @@
+#include "ReportDialog.h"\r
+#include "Unfrag.h"\r
+#include "Fraginator.h"\r
+#include "DriveVolume.h"\r
+#include "Defragment.h"\r
+#include "resource.h"\r
+\r
+\r
+void SetReportInfo (HWND Dlg, DefragReport &Report, uint32 BytesDivisor, wchar_t *BytesUnits, bool Fractional)\r
+{\r
+    wchar_t Text[1000];\r
+    wchar_t Text2[1000];\r
+    wchar_t Text3[1000];\r
+\r
+    memset (Text, 0, sizeof (Text));\r
+\r
+    // Volume name\r
+    SetDlgItemText (Dlg, IDC_DRIVELETTER, Report.RootPath.c_str());\r
+\r
+    // Volume label\r
+    SetDlgItemText (Dlg, IDC_VOLUMELABEL, Defrag->GetVolume().GetVolumeInfo().Name.c_str());\r
+\r
+    // Volume Serial\r
+    SetDlgItemText (Dlg, IDC_VOLUMESERIAL, Defrag->GetVolume().GetVolumeInfo().Serial.c_str());\r
+\r
+    // File System\r
+    SetDlgItemText (Dlg, IDC_FILESYSTEM, Defrag->GetVolume().GetVolumeInfo().FileSystem.c_str());\r
+\r
+    // DiskSizeBytes\r
+    if (Fractional)\r
+    {\r
+        swprintf (Text, L"%.2f %s", (double)(signed)(Report.DiskSizeBytes /\r
+            (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+    }\r
+    else\r
+    {\r
+        AddCommas (Text, Report.DiskSizeBytes / BytesDivisor);\r
+        wcscat (Text, L" ");\r
+        wcscat (Text, BytesUnits);\r
+    }\r
+\r
+    SetDlgItemText (Dlg, IDC_DISKSIZEBYTES, Text);\r
+\r
+    // DiskFreeBytes\r
+    if (Fractional)\r
+    {\r
+        swprintf (Text, L"%.2f %s", (double)(signed)(Defrag->GetVolume().GetVolumeInfo().FreeBytes /\r
+            (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+    }\r
+    else\r
+    {\r
+        AddCommas (Text, Defrag->GetVolume().GetVolumeInfo().FreeBytes / BytesDivisor);\r
+        wcscat (Text, L" ");\r
+        wcscat (Text, BytesUnits);\r
+    }\r
+    SetDlgItemText (Dlg, IDC_DISKFREEBYTES, Text);\r
+\r
+    // DiskSizeClusters\r
+    AddCommas (Text, Defrag->GetVolume().GetVolumeInfo().ClusterCount);\r
+    wcscat (Text, L" clusters");\r
+    SetDlgItemText (Dlg, IDC_DISKSIZECLUSTERS, Text);\r
+\r
+    // DiskClusterSize\r
+    swprintf (Text, L"%u bytes", Defrag->GetVolume().GetVolumeInfo().ClusterSize);\r
+    SetDlgItemText (Dlg, IDC_DISKCLUSTERSIZE, Text);\r
+\r
+    // DirsCount\r
+    AddCommas (Text, Report.DirsCount);\r
+    SetDlgItemText (Dlg, IDC_DIRSCOUNT, Text);\r
+\r
+    // FilesCount\r
+    AddCommas (Text, Report.FilesCount);\r
+    SetDlgItemText (Dlg, IDC_FILESCOUNT, Text);\r
+\r
+    // FilesFragged\r
+    swprintf (Text, L"(%.2f%%)", Report.PercentFragged);\r
+    AddCommas (Text2, Report.FraggedFiles.size());\r
+    swprintf (Text3, L"%s %s", Text, Text2);\r
+    SetDlgItemText (Dlg, IDC_FILESFRAGGED, Text3);\r
+\r
+    // Average Frags\r
+    swprintf (Text, L"%.2f", Report.AverageFragments);\r
+    SetDlgItemText (Dlg, IDC_AVERAGEFRAGS, Text);\r
+\r
+    // FilesSizeBytes\r
+    if (Fractional)\r
+    {\r
+        swprintf (Text, L"%.2f %s", (double)(signed)(Report.FilesSizeBytes /\r
+            (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+    }\r
+    else\r
+    {\r
+        AddCommas (Text, Report.FilesSizeBytes / (uint64)BytesDivisor);\r
+        wcscat (Text, L" ");\r
+        wcscat (Text, BytesUnits);\r
+    }\r
+    SetDlgItemText (Dlg, IDC_FILESSIZEBYTES, Text);\r
+\r
+    // Files SizeOnDisk\r
+    if (Fractional)\r
+    {\r
+        swprintf (Text, L"%.2f %s", (double)(signed)((Report.FilesSizeBytes + Report.FilesSlackBytes) /\r
+            (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+    }\r
+    else\r
+    {\r
+        AddCommas (Text, (Report.FilesSizeBytes + Report.FilesSlackBytes) / (uint64)BytesDivisor);\r
+        wcscat (Text, L" ");\r
+        wcscat (Text, BytesUnits);\r
+\r
+    }\r
+    SetDlgItemText (Dlg, IDC_FILESSIZEONDISK, Text);\r
+\r
+    // FilesSlackBytes\r
+    if (Fractional)\r
+    {\r
+        swprintf (Text, L"%.2f %s", (double)(signed)(Report.FilesSlackBytes /\r
+            (BytesDivisor / 1024)) / 1024.0, BytesUnits);\r
+    }\r
+    else\r
+    {\r
+        AddCommas (Text, Report.FilesSlackBytes / BytesDivisor);\r
+        wcscat (Text, L" ");\r
+        wcscat (Text, BytesUnits);\r
+    }\r
+    swprintf (Text2, L"(%.2f%%)", Report.PercentSlack);\r
+    swprintf (Text3, L"%s %s", Text2, Text);\r
+    SetDlgItemText (Dlg, IDC_FILESSLACKBYTES, Text3);\r
+\r
+    // Recommendation\r
+    bool PFRec = false; // Recommend based off percent fragged files?\r
+    bool AFRec = false; // Recommend based off average fragments per file?\r
+\r
+    if (Report.PercentFragged >= 5.0f)\r
+        PFRec = true;\r
+\r
+    if (Report.AverageFragments >= 1.1f)\r
+        AFRec = true;\r
+\r
+    wcscpy (Text, L"* ");\r
+\r
+    if (PFRec)\r
+    {\r
+        swprintf\r
+        (\r
+            Text2,\r
+            L"%.2f%% of the files on this volume are fragmented. ",\r
+            Report.PercentFragged\r
+        );\r
+\r
+        wcscat (Text, Text2);\r
+    }\r
+\r
+    if (AFRec)\r
+    {\r
+        swprintf\r
+        (\r
+            Text2,\r
+            L"The average fragments per file (%.2f) indicates a high degree of fragmentation. ",\r
+            Report.AverageFragments\r
+        );\r
+\r
+        wcscat (Text, Text2);\r
+    }\r
+\r
+    if (Report.PercentFragged <  5.0f  &&  Report.AverageFragments < 1.1f)\r
+        swprintf (Text, L"* No defragmentation is necessary at this point.");\r
+    else\r
+    if (Report.PercentFragged < 15.0f  &&  Report.AverageFragments < 1.3f)\r
+        wcscat (Text, L"It is recommended that you perform a Fast Defrag.");\r
+    else\r
+        wcscat (Text, L"It is recommended that you perform an Extensive Defrag.");\r
+\r
+    // Should we recommend a smaller cluster size?\r
+    if (Report.PercentSlack >= 10.0f)\r
+    {\r
+        swprintf\r
+        (\r
+            Text2,\r
+            L"\n* A large amount of disk space (%.2f%%) is being lost "\r
+            L"due to a large (%u bytes) cluster size. It is recommended "\r
+            L"that you use a disk utility such as Partition Magic to "\r
+            L"reduce the cluster size of this volume.",\r
+            Report.PercentSlack,\r
+            Defrag->GetVolume().GetVolumeInfo().ClusterSize\r
+        );\r
+\r
+        wcscat (Text, Text2);\r
+    }\r
+\r
+    SetDlgItemText (Dlg, IDC_RECOMMEND, Text);\r
+\r
+    return;\r
+}\r
+\r
+\r
+INT_PTR CALLBACK ReportDialogProc (HWND Dlg, UINT Msg, WPARAM WParam, LPARAM LParam)\r
+{\r
+    switch (Msg)\r
+    {\r
+        case WM_INITDIALOG:\r
+            SetReportInfo (Dlg, Defrag->GetDefragReport (), 1, L"bytes", false);\r
+            return (1);\r
+\r
+        case WM_COMMAND:\r
+            switch (LOWORD(WParam))\r
+            {\r
+                case IDC_REPORTOK:\r
+                    EndDialog (Dlg, 0);\r
+                    return (1);\r
+\r
+                case IDC_GIGABYTES:\r
+                    SetReportInfo (Dlg, Defrag->GetDefragReport (), 1024*1024*1024, L"GB", true);\r
+                    return (1);\r
+\r
+                case IDC_MEGABYTES:\r
+                    SetReportInfo (Dlg, Defrag->GetDefragReport (), 1024*1024, L"MB", false);\r
+                    return (1);\r
+\r
+                case IDC_KILOBYTES:\r
+                    SetReportInfo (Dlg, Defrag->GetDefragReport (), 1024, L"KB", false);\r
+                    return (1);\r
+\r
+                case IDC_BYTES:\r
+                    SetReportInfo (Dlg, Defrag->GetDefragReport (), 1, L"bytes", false);\r
+                    return (1);\r
+            }\r
+    }\r
+\r
+    return (0);\r
+}\r