Initial import of Scalos. To decrease size I have
[AROS-Contrib.git] / scalos / Modules / FormatDisk.MUI / FormatDisk.c
blob407975c1767c943179289b55817514c9c390eb60
1 // FormatDisk.c
2 // $Date$
3 // $Revision$
6 #include <exec/types.h>
7 #include <exec/alerts.h>
8 #include <exec/execbase.h>
9 #include <dos/dos.h>
10 #include <dos/filehandler.h>
11 #include <resources/filesysres.h>
12 #include <intuition/intuition.h>
13 #include <intuition/gadgetclass.h>
14 #include <intuition/classusr.h>
15 #include <libraries/mui.h>
16 #include <mui/NListview_mcc.h>
17 #include <workbench/startup.h>
19 #include <clib/alib_protos.h>
21 #include <proto/exec.h>
22 #include <proto/dos.h>
23 #include <proto/icon.h>
24 #include <proto/intuition.h>
25 #include <proto/locale.h>
26 #include <proto/utility.h>
27 #include <proto/muimaster.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <ctype.h>
34 #include <defs.h>
35 #include <Year.h> // +jmc+
37 #include "FormatDisk.h"
39 #define FormatDiskMUI_NUMBERS
40 #define FormatDiskMUI_ARRAY
41 #define FormatDiskMUI_CODE
42 #include STR(SCALOSLOCALE)
44 //----------------------------------------------------------------------------
46 #define VERSION_MAJOR 40
47 #define VERSION_MINOR 1
49 //----------------------------------------------------------------------------
51 #define MAX_DEV_NAME 128
53 struct FileSystemName
55 ULONG fsn_DosType; // DosType
56 CONST_STRPTR fsn_Name;
59 #define KeyButtonHelp(name,key,HelpText)\
60 TextObject,\
61 ButtonFrame,\
62 MUIA_Font , MUIV_Font_Button,\
63 MUIA_Text_Contents, name,\
64 MUIA_Text_PreParse, "\33c",\
65 MUIA_Text_HiChar , key,\
66 MUIA_ControlChar , key,\
67 MUIA_InputMode , MUIV_InputMode_RelVerify,\
68 MUIA_Background , MUII_ButtonBack,\
69 MUIA_ShortHelp , HelpText,\
70 MUIA_CycleChain , TRUE,\
71 End
73 #define CheckMarkHelp(selected, HelpTextID)\
74 ImageObject,\
75 ImageButtonFrame,\
76 MUIA_InputMode , MUIV_InputMode_Toggle,\
77 MUIA_Image_Spec , MUII_CheckMark,\
78 MUIA_Image_FreeVert , TRUE,\
79 MUIA_Selected , selected,\
80 MUIA_Background , MUII_ButtonBack,\
81 MUIA_ShowSelState , FALSE,\
82 MUIA_CycleChain , TRUE,\
83 MUIA_ShortHelp , GetLocString(HelpTextID), \
84 End
86 #if defined(MUII_StringBack)
87 #define StringBack MUIA_Background, MUII_StringBack
88 #else /* MUII_StringBack */
89 #define StringBack MUIA_Background, MUII_TextBack
90 #endif /* MUII_StringBack */
92 //----------------------------------------------------------------------------
94 static BOOL OpenLibraries(void);
95 static void CloseLibraries(void);
96 static SAVEDS(APTR) INTERRUPT OpenAboutMUIHookFunc(struct Hook *hook, Object *o, Msg msg);
97 static SAVEDS(void) INTERRUPT OpenAboutHookFunc(struct Hook *hook, Object *o, Msg msg);
98 static SAVEDS(void) INTERRUPT SelectDeviceHookFunc(struct Hook *hook, Object *o, Msg msg);
99 static STRPTR GetLocString(ULONG MsgId);
100 static BOOL CheckMCCVersion(CONST_STRPTR name, ULONG minver, ULONG minrev);
101 static void FillDeviceList(void);
102 static void BToCString(BSTR BName, STRPTR CName, size_t Length);
103 static BOOL IsFssmValid(struct FileSysStartupMsg *fssm);
104 static void SelectDevice(CONST_STRPTR DevName);
105 static BOOL IsDiskFormatted(CONST_STRPTR DevName);
106 static void StripTrailingChar(STRPTR String, char CharToRemove);
107 static ULONG GetDosType(CONST_STRPTR DevName, STRPTR ExecDevName, size_t MaxLength, ULONG *UnitNumber);
108 static CONST_STRPTR GetFileSystemName(ULONG DosType, STRPTR Buffer, size_t MaxLength);
109 static STRPTR GetDosTypePrintableString(UBYTE dosType, STRPTR Buffer, size_t MaxLength);
110 static void GetCapacityString(STRPTR Buffer, size_t MaxLength, const struct InfoData *id);
112 //----------------------------------------------------------------------------
114 #if !defined(__amigaos4__) && !defined(__AROS__)
115 #include <dos.h>
117 long _stack = 16384; // minimum stack size, used by SAS/C startup code
118 #endif
120 //----------------------------------------------------------------------------
122 extern struct ExecBase *SysBase;
123 struct IntuitionBase *IntuitionBase = NULL;
124 T_LOCALEBASE LocaleBase = NULL;
125 #ifndef __amigaos4__
126 T_UTILITYBASE UtilityBase = NULL;
127 #endif
128 struct Library *MUIMasterBase = NULL;
129 struct Library *IconBase = NULL;
130 struct Library *IconobjectBase = NULL;
132 #ifdef __amigaos4__
133 struct IntuitionIFace *IIntuition = NULL;
134 struct LocaleIFace *ILocale = NULL;
135 struct MUIMasterIFace *IMUIMaster = NULL;
136 struct IconIFace *IIcon = NULL;
137 struct IconobjectIFace *IIconobject = NULL;
138 #endif
140 static struct Catalog *gb_Catalog;
142 static struct Hook AboutHook = { { NULL, NULL }, HOOKFUNC_DEF(OpenAboutHookFunc), NULL };
143 static struct Hook AboutMUIHook = { { NULL, NULL }, HOOKFUNC_DEF(OpenAboutMUIHookFunc), NULL };
144 static struct Hook SelectDeviceHook = { { NULL, NULL }, HOOKFUNC_DEF(SelectDeviceHookFunc), NULL };
146 //----------------------------------------------------------------------------
148 static const struct FileSystemName FsList[] =
150 /* BSD disklabel in MSDOS partitions */
151 {FS_BSD_DISKLABEL_MSDOS_SWAP , "BSD swap"}, /* "BSD\1" */
152 {FS_BSD_DISKLABEL_MSDOS_V6 , "BSD version 6"}, /* "BSD\2" */
153 {FS_BSD_DISKLABEL_MSDOS_V7 , "BSD version 7"}, /* "BSD\3" */
154 {FS_BSD_DISKLABEL_MSDOS_SYSV , "BSD System V"}, /* "BSD\4" */
155 {FS_BSD_DISKLABEL_MSDOS_41 , "4.1 BSD"}, /* "BSD\5" */
156 {FS_BSD_DISKLABEL_MSDOS_8TH , "8th edition BSD"}, /* "BSD\6" */
157 {FS_BSD_DISKLABEL_MSDOS_42 , "4.2 BSD"}, /* "BSD\7" */
158 {FS_BSD_DISKLABEL_MSDOS_MSDOS , "BSD MSDOS"}, /* "BSD\8" */
159 {FS_BSD_DISKLABEL_MSDOS_44LFS , "4.4 BSD LFS"}, /* "BSD\9" */
160 {FS_BSD_DISKLABEL_MSDOS_UNKNOWN, "BSD unknown"}, /* "BSD\a" */
161 {FS_BSD_DISKLABEL_MSDOS_HPFS , "BSD OS/2 HPFS"}, /* "BSD\b" */
162 {FS_BSD_DISKLABEL_MSDOS_ISO9660, "BSD ISO9660"}, /* "BSD\c" */
163 {FS_BSD_DISKLABEL_MSDOS_BOOT , "BSD boot"}, /* "BSD\d" */
164 {FS_BSD_DISKLABEL_MSDOS_AFFS , "BSD Amiga AFFS"}, /* "BSD\e" */
165 {FS_BSD_DISKLABEL_MSDOS_HFS , "BSD Apple HFS"}, /* "BSD\f" */
167 /* OSF (alpha) */
168 {FS_OFS_LINUX_SWAP , "OSF BSD/Linux swap"}, /* "OFS\1" */
169 {FS_OFS_BSD_V6 , "OSF BSD version 6"}, /* "OFS\2" */
170 {FS_OFS_BSD_V7 , "OSF BSD version 7"}, /* "OFS\3" */
171 {FS_OFS_BSD_SYSV , "OSF BSD System V"}, /* "OFS\4" */
172 {FS_OFS_BSD_41 , "OSF 4.1 BSD"}, /* "OFS\5" */
173 {FS_OFS_BSD_8TH , "OSF 8th edition BSD"}, /* "OFS\6" */
174 {FS_OFS_BSD_42 , "OSF 4.2 BSD"}, /* "OFS\7" */
175 {FS_OFS_LINUX_NATIVE, "OSF Linux native"}, /* "OFS\8" */
176 {FS_OFS_BSD_44LFS , "OSF 4.4 BSD LFS"}, /* "OFS\9" */
177 {FS_OFS_UNKNOWN , "OSF unknown"}, /* "OFS\a" */
178 {FS_OFS_HPFS , "OSF OS/2 HPFS"}, /* "OFS\b" */
179 {FS_OFS_ISO9660 , "OSF ISO9660"}, /* "OFS\c" */
180 {FS_OFS_BOOT , "OSF boot"}, /* "OFS\d" */
181 {FS_OFS_AFFS , "OSF Amiga AFFS"}, /* "OFS\e" */
182 {FS_OFS_HFS , "OSF Apple HFS"}, /* "OFS\f" */
183 {FS_OFS_ADVFS , "OSF Digital AdvFS"}, /* "OFS\1\0" */
185 /* SUN */
186 {FS_SUN_EMPTY , "Sun empty"}, /* "SUN\0" */
187 {FS_SUN_BOOT , "Sun boot"}, /* "SUN\1" */
188 {FS_SUN_SUNOS_ROOT , "SunOS root"}, /* "SUN\2" */
189 {FS_SUN_SUNOS_SWAP , "SunOS swap"}, /* "SUN\3" */
190 {FS_SUN_SUNOS_USR , "SunOS usr"}, /* "SUN\4" */
191 {FS_SUN_WHOLE , "Sun whole disk"}, /* "SUN\5" */
192 {FS_SUN_SUNOS_STAND , "SunOS stand"}, /* "SUN\6" */
193 {FS_SUN_SUNOS_VAR , "SunOS var"}, /* "SUN\7" */
194 {FS_SUN_SUNOS_HOME , "SunOS home"}, /* "SUN\8" */
195 {FS_SUN_LINUX_MINIX , "Sun Linux minix"}, /* "SUN\8\1" */
196 {FS_SUN_LINUX_SWAP , "Sun Linux swap"}, /* "SUN\8\2" */
197 {FS_SUN_LINUX_NATIVE, "Sun Linux native"}, /* "SUN\8\3" */
199 /* Amiga */
200 {FS_AMIGA_GENERIC_BOOT , "Amiga generic boot"}, /* "BOOU" */
201 {FS_AMIGA_OFS , "OFS"}, /* "DOS\0" */
202 {FS_AMIGA_FFS , "FFS"}, /* "DOS\1" */
203 {FS_AMIGA_OFS_INTL , "OFS Intl."}, /* "DOS\2" */
204 {FS_AMIGA_FFS_INTL , "FFS Intl."}, /* "DOS\3" */
205 {FS_AMIGA_OFS_DC_INTL , "OFS DC Intl."}, /* "DOS\4" */
206 {FS_AMIGA_FFS_DC_INTL , "FFS DC Intl."}, /* "DOS\5" */
207 {FS_AMIGA_OFS_LNFS , "OFS LNFS"}, /* "DOS\6" */
208 {FS_AMIGA_FFS_LNFS , "FFS LNFS"}, /* "DOS\7" */
209 {FS_AMIGA_MUFS_FFS_INTL , "muFS FFS Intl."}, /* "muFS" */
210 {FS_AMIGA_MUFS_OFS , "muFS OFS"}, /* "muF\0" */
211 {FS_AMIGA_MUFS_FFS , "muFS FFS"}, /* "muF\1" */
212 {FS_AMIGA_MUFS_OFS_INTL , "muFS OFS Intl"}, /* "muF\2" */
213 {FS_AMIGA_MUFS_FFS_INTL2, "muFS FFS Intl."}, /* "muF\3", same as muFS */
214 {FS_AMIGA_MUFS_OFS_DC , "muFS OFS DC"}, /* "muF\4" */
215 {FS_AMIGA_MUFS_FFS_DC , "muFS FFS DC"}, /* "muF\5" */
216 {FS_AMIGA_LINUX_NATIVE , "Amiga Linux native"}, /* "LNX\0" */
217 {FS_AMIGA_LINUX_EXT2 , "Amiga Linux ext2"}, /* "EXT2" */
218 {FS_AMIGA_LINUX_SWAP , "Amiga Linux swap"}, /* "SWAP" */
219 {FS_AMIGA_LINUX_SWAP2 , "Amiga Linux swap"}, /* "SWP\0", same as SWAP */
220 {FS_AMIGA_LINUX_MINIX , "Amiga Linux minix"}, /* "MNX\0" */
221 {FS_AMIGA_AMIX_0 , "Amix 0"}, /* "UNI\0" */
222 {FS_AMIGA_AMIX_1 , "Amix 1"}, /* "UNI\1" */
223 {FS_AMIGA_NETBSD_ROOT , "Amiga NetBSD root"}, /* "NBR\7" */
224 {FS_AMIGA_NETBSD_SWAP , "Amiga NetBSD swap"}, /* "NBS\1" */
225 {FS_AMIGA_NETBSD_OTHER , "Amiga NetBSD other"}, /* "NBU\7" */
226 {FS_AMIGA_PFS0 , "PFS 0"}, /* "PFS\0" */ /* XXX: not sure about the PFS ones.. ask.. */
227 {FS_AMIGA_PFS1 , "PFS 1"}, /* "PFS\1" */ /* XXX: not sure about the PFS ones.. ask.. */
228 {FS_AMIGA_PFS2 , "PFS 2"}, /* "PFS\2" */
229 {FS_AMIGA_PDS2 , "PFS 2 SCSIdirect"}, /* "PDS\0" */
230 {FS_AMIGA_PFS3 , "PFS 3"}, /* "PFS\3" */
231 {FS_AMIGA_PDS3 , "PFS 3 SCSIdirect"}, /* "PDS\3" */
232 {FS_AMIGA_MUPFS , "PFS Multiuser"}, /* "muPF" */
233 {FS_AMIGA_AFS , "AFS"}, /* "AFS\0" */
234 {FS_AMIGA_AFS_EXP , "AFS (experimental)"}, /* "AFS\1" */
235 {FS_AMIGA_CDISO , "CDROM ISO"}, /* "CD01" can be AmiCDFS, CBM's FS or CDrive in ISO mode */
236 {FS_AMIGA_CDHSF , "CDROM HSF"}, /* "CD00" HighSierra */
237 {FS_AMIGA_CDDA , "CDROM CDDA"}, /* "CDDA" audio CD */
238 {FS_AMIGA_CDRIVE , "CDrive or AmiCDFS"}, /* "CDFS" used by AmiCDFS and CDrive, CDrive changes the dostype to ISO, HighSierra or CDDA then */
239 {FS_AMIGA_ASIMCDFS , "AsimCDFS"}, /* <meaningless> */
240 {FS_AMIGA_HFS , "Macintosh HFS"}, /* "MAC\0" */
241 {FS_AMIGA_MSDOS , "MSDOS disk"}, /* "MSD\0" */
242 {FS_AMIGA_MSDOS_HF , "MSDOS PC-Task hardfile"}, /* "MSH\0" */
243 {FS_AMIGA_BFFS , "BFFS"}, /* "BFFS" */
244 {FS_AMIGA_SFS , "SFS"}, /* "SFS\0 */
246 /* Those are special amiga stuff */
247 {FS_AMIGA_BAD , "Unreadable disk"}, /* "BAD\0" */
248 {FS_AMIGA_NDOS, "Not really dos"}, /* "NDOS" */
249 {FS_AMIGA_KICK, "Kickstart disk"}, /* "KICK" */
251 /* Atari */
252 {FS_ATARI_GEMDOS , "Atari GEMDOS (<32MB)"}, /* "AGEM" */
253 {FS_ATARI_GEMDOSBIG , "Atari GEMDOS (>32MB)"}, /* "ABGM" */
254 {FS_ATARI_LINUX , "Atari Linux"}, /* LNX */
255 {FS_ATARI_LINUX_SWAP , "Atari Linux swap"}, /* SWP */
256 {FS_ATARI_LINUX_MINIX , "Atari Linux minix"}, /* MIX */
257 {FS_ATARI_LINUX_MINIX2, "Atari Linux minix"}, /* MNX */
258 {FS_ATARI_HFS , "Atari HFS"}, /* MAC */
259 {FS_ATARI_SYSV_UNIX , "Atari SysV unix"}, /* UNX */
260 {FS_ATARI_RAW , "Atari raw"}, /* RAW */
261 {FS_ATARI_EXTENDED , "Atari extended"}, /* XGM */
263 /* Macintosh */
264 {FS_MAC_PARTITION_MAP , "Mac partition map"}, /* "MAC\0" */
265 {FS_MAC_MACOS_DRIVER , "MacOS driver"}, /* "MAC\1" */
266 {FS_MAC_MACOS_DRIVER_43 , "MacOS driver 4.3"}, /* "MAC\2" */
267 {FS_MAC_MACOS_HFS , "MacOS HFS"}, /* "MAC\4" */
268 {FS_MAC_MACOS_MFS , "MacOS MFS"}, /* "MAC\5" */
269 {FS_MAC_SCRATCH , "Mac scratch"}, /* "MAC\6" */
270 {FS_MAC_PRODOS , "Mac ProDOS"}, /* "MAC\7" */
271 {FS_MAC_FREE , "Mac free"}, /* "MAC\8" */
272 {FS_MAC_LINUX_SWAP , "Mac Linux swap"}, /* "MAC\9" */
273 {FS_MAC_AUX , "Mac A/UX"}, /* "MAC\a" */
274 {FS_MAC_MSDOS , "Mac MSDOS"}, /* "MAC\b" */
275 {FS_MAC_MINIX , "Mac minix"}, /* "MAC\c" */
276 {FS_MAC_AFFS , "Mac Amiga AFFS"}, /* "MAC\d" */
277 {FS_MAC_LINUX_NATIVE , "Mac Linux native"}, /* "MAC\e" */
278 {FS_MAC_NEWWORLD , "Mac NewWorld bootblock"}, /* "MAC\f" */
279 {FS_MAC_MACOS_ATA , "MacOS ATA driver"}, /* "MAC\1\0" */
280 {FS_MAC_MACOS_FW_DRIVER , "MacOS FW driver"}, /* "MAC\1\1" */
281 {FS_MAC_MACOS_IOKIT , "MacOS IOKit"}, /* "MAC\1\2" */
282 {FS_MAC_MACOS_PATCHES , "MacOS patches"}, /* "MAC\1\3" */
283 {FS_MAC_MACOSX_BOOT , "MacOSX bootloader"}, /* "MAC\1\4" */
284 {FS_MAC_MACOSX_LOADER , "MacOSX loader"}, /* "MAC\1\5" */
285 {FS_MAC_UFS , "Mac UFS"}, /* "MAC\1\6" */
287 /* Acorn */
288 {FS_ACORN_ADFS , "Acorn ADFS"}, /* "ARM\1" */
289 {FS_ACORN_LINUX_MAP , "Acorn Linux partitionmap"}, /* "ARM\2" */
290 {FS_ACORN_LINUX_EXT2 , "Acorn Linux ext2"}, /* "ARM\3" */
291 {FS_ACORN_LINUX_SWAP , "Acorn Linux swap"}, /* "ARM\4" */
292 {FS_ACORN_ADFS_ICS , "Acorn ADFS (ICS/APDL)"}, /* "ARM\5" */
293 {FS_ACORN_LINUX_EXT2_ICS, "Acorn Linux ext2 (ICS/APDL)"}, /* "ARM\6" */
294 {FS_ACORN_LINUX_SWAP_ICS, "Acorn Linux swap (ICS/APDL)"}, /* "ARM\7" */
296 /* Sinclair QL */
297 {FS_SINCLAIR_QL5A, "Sinclair QL 720k"}, /* "QL5A" */
298 {FS_SINCLAIR_QL5B, "Sinclair QL 1440k"}, /* "QL5B" */
300 /* Spectrum */
301 {FS_SPECTRUM_DISCIPLE, "Spectrum Disciple"}, /* "ZXS\0" */
302 {FS_SPECTRUM_UNIDOS , "Spectrum UniDos"}, /* "ZXS\1" */
303 {FS_SPECTRUM_SAMDOS , "Spectrum SamDos"}, /* "ZXS\2" */
304 {FS_SPECTRUM_OPUS , "Spectrum Opus (180k)"}, /* "ZXS\3" */
306 /* Archimedes */
307 {FS_ARCHIMEDES_D, "Archimedes (D)"}, /* "ARMD" */
308 {FS_ARCHIMEDES_E, "Archimedes (E)"}, /* "ARME" */
310 /* CP/M */
311 {FS_CPM, "CP/M"}, /* "CPM\2" */
313 /* C64 */
314 {FS_C64, "C64"}, /* "1541" */
316 {0, NULL},
319 //----------------------------------------------------------------------------
321 static Object *APP_Main;
322 static Object *WIN_Main;
323 static Object *WIN_AboutMUI;
324 static Object *NListDosDevices;
325 static Object *StringLabel;
326 static Object *TextFormatted;
327 static Object *TextDosType;
328 static Object *TextDeviceName;
329 static Object *CancelButton;
330 static Object *ButtonQuickFormat, *ButtonFormat, *ButtonFormatVerify;
331 static Object *MenuAbout, *MenuAboutMUI, *MenuQuit;
333 //----------------------------------------------------------------------------
336 int main(int argc, char *argv[])
338 LONG win_opened;
339 #if 0
340 struct WBStartup *WBenchMsg =
341 (argc == 0) ? (struct WBStartup *)argv : NULL;
343 if (NULL == WBenchMsg)
345 return 5;
347 if (WBenchMsg->sm_NumArgs < 2)
349 return 5;
351 #endif
353 do {
354 ULONG sigs = 0;
355 BOOL Run = TRUE;
357 if (!OpenLibraries())
358 break;
360 if (!CheckMCCVersion(MUIC_NListview, 19, 66) )
361 break;
363 gb_Catalog = OpenCatalogA(NULL, "Scalos/FormatDiskMUI.catalog",NULL);
365 APP_Main = ApplicationObject,
366 MUIA_Application_Title, GetLocString(MSGID_TITLENAME),
367 MUIA_Application_Version, "$VER: Scalos FormatDisk.module V40.1 (" __DATE__ ") " COMPILER_STRING,
368 MUIA_Application_Copyright, "© The Scalos Team, 2008" CURRENTYEAR,
369 MUIA_Application_Author, "The Scalos Team",
370 MUIA_Application_Description, "Scalos FormatDisk module",
371 MUIA_Application_Base, "SCALOS_FORMATDISK",
373 SubWindow, WIN_Main = WindowObject,
374 MUIA_Window_Title, GetLocString(MSGID_TITLENAME),
375 MUIA_Window_ID, MAKE_ID('M','A','I','N'),
376 MUIA_Window_AppWindow, TRUE,
377 MUIA_Window_UseBottomBorderScroller, TRUE, // +jmc+
379 WindowContents, VGroup,
380 Child, HGroup,
381 Child, NListviewObject,
382 MUIA_Weight, 10,
383 MUIA_NListview_NList, NListDosDevices = NListObject,
384 MUIA_NList_ConstructHook, MUIV_NList_ConstructHook_String,
385 MUIA_NList_DestructHook, MUIV_NList_DestructHook_String,
386 End, //NListObject
387 End, //NListviewObject
389 Child, VGroup,
390 GroupFrame,
391 Child, ColGroup(2),
392 Child, Label1(GetLocString(MSGID_STRING_LABEL)),
393 Child, StringLabel = StringObject,
394 StringFrame,
395 StringBack,
396 End, //StringObject
398 Child, Label1(GetLocString(MSGID_TEXT_FILESYSTEM)),
399 Child, TextDosType = TextObject,
400 MUIA_Background, MUII_TextBack,
401 TextFrame,
402 End, //TextObject
404 Child, Label1(GetLocString(MSGID_TEXT_STATUS)),
405 Child, TextFormatted = TextObject,
406 TextFrame,
407 MUIA_Background, MUII_TextBack,
408 End, //TextObject
409 End, //ColGroup
411 Child, HVSpace,
413 Child, HGroup,
414 Child, VGroup,
415 GroupFrame,
416 MUIA_Background, MUII_GroupBack,
417 MUIA_FrameTitle, (ULONG) GetLocString(MSGID_GROUP_COMMON),
419 Child, ColGroup(2),
420 Child, Label1(GetLocString(MSGID_CHECK_CREATEICONS)),
421 Child, CheckMarkHelp(FALSE, MSGID_CHECK_CREATEICONS_SHORTHELP),
422 End, //ColGroup
423 End, //VGroup
425 Child, HVSpace,
427 Child, VGroup,
428 GroupFrame,
429 MUIA_Background, MUII_GroupBack,
430 MUIA_FrameTitle, (ULONG) GetLocString(MSGID_GROUP_SPECIFIC),
432 Child, ColGroup(2),
433 Child, Label1(GetLocString(MSGID_CHECK_CASE_SENSITIVE)),
434 Child, CheckMarkHelp(FALSE, MSGID_CHECK_CASE_SENSITIVE_SHORTHELP),
436 Child, Label1(GetLocString(MSGID_CHECK_CREATE_RECYCLE)),
437 Child, CheckMarkHelp(FALSE, MSGID_CHECK_CREATE_RECYCLE_SHORTHELP),
439 Child, Label1(GetLocString(MSGID_CHECK_RECYCLE_VISIBLE)),
440 Child, CheckMarkHelp(FALSE, MSGID_CHECK_RECYCLE_VISIBLE_SHORTHELP),
441 End, //ColGroup
442 End, //VGroup
444 End, //HGroup
446 Child, HVSpace,
448 Child, TextDeviceName = TextObject,
449 TextFrame,
450 MUIA_Background, MUII_TextBack,
451 MUIA_Text_PreParse, "\33c",
452 End, //TextObject
453 End, //VGroup
454 End, //HGroup
456 Child, VSpace(1),
458 Child, ColGroup(4),
459 Child, ButtonQuickFormat = KeyButtonHelp(GetLocString(MSGID_BUTTON_QUICKFORMAT),
460 *GetLocString(MSGID_BUTTON_QUICKFORMAT_SHORT), GetLocString(MSGID_BUTTON_QUICKFORMAT_SHORTHELP)),
461 Child, ButtonFormat = KeyButtonHelp(GetLocString(MSGID_BUTTON_FORMAT),
462 *GetLocString(MSGID_BUTTON_FORMAT_SHORT), GetLocString(MSGID_BUTTON_FORMAT_SHORTHELP)),
463 Child, ButtonFormatVerify = KeyButtonHelp(GetLocString(MSGID_BUTTON_FORMAT_VERIFY),
464 *GetLocString(MSGID_BUTTON_FORMAT_VERIFY_SHORT), GetLocString(MSGID_BUTTON_FORMAT_VERIFY_SHORTHELP)),
465 Child, CancelButton = KeyButtonHelp(GetLocString(MSGID_CANCELBUTTON),
466 *GetLocString(MSGID_CANCELBUTTON_SHORT), GetLocString(MSGID_SHORTHELP_CANCELBUTTON)),
467 End, //HGroup
468 End, //VGroup
469 End, //WindowObject
471 MUIA_Application_Menustrip, MenustripObject,
472 Child, MenuObjectT(GetLocString(MSGID_MENU_PROJECT)),
474 Child, MenuAbout = MenuitemObject,
475 MUIA_Menuitem_Title, GetLocString(MSGID_MENU_PROJECT_ABOUT),
476 End,
477 Child, MenuAboutMUI = MenuitemObject,
478 MUIA_Menuitem_Title, GetLocString(MSGID_MENU_PROJECT_ABOUTMUI),
479 End,
480 Child, MenuitemObject,
481 MUIA_Menuitem_Title, -1,
482 End,
483 Child, MenuQuit = MenuitemObject,
484 MUIA_Menuitem_Title, GetLocString(MSGID_MENU_PROJECT_QUIT),
485 MUIA_Menuitem_Shortcut, GetLocString(MSGID_MENU_PROJECT_QUIT_SHORT),
486 End,
488 End, //MenuObjectT
489 End, //MenuStripObject
491 End; //ApplicationObject
493 d1(KPrintF( "%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
495 if (NULL == APP_Main)
497 printf(GetLocString(MSGID_CREATE_APPLICATION_FAILED));
498 break;
501 DoMethod(WIN_Main, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
502 WIN_Main, 3, MUIM_Set, MUIA_Window_Open, FALSE);
503 DoMethod(WIN_Main, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
504 APP_Main, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
506 DoMethod(MenuAbout, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
507 APP_Main, 2, MUIM_CallHook, &AboutHook);
508 DoMethod(MenuAboutMUI, MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
509 APP_Main, 2, MUIM_CallHook, &AboutMUIHook);
510 DoMethod(MenuQuit, MUIM_Notify,MUIA_Menuitem_Trigger,MUIV_EveryTime,
511 APP_Main, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
513 // Call hook everytime a device is selected
514 DoMethod(NListDosDevices, MUIM_Notify, MUIA_NList_Active, MUIV_EveryTime,
515 APP_Main, 3, MUIM_CallHook, &SelectDeviceHook, MUIV_TriggerValue);
517 // Quit when "Cancel" button is clicked
518 DoMethod(CancelButton, MUIM_Notify, MUIA_Pressed, FALSE,
519 APP_Main, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
521 set(ButtonQuickFormat, MUIA_Disabled, TRUE);
522 set(ButtonFormat, MUIA_Disabled, TRUE);
523 set(ButtonFormatVerify, MUIA_Disabled, TRUE);
525 FillDeviceList();
527 set(WIN_Main, MUIA_Window_Open, TRUE);
528 get(WIN_Main, MUIA_Window_Open, &win_opened);
530 if (!win_opened)
532 printf(GetLocString(MSGID_CREATE_MAINWINDOW_FAILED));
533 break;
536 d1(KPrintF( "%s/%s/%ld: \n", __FILE__, __FUNC__, __LINE__));
538 while (Run)
540 ULONG Action = DoMethod(APP_Main, MUIM_Application_NewInput, &sigs);
542 switch (Action)
544 case MUIV_Application_ReturnID_Quit:
545 Run = FALSE;
546 break;
549 if (Run && sigs)
551 sigs = Wait(sigs | SIGBREAKF_CTRL_C);
553 if (sigs & SIGBREAKF_CTRL_C)
555 Run = FALSE;
560 set(WIN_Main, MUIA_Window_Open, FALSE);
561 } while (0);
563 if (APP_Main)
564 MUI_DisposeObject(APP_Main);
565 if(gb_Catalog)
566 CloseCatalog(gb_Catalog);
568 CloseLibraries();
570 return 0;
573 //----------------------------------------------------------------------------
575 static BOOL OpenLibraries(void)
577 MUIMasterBase = OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN-1);
578 if (NULL == MUIMasterBase)
579 return FALSE;
580 #ifdef __amigaos4__
581 else
583 IMUIMaster = (struct MUIMasterIFace *)GetInterface((struct Library *)MUIMasterBase, "main", 1, NULL);
584 if (NULL == IMUIMaster)
585 return FALSE;
587 #endif
590 IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 39);
591 if (NULL == IntuitionBase)
592 return FALSE;
593 #ifdef __amigaos4__
594 else
596 IIntuition = (struct IntuitionIFace *)GetInterface((struct Library *)IntuitionBase, "main", 1, NULL);
597 if (NULL == IIntuition)
598 return FALSE;
600 #endif
602 LocaleBase = (T_LOCALEBASE) OpenLibrary("locale.library", 38);
603 #ifdef __amigaos4__
604 if (NULL != LocaleBase)
605 ILocale = (struct LocaleIFace *)GetInterface((struct Library *)LocaleBase, "main", 1, NULL);
606 #endif
608 IconBase = OpenLibrary("icon.library", 39);
609 if (NULL == IconBase)
610 return FALSE;
611 #ifdef __amigaos4__
612 else
614 IIcon = (struct IconIFace *)GetInterface((struct Library *)IconBase, "main", 1, NULL);
615 if (NULL == IIcon)
616 return FALSE;
618 #endif
620 #ifndef __amigaos4__
621 UtilityBase = (T_UTILITYBASE) OpenLibrary("utility.library", 39);
622 if (NULL == UtilityBase)
623 return FALSE;
624 #endif
626 return TRUE;
629 //----------------------------------------------------------------------------
631 static void CloseLibraries(void)
633 #ifndef __amigaos4__
634 if (UtilityBase)
636 CloseLibrary((struct Library *) UtilityBase);
637 UtilityBase = NULL;
639 #endif
640 #ifdef __amigaos4__
641 if (ILocale)
643 DropInterface((struct Interface *)ILocale);
644 ILocale = NULL;
646 #endif
647 if (LocaleBase)
649 CloseLibrary((struct Library *)LocaleBase);
650 LocaleBase = NULL;
652 #ifdef __amigaos4__
653 if (IIcon)
655 DropInterface((struct Interface *)IIcon);
656 IIcon = NULL;
658 #endif
659 if (IconBase)
661 CloseLibrary(IconBase);
662 IconBase = NULL;
664 #ifdef __amigaos4__
665 if (IIntuition)
667 DropInterface((struct Interface *)IIntuition);
668 IIntuition = NULL;
670 #endif
671 if (IntuitionBase)
673 CloseLibrary((struct Library *)IntuitionBase);
674 IntuitionBase = NULL;
676 #ifdef __amigaos4__
677 if (IMUIMaster)
679 DropInterface((struct Interface *)IMUIMaster);
680 IMUIMaster = NULL;
682 #endif
683 if (MUIMasterBase)
685 CloseLibrary(MUIMasterBase);
686 MUIMasterBase = NULL;
690 //----------------------------------------------------------------------------
692 static STRPTR GetLocString(ULONG MsgId)
694 struct FormatDiskMUI_LocaleInfo li;
696 li.li_Catalog = gb_Catalog;
697 #ifndef __amigaos4__
698 li.li_LocaleBase = LocaleBase;
699 #else
700 li.li_ILocale = ILocale;
701 #endif
703 return (STRPTR)GetFormatDiskMUIString(&li, MsgId);
706 //----------------------------------------------------------------------------
708 static SAVEDS(APTR) INTERRUPT OpenAboutMUIHookFunc(struct Hook *hook, Object *o, Msg msg)
710 if (NULL == WIN_AboutMUI)
712 WIN_AboutMUI = MUI_NewObject(MUIC_Aboutmui,
713 MUIA_Window_RefWindow, WIN_Main,
714 MUIA_Aboutmui_Application, APP_Main,
715 End;
718 if (WIN_AboutMUI)
719 set(WIN_AboutMUI, MUIA_Window_Open, TRUE);
721 return 0;
724 //----------------------------------------------------------------------------
726 static SAVEDS(void) INTERRUPT OpenAboutHookFunc(struct Hook *hook, Object *o, Msg msg)
728 MUI_Request(APP_Main, WIN_Main, 0, NULL,
729 GetLocString(MSGID_ABOUTREQOK),
730 GetLocString(MSGID_ABOUTREQFORMAT),
731 VERSION_MAJOR, VERSION_MINOR, COMPILER_STRING, CURRENTYEAR);
734 //----------------------------------------------------------------------------
736 static SAVEDS(void) INTERRUPT SelectDeviceHookFunc(struct Hook *hook, Object *o, Msg msg)
738 LONG *pPos = (LONG *) msg;
740 (void) hook;
741 (void) o;
743 if (*pPos >= 0)
745 STRPTR entry;
747 DoMethod(NListDosDevices, MUIM_NList_GetEntry, *pPos, &entry);
748 d2(KPrintF(__FILE__ "/%s/%ld: *pPos=%ld entry=<%s>\n", __FUNC__, __LINE__, *pPos, entry));
750 if (entry)
751 SelectDevice(entry);
756 //----------------------------------------------------------------------------
758 IPTR mui_getv(APTR obj, ULONG attr)
760 IPTR v;
761 GetAttr(attr, obj, &v);
762 return (v);
765 //----------------------------------------------------------------------------
767 // Checks if a certain version of a MCC is available
768 static BOOL CheckMCCVersion(CONST_STRPTR name, ULONG minver, ULONG minrev)
770 BOOL flush = TRUE;
772 d1(KPrintF(__FILE__ "/" __FUNC__ "/%ld: %s ", __LINE__, name);)
774 while (1)
776 ULONG ver;
777 ULONG rev;
778 struct Library *base;
779 char libname[256];
781 // First we attempt to acquire the version and revision through MUI
782 Object *obj = MUI_NewObject((STRPTR) name, TAG_DONE);
783 if (obj)
785 get(obj, MUIA_Version, &ver);
786 get(obj, MUIA_Revision, &rev);
788 MUI_DisposeObject(obj);
790 if(ver > minver || (ver == minver && rev >= minrev))
792 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: v%ld.%ld found through MUIA_Version/Revision\n", __LINE__, ver, rev);)
793 return TRUE;
797 // If we did't get the version we wanted, let's try to open the
798 // libraries ourselves and see what happens...
799 stccpy(libname, "PROGDIR:mui", sizeof(libname));
800 AddPart(libname, name, sizeof(libname));
802 if ((base = OpenLibrary(&libname[8], 0)) || (base = OpenLibrary(&libname[0], 0)))
804 UWORD OpenCnt = base->lib_OpenCnt;
806 ver = base->lib_Version;
807 rev = base->lib_Revision;
809 CloseLibrary(base);
811 // we add some additional check here so that eventual broken .mcc also have
812 // a chance to pass this test (i.e. Toolbar.mcc is broken)
813 if (ver > minver || (ver == minver && rev >= minrev))
815 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: v%ld.%ld found through OpenLibrary()\n", __LINE__, ver, rev);)
816 return TRUE;
819 if (OpenCnt > 1)
821 if (MUI_Request(NULL, NULL, 0L,
822 (STRPTR) GetLocString(MSGID_STARTUP_FAILURE),
823 (STRPTR) GetLocString(MSGID_STARTUP_RETRY_QUIT_GAD),
824 (STRPTR) GetLocString(MSGID_STARTUP_MCC_IN_USE),
825 name, minver, minrev, ver, rev))
827 flush = TRUE;
829 else
830 break;
833 // Attempt to flush the library if open count is 0 or because the
834 // user wants to retry (meaning there's a chance that it's 0 now)
836 if (flush)
838 struct Library *result;
839 extern struct ExecBase *SysBase;
841 Forbid();
842 if ((result = (struct Library *) FindName(&SysBase->LibList, name)))
843 RemLibrary(result);
844 Permit();
845 flush = FALSE;
847 else
849 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: couldn`t find minimum required version.\n", __LINE__);)
851 // We're out of luck - open count is 0, we've tried to flush
852 // and still haven't got the version we want
853 if (MUI_Request(NULL, NULL, 0L,
854 (STRPTR) GetLocString(MSGID_STARTUP_FAILURE),
855 (STRPTR) GetLocString(MSGID_STARTUP_RETRY_QUIT_GAD),
856 (STRPTR) GetLocString(MSGID_STARTUP_OLD_MCC),
857 name, minver, minrev, ver, rev))
859 flush = TRUE;
861 else
862 break;
865 else
867 // No MCC at all - no need to attempt flush
868 flush = FALSE;
869 if (!MUI_Request(NULL, NULL, 0L,
870 (STRPTR) GetLocString(MSGID_STARTUP_FAILURE),
871 (STRPTR) GetLocString(MSGID_STARTUP_RETRY_QUIT_GAD),
872 (STRPTR) GetLocString(MSGID_STARTUP_MCC_NOT_FOUND),
873 name, minver, minrev))
875 break;
880 return FALSE;
883 //----------------------------------------------------------------------------
885 static void FillDeviceList(void)
887 ULONG DosListFlags = LDF_DEVICES | LDF_READ;
888 struct DosList *dl;
890 dl = LockDosList(DosListFlags);
892 while ((dl = NextDosEntry(dl, DosListFlags)))
894 struct FileSysStartupMsg *fssm = BADDR(dl->dol_misc.dol_handler.dol_Startup);
896 if (dl->dol_Task && IsFssmValid(fssm))
898 char DeviceName[MAX_DEV_NAME];
900 BToCString(dl->dol_Name, DeviceName, sizeof(DeviceName) - 1);
901 strcat(DeviceName, ":");
903 d1(KPrintF( "%s/%s/%ld: dl=%08lx dol_Name=%08lx <%s>\n", __FILE__, __FUNC__, __LINE__, dl, dl->dol_Name, DeviceName));
905 if (IsFileSystem(DeviceName))
907 DoMethod(NListDosDevices,
908 MUIM_NList_InsertSingle,
909 DeviceName,
910 MUIV_NList_Insert_Sorted);
915 UnLockDosList(DosListFlags);
918 //----------------------------------------------------------------------------
920 static void BToCString(BSTR BName, STRPTR CName, size_t Length)
922 const UBYTE *bName = BADDR((const UBYTE *) BName);
923 size_t BLength = bName[0];
925 bName++; // skip length
927 while (Length > 1 && BLength)
929 *CName++ = *bName++;
930 Length--;
931 BLength--;
933 *CName = '\0';
936 //----------------------------------------------------------------------------
939 * Checks if a device has a valid fssm.
941 static BOOL IsFssmValid(struct FileSysStartupMsg *fssm)
943 const struct DosEnvec *env;
945 if (!(TypeOfMem(fssm) & MEMF_PUBLIC))
946 return FALSE;
948 if (!(TypeOfMem(BADDR(fssm->fssm_Device)) & MEMF_PUBLIC))
949 return FALSE;
951 env = BADDR(fssm->fssm_Environ);
952 if (!(TypeOfMem((APTR) env) & MEMF_PUBLIC))
953 return FALSE;
955 if (env->de_TableSize > 2 * sizeof(struct DosEnvec))
956 return FALSE;
957 #if 0
958 if (!((UBYTE *)myfssm)[0] || !((UBYTE *)devname)[0])
960 return (TRUE);
962 #endif
964 return TRUE;
967 //----------------------------------------------------------------------------
969 static void SelectDevice(CONST_STRPTR DevName)
971 struct FileInfoBlock *fib = NULL;
972 struct InfoData *id = NULL;
973 BPTR dLock = 0;
974 struct Process *myProc = (struct Process *) FindTask(NULL);
975 APTR oldWindowPtr = myProc->pr_WindowPtr;
977 myProc->pr_WindowPtr = (APTR) ~0;
979 do {
980 char FsName[MAX_DEV_NAME];
981 char ExecDevName[108];
982 char DevInfoString[128];
983 char CapacityString[40];
984 ULONG UnitNumber = 0;
985 ULONG DosType;
987 fib = AllocDosObject(DOS_FIB, NULL);
988 d2(KPrintF( "%s/%s/%ld: fib=%08lx\n", __FILE__, __FUNC__, __LINE__, fib));
989 if (NULL == fib)
990 break;
992 id = malloc(sizeof(struct InfoData));
993 d2(KPrintF( "%s/%s/%ld: id=%08lx\n", __FILE__, __FUNC__, __LINE__, id));
994 if (NULL == id)
995 break;
997 dLock = Lock(DevName, ACCESS_READ);
998 d2(KPrintF( "%s/%s/%ld: dLock=%08lx\n", __FILE__, __FUNC__, __LINE__, dLock));
999 if (0 == dLock)
1000 break;
1002 if (!Info(dLock, id))
1003 break;
1005 d2(KPrintF( "%s/%s/%ld: Info() Ok, id_DiskType=%08lx\n", __FILE__, __FUNC__, __LINE__, id->id_DiskType));
1007 if (ID_NO_DISK_PRESENT == id->id_DiskType)
1008 break;
1010 if (Examine(dLock, fib))
1012 d2(KPrintF( "%s/%s/%ld: Examine() OK <%s>\n", __FILE__, __FUNC__, __LINE__, fib->fib_FileName));
1013 setstring(StringLabel, fib->fib_FileName);
1015 else
1017 d2(KPrintF( "%s/%s/%ld: Examine() failed <%s>\n", __FILE__, __FUNC__, __LINE__, fib->fib_FileName));
1018 setstring(StringLabel, GetLocString(MSGID_LABEL_RELABEL_ME));
1021 set(TextFormatted, MUIA_Text_Contents,
1022 GetLocString(IsDiskFormatted(DevName) ? MSGID_DISK_FORMATTED : MSGID_DISK_UNFORMATTED));
1024 DosType = GetDosType(DevName, ExecDevName, sizeof(ExecDevName), &UnitNumber);
1025 d2(KPrintF( "%s/%s/%ld: DosType=%08lx\n", __FILE__, __FUNC__, __LINE__, DosType));
1027 set(TextDosType, MUIA_Text_Contents, GetFileSystemName(DosType, FsName, sizeof(FsName)));
1029 GetCapacityString(CapacityString, sizeof(CapacityString), id);
1031 snprintf(DevInfoString, sizeof(DevInfoString),
1032 GetLocString(MSGID_TEXT_DEVICENAME), ExecDevName, UnitNumber, CapacityString);
1034 set(TextDeviceName, MUIA_Text_Contents, DevInfoString);
1036 if (ID_WRITE_PROTECTED == id->id_DiskState)
1038 set(ButtonQuickFormat, MUIA_Disabled, TRUE);
1039 set(ButtonFormat, MUIA_Disabled, TRUE);
1040 set(ButtonFormatVerify, MUIA_Disabled, TRUE);
1042 else
1044 set(ButtonQuickFormat, MUIA_Disabled, FALSE);
1045 set(ButtonFormat, MUIA_Disabled, FALSE);
1046 set(ButtonFormatVerify, MUIA_Disabled, FALSE);
1048 } while (0);
1050 if (dLock)
1051 UnLock(dLock);
1052 if (id)
1053 free(id);
1054 if (fib)
1055 FreeDosObject(DOS_FIB, fib);
1057 myProc->pr_WindowPtr = oldWindowPtr;
1060 //----------------------------------------------------------------------------
1062 static BOOL IsDiskFormatted(CONST_STRPTR DevName)
1064 char ClonedDeviceName[MAX_DEV_NAME];
1065 ULONG DosListFlags = LDF_DEVICES | LDF_READ;
1066 struct DosList *dl;
1067 struct MsgPort *mp = NULL;
1068 BOOL IsFormatted = FALSE;
1070 stccpy(ClonedDeviceName, DevName, sizeof(ClonedDeviceName));
1071 StripTrailingChar(ClonedDeviceName, ':');
1073 d2(KPrintF( "%s/%s/%ld: ClonedDeviceName=<%s>\n", __FILE__, __FUNC__, __LINE__, ClonedDeviceName));
1075 dl = LockDosList(DosListFlags);
1076 if ((dl = FindDosEntry(dl, ClonedDeviceName, LDF_DEVICES)))
1078 mp = dl->dol_Task;
1079 d2(KPrintF( "%s/%s/%ld: dl=%08lx mp=%08lx dol_Task=%08lx\n", __FILE__, __FUNC__, __LINE__, dl, mp));
1081 UnLockDosList(DosListFlags);
1083 if (mp)
1085 DosListFlags = LDF_VOLUMES | LDF_READ;
1087 dl = LockDosList(DosListFlags);
1088 while ((dl = NextDosEntry(dl, LDF_VOLUMES)))
1090 d2(KPrintF( "%s/%s/%ld: dl=%08lx mp=%08lx dol_Task=%08lx\n", __FILE__, __FUNC__, __LINE__, dl, mp, dl->dol_Task));
1091 if (mp == dl->dol_Task)
1093 IsFormatted = TRUE;
1094 break;
1097 UnLockDosList(DosListFlags);
1100 return IsFormatted;
1103 //----------------------------------------------------------------------------
1105 static void StripTrailingChar(STRPTR String, char CharToRemove)
1107 size_t Len = strlen(String);
1109 if (Len > 0 && CharToRemove == String[Len - 1])
1110 String[Len - 1] = '\0';
1113 //----------------------------------------------------------------------------
1115 static ULONG GetDosType(CONST_STRPTR DevName, STRPTR ExecDevName, size_t MaxLength, ULONG *UnitNumber)
1117 char ClonedDeviceName[MAX_DEV_NAME];
1118 ULONG DosListFlags = LDF_DEVICES | LDF_READ;
1119 struct DosList *dl;
1120 ULONG DosType = 0;
1122 stccpy(ClonedDeviceName, DevName, sizeof(ClonedDeviceName));
1123 StripTrailingChar(ClonedDeviceName, ':');
1125 d2(KPrintF( "%s/%s/%ld: ClonedDeviceName=<%s>\n", __FILE__, __FUNC__, __LINE__, ClonedDeviceName));
1127 dl = LockDosList(DosListFlags);
1128 if ((dl = FindDosEntry(dl, ClonedDeviceName, LDF_DEVICES)))
1130 struct FileSysStartupMsg *fssm = BADDR(dl->dol_misc.dol_handler.dol_Startup);
1132 d2(KPrintF( "%s/%s/%ld: dl=%08lx fssm=%08lx\n", __FILE__, __FUNC__, __LINE__, dl, fssm));
1134 if (dl->dol_Task && IsFssmValid(fssm))
1136 struct DosEnvec *env = BADDR(fssm->fssm_Environ);
1138 DosType = env->de_DosType;
1140 BToCString(fssm->fssm_Device, ExecDevName, MaxLength);
1141 *UnitNumber = fssm->fssm_Unit;
1144 UnLockDosList(DosListFlags);
1146 return DosType;
1149 //----------------------------------------------------------------------------
1151 static CONST_STRPTR GetFileSystemName(ULONG DosType, STRPTR Buffer, size_t MaxLength)
1153 const struct FileSystemName *fsn;
1154 CONST_STRPTR FsName = NULL;
1156 for (fsn = FsList; fsn->fsn_Name; fsn++)
1158 if (fsn->fsn_DosType == DosType)
1160 stccpy(Buffer, fsn->fsn_Name, MaxLength);
1161 FsName = Buffer;
1162 break;
1166 if (NULL == FsName)
1168 char DosListString[4][10];
1170 snprintf(Buffer, MaxLength,
1171 GetLocString(MSGID_FSNAME_UNKNOWN),
1172 GetDosTypePrintableString((UBYTE) (DosType >> 24), DosListString[0], sizeof(DosListString[0])),
1173 GetDosTypePrintableString((UBYTE) ((DosType >> 16) & 0xff), DosListString[1], sizeof(DosListString[1])),
1174 GetDosTypePrintableString((UBYTE) ((DosType >> 8) & 0xff), DosListString[2], sizeof(DosListString[2])),
1175 GetDosTypePrintableString((UBYTE) (DosType & 0xff), DosListString[3], sizeof(DosListString[3]))
1179 return Buffer;
1182 //----------------------------------------------------------------------------
1184 static STRPTR GetDosTypePrintableString(UBYTE dosType, STRPTR Buffer, size_t MaxLength)
1186 if (isprint(dosType))
1187 snprintf(Buffer, MaxLength, "%c", dosType);
1188 else
1189 snprintf(Buffer, MaxLength, "\\%x", (unsigned int) dosType);
1191 return Buffer;
1194 //----------------------------------------------------------------------------
1196 static void GetCapacityString(STRPTR Buffer, size_t MaxLength, const struct InfoData *id)
1198 ULONG BlocksPerKByte = 1024 / id->id_BytesPerBlock;
1199 ULONG KBytes, MBytes, GBytes;
1201 if (BlocksPerKByte)
1203 // Block size <= 1024
1204 KBytes = id->id_NumBlocks / BlocksPerKByte;
1206 else
1208 // Block size > 1024
1209 ULONG KBytesPerBlock = id->id_BytesPerBlock / 1024;
1211 KBytes = id->id_NumBlocks * KBytesPerBlock;
1214 MBytes = KBytes / 1024;
1215 GBytes = MBytes / 1024;
1217 if (GBytes > 2)
1219 if (GBytes > 20)
1220 snprintf(Buffer, MaxLength, "%lu %s", (unsigned long)GBytes, GetLocString(MSGID_GBYTENAME));
1221 else
1222 snprintf(Buffer, MaxLength, "%lu.%lu %s", (unsigned long)GBytes, (unsigned long)((MBytes / 100) % 10), GetLocString(MSGID_GBYTENAME));
1224 else if (MBytes > 2)
1226 if (MBytes > 20)
1227 snprintf(Buffer, MaxLength, "%lu %s", (unsigned long)MBytes, GetLocString(MSGID_MBYTENAME));
1228 else
1229 snprintf(Buffer, MaxLength, "%lu.%lu %s", (unsigned long)MBytes, (unsigned long)((KBytes / 100) % 10), GetLocString(MSGID_MBYTENAME));
1231 else
1232 snprintf(Buffer, MaxLength, "%lu %s", (unsigned long)KBytes, GetLocString(MSGID_KBYTENAME));
1235 //----------------------------------------------------------------------------