2 Copyright © 2002-2007, 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", (ULONG
)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
, struct opSet
*msg
)
128 struct DosList
*dl
, *actdl
;
130 STRPTR format
= (STRPTR
)GetTagData(MUIA_List_Format
, 0, msg
->ops_AttrList
);
132 obj
= (Object
*)DoSuperNewTags
135 MUIA_List_Format
, format
137 : (IPTR
)",,P=\33r,P=\33r,P=\33r",
138 TAG_MORE
, (IPTR
) msg
->ops_AttrList
143 struct Volumelist_DATA
*data
= INST_DATA(cl
, obj
);
145 data
->construct_hook
.h_Entry
= (HOOKFUNC
)construct_func
;
146 data
->destruct_hook
.h_Entry
= (HOOKFUNC
)destruct_func
;
147 data
->display_hook
.h_Entry
= (HOOKFUNC
)display_func
;
149 SetAttrs(obj
, MUIA_List_ConstructHook
, (IPTR
)&data
->construct_hook
,
150 MUIA_List_DestructHook
, (IPTR
)&data
->destruct_hook
,
151 MUIA_List_DisplayHook
, (IPTR
)&data
->display_hook
,
154 dl
= LockDosList(LDF_READ
| LDF_VOLUMES
| LDF_ASSIGNS
| LDF_DEVICES
);
157 while((actdl
= NextDosEntry(actdl
, LDF_DEVICES
)))
159 struct Volumelist_Entry entry
;
161 entry
.full
[0] = '\0';
162 entry
.free
[0] = '\0';
163 entry
.used
[0] = '\0';
165 entry
.type
= DLT_DEVICE
;
167 strncpy(entry
.name
, actdl
->dol_Ext
.dol_AROS
.dol_DevName
, sizeof(entry
.name
));
169 #warning "FIXME: AmigaOS: get device name"
170 strncpy(entry
.name
, "???", sizeof(entry
.name
));
172 entry
.name
[sizeof(entry
.name
) - 2] = '\0';
173 strcat(entry
.name
, ":");
175 DoMethod(obj
, MUIM_List_InsertSingle
, (IPTR
)&entry
, MUIV_List_Insert_Bottom
);
179 while((actdl
= NextDosEntry(actdl
, LDF_VOLUMES
)))
181 struct Volumelist_Entry entry
;
182 struct InfoData diskinfo
;
187 entry
.full
[0] = '\0';
188 entry
.free
[0] = '\0';
189 entry
.used
[0] = '\0';
191 entry
.type
= DLT_VOLUME
;
193 strncpy(entry
.name
, actdl
->dol_Ext
.dol_AROS
.dol_DevName
, sizeof(entry
.name
));
195 #warning "FIXME: AmigaOS: get device name"
196 strncpy(entry
.name
, "???", sizeof(entry
.name
));
198 entry
.name
[sizeof(entry
.name
) - 2] = '\0';
199 strcat(entry
.name
, ":");
201 if ((lock
= Lock(entry
.name
, SHARED_LOCK
)) != NULL
)
203 if (Info(lock
, &diskinfo
) != DOSFALSE
)
210 100 * diskinfo
.id_NumBlocksUsed
/ diskinfo
.id_NumBlocks
212 entry
.full
[sizeof(entry
.full
) - 1] = '\0';
214 used
= (UQUAD
)diskinfo
.id_NumBlocksUsed
* diskinfo
.id_BytesPerBlock
;
215 free
= (UQUAD
)diskinfo
.id_NumBlocks
* diskinfo
.id_BytesPerBlock
- used
;
216 printSize(entry
.free
, sizeof entry
.free
, free
);
217 printSize(entry
.used
, sizeof entry
.used
, used
);
222 DoMethod(obj
, MUIM_List_InsertSingle
, (IPTR
)&entry
, MUIV_List_Insert_Bottom
);
226 while((actdl
= NextDosEntry(actdl
, LDF_ASSIGNS
)))
228 struct Volumelist_Entry entry
;
230 entry
.full
[0] = '\0';
231 entry
.free
[0] = '\0';
232 entry
.used
[0] = '\0';
234 entry
.type
= DLT_DIRECTORY
;
236 strncpy(entry
.name
, actdl
->dol_Ext
.dol_AROS
.dol_DevName
, sizeof(entry
.name
));
238 #warning "FIXME: AmigaOS: get assign name"
239 strncpy(entry
.name
, "???", sizeof(entry
.name
));
241 entry
.name
[sizeof(entry
.name
) - 2] = '\0';
242 strcat(entry
.name
, ":");
244 DoMethod(obj
, MUIM_List_InsertSingle
, (IPTR
)&entry
, 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
)
259 case OM_NEW
: return Volumelist__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
261 default: return DoSuperMethodA(cl
, obj
, msg
);
264 BOOPSI_DISPATCHER_END
266 const struct __MUIBuiltinClass _MUI_Volumelist_desc
=
270 sizeof(struct Volumelist_DATA
),
271 (void*)Volumelist_Dispatcher
273 #endif /* ZUNE_BUILTIN_VOLUMELIST */