Small modification to diskinfo and info tool layout
[cake.git] / workbench / system / Wanderer / Tools / DiskInfo / diskinfo.c
blob830350c564a4ecc3c87cd875783e17671ea0dc1c
1 /*
2 Copyright © 2005-2009, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define MUIMASTER_YES_INLINE_STDARG
8 #define DEBUG 0
9 #include <aros/debug.h>
11 #include <exec/types.h>
12 #include <utility/tagitem.h>
13 #include <libraries/mui.h>
14 #include <libraries/asl.h>
16 #include <proto/exec.h>
17 #include <proto/dos.h>
18 #include <proto/intuition.h>
19 #include <proto/utility.h>
20 #include <proto/icon.h>
21 #include <proto/muimaster.h>
22 #include <proto/workbench.h>
24 #include <stdio.h>
26 #include <zune/iconimage.h>
27 #include "diskinfo.h"
28 #include "locale.h"
29 #include "support.h"
31 #define MINUSER 1
32 #define NOVICE 0
33 #define AVERAGE 1
34 #define ADVANCED 1
35 #define EXPERT 2
37 #ifndef ID_FAT12_DISK
38 #define ID_FAT12_DISK (0x46415400L)
39 #define ID_FAT16_DISK (0x46415401L)
40 #define ID_FAT32_DISK (0x46415402L)
41 #endif
42 #ifndef ID_CDFS_DISK
43 #define ID_CDFS_DISK (0x43444653L)
44 #endif
46 static LONG dt[]={ID_NO_DISK_PRESENT, ID_UNREADABLE_DISK,
47 ID_DOS_DISK, ID_FFS_DISK, ID_INTER_DOS_DISK, ID_INTER_FFS_DISK,
48 ID_FASTDIR_DOS_DISK, ID_FASTDIR_FFS_DISK, ID_NOT_REALLY_DOS,
49 ID_KICKSTART_DISK, ID_MSDOS_DISK, ID_SFS_BE_DISK, ID_SFS_LE_DISK,
50 ID_FAT12_DISK, ID_FAT16_DISK, ID_FAT32_DISK, ID_CDFS_DISK };
52 /*** Instance data **********************************************************/
53 struct DiskInfo_DATA
55 Object *dki_Window;
56 STRPTR dki_Volname;
57 ULONG dki_Percent;
58 LONG dki_DiskType;
59 LONG dki_Aspect;
62 /*** Methods ****************************************************************/
63 Object *DiskInfo__OM_NEW
65 Class *CLASS, Object *self, struct opSet *message
68 struct DiskInfo_DATA *data = NULL;
69 const struct TagItem *tstate = message->ops_AttrList;
70 struct TagItem *tag = NULL;
71 BPTR initial = NULL;
72 Object *window, *grp, *grpformat;
73 Object *textspace, *levelspace, *typespace;
74 ULONG percent = 0;
75 LONG disktype = ID_NO_DISK_PRESENT;
76 LONG aspect = 0;
77 TEXT volname[108];
78 TEXT size[64];
79 TEXT used[64];
80 TEXT free[64];
81 TEXT blocksize[16];
82 TEXT status[64];
83 STRPTR dtr;
84 struct DosList *dl, *dn;
85 BOOL disktypefound = FALSE;
87 static struct InfoData id;
89 static STRPTR disktypelist[] = {"No Disk", "Unreadable",
90 "OFS", "FFS", "OFS-Intl", "FFS-Intl",
91 "OFS-DC", "FFS-DC", "Not DOS",
92 "KickStart", "MSDOS", "SFS0 BE", "SFS0 LE",
93 "FAT12", "FAT16", "FAT32", "CD-ROM" };
95 /* Parse initial taglist -----------------------------------------------*/
96 D(bug("[DiskInfo] OM_NEW\n"));
97 while ((tag = NextTagItem(&tstate)) != NULL)
99 switch (tag->ti_Tag)
101 case MUIA_DiskInfo_Initial:
102 initial = (BPTR) tag->ti_Data;
103 D(bug("[DiskInfo] initial: 0x%08lX\n",initial));
104 break;
105 case MUIA_DiskInfo_Aspect:
106 aspect = tag->ti_Data;
107 D(bug("[DiskInfo] aspect: %d\n",aspect));
108 break;
112 /* Initial lock is required */
113 if (initial == NULL)
115 return NULL;
118 // obtain the volume name from a lock
119 if (!NameFromLock(initial, volname, sizeof(volname))) {
120 SetIoErr(ERROR_DEVICE_NOT_MOUNTED);
121 return NULL;
123 volname[strlen(volname)-1] = '\0';
124 dtr = _(MSG_UNKNOWN);
125 dl = LockDosList(LDF_VOLUMES|LDF_READ);
126 if (dl) {
127 dn = FindDosEntry(dl, volname, LDF_VOLUMES);
128 if (dn) {
129 ULONG i;
131 disktype = dn->dol_misc.dol_volume.dol_DiskType;
132 for (i = 0; i < sizeof(dt) / sizeof(LONG); ++i)
134 if (disktype == dt[i])
136 dtr = disktypelist[i];
137 disktypefound = TRUE;
138 break;
141 D(bug("[DiskInfo] Disk Type: %s\n", dtr));
143 UnLockDosList(LDF_VOLUMES|LDF_READ);
146 /* Extract volume info from InfoData */
147 if (Info(initial, &id) == DOSTRUE)
149 if (!disktypefound) /* Workaround for FFS-Intl having 0 as dol_DiskType */
151 LONG i;
152 dtr = _(MSG_UNKNOWN);
153 disktype = id.id_DiskType;
155 for (i = 0; i < sizeof(dt) / sizeof(LONG); ++i)
157 if (disktype == dt[i])
159 dtr = disktypelist[i];
160 break;
165 percent = (100 * id.id_NumBlocksUsed/id.id_NumBlocks);
166 FormatSize(size, id.id_NumBlocks, id.id_NumBlocks, id.id_BytesPerBlock, FALSE);
167 FormatSize(used, id.id_NumBlocksUsed, id.id_NumBlocks, id.id_BytesPerBlock, TRUE);
168 FormatSize(free, id.id_NumBlocks - id.id_NumBlocksUsed, id.id_NumBlocks, id.id_BytesPerBlock, TRUE);
169 sprintf(blocksize, "%d %s", id.id_BytesPerBlock, _(MSG_BYTES));
171 sprintf(status,"%s", _(MSG_UNKNOWN));
172 if ((id.id_DiskState & ID_WRITE_PROTECTED) == ID_WRITE_PROTECTED)
173 sprintf(status,"%s", _(MSG_READABLE));
174 if ((id.id_DiskState & ID_VALIDATING) == ID_VALIDATING)
175 sprintf(status,"%s", _(MSG_VALIDATING));
176 if ((id.id_DiskState & ID_VALIDATED) == ID_VALIDATED)
177 sprintf(status,"%s", _(MSG_READABLE_WRITABLE));
181 /* Create application and window objects -------------------------------*/
182 self = (Object *) DoSuperNewTags
184 CLASS, self, NULL,
186 MUIA_Application_Title, __(MSG_TITLE),
187 MUIA_Application_Version, (IPTR) "$VER: DiskInfo 0.3 ("ADATE") ©2006-2009 AROS Dev Team",
188 MUIA_Application_Copyright, __(MSG_COPYRIGHT),
189 MUIA_Application_Author, __(MSG_AUTHOR),
190 MUIA_Application_Description, __(MSG_DESCRIPTION),
191 MUIA_Application_Base, (IPTR) "DISKINFO",
192 SubWindow, (IPTR) (window = WindowObject,
193 MUIA_Window_Title,(IPTR) volname,
194 MUIA_Window_Activate, TRUE,
195 MUIA_Window_NoMenus, TRUE,
196 MUIA_Window_CloseGadget, TRUE,
198 WindowContents, (IPTR) VGroup,
199 Child, (IPTR) HGroup,
200 Child, (IPTR) VGroup,
201 Child, (IPTR) IconImageObject,
202 MUIA_InputMode, MUIV_InputMode_Toggle,
203 MUIA_IconImage_File, (IPTR) initial,
204 End,
205 End,
206 Child, (IPTR) (grp = VGroup,
207 // grp object aspect sensitive
208 End),
209 End,
210 Child, (IPTR) HGroup,
211 Child, (IPTR) VGroup, GroupFrame,
212 Child, (IPTR) ColGroup(2),
213 Child, (IPTR) TextObject,
214 MUIA_Text_PreParse, (IPTR) "\33r",
215 MUIA_Text_Contents, (IPTR) __(MSG_SIZE),
216 End,
217 Child, (IPTR) GaugeObject, GaugeFrame,
218 MUIA_Gauge_InfoText, size,
219 MUIA_Gauge_Horiz, TRUE,
220 MUIA_Gauge_Current, percent,
221 End,
222 Child, (IPTR) TextObject,
223 MUIA_Text_PreParse, (IPTR) "\33r",
224 MUIA_Text_Contents, (IPTR) __(MSG_USED),
225 End,
226 Child, (IPTR) TextObject, TextFrame,
227 MUIA_Background, MUII_TextBack,
228 MUIA_Text_PreParse, (IPTR) "\33l",
229 MUIA_Text_Contents, (IPTR) used,
230 End,
231 Child, (IPTR) TextObject,
232 MUIA_Text_PreParse, (IPTR) "\33r",
233 MUIA_Text_Contents, (IPTR) __(MSG_FREE),
234 End,
235 Child, (IPTR) TextObject, TextFrame,
236 MUIA_Background, MUII_TextBack,
237 MUIA_Text_PreParse, (IPTR) "\33l",
238 MUIA_Text_Contents, (IPTR) free,
239 End,
240 Child, (IPTR) TextObject,
241 MUIA_Text_PreParse, (IPTR) "\33r",
242 MUIA_Text_Contents, (IPTR) __(MSG_BLOCK_SIZE),
243 End,
244 Child, (IPTR) TextObject, TextFrame,
245 MUIA_Background, MUII_TextBack,
246 MUIA_Text_PreParse, (IPTR) "\33l",
247 MUIA_Text_Contents, (IPTR) blocksize,
248 End,
249 Child, (IPTR) TextObject,
250 MUIA_Text_PreParse, (IPTR) "\33r",
251 MUIA_Text_Contents, (IPTR) __(MSG_STATUS),
252 End,
253 Child, (IPTR) TextObject, TextFrame,
254 MUIA_Background, MUII_TextBack,
255 MUIA_Text_PreParse, (IPTR) "\33l",
256 MUIA_Text_Contents, (IPTR) status,
257 End,
258 End,
259 End,
260 End,
261 Child, (IPTR) (grpformat = HGroup,
262 // grpformat object userlevel sensitive
263 End),
264 End,
265 End),
266 TAG_DONE);
268 /* Check if object creation succeeded */
269 if (self == NULL)
270 return NULL;
272 /* Store instance data -------------------------------------------------*/
273 data = INST_DATA(CLASS, self);
274 data->dki_Window = window;
275 data->dki_Volname = volname;
276 data->dki_Percent = percent;
277 data->dki_Aspect = aspect;
279 // aspect dependant GUI
280 // if (aspect > 0)
281 // {
282 textspace = MUI_NewObject(MUIC_Text,
283 MUIA_Text_PreParse, (IPTR) "\33I[6:24] \33b\33l",
284 MUIA_Text_Contents, (IPTR) volname, TAG_DONE);
286 DoMethod(grp, MUIM_Group_InitChange);
287 DoMethod(grp, OM_ADDMEMBER, textspace);
288 DoMethod(grp, MUIM_Group_ExitChange);
289 // } else {
290 // levelspace = MUI_NewObject(MUIC_Levelmeter,MUIA_Numeric_Min, 0,
291 // MUIA_Numeric_Max, 100,
292 // MUIA_Numeric_Value, percent, TAG_DONE);
294 // DoMethod(grp, MUIM_Group_InitChange);
295 // DoMethod(grp, OM_ADDMEMBER, levelspace);
296 // DoMethod(grp, MUIM_Group_ExitChange);
297 // }
299 typespace = MUI_NewObject(MUIC_Text,
300 MUIA_Text_PreParse, (IPTR) "\33I[6:24] \33b\33l",
301 MUIA_Text_Contents, (IPTR) dtr, TAG_DONE);
302 DoMethod(grp, MUIM_Group_InitChange);
303 DoMethod(grp, OM_ADDMEMBER, typespace);
304 DoMethod(grp, MUIM_Group_ExitChange);
306 /* Setup notifications -------------------------------------------------*/
307 DoMethod( window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
308 (IPTR) self, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
310 return self;
314 IPTR DiskInfo__OM_DISPOSE(Class *CLASS, Object *self, Msg message)
316 D(bug("[DiskInfo] OM_DISPOSE\n"));
317 return DoSuperMethodA(CLASS, self, message);
320 IPTR DiskInfo__MUIM_Application_Execute(Class *CLASS, Object *self, Msg message)
322 struct DiskInfo_DATA *data = INST_DATA(CLASS, self);
324 SET(data->dki_Window, MUIA_Window_Open, TRUE);
326 DoSuperMethodA(CLASS, self, message);
328 SET(data->dki_Window, MUIA_Window_Open, FALSE);
330 return (IPTR) NULL;
333 IPTR DiskInfo__OM_GET(Class *CLASS, Object *self, struct opGet *msg)
335 struct DiskInfo_DATA *data = INST_DATA(CLASS, self);
336 IPTR retval = TRUE;
337 D(bug("[DiskInfo] OM_GET\n"));
338 switch(msg->opg_AttrID)
340 case MUIA_DiskInfo_Volname:
341 retval = (IPTR) data->dki_Volname;
342 break;
343 case MUIA_DiskInfo_Percent:
344 retval = (ULONG) data->dki_Percent;
345 break;
346 case MUIA_DiskInfo_Aspect:
347 retval = (ULONG) data->dki_Aspect;
348 break;
349 default:
350 retval = DoSuperMethodA(CLASS, self, (Msg)msg);
351 break;
353 return retval;
356 ULONG DiskInfo__OM_SET(Class *CLASS, Object *self, struct opSet *msg)
358 struct DiskInfo_DATA *data = INST_DATA(CLASS, self);
359 const struct TagItem *tags = msg->ops_AttrList;
360 struct TagItem *tag;
361 D(bug("[DiskInfo] OM_SET\n"));
362 while ((tag = NextTagItem((const struct TagItem **)&tags)) != NULL)
364 switch (tag->ti_Tag)
366 case MUIA_DiskInfo_Aspect:
367 data->dki_Aspect = tag->ti_Data;
368 break;
371 return DoSuperMethodA(CLASS, self, (Msg)msg);
374 /*** Dispatcher *************************************************************/
375 BOOPSI_DISPATCHER(IPTR, DiskInfo_Dispatcher, CLASS, self, message)
377 switch (message->MethodID)
379 case OM_NEW: return (IPTR) DiskInfo__OM_NEW(CLASS, self, (struct opSet *) message);
380 case OM_DISPOSE: return DiskInfo__OM_DISPOSE(CLASS, self, message);
381 case OM_GET: return (IPTR) DiskInfo__OM_GET(CLASS, self, (struct opGet *)message);
382 case OM_SET: return (IPTR) DiskInfo__OM_SET(CLASS, self, (struct opSet *)message);
383 case MUIM_Application_Execute: return DiskInfo__MUIM_Application_Execute(CLASS, self, message);
384 default: return DoSuperMethodA(CLASS, self, message);
386 return 0;
388 BOOPSI_DISPATCHER_END
390 /*** Setup ******************************************************************/
391 struct MUI_CustomClass *DiskInfo_CLASS;
393 BOOL DiskInfo_Initialize()
395 D(bug("[DiskInfo] Initialize\n"));
396 DiskInfo_CLASS = MUI_CreateCustomClass(
397 NULL, MUIC_Application, NULL,
398 sizeof(struct DiskInfo_DATA), DiskInfo_Dispatcher);
400 return DiskInfo_CLASS ? TRUE : FALSE;
403 VOID DiskInfo_Deinitialize()
405 D(bug("[DiskInfo] Deinitialize\n"));
406 if (DiskInfo_CLASS != NULL)
408 MUI_DeleteCustomClass(DiskInfo_CLASS);