2 Copyright © 2005-2009, The AROS Development Team. All rights reserved.
6 #define MUIMASTER_YES_INLINE_STDARG
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>
26 #include <zune/iconimage.h>
38 #define ID_FAT12_DISK (0x46415400L)
39 #define ID_FAT16_DISK (0x46415401L)
40 #define ID_FAT32_DISK (0x46415402L)
43 #define ID_CDFS_DISK (0x43444653L)
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 **********************************************************/
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
;
72 Object
*window
, *grp
, *grpformat
;
73 Object
*textspace
, *levelspace
, *typespace
;
75 LONG disktype
= ID_NO_DISK_PRESENT
;
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
)
101 case MUIA_DiskInfo_Initial
:
102 initial
= (BPTR
) tag
->ti_Data
;
103 D(bug("[DiskInfo] initial: 0x%08lX\n",initial
));
105 case MUIA_DiskInfo_Aspect
:
106 aspect
= tag
->ti_Data
;
107 D(bug("[DiskInfo] aspect: %d\n",aspect
));
112 /* Initial lock is required */
118 // obtain the volume name from a lock
119 if (!NameFromLock(initial
, volname
, sizeof(volname
))) {
120 SetIoErr(ERROR_DEVICE_NOT_MOUNTED
);
123 volname
[strlen(volname
)-1] = '\0';
124 dtr
= _(MSG_UNKNOWN
);
125 dl
= LockDosList(LDF_VOLUMES
|LDF_READ
);
127 dn
= FindDosEntry(dl
, volname
, LDF_VOLUMES
);
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
;
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 */
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
];
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
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
,
206 Child
, (IPTR
) (grp
= VGroup
,
207 // grp object aspect sensitive
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
),
217 Child
, (IPTR
) GaugeObject
, GaugeFrame
,
218 MUIA_Gauge_InfoText
, size
,
219 MUIA_Gauge_Horiz
, TRUE
,
220 MUIA_Gauge_Current
, percent
,
222 Child
, (IPTR
) TextObject
,
223 MUIA_Text_PreParse
, (IPTR
) "\33r",
224 MUIA_Text_Contents
, (IPTR
) __(MSG_USED
),
226 Child
, (IPTR
) TextObject
, TextFrame
,
227 MUIA_Background
, MUII_TextBack
,
228 MUIA_Text_PreParse
, (IPTR
) "\33l",
229 MUIA_Text_Contents
, (IPTR
) used
,
231 Child
, (IPTR
) TextObject
,
232 MUIA_Text_PreParse
, (IPTR
) "\33r",
233 MUIA_Text_Contents
, (IPTR
) __(MSG_FREE
),
235 Child
, (IPTR
) TextObject
, TextFrame
,
236 MUIA_Background
, MUII_TextBack
,
237 MUIA_Text_PreParse
, (IPTR
) "\33l",
238 MUIA_Text_Contents
, (IPTR
) free
,
240 Child
, (IPTR
) TextObject
,
241 MUIA_Text_PreParse
, (IPTR
) "\33r",
242 MUIA_Text_Contents
, (IPTR
) __(MSG_BLOCK_SIZE
),
244 Child
, (IPTR
) TextObject
, TextFrame
,
245 MUIA_Background
, MUII_TextBack
,
246 MUIA_Text_PreParse
, (IPTR
) "\33l",
247 MUIA_Text_Contents
, (IPTR
) blocksize
,
249 Child
, (IPTR
) TextObject
,
250 MUIA_Text_PreParse
, (IPTR
) "\33r",
251 MUIA_Text_Contents
, (IPTR
) __(MSG_STATUS
),
253 Child
, (IPTR
) TextObject
, TextFrame
,
254 MUIA_Background
, MUII_TextBack
,
255 MUIA_Text_PreParse
, (IPTR
) "\33l",
256 MUIA_Text_Contents
, (IPTR
) status
,
261 Child
, (IPTR
) (grpformat
= HGroup
,
262 // grpformat object userlevel sensitive
268 /* Check if object creation succeeded */
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
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
);
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);
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
);
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
);
333 IPTR
DiskInfo__OM_GET(Class
*CLASS
, Object
*self
, struct opGet
*msg
)
335 struct DiskInfo_DATA
*data
= INST_DATA(CLASS
, self
);
337 D(bug("[DiskInfo] OM_GET\n"));
338 switch(msg
->opg_AttrID
)
340 case MUIA_DiskInfo_Volname
:
341 retval
= (IPTR
) data
->dki_Volname
;
343 case MUIA_DiskInfo_Percent
:
344 retval
= (ULONG
) data
->dki_Percent
;
346 case MUIA_DiskInfo_Aspect
:
347 retval
= (ULONG
) data
->dki_Aspect
;
350 retval
= DoSuperMethodA(CLASS
, self
, (Msg
)msg
);
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
;
361 D(bug("[DiskInfo] OM_SET\n"));
362 while ((tag
= NextTagItem((const struct TagItem
**)&tags
)) != NULL
)
366 case MUIA_DiskInfo_Aspect
:
367 data
->dki_Aspect
= tag
->ti_Data
;
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
);
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
);