2 Copyright © 2002-2011, The AROS Development Team. All rights reserved.
6 #define MUIMASTER_YES_INLINE_STDARG
8 #include <exec/memory.h>
9 #include <clib/alib_protos.h>
10 #include <proto/exec.h>
11 #include <proto/dos.h>
12 #include <proto/intuition.h>
13 #include <proto/utility.h>
14 #include <proto/muimaster.h>
20 #include "muimaster_intern.h"
22 #include "support_classes.h"
23 #include "volumelist_private.h"
25 extern struct Library
*MUIMasterBase
;
28 static void printSize(STRPTR string
, size_t bufsize
, UQUAD size
)
32 if (size
>= 9999999999ULL)
37 else if (size
>= 9999999UL)
48 snprintf(string
, bufsize
, "%u%c", (unsigned int)size
, unit
);
49 string
[bufsize
- 1] = '\0';
52 AROS_UFH3S(APTR
, construct_func
,
53 AROS_UFHA(struct Hook
*, hook
, A0
),
54 AROS_UFHA(APTR
, pool
, A2
),
55 AROS_UFHA(struct Volumelist_Entry
*, entry
, A1
))
59 struct Volumelist_Entry
*new;
61 if ((new = AllocPooled(pool
, sizeof(*new))))
70 AROS_UFH3S(void, destruct_func
,
71 AROS_UFHA(struct Hook
*, hook
, A0
),
72 AROS_UFHA(APTR
, pool
, A2
),
73 AROS_UFHA(struct Volumelist_Entry
*, entry
, A1
))
77 FreePooled(pool
, entry
, sizeof(struct Volumelist_Entry
));
82 AROS_UFH3S(LONG
, display_func
,
83 AROS_UFHA(struct Hook
*, hook
, A0
),
84 AROS_UFHA(char **, array
, A2
),
85 AROS_UFHA(struct Volumelist_Entry
*, entry
, A1
))
89 /* MUI: logo | devicename | %-used | bytes free | bytes used */
93 if (entry
->type
== DLT_DEVICE
)
95 *array
++ = "\33I[6:24]";
97 else if (entry
->type
== DLT_VOLUME
)
99 *array
++ = "\33I[6:26]";
103 *array
++ = "\33I[6:29]";
106 *array
++ = entry
->name
;
107 *array
++ = entry
->full
;
108 *array
++ = entry
->free
;
109 *array
= entry
->used
;
126 IPTR
Volumelist__OM_NEW(struct IClass
*cl
, Object
*obj
,
129 struct DosList
*dl
, *actdl
;
132 (STRPTR
) GetTagData(MUIA_List_Format
, 0, msg
->ops_AttrList
);
134 obj
= (Object
*)DoSuperNewTags
137 MUIA_List_Format
, format
139 : (IPTR
)",,P=\33r,P=\33r,P=\33r",
140 TAG_MORE
, (IPTR
) msg
->ops_AttrList
145 struct Volumelist_DATA
*data
= INST_DATA(cl
, obj
);
147 data
->construct_hook
.h_Entry
= (HOOKFUNC
) construct_func
;
148 data
->destruct_hook
.h_Entry
= (HOOKFUNC
) destruct_func
;
149 data
->display_hook
.h_Entry
= (HOOKFUNC
) display_func
;
151 SetAttrs(obj
, MUIA_List_ConstructHook
,
152 (IPTR
) & data
->construct_hook
, MUIA_List_DestructHook
,
153 (IPTR
) & data
->destruct_hook
, MUIA_List_DisplayHook
,
154 (IPTR
) & data
->display_hook
, TAG_DONE
);
156 dl
= LockDosList(LDF_READ
| LDF_VOLUMES
| LDF_ASSIGNS
|
160 while ((actdl
= NextDosEntry(actdl
, LDF_DEVICES
)))
162 struct Volumelist_Entry entry
;
164 entry
.full
[0] = '\0';
165 entry
.free
[0] = '\0';
166 entry
.used
[0] = '\0';
168 entry
.type
= DLT_DEVICE
;
170 strncpy(entry
.name
, AROS_BSTR_ADDR(actdl
->dol_Name
),
172 entry
.name
[sizeof(entry
.name
) - 2] = '\0';
173 strcat(entry
.name
, ":");
175 DoMethod(obj
, MUIM_List_InsertSingle
, (IPTR
) & entry
,
176 MUIV_List_Insert_Bottom
);
180 while ((actdl
= NextDosEntry(actdl
, LDF_VOLUMES
)))
182 struct Volumelist_Entry entry
;
183 struct InfoData diskinfo
;
188 entry
.full
[0] = '\0';
189 entry
.free
[0] = '\0';
190 entry
.used
[0] = '\0';
192 entry
.type
= DLT_VOLUME
;
194 strncpy(entry
.name
, AROS_BSTR_ADDR(actdl
->dol_Name
),
196 entry
.name
[sizeof(entry
.name
) - 2] = '\0';
197 strcat(entry
.name
, ":");
199 if ((lock
= Lock(entry
.name
, SHARED_LOCK
)) != BNULL
)
201 if (Info(lock
, &diskinfo
) != DOSFALSE
)
207 (long)(100 * diskinfo
.id_NumBlocksUsed
/
208 diskinfo
.id_NumBlocks
));
209 entry
.full
[sizeof(entry
.full
) - 1] = '\0';
212 (UQUAD
) diskinfo
.id_NumBlocksUsed
*
213 diskinfo
.id_BytesPerBlock
;
215 (UQUAD
) diskinfo
.id_NumBlocks
*
216 diskinfo
.id_BytesPerBlock
- used
;
217 printSize(entry
.free
, sizeof entry
.free
, free
);
218 printSize(entry
.used
, sizeof entry
.used
, used
);
223 DoMethod(obj
, MUIM_List_InsertSingle
, (IPTR
) & entry
,
224 MUIV_List_Insert_Bottom
);
228 while ((actdl
= NextDosEntry(actdl
, LDF_ASSIGNS
)))
230 struct Volumelist_Entry entry
;
232 entry
.full
[0] = '\0';
233 entry
.free
[0] = '\0';
234 entry
.used
[0] = '\0';
236 entry
.type
= DLT_DIRECTORY
;
238 strncpy(entry
.name
, AROS_BSTR_ADDR(actdl
->dol_Name
),
240 entry
.name
[sizeof(entry
.name
) - 2] = '\0';
241 strcat(entry
.name
, ":");
243 DoMethod(obj
, MUIM_List_InsertSingle
, (IPTR
) & entry
,
244 MUIV_List_Insert_Bottom
);
247 UnLockDosList(LDF_READ
| LDF_VOLUMES
| LDF_ASSIGNS
| LDF_DEVICES
);
254 #if ZUNE_BUILTIN_VOLUMELIST
255 BOOPSI_DISPATCHER(IPTR
, Volumelist_Dispatcher
, cl
, obj
, msg
)
257 switch (msg
->MethodID
)
260 return Volumelist__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
263 return DoSuperMethodA(cl
, obj
, msg
);
266 BOOPSI_DISPATCHER_END
268 const struct __MUIBuiltinClass _MUI_Volumelist_desc
=
272 sizeof(struct Volumelist_DATA
),
273 (void *) Volumelist_Dispatcher
275 #endif /* ZUNE_BUILTIN_VOLUMELIST */