[USETUP] Display the chosen filesystem name in case of bootcode installation failure.
[reactos.git] / base / setup / usetup / fslist.c
index 85045a8..6aa8c4e 100644 (file)
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS text-mode setup
- * FILE:            subsys/system/usetup/fslist.c
+ * FILE:            base/setup/usetup/fslist.c
  * PURPOSE:         Filesystem list functions
- * PROGRAMMER:      Eric Kohl
- *                  Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * PROGRAMMER:      Casper S. Hornstrup (chorns@users.sourceforge.net)
  */
 
 #include "usetup.h"
 
 /* FUNCTIONS ****************************************************************/
 
-VOID
-FS_AddProvider(
+static VOID
+AddProvider(
     IN OUT PFILE_SYSTEM_LIST List,
-    IN LPCWSTR FileSystem,
-    IN FORMATEX FormatFunc,
-    IN CHKDSKEX ChkdskFunc)
+    IN PCWSTR FileSystemName, // Redundant, I need to check whether this is reaaaaally needed....
+    IN PFILE_SYSTEM FileSystem)
 {
     PFILE_SYSTEM_ITEM Item;
 
-    Item = (PFILE_SYSTEM_ITEM)RtlAllocateHeap(ProcessHeap, 0, sizeof(FILE_SYSTEM_ITEM));
+    Item = (PFILE_SYSTEM_ITEM)RtlAllocateHeap(ProcessHeap, 0, sizeof(*Item));
     if (!Item)
         return;
 
+    Item->FileSystemName = FileSystemName;
     Item->FileSystem = FileSystem;
-    Item->FormatFunc = FormatFunc;
-    Item->ChkdskFunc = ChkdskFunc;
-    Item->QuickFormat = FALSE;
+    Item->QuickFormat = TRUE;
     InsertTailList(&List->ListHead, &Item->ListEntry);
 
-    if (!FormatFunc)
+    if (!FileSystem)
         return;
 
-    Item = (PFILE_SYSTEM_ITEM)RtlAllocateHeap(ProcessHeap, 0, sizeof(FILE_SYSTEM_ITEM));
+    Item = (PFILE_SYSTEM_ITEM)RtlAllocateHeap(ProcessHeap, 0, sizeof(*Item));
     if (!Item)
         return;
 
+    Item->FileSystemName = FileSystemName;
     Item->FileSystem = FileSystem;
-    Item->FormatFunc = FormatFunc;
-    Item->ChkdskFunc = ChkdskFunc;
-    Item->QuickFormat = TRUE;
+    Item->QuickFormat = FALSE;
     InsertTailList(&List->ListHead, &Item->ListEntry);
 }
 
+static VOID
+InitializeFileSystemList(
+    IN PFILE_SYSTEM_LIST List)
+{
+    ULONG Count;
+    PFILE_SYSTEM FileSystems;
+
+    FileSystems = GetRegisteredFileSystems(&Count);
+    if (!FileSystems || Count == 0)
+        return;
+
+    while (Count--)
+    {
+        AddProvider(List, FileSystems->FileSystemName, FileSystems);
+        ++FileSystems;
+    }
+}
 
 PFILE_SYSTEM_LIST
 CreateFileSystemList(
     IN SHORT Left,
     IN SHORT Top,
     IN BOOLEAN ForceFormat,
-    IN LPCWSTR ForceFileSystem)
+    IN PCWSTR SelectFileSystem)
 {
     PFILE_SYSTEM_LIST List;
     PFILE_SYSTEM_ITEM Item;
     PLIST_ENTRY ListEntry;
 
-    List = (PFILE_SYSTEM_LIST)RtlAllocateHeap(ProcessHeap, 0, sizeof(FILE_SYSTEM_LIST));
+    List = (PFILE_SYSTEM_LIST)RtlAllocateHeap(ProcessHeap, 0, sizeof(*List));
     if (List == NULL)
         return NULL;
 
@@ -86,20 +99,19 @@ CreateFileSystemList(
     List->Selected = NULL;
     InitializeListHead(&List->ListHead);
 
-    HOST_CreateFileSystemList(List);
-
+    InitializeFileSystemList(List);
     if (!ForceFormat)
     {
-        /* Add 'Keep' provider */
-       FS_AddProvider(List, NULL, NULL, NULL);
+        /* Add the 'Keep existing filesystem' dummy provider */
+        AddProvider(List, NULL, NULL);
     }
 
-    /* Search for ForceFileSystem in list */
+    /* Search for SelectFileSystem in list */
     ListEntry = List->ListHead.Flink;
     while (ListEntry != &List->ListHead)
     {
         Item = CONTAINING_RECORD(ListEntry, FILE_SYSTEM_ITEM, ListEntry);
-        if (Item->FileSystem && wcscmp(ForceFileSystem, Item->FileSystem) == 0)
+        if (Item->FileSystemName && wcscmp(SelectFileSystem, Item->FileSystemName) == 0)
         {
             List->Selected = Item;
             break;
@@ -112,28 +124,24 @@ CreateFileSystemList(
     return List;
 }
 
-
 VOID
 DestroyFileSystemList(
     IN PFILE_SYSTEM_LIST List)
 {
-    PLIST_ENTRY ListEntry = List->ListHead.Flink;
+    PLIST_ENTRY ListEntry;
     PFILE_SYSTEM_ITEM Item;
-    PLIST_ENTRY Next;
 
-    while (ListEntry != &List->ListHead)
+    ListEntry = List->ListHead.Flink;
+    while (!IsListEmpty(&List->ListHead))
     {
+        ListEntry = RemoveHeadList(&List->ListHead);
         Item = CONTAINING_RECORD(ListEntry, FILE_SYSTEM_ITEM, ListEntry);
-        Next = ListEntry->Flink;
-
         RtlFreeHeap(ProcessHeap, 0, Item);
-
-        ListEntry = Next;
     }
+
     RtlFreeHeap(ProcessHeap, 0, List);
 }
 
-
 VOID
 DrawFileSystemList(
     IN PFILE_SYSTEM_LIST List)
@@ -143,7 +151,7 @@ DrawFileSystemList(
     COORD coPos;
     DWORD Written;
     ULONG Index = 0;
-    CHAR Buffer[70];
+    CHAR Buffer[128];
 
     ListEntry = List->ListHead.Flink;
     while (ListEntry != &List->ListHead)
@@ -163,15 +171,17 @@ DrawFileSystemList(
                                     coPos,
                                     &Written);
 
-        if (Item->FileSystem)
+        if (Item->FileSystemName)
         {
             if (Item->QuickFormat)
-                sprintf(Buffer, MUIGetString(STRING_FORMATDISK1), Item->FileSystem);
+                snprintf(Buffer, sizeof(Buffer), MUIGetString(STRING_FORMATDISK1), Item->FileSystemName);
             else
-                sprintf(Buffer, MUIGetString(STRING_FORMATDISK2), Item->FileSystem);
+                snprintf(Buffer, sizeof(Buffer), MUIGetString(STRING_FORMATDISK2), Item->FileSystemName);
         }
         else
-            sprintf(Buffer, MUIGetString(STRING_KEEPFORMAT));
+        {
+            snprintf(Buffer, sizeof(Buffer), MUIGetString(STRING_KEEPFORMAT));
+        }
 
         if (ListEntry == &List->Selected->ListEntry)
             CONSOLE_SetInvertedTextXY(List->Left,
@@ -186,7 +196,6 @@ DrawFileSystemList(
     }
 }
 
-
 VOID
 ScrollDownFileSystemList(
     IN PFILE_SYSTEM_LIST List)
@@ -198,7 +207,6 @@ ScrollDownFileSystemList(
     }
 }
 
-
 VOID
 ScrollUpFileSystemList(
     IN PFILE_SYSTEM_LIST List)