childs -> children.
[AROS.git] / workbench / libs / icon / diskobjio.c
blob1b4627d988de90d405d29c6e246df5f3598d8a5e
1 /*
2 Copyright © 1995-2010, The AROS Development Team. All rights reserved.
3 $Id$
5 Read an icon from an .info file
6 */
8 #ifdef __MORPHOS__
9 #undef __NOLIBBASE__
10 #endif
12 /****************************************************************************************/
14 #include <stdio.h>
15 #include <stddef.h>
16 #include <string.h>
18 #include <exec/memory.h>
19 #include <aros/bigendianio.h>
20 #include <aros/asmcall.h>
21 #include <aros/macros.h>
22 #include <workbench/workbench.h>
24 #include <proto/alib.h>
25 #include <proto/exec.h>
26 #include <proto/dos.h>
27 #include <proto/arossupport.h>
28 #include <proto/intuition.h>
30 #include "icon_intern.h"
32 # include <aros/debug.h>
34 /****************************************************************************************/
36 AROS_UFP3S(ULONG, ProcessCheckFileType,
37 AROS_UFPA(struct Hook *, hook, A0),
38 AROS_UFPA(struct Hook *, streamhook, A2),
39 AROS_UFPA(struct SDData *, data, A1)
42 AROS_UFP3S(ULONG, ProcessOldDrawerData,
43 AROS_UFPA(struct Hook *, hook, A0),
44 AROS_UFPA(struct Hook *, streamhook, A2),
45 AROS_UFPA(struct SDData *, data, A1)
48 AROS_UFP3S(ULONG, ProcessNewDrawerData,
49 AROS_UFPA(struct Hook *, hook, A0),
50 AROS_UFPA(struct Hook *, streamhook, A2),
51 AROS_UFPA(struct SDData *, data, A1)
54 AROS_UFP3S(ULONG, ProcessGadgetRender,
55 AROS_UFPA(struct Hook *, hook, A0),
56 AROS_UFPA(struct Hook *, streamhook, A2),
57 AROS_UFPA(struct SDData *, data, A1)
60 AROS_UFP3S(ULONG, ProcessSelectRender,
61 AROS_UFPA(struct Hook *, hook, A0),
62 AROS_UFPA(struct Hook *, streamhook, A2),
63 AROS_UFPA(struct SDData *, data, A1)
66 AROS_UFP3S(ULONG, ProcessDefaultTool,
67 AROS_UFPA(struct Hook *, hook, A0),
68 AROS_UFPA(struct Hook *, streamhook, A2),
69 AROS_UFPA(struct SDData *, data, A1)
72 AROS_UFP3S(ULONG, ProcessToolWindow,
73 AROS_UFPA(struct Hook *, hook, A0),
74 AROS_UFPA(struct Hook *, streamhook, A2),
75 AROS_UFPA(struct SDData *, data, A1)
78 AROS_UFP3S(ULONG, ProcessToolTypes,
79 AROS_UFPA(struct Hook *, hook, A0),
80 AROS_UFPA(struct Hook *, streamhook, A2),
81 AROS_UFPA(struct SDData *, data, A1)
84 AROS_UFP3S(ULONG, ProcessFlagPtr,
85 AROS_UFPA(struct Hook *, hook, A0),
86 AROS_UFPA(struct Hook *, streamhook, A2),
87 AROS_UFPA(struct SDData *, data, A1)
90 AROS_UFP3S(ULONG, ProcessIcon35,
91 AROS_UFPA(struct Hook *, hook, A0),
92 AROS_UFPA(struct Hook *, streamhook, A2),
93 AROS_UFPA(struct SDData *, data, A1)
96 AROS_UFP3S(ULONG, ProcessIconNI,
97 AROS_UFPA(struct Hook *, hook, A0),
98 AROS_UFPA(struct Hook *, streamhook, A2),
99 AROS_UFPA(struct SDData *, data, A1)
102 const struct Hook
103 ProcessCheckFileTypeHook =
105 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessCheckFileType), NULL, NULL
107 ProcessOldDrawerDataHook =
109 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessOldDrawerData), NULL, NULL
111 ProcessNewDrawerDataHook =
113 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessNewDrawerData), NULL, NULL
115 ProcessGadgetRenderHook =
117 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessGadgetRender), NULL, NULL
119 ProcessSelectRenderHook =
121 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessSelectRender), NULL, NULL
123 ProcessFlagPtrHook =
125 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessFlagPtr), NULL, NULL
127 ProcessDefaultToolHook =
129 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessDefaultTool), NULL, NULL
131 ProcessToolWindowHook =
133 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessToolWindow), NULL, NULL
135 ProcessToolTypesHook =
137 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessToolTypes), NULL, NULL
139 ProcessIcon35Hook =
141 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessIcon35), NULL, NULL
143 ProcessIconNIHook =
145 { NULL, NULL}, (HOOKFUNC)AROS_ASMSYMNAME(ProcessIconNI), NULL, NULL
148 /****************************************************************************************/
150 #undef O
151 #define O(x) (offsetof (struct Gadget,x))
153 /****************************************************************************************/
155 static const IPTR GadgetDesc[] =
157 sizeof (struct Gadget),
158 SDM_IGNORE(4), /* NextGadget */
159 SDM_WORD(O(LeftEdge)),
160 SDM_WORD(O(TopEdge)),
161 SDM_WORD(O(Width)),
162 SDM_WORD(O(Height)),
163 SDM_UWORD(O(Flags)),
164 SDM_UWORD(O(Activation)),
165 SDM_UWORD(O(GadgetType)),
166 SDM_SPECIAL(O(GadgetRender),&ProcessFlagPtrHook),
167 SDM_SPECIAL(O(SelectRender),&ProcessFlagPtrHook),
168 SDM_SPECIAL(O(GadgetText),&ProcessFlagPtrHook),
169 SDM_LONG(O(MutualExclude)),
170 SDM_SPECIAL(O(SpecialInfo),&ProcessFlagPtrHook),
171 SDM_UWORD(O(GadgetID)),
172 SDM_ULONG(O(UserData)),
173 SDM_END
176 /****************************************************************************************/
178 #undef O
179 #define O(x) (offsetof (struct DiskObject,x))
181 /****************************************************************************************/
183 static const IPTR DiskObjectDesc[] =
185 sizeof (struct DiskObject),
186 SDM_UWORD(O(do_Magic)),
187 SDM_UWORD(O(do_Version)),
188 SDM_STRUCT(O(do_Gadget),GadgetDesc),
189 SDM_UBYTE(O(do_Type)),
190 SDM_IGNORE(1), /* Pad */
191 SDM_SPECIAL(O(do_DefaultTool),&ProcessFlagPtrHook),
192 SDM_SPECIAL(O(do_ToolTypes),&ProcessFlagPtrHook),
193 SDM_LONG(O(do_CurrentX)),
194 SDM_LONG(O(do_CurrentY)),
195 SDM_SPECIAL(O(do_DrawerData),&ProcessFlagPtrHook),
196 SDM_SPECIAL(O(do_ToolWindow),&ProcessFlagPtrHook),
197 SDM_LONG(O(do_StackSize)),
198 SDM_END
201 /****************************************************************************************/
203 #undef O
204 #define O(x) (offsetof (struct Image,x))
206 /****************************************************************************************/
208 static const IPTR ImageDesc[] =
210 sizeof (struct Image),
211 SDM_WORD(O(LeftEdge)),
212 SDM_WORD(O(TopEdge)),
213 SDM_WORD(O(Width)),
214 SDM_WORD(O(Height)),
215 SDM_WORD(O(Depth)),
216 SDM_SPECIAL(O(ImageData),&ProcessFlagPtrHook),
217 SDM_UBYTE(O(PlanePick)),
218 SDM_UBYTE(O(PlaneOnOff)),
219 SDM_SPECIAL(O(NextImage),&ProcessFlagPtrHook),
220 SDM_END
223 /****************************************************************************************/
225 const IPTR IconDesc[] =
227 sizeof (struct NativeIcon),
228 SDM_STRUCT(0,DiskObjectDesc),
229 SDM_SPECIAL(0,&ProcessCheckFileTypeHook),
230 SDM_SPECIAL(0,&ProcessOldDrawerDataHook),
231 SDM_SPECIAL(0,&ProcessGadgetRenderHook),
232 SDM_SPECIAL(0,&ProcessSelectRenderHook),
233 SDM_SPECIAL(0,&ProcessDefaultToolHook),
234 SDM_SPECIAL(0,&ProcessToolTypesHook),
235 SDM_SPECIAL(0,&ProcessToolWindowHook),
236 SDM_SPECIAL(0,&ProcessNewDrawerDataHook),
237 SDM_SPECIAL(0,&ProcessIcon35Hook),
238 SDM_SPECIAL(0,&ProcessIconNIHook),
239 SDM_END
242 /****************************************************************************************/
244 #undef O
245 #define O(x) (offsetof (struct NewWindow,x))
247 /****************************************************************************************/
249 const IPTR NewWindowDesc[] =
251 sizeof (struct NewWindow),
252 SDM_WORD(O(LeftEdge)),
253 SDM_WORD(O(TopEdge)),
254 SDM_WORD(O(Width)),
255 SDM_WORD(O(Height)),
256 SDM_UBYTE(O(DetailPen)),
257 SDM_UBYTE(O(BlockPen)),
258 SDM_ULONG(O(IDCMPFlags)),
259 SDM_ULONG(O(Flags)),
260 SDM_IGNORE(4+4+4+4+4), /* FirstGadget
261 +CheckMark
262 +Title
263 +Screen
264 +BitMap
266 SDM_WORD(O(MinWidth)),
267 SDM_WORD(O(MinHeight)),
268 SDM_UWORD(O(MaxWidth)),
269 SDM_UWORD(O(MaxHeight)),
270 SDM_UWORD(O(Type)),
271 SDM_END
274 /****************************************************************************************/
276 #undef O
277 #define O(x) (offsetof (struct DrawerData,x))
279 /****************************************************************************************/
281 const IPTR OldDrawerDataDesc[] =
283 sizeof (struct DrawerData),
284 SDM_STRUCT(O(dd_NewWindow),NewWindowDesc),
285 SDM_LONG(O(dd_CurrentX)),
286 SDM_LONG(O(dd_CurrentY)),
287 SDM_END
290 /****************************************************************************************/
292 AROS_UFH3(LONG, dosstreamhook,
293 AROS_UFHA(struct Hook *, hook, A0),
294 AROS_UFHA(BPTR, fh, A2),
295 AROS_UFHA(ULONG *, msg, A1)
298 AROS_USERFUNC_INIT
300 struct IconBase *IconBase = hook->h_Data;
302 LONG rc = 0;
304 switch (*msg)
306 case BEIO_READ:
307 rc = FGetC (fh);
308 #if 0
309 kprintf ("dsh: Read: %02X\n", rc);
310 #endif
311 break;
313 case BEIO_WRITE:
314 rc = FPutC (fh, ((struct BEIOM_Write *)msg)->Data);
315 break;
317 case BEIO_IGNORE:
318 Flush (fh);
320 rc = Seek (fh, ((struct BEIOM_Ignore *)msg)->Count, OFFSET_CURRENT);
321 #if 0
322 kprintf ("dsh: Skip %d\n", ((struct BEIOM_Ignore *)msg)->Count);
323 #endif
324 break;
328 return rc;
330 AROS_USERFUNC_EXIT
331 } /* dosstreamhook */
333 /****************************************************************************************/
335 #define DO(x) ((struct DiskObject *)x)
337 /****************************************************************************************/
339 AROS_UFH3S(ULONG, ProcessCheckFileType,
340 AROS_UFHA(struct Hook *, hook, A0),
341 AROS_UFHA(struct Hook *, streamhook, A2),
342 AROS_UFHA(struct SDData *, data, A1)
345 AROS_USERFUNC_INIT
347 struct DiskObject *icon = DO(data->sdd_Dest);
349 if (data->sdd_Mode == SDV_SPECIALMODE_READ)
351 if ((icon->do_Magic != WB_DISKMAGIC))
353 return FALSE;
357 return TRUE;
359 AROS_USERFUNC_EXIT
363 /****************************************************************************************/
365 AROS_UFH3S(ULONG, ProcessOldDrawerData,
366 AROS_UFHA(struct Hook *, hook, A0),
367 AROS_UFHA(struct Hook *, streamhook, A2),
368 AROS_UFHA(struct SDData *, data, A1)
371 AROS_USERFUNC_INIT
373 APTR ptr;
374 struct IconBase *IconBase = streamhook->h_Data;
375 struct DiskObject *icon = DO(data->sdd_Dest);
377 #if 0
378 kprintf ("ProcessOldDrawerData\n");
379 #endif
381 /* if (icon->do_Type == WBDRAWER)
383 /* sba: all icons which have do_DrawerData set actually contain
384 * also the drawer data */
386 if (icon->do_DrawerData)
388 switch (data->sdd_Mode)
390 case SDV_SPECIALMODE_READ:
391 ptr = AllocMemIcon(icon, sizeof(struct DrawerData), MEMF_PUBLIC);
392 if (ptr == NULL)
393 return FALSE;
395 if (ReadStruct (streamhook
396 , (APTR *)&ptr
397 , data->sdd_Stream
398 , OldDrawerDataDesc
401 icon->do_DrawerData = ptr;
402 NATIVEICON(data->sdd_Dest)->ni_ReadStruct_State |= RSS_OLDDRAWERDATA_READ;
403 return TRUE;
405 return FALSE;
407 case SDV_SPECIALMODE_WRITE:
408 return WriteStruct (streamhook
409 , icon->do_DrawerData
410 , data->sdd_Stream
411 , OldDrawerDataDesc
413 case SDV_SPECIALMODE_FREE:
414 return TRUE;
418 return TRUE;
420 AROS_USERFUNC_EXIT
421 } /* ProcessOldDrawerData */
423 /****************************************************************************************/
425 static struct Image * ReadImage (struct DiskObject *icon, struct Hook * streamhook, BPTR file)
427 struct Image * image;
428 ULONG size;
429 ULONG t;
430 struct IconBase *IconBase = streamhook->h_Data;
432 image = AllocMemIcon(icon, sizeof(struct Image), MEMF_PUBLIC | MEMF_CLEAR);
433 if (!image)
434 return NULL;
436 if (!ReadStruct (streamhook, (APTR *)&image, (APTR)file, ImageDesc))
437 return NULL;
439 /* Size of imagedata in bytes */
440 size = ((image->Width + 15) >> 4) * image->Height * image->Depth * 2;
442 D(bug("%s: %dx%dx%d (%d bytes)\n", __func__
443 , image->Width
444 , image->Height
445 , image->Depth
446 , size));
448 if (size)
450 if (!(image->ImageData = AllocMemIcon(icon, size, MEMF_PUBLIC | MEMF_CHIP)) )
451 return NULL;
453 size >>= 1;
455 for (t=0; t<size; t++)
457 UWORD data;
459 if (!ReadWord (streamhook, &data, (APTR)file))
460 break;
462 image->ImageData[t] = AROS_WORD2BE(data);
465 if (t != size)
467 D(bug("[%s] Strange. Short read at %d, expected %d\n", t, size));
468 return NULL;
472 return image;
473 } /* ReadImage */
475 /****************************************************************************************/
477 static int WriteImage (struct Hook * streamhook, BPTR file,
478 struct Image * image)
480 ULONG size;
481 ULONG t;
483 if (!WriteStruct (streamhook, image, (APTR)file, ImageDesc) )
484 return FALSE;
486 /* Get size in words */
487 size = ((image->Width + 15) >> 4) * image->Height * image->Depth;
489 #if 0
490 kprintf ("WriteImage: %dx%dx%d (%d bytes)\n"
491 , image->Width
492 , image->Height
493 , image->Depth
494 , size*2
496 #endif
498 for (t=0; t<size; t++)
500 UWORD data = image->ImageData[t];
502 if (!WriteWord (streamhook, AROS_WORD2BE(data), (APTR)file))
503 break;
506 return (t == size);
507 } /* WriteImage */
509 /****************************************************************************************/
511 AROS_UFH3S(ULONG, ProcessGadgetRender,
512 AROS_UFHA(struct Hook *, hook, A0),
513 AROS_UFHA(struct Hook *, streamhook, A2),
514 AROS_UFHA(struct SDData *, data, A1)
517 AROS_USERFUNC_INIT
519 struct Image * image;
520 struct DiskObject *icon = DO(data->sdd_Dest);
522 #if 0
523 kprintf ("ProcessGadgetRender\n");
524 #endif
526 if (icon->do_Gadget.GadgetRender || (icon->do_Gadget.Flags & GFLG_GADGIMAGE))
528 switch (data->sdd_Mode)
530 case SDV_SPECIALMODE_READ:
531 image = ReadImage (icon, streamhook, (BPTR)data->sdd_Stream);
533 if (!image)
534 return FALSE;
536 icon->do_Gadget.GadgetRender = image;
537 NATIVEICON(data->sdd_Dest)->ni_ReadStruct_State |= RSS_GADGETIMAGE_READ;
538 break;
540 case SDV_SPECIALMODE_WRITE:
541 image = icon->do_Gadget.GadgetRender;
542 if (!image)
543 return TRUE;
545 return WriteImage (streamhook, (BPTR)data->sdd_Stream, image);
547 case SDV_SPECIALMODE_FREE:
548 break;
552 return TRUE;
554 AROS_USERFUNC_EXIT
555 } /* ProcessGadgetRender */
557 /****************************************************************************************/
559 AROS_UFH3S(ULONG, ProcessSelectRender,
560 AROS_UFHA(struct Hook *, hook, A0),
561 AROS_UFHA(struct Hook *, streamhook, A2),
562 AROS_UFHA(struct SDData *, data, A1)
565 AROS_USERFUNC_INIT
567 struct Image * image;
568 struct DiskObject *icon = DO(data->sdd_Dest);
570 #if 0
571 kprintf ("ProcessSelectRender\n");
572 #endif
574 /* Not all icon with second image seem to have GFLG_GADGHIMAGE set */
576 if (icon->do_Gadget.SelectRender || (icon->do_Gadget.Flags & GFLG_GADGHIMAGE))
578 switch (data->sdd_Mode)
580 case SDV_SPECIALMODE_READ:
581 image = ReadImage (icon, streamhook, (BPTR)data->sdd_Stream);
583 if (!image)
584 return FALSE;
586 icon->do_Gadget.SelectRender = image;
587 NATIVEICON(data->sdd_Dest)->ni_ReadStruct_State |= RSS_SELECTIMAGE_READ;
588 break;
590 case SDV_SPECIALMODE_WRITE:
591 image = icon->do_Gadget.SelectRender;
593 return WriteImage (streamhook, (BPTR)data->sdd_Stream, image);
595 case SDV_SPECIALMODE_FREE:
596 break;
600 return TRUE;
602 AROS_USERFUNC_EXIT
603 } /* ProcessSelectRender */
605 /****************************************************************************************/
607 AROS_UFH3S(ULONG, ProcessFlagPtr,
608 AROS_UFHA(struct Hook *, hook, A0),
609 AROS_UFHA(struct Hook *, streamhook, A2),
610 AROS_UFHA(struct SDData *, data, A1)
613 AROS_USERFUNC_INIT
615 LONG ptr;
616 struct IconBase *IconBase = streamhook->h_Data;
618 switch (data->sdd_Mode)
620 case SDV_SPECIALMODE_READ:
621 if (FRead ((BPTR)data->sdd_Stream, &ptr, 1, 4) != 4)
622 return FALSE;
624 #if 0
625 kprintf ("ProcessFlagPtr: %08lx %ld\n", ptr);
626 #endif
628 *((IPTR *)data->sdd_Dest) = (IPTR)(ptr != 0L);
630 break;
632 case SDV_SPECIALMODE_WRITE:
633 IconBase = streamhook->h_Data;
634 if (*((APTR *)data->sdd_Dest))
635 ptr = 0xABADCAFEL;
636 else
637 ptr = 0L;
639 if (FWrite ((BPTR)data->sdd_Stream, &ptr, 1, 4) != 4)
640 return FALSE;
642 break;
644 case SDV_SPECIALMODE_FREE:
645 break;
649 return TRUE;
651 AROS_USERFUNC_EXIT
652 } /* ProcessFlagPtr */
654 /****************************************************************************************/
656 static STRPTR ReadIconString (struct DiskObject *icon, struct Hook * streamhook, BPTR file)
658 ULONG len;
659 STRPTR str;
661 struct IconBase *IconBase = streamhook->h_Data;
663 if (!ReadLong (streamhook, &len, (APTR)file))
664 return NULL;
666 str = AllocMemIcon(icon, len, MEMF_PUBLIC);
668 if (!str)
669 return NULL;
671 if (FRead ((BPTR)file, str, len, 1) == EOF)
673 return NULL;
676 #if 0
677 kprintf ("ReadIconString: \"%s\"\n", str);
678 #endif
680 return str;
681 } /* ReadIconString */
683 /****************************************************************************************/
685 static int WriteIconString (struct Hook * streamhook, BPTR file, STRPTR str)
687 ULONG len;
689 struct IconBase *IconBase = streamhook->h_Data;
691 len = strlen (str) + 1;
693 if (!WriteLong (streamhook, len, (APTR)file))
694 return FALSE;
696 return FWrite (file, str, len, 1) != EOF;
697 } /* WriteIconString */
699 /****************************************************************************************/
701 AROS_UFH3S(ULONG, ProcessDefaultTool,
702 AROS_UFHA(struct Hook *, hook, A0),
703 AROS_UFHA(struct Hook *, streamhook, A2),
704 AROS_UFHA(struct SDData *, data, A1)
707 AROS_USERFUNC_INIT
709 STRPTR str;
710 struct DiskObject *icon = DO(data->sdd_Dest);
712 #if 0
713 kprintf ("ProcessDefaultTool\n");
714 #endif
716 if (icon->do_DefaultTool)
718 switch (data->sdd_Mode)
720 case SDV_SPECIALMODE_READ:
721 str = ReadIconString (icon, streamhook, (BPTR) data->sdd_Stream);
723 if (!str)
724 return FALSE;
726 icon->do_DefaultTool = str;
727 NATIVEICON(data->sdd_Dest)->ni_ReadStruct_State |= RSS_DEFAULTTOOL_READ;
728 break;
730 case SDV_SPECIALMODE_WRITE: {
731 str = icon->do_DefaultTool;
733 WriteIconString (streamhook, (BPTR) data->sdd_Stream, str);
735 break; }
737 case SDV_SPECIALMODE_FREE:
738 break;
742 return TRUE;
744 AROS_USERFUNC_EXIT
745 } /* ProcessDefaultTool */
747 /****************************************************************************************/
749 AROS_UFH3S(ULONG, ProcessToolWindow,
750 AROS_UFHA(struct Hook *, hook, A0),
751 AROS_UFHA(struct Hook *, streamhook, A2),
752 AROS_UFHA(struct SDData *, data, A1)
755 AROS_USERFUNC_INIT
757 STRPTR str;
758 struct DiskObject *icon = DO(data->sdd_Dest);
760 #if 0
761 kprintf ("ProcessToolWindow\n");
762 #endif
764 if (icon->do_ToolWindow)
766 switch (data->sdd_Mode)
768 case SDV_SPECIALMODE_READ:
769 str = ReadIconString (icon, streamhook, (BPTR)data->sdd_Stream);
771 if (!str)
772 return FALSE;
774 icon->do_ToolWindow = str;
775 NATIVEICON(data->sdd_Dest)->ni_ReadStruct_State |= RSS_TOOLWINDOW_READ;
776 break;
778 case SDV_SPECIALMODE_WRITE: {
779 str = icon->do_ToolWindow;
781 WriteIconString (streamhook, (BPTR)data->sdd_Stream, str);
783 break; }
785 case SDV_SPECIALMODE_FREE:
786 break;
790 return TRUE;
792 AROS_USERFUNC_EXIT
793 } /* ProcessToolWindow */
795 /****************************************************************************************/
797 AROS_UFH3S(ULONG, ProcessToolTypes,
798 AROS_UFHA(struct Hook *, hook, A0),
799 AROS_UFHA(struct Hook *, streamhook, A2),
800 AROS_UFHA(struct SDData *, data, A1)
803 AROS_USERFUNC_INIT
805 struct IconBase *IconBase = streamhook->h_Data;
806 struct DiskObject *icon = DO(data->sdd_Dest);
808 #if 0
809 kprintf ("ProcessToolTypes\n");
810 #endif
812 if (icon->do_ToolTypes)
814 ULONG t;
815 ULONG count;
816 STRPTR * ttarray;
818 switch (data->sdd_Mode)
820 case SDV_SPECIALMODE_READ:
821 /* Read size of ToolTypes array (each entry is 4 bytes and the
822 last is 0L */
823 if (!ReadLong (streamhook, &count, data->sdd_Stream))
824 return FALSE;
826 count = (count >> 2) - 1; /* How many entries */
828 if ((LONG)count < 0)
830 icon->do_ToolTypes = NULL;
831 return TRUE;
834 ttarray = AllocMemIcon(icon, (count+1)*sizeof(STRPTR), MEMF_PUBLIC);
835 if (!ttarray) return FALSE;
837 #if 0
838 kprintf ("Read %d tooltypes (tt=%p)\n", count, ttarray);
839 #endif
841 for (t=0; t<count; t++)
843 ttarray[t] = ReadIconString (icon, streamhook, (BPTR)data->sdd_Stream);
844 #if 0
845 kprintf ("String %d=%p=%s\n", t, ttarray[t], ttarray[t]);
846 #endif
848 if (!ttarray[t])
849 return FALSE;
852 ttarray[t] = NULL;
854 icon->do_ToolTypes = (STRPTR *)ttarray;
855 NATIVEICON(icon)->ni_ReadStruct_State |= RSS_TOOLTYPES_READ;
856 break;
858 case SDV_SPECIALMODE_WRITE: {
859 ULONG size;
861 ttarray = (STRPTR *)icon->do_ToolTypes;
863 for (count=0; ttarray[count]; count++);
865 #if 0
866 kprintf ("Write %d tooltypes (%p)\n", count, ttarray);
867 #endif
869 size = (count+1)*4;
871 if (!WriteLong (streamhook, size, data->sdd_Stream))
872 return FALSE;
874 for (t=0; t<count; t++)
876 #if 0
877 kprintf ("String %d=%p=%s\n", t, ttarray[t], ttarray[t]);
878 #endif
879 if (!WriteIconString (streamhook, (BPTR)data->sdd_Stream, ttarray[t]))
880 return FALSE;
883 break; }
885 case SDV_SPECIALMODE_FREE:
886 break;
889 #if 0
890 else
891 kprintf ("No tool types\n");
892 #endif
894 return TRUE;
896 AROS_USERFUNC_EXIT
897 } /* ProcessToolTypes */
899 /****************************************************************************************/
901 AROS_UFH3S(ULONG, ProcessNewDrawerData,
902 AROS_UFHA(struct Hook *, hook, A0),
903 AROS_UFHA(struct Hook *, streamhook, A2),
904 AROS_UFHA(struct SDData *, data, A1)
907 AROS_USERFUNC_INIT
909 struct DiskObject *icon = DO(data->sdd_Dest);
910 IPTR rev = (IPTR)icon->do_Gadget.UserData & WB_DISKREVISIONMASK;
911 #if 0
912 kprintf ("ProcessNewDrawerData\n");
913 #endif
915 if (icon->do_DrawerData && (rev > 0) && (rev <= WB_DISKREVISION))
917 switch (data->sdd_Mode)
919 case SDV_SPECIALMODE_READ:
920 if (!ReadLong(streamhook, &icon->do_DrawerData->dd_Flags, data->sdd_Stream))
921 return FALSE;
923 if (!ReadWord(streamhook, &icon->do_DrawerData->dd_ViewModes, data->sdd_Stream))
924 return FALSE;
926 break;
928 case SDV_SPECIALMODE_WRITE:
929 if (!WriteLong(streamhook, icon->do_DrawerData->dd_Flags, data->sdd_Stream))
930 return FALSE;
932 if (!WriteWord(streamhook, icon->do_DrawerData->dd_ViewModes, data->sdd_Stream))
933 return FALSE;
934 break;
938 return TRUE;
940 AROS_USERFUNC_EXIT
941 } /* ProcessNewDrawerData */
943 /****************************************************************************************/
945 #define IconBase ((IconBase_T *)(streamhook->h_Data))
947 /****************************************************************************************/
949 AROS_UFH3S(ULONG, ProcessIcon35,
950 AROS_UFHA(struct Hook *, hook, A0),
951 AROS_UFHA(struct Hook *, streamhook, A2),
952 AROS_UFHA(struct SDData *, data, A1)
955 AROS_USERFUNC_INIT
957 IPTR retval = TRUE;
959 #if 0
960 kprintf ("ProcessIcon35\n");
961 #endif
963 switch (data->sdd_Mode)
965 case SDV_SPECIALMODE_READ:
966 ReadIcon35(NATIVEICON(DO(data->sdd_Dest)), streamhook, data->sdd_Stream, IconBase);
967 break;
969 case SDV_SPECIALMODE_FREE:
970 FreeIcon35(NATIVEICON(DO(data->sdd_Dest)), IconBase);
971 break;
973 case SDV_SPECIALMODE_WRITE:
974 retval = WriteIcon35(NATIVEICON(DO(data->sdd_Dest)), streamhook, data->sdd_Stream, IconBase);
975 break;
979 return retval;
981 AROS_USERFUNC_EXIT
982 } /* ProcessIcon35 */
984 /****************************************************************************************/
986 AROS_UFH3S(ULONG, ProcessIconNI,
987 AROS_UFHA(struct Hook *, hook, A0),
988 AROS_UFHA(struct Hook *, streamhook, A2),
989 AROS_UFHA(struct SDData *, data, A1)
992 AROS_USERFUNC_INIT
994 IPTR retval = TRUE;
996 #if 0
997 kprintf ("ProcessIconNI\n");
998 #endif
1000 switch (data->sdd_Mode)
1002 case SDV_SPECIALMODE_READ:
1003 ReadIconNI(NATIVEICON(DO(data->sdd_Dest)), streamhook, data->sdd_Stream, IconBase);
1004 break;
1006 case SDV_SPECIALMODE_FREE:
1007 FreeIconNI(NATIVEICON(DO(data->sdd_Dest)), IconBase);
1008 break;
1010 case SDV_SPECIALMODE_WRITE:
1011 retval = WriteIconNI(NATIVEICON(DO(data->sdd_Dest)), streamhook, data->sdd_Stream, IconBase);
1012 break;
1016 return retval;
1018 AROS_USERFUNC_EXIT
1019 } /* ProcessIconNI */
1021 /****************************************************************************************/