6 #include <exec/types.h>
7 #include <exec/alerts.h>
8 #include <exec/execbase.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>
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
55 ULONG fsn_DosType
; // DosType
56 CONST_STRPTR fsn_Name
;
59 #define KeyButtonHelp(name,key,HelpText)\
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,\
73 #define CheckMarkHelp(selected, HelpTextID)\
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), \
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__)
117 long _stack
= 16384; // minimum stack size, used by SAS/C startup code
120 //----------------------------------------------------------------------------
122 extern struct ExecBase
*SysBase
;
123 struct IntuitionBase
*IntuitionBase
= NULL
;
124 T_LOCALEBASE LocaleBase
= NULL
;
126 T_UTILITYBASE UtilityBase
= NULL
;
128 struct Library
*MUIMasterBase
= NULL
;
129 struct Library
*IconBase
= NULL
;
130 struct Library
*IconobjectBase
= NULL
;
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
;
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" */
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" */
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" */
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" */
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 */
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" */
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" */
297 {FS_SINCLAIR_QL5A
, "Sinclair QL 720k"}, /* "QL5A" */
298 {FS_SINCLAIR_QL5B
, "Sinclair QL 1440k"}, /* "QL5B" */
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" */
307 {FS_ARCHIMEDES_D
, "Archimedes (D)"}, /* "ARMD" */
308 {FS_ARCHIMEDES_E
, "Archimedes (E)"}, /* "ARME" */
311 {FS_CPM
, "CP/M"}, /* "CPM\2" */
314 {FS_C64
, "C64"}, /* "1541" */
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
[])
340 struct WBStartup
*WBenchMsg
=
341 (argc
== 0) ? (struct WBStartup
*)argv
: NULL
;
343 if (NULL
== WBenchMsg
)
347 if (WBenchMsg
->sm_NumArgs
< 2)
357 if (!OpenLibraries())
360 if (!CheckMCCVersion(MUIC_NListview
, 19, 66) )
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
,
381 Child
, NListviewObject
,
383 MUIA_NListview_NList
, NListDosDevices
= NListObject
,
384 MUIA_NList_ConstructHook
, MUIV_NList_ConstructHook_String
,
385 MUIA_NList_DestructHook
, MUIV_NList_DestructHook_String
,
387 End
, //NListviewObject
392 Child
, Label1(GetLocString(MSGID_STRING_LABEL
)),
393 Child
, StringLabel
= StringObject
,
398 Child
, Label1(GetLocString(MSGID_TEXT_FILESYSTEM
)),
399 Child
, TextDosType
= TextObject
,
400 MUIA_Background
, MUII_TextBack
,
404 Child
, Label1(GetLocString(MSGID_TEXT_STATUS
)),
405 Child
, TextFormatted
= TextObject
,
407 MUIA_Background
, MUII_TextBack
,
416 MUIA_Background
, MUII_GroupBack
,
417 MUIA_FrameTitle
, (ULONG
) GetLocString(MSGID_GROUP_COMMON
),
420 Child
, Label1(GetLocString(MSGID_CHECK_CREATEICONS
)),
421 Child
, CheckMarkHelp(FALSE
, MSGID_CHECK_CREATEICONS_SHORTHELP
),
429 MUIA_Background
, MUII_GroupBack
,
430 MUIA_FrameTitle
, (ULONG
) GetLocString(MSGID_GROUP_SPECIFIC
),
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
),
448 Child
, TextDeviceName
= TextObject
,
450 MUIA_Background
, MUII_TextBack
,
451 MUIA_Text_PreParse
, "\33c",
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
)),
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
),
477 Child
, MenuAboutMUI
= MenuitemObject
,
478 MUIA_Menuitem_Title
, GetLocString(MSGID_MENU_PROJECT_ABOUTMUI
),
480 Child
, MenuitemObject
,
481 MUIA_Menuitem_Title
, -1,
483 Child
, MenuQuit
= MenuitemObject
,
484 MUIA_Menuitem_Title
, GetLocString(MSGID_MENU_PROJECT_QUIT
),
485 MUIA_Menuitem_Shortcut
, GetLocString(MSGID_MENU_PROJECT_QUIT_SHORT
),
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
));
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
);
527 set(WIN_Main
, MUIA_Window_Open
, TRUE
);
528 get(WIN_Main
, MUIA_Window_Open
, &win_opened
);
532 printf(GetLocString(MSGID_CREATE_MAINWINDOW_FAILED
));
536 d1(KPrintF( "%s/%s/%ld: \n", __FILE__
, __FUNC__
, __LINE__
));
540 ULONG Action
= DoMethod(APP_Main
, MUIM_Application_NewInput
, &sigs
);
544 case MUIV_Application_ReturnID_Quit
:
551 sigs
= Wait(sigs
| SIGBREAKF_CTRL_C
);
553 if (sigs
& SIGBREAKF_CTRL_C
)
560 set(WIN_Main
, MUIA_Window_Open
, FALSE
);
564 MUI_DisposeObject(APP_Main
);
566 CloseCatalog(gb_Catalog
);
573 //----------------------------------------------------------------------------
575 static BOOL
OpenLibraries(void)
577 MUIMasterBase
= OpenLibrary(MUIMASTER_NAME
, MUIMASTER_VMIN
-1);
578 if (NULL
== MUIMasterBase
)
583 IMUIMaster
= (struct MUIMasterIFace
*)GetInterface((struct Library
*)MUIMasterBase
, "main", 1, NULL
);
584 if (NULL
== IMUIMaster
)
590 IntuitionBase
= (struct IntuitionBase
*) OpenLibrary("intuition.library", 39);
591 if (NULL
== IntuitionBase
)
596 IIntuition
= (struct IntuitionIFace
*)GetInterface((struct Library
*)IntuitionBase
, "main", 1, NULL
);
597 if (NULL
== IIntuition
)
602 LocaleBase
= (T_LOCALEBASE
) OpenLibrary("locale.library", 38);
604 if (NULL
!= LocaleBase
)
605 ILocale
= (struct LocaleIFace
*)GetInterface((struct Library
*)LocaleBase
, "main", 1, NULL
);
608 IconBase
= OpenLibrary("icon.library", 39);
609 if (NULL
== IconBase
)
614 IIcon
= (struct IconIFace
*)GetInterface((struct Library
*)IconBase
, "main", 1, NULL
);
621 UtilityBase
= (T_UTILITYBASE
) OpenLibrary("utility.library", 39);
622 if (NULL
== UtilityBase
)
629 //----------------------------------------------------------------------------
631 static void CloseLibraries(void)
636 CloseLibrary((struct Library
*) UtilityBase
);
643 DropInterface((struct Interface
*)ILocale
);
649 CloseLibrary((struct Library
*)LocaleBase
);
655 DropInterface((struct Interface
*)IIcon
);
661 CloseLibrary(IconBase
);
667 DropInterface((struct Interface
*)IIntuition
);
673 CloseLibrary((struct Library
*)IntuitionBase
);
674 IntuitionBase
= NULL
;
679 DropInterface((struct Interface
*)IMUIMaster
);
685 CloseLibrary(MUIMasterBase
);
686 MUIMasterBase
= NULL
;
690 //----------------------------------------------------------------------------
692 static STRPTR
GetLocString(ULONG MsgId
)
694 struct FormatDiskMUI_LocaleInfo li
;
696 li
.li_Catalog
= gb_Catalog
;
698 li
.li_LocaleBase
= LocaleBase
;
700 li
.li_ILocale
= ILocale
;
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
,
719 set(WIN_AboutMUI
, MUIA_Window_Open
, TRUE
);
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
;
747 DoMethod(NListDosDevices
, MUIM_NList_GetEntry
, *pPos
, &entry
);
748 d2(KPrintF(__FILE__
"/%s/%ld: *pPos=%ld entry=<%s>\n", __FUNC__
, __LINE__
, *pPos
, entry
));
756 //----------------------------------------------------------------------------
758 IPTR
mui_getv(APTR obj
, ULONG attr
)
761 GetAttr(attr
, obj
, &v
);
765 //----------------------------------------------------------------------------
767 // Checks if a certain version of a MCC is available
768 static BOOL
CheckMCCVersion(CONST_STRPTR name
, ULONG minver
, ULONG minrev
)
772 d1(KPrintF(__FILE__
"/" __FUNC__
"/%ld: %s ", __LINE__
, name
);)
778 struct Library
*base
;
781 // First we attempt to acquire the version and revision through MUI
782 Object
*obj
= MUI_NewObject((STRPTR
) name
, TAG_DONE
);
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
);)
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
;
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
);)
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
))
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)
838 struct Library
*result
;
839 extern struct ExecBase
*SysBase
;
842 if ((result
= (struct Library
*) FindName(&SysBase
->LibList
, name
)))
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
))
867 // No MCC at all - no need to attempt flush
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
))
883 //----------------------------------------------------------------------------
885 static void FillDeviceList(void)
887 ULONG DosListFlags
= LDF_DEVICES
| LDF_READ
;
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
,
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
)
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
))
948 if (!(TypeOfMem(BADDR(fssm
->fssm_Device
)) & MEMF_PUBLIC
))
951 env
= BADDR(fssm
->fssm_Environ
);
952 if (!(TypeOfMem((APTR
) env
) & MEMF_PUBLIC
))
955 if (env
->de_TableSize
> 2 * sizeof(struct DosEnvec
))
958 if (!((UBYTE
*)myfssm
)[0] || !((UBYTE
*)devname
)[0])
967 //----------------------------------------------------------------------------
969 static void SelectDevice(CONST_STRPTR DevName
)
971 struct FileInfoBlock
*fib
= NULL
;
972 struct InfoData
*id
= NULL
;
974 struct Process
*myProc
= (struct Process
*) FindTask(NULL
);
975 APTR oldWindowPtr
= myProc
->pr_WindowPtr
;
977 myProc
->pr_WindowPtr
= (APTR
) ~0;
980 char FsName
[MAX_DEV_NAME
];
981 char ExecDevName
[108];
982 char DevInfoString
[128];
983 char CapacityString
[40];
984 ULONG UnitNumber
= 0;
987 fib
= AllocDosObject(DOS_FIB
, NULL
);
988 d2(KPrintF( "%s/%s/%ld: fib=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, fib
));
992 id
= malloc(sizeof(struct InfoData
));
993 d2(KPrintF( "%s/%s/%ld: id=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, id
));
997 dLock
= Lock(DevName
, ACCESS_READ
);
998 d2(KPrintF( "%s/%s/%ld: dLock=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, dLock
));
1002 if (!Info(dLock
, id
))
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
)
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
);
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
);
1044 set(ButtonQuickFormat
, MUIA_Disabled
, FALSE
);
1045 set(ButtonFormat
, MUIA_Disabled
, FALSE
);
1046 set(ButtonFormatVerify
, MUIA_Disabled
, FALSE
);
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
;
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
)))
1079 d2(KPrintF( "%s/%s/%ld: dl=%08lx mp=%08lx dol_Task=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, dl
, mp
));
1081 UnLockDosList(DosListFlags
);
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
)
1097 UnLockDosList(DosListFlags
);
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
;
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
);
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
);
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]))
1182 //----------------------------------------------------------------------------
1184 static STRPTR
GetDosTypePrintableString(UBYTE dosType
, STRPTR Buffer
, size_t MaxLength
)
1186 if (isprint(dosType
))
1187 snprintf(Buffer
, MaxLength
, "%c", dosType
);
1189 snprintf(Buffer
, MaxLength
, "\\%x", (unsigned int) dosType
);
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
;
1203 // Block size <= 1024
1204 KBytes
= id
->id_NumBlocks
/ BlocksPerKByte
;
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;
1220 snprintf(Buffer
, MaxLength
, "%lu %s", (unsigned long)GBytes
, GetLocString(MSGID_GBYTENAME
));
1222 snprintf(Buffer
, MaxLength
, "%lu.%lu %s", (unsigned long)GBytes
, (unsigned long)((MBytes
/ 100) % 10), GetLocString(MSGID_GBYTENAME
));
1224 else if (MBytes
> 2)
1227 snprintf(Buffer
, MaxLength
, "%lu %s", (unsigned long)MBytes
, GetLocString(MSGID_MBYTENAME
));
1229 snprintf(Buffer
, MaxLength
, "%lu.%lu %s", (unsigned long)MBytes
, (unsigned long)((KBytes
/ 100) % 10), GetLocString(MSGID_MBYTENAME
));
1232 snprintf(Buffer
, MaxLength
, "%lu %s", (unsigned long)KBytes
, GetLocString(MSGID_KBYTENAME
));
1235 //----------------------------------------------------------------------------