2 Copyright 2004-2007, The AROS Development Team. All rights reserved.
5 #include "portable_macros.h"
8 #include <aros/debug.h>
10 #define MUIMASTER_YES_INLINE_STDARG
13 #define IFF_CHUNK_BUFFER_SIZE 1024
15 #include <exec/types.h>
16 #include <libraries/mui.h>
19 #include <zune/customclasses.h>
21 #include <zune_AROS/customclasses.h>
24 #include <proto/workbench.h>
26 #include <proto/utility.h>
28 #include <proto/dos.h>
31 #include <proto/alib.h>
34 #include <proto/iffparse.h>
37 #include <proto/aros.h>
40 #include <aros/arosbase.h>
41 #include <aros/inquire.h>
47 #if defined(__AMIGA__) && !defined(__PPC__)
48 #define NO_INLINE_STDARG
50 #ifndef _PROTO_INTUITION_H
51 #include <proto/intuition.h>
54 #include <proto/muimaster.h>
56 #include "wandererprefs.h"
57 #include "Classes/iconlist_attributes.h"
58 #include "iconwindow_attributes.h"
64 #include <prefs/prefhdr.h>
65 #include <prefs/wanderer.h>
67 #include <prefs_AROS/prefhdr.h>
68 #include <prefs_AROS/wanderer.h>
76 #define D(x) if (DEBUG) x
78 #define bug DebugPrintF
92 /*** Instance Data **********************************************************/
93 struct WandererPrefs_DATA
95 ULONG wpd_NavigationMethod
;
96 ULONG wpd_ToolbarEnabled
;
97 ULONG wpd_ShowNetwork
;
98 ULONG wpd_ShowUserFiles
;
99 ULONG wpd_ScreenTitleString
[IFF_CHUNK_BUFFER_SIZE
];
101 struct List wpd_ViewSettings
;
106 struct WandererPrefs_ViewSettingsNode
108 struct Node wpbn_Node
;
110 IPTR wpbn_Background
;
111 struct TagItem32
*wpbn_Options
;
112 Object
*wpbn_NotifyObject
;
115 /*** Macros *****************************************************************/
116 #define SETUP_INST_DATA struct WandererPrefs_DATA *data = INST_DATA(CLASS, self)
118 /*** Utility Functions ******************************************************/
120 BOOL
SetString(STRPTR
*dst
, STRPTR src
)
124 if ((*dst
== NULL
) || (strcmp(src
, *dst
) != 0))
126 STRPTR tmp
=(STRPTR
) StrDup(src
);
143 static unsigned char strtochar(STRPTR st
)
148 /******** code from workbench/c/Info.c **************************************/
150 static void fmtlarge(UBYTE
*buf
, ULONG num
)
164 if (num
>= 1073741824)
167 array
.val
= num
>> 30;
168 d
= ((UQUAD
)num
* 10 + 536870912) / 1073741824;
170 ch
= strtochar((STRPTR
)_(MSG_MEM_G
));
172 else if (num
>= 1048576)
175 array
.val
= num
>> 20;
176 d
= ((UQUAD
)num
* 10 + 524288) / 1048576;
178 ch
= strtochar((STRPTR
)_(MSG_MEM_M
));
180 else if (num
>= 1024)
183 array
.val
= num
>> 10;
184 d
= (num
* 10 + 512) / 1024;
186 ch
= strtochar((STRPTR
)_(MSG_MEM_K
));
194 ch
= strtochar((STRPTR
)_(MSG_MEM_B
));
197 if (!array
.dec
&& (d
> array
.val
* 10))
202 RawDoFmt(array
.dec
? "%lu.%lu" : "%lu", &array
, NULL
, buf
);
215 /* Case-insensitive FindName()
216 * code from workbench/c/Version.c
219 struct Node
*findname(struct List
*list
, CONST_STRPTR name
)
223 ForeachNode(list
, node
)
225 Foreach_Node(list
, node
);
228 if (!Stricmp(node
->ln_Name
, (STRPTR
) name
))
238 ///ProcessUserScreenTitle()
239 /*pattern matching of user screentitle...;*/
240 STRPTR
ProcessUserScreenTitle(STRPTR screentitle_Template
)
242 /* Work in progress :-) */
243 int screentitle_TemplateLen
;
244 STATIC
char title
[256];
245 char temp
[256], buffer
[256];
247 int screentitle_curChar
;
249 if (screentitle_Template
== NULL
)
251 D(bug("[Wanderer] ProcessUserScreenTitle(),EXTERN screentitle = NULL\n"));
252 return screentitle_Template
;
256 D(bug("[Wanderer] ProcessUserScreenTitle('%s')\n", screentitle_Template
));
259 screentitle_TemplateLen
= strlen(screentitle_Template
);
261 if (screentitle_TemplateLen
< 1)
263 D(bug("[Wanderer] ProcessUserScreenTitle: EXTERN screentitle_TemplateLen = %d\n", screentitle_TemplateLen
));
264 return (STRPTR
) screentitle_TemplateLen
;
267 strcpy(temp
, screentitle_Template
);
269 for (screentitle_curChar
= 0; screentitle_curChar
< screentitle_TemplateLen
; screentitle_curChar
++)
271 if (temp
[screentitle_curChar
]=='%')
273 if (screentitle_TemplateLen
>= 3)
277 if (strncmp(temp
+ screentitle_curChar
, "%wv", 3) == 0)
279 struct Library
*MyLibrary
= NULL
;
282 MyLibrary
= (struct Library
*)findname(&SysBase
->LibList
, "workbench.library");
283 //workbench.library is just opened, what is the sense of this istruction?
285 MyLibrary
= WorkbenchBase
;
288 sprintf(infostr
, "%ld.%ld",(long int) MyLibrary
->lib_Version
,(long int) MyLibrary
->lib_Revision
);
292 if (strncmp(temp
+ screentitle_curChar
, "%ov", 3) == 0)
294 struct Library
*AROSBase
= OpenLibrary(AROSLIBNAME
, AROSLIBVERSION
);
303 AI_ArosVersion
, (IPTR
)&ver
,
306 sprintf(infostr
, "%d", ver
);
307 CloseLibrary(AROSBase
);
312 if (strncmp(temp
+ screentitle_curChar
, "%os", 3) == 0)
314 struct Library
*AROSBase
= OpenLibrary(AROSLIBNAME
, AROSLIBVERSION
);
316 if (AROSBase
!= NULL
)
323 AI_ArosReleaseMajor
, (IPTR
)&ver
,
324 AI_ArosReleaseMinor
, (IPTR
)&rev
,
327 sprintf(infostr
, "%ld.%ld", ver
, rev
);
328 CloseLibrary(AROSBase
);
333 if (strncmp(temp
+ screentitle_curChar
, "%wb", 3) == 0)
335 struct Library
*AROSBase
= OpenLibrary(AROSLIBNAME
, AROSLIBVERSION
);
337 if (AROSBase
!= NULL
)
344 AI_ArosReleaseMajor
, (IPTR
)&ver
,
345 AI_ArosReleaseMinor
, (IPTR
)&rev
,
348 sprintf(infostr
, "%d.%d", WANDERERVERS
, WANDERERREV
);
349 CloseLibrary(AROSBase
);
354 if (strncmp(temp
+ screentitle_curChar
, "%pc", 3) == 0)
356 fmtlarge(infostr
, AvailMem(MEMF_CHIP
));
360 if (strncmp(temp
+ screentitle_curChar
, "%pf", 3) == 0)
362 fmtlarge(infostr
, AvailMem(MEMF_FAST
));
366 if (strncmp(temp
+ screentitle_curChar
, "%pt", 3) == 0)
368 fmtlarge(infostr
, AvailMem(MEMF_ANY
));
372 if (strncmp(temp
+ screentitle_curChar
, "%PC", 3) == 0)
374 fmtlarge(infostr
, AvailMem(MEMF_CHIP
|MEMF_TOTAL
));
378 if (strncmp(temp
+ screentitle_curChar
, "%PF", 3) == 0)
380 fmtlarge(infostr
, AvailMem(MEMF_FAST
|MEMF_TOTAL
));
384 if (strncmp(temp
+ screentitle_curChar
, "%PT", 3) == 0)
386 fmtlarge(infostr
, AvailMem(MEMF_ANY
|MEMF_TOTAL
));
392 temp
[screentitle_curChar
+ 1] = 's';
393 temp
[screentitle_curChar
+ 2] = ' ';
395 sprintf(title
, temp
, infostr
);
397 screentitle_curChar
= screentitle_curChar
+ strlen(infostr
);
398 strncpy(buffer
, title
, screentitle_curChar
);
399 strcpy(&buffer
[screentitle_curChar
], &temp
[(screentitle_curChar
+ 3) - strlen(infostr
)]);
400 strcpy(temp
, buffer
);
402 screentitle_TemplateLen
= screentitle_TemplateLen
+ strlen(infostr
);
406 temp
[screentitle_curChar
] = '?';
407 temp
[screentitle_curChar
+ 1] = '?';
408 temp
[screentitle_curChar
+ 2] = '?';
409 sprintf(title
, temp
);
414 switch (screentitle_TemplateLen
)
417 temp
[screentitle_curChar
]= '?';
418 temp
[screentitle_curChar
+ 1]= '?';
421 temp
[screentitle_curChar
] = '?';
423 sprintf(title
, temp
);
427 sprintf(title
, temp
);
432 /*** Methods ****************************************************************/
434 Object
*WandererPrefs__OM_NEW(Class
*CLASS
, Object
*self
, struct opSet
*message
)
436 self
= (Object
*) DoSuperMethodA(CLASS
, self
, (Msg
) message
);
438 D(bug("WandererPrefs::New()\n"));
444 D(bug("WandererPrefs::New - reloading\n"));
446 NewList(&data
->wpd_ViewSettings
);
448 data
->wpd_PROCESSING
= FALSE
;
450 DoMethod(self
, MUIM_WandererPrefs_Reload
);
452 D(bug("[WandererPrefs] obj = %ld\n", self
));
458 IPTR
WandererPrefs__OM_DISPOSE(Class
*CLASS
, Object
*self
, Msg message
)
462 return DoSuperMethodA(CLASS
, self
, (Msg
)message
);
467 IPTR
WandererPrefs__OM_SET(Class
*CLASS
, Object
*self
, struct opSet
*message
)
470 const struct TagItem
*tstate
= message
->ops_AttrList
;
473 while ((tag
= NextTagItem((TAGITEM
)&tstate
)) != NULL
)
477 case MUIA_WandererPrefs_Processing
:
478 data
->wpd_PROCESSING
= (BOOL
)tag
->ti_Data
;
480 case MUIA_IconWindowExt_NetworkBrowser_Show
:
481 data
->wpd_ShowNetwork
= (LONG
)tag
->ti_Data
;
484 case MUIA_IconWindowExt_UserFiles_ShowFilesFolder
:
485 data
->wpd_ShowUserFiles
= (LONG
)tag
->ti_Data
;
488 case MUIA_IconWindowExt_ScreenTitle_String
:
489 strcpy((STRPTR
)data
->wpd_ScreenTitleString
, (STRPTR
)tag
->ti_Data
);
490 //data->wpd_ScreenTitleString = (LONG)tag->ti_Data;
493 case MUIA_IconWindowExt_Toolbar_Enabled
:
494 data
->wpd_ToolbarEnabled
= (LONG
)tag
->ti_Data
;
497 case MUIA_IconWindowExt_Toolbar_NavigationMethod
:
498 data
->wpd_NavigationMethod
= (LONG
)tag
->ti_Data
;
503 return DoSuperMethodA(CLASS
, self
, (Msg
)message
);
508 IPTR
WandererPrefs__OM_GET(Class
*CLASS
, Object
*self
, struct opGet
*message
)
511 IPTR
*store
= message
->opg_Storage
;
514 switch (message
->opg_AttrID
)
516 case MUIA_WandererPrefs_Processing
:
517 *store
= (IPTR
)data
->wpd_PROCESSING
;
520 case MUIA_IconWindowExt_NetworkBrowser_Show
:
521 *store
= (IPTR
)data
->wpd_ShowNetwork
;
524 case MUIA_IconWindowExt_UserFiles_ShowFilesFolder
:
525 *store
= (IPTR
)data
->wpd_ShowUserFiles
;
528 case MUIA_IconWindowExt_ScreenTitle_String
:
529 *store
= (IPTR
)data
->wpd_ScreenTitleString
;
530 D(bug("[WANDERER.PREFS] WandererPrefs__GET@@@@@@@@@: SCREENTITLE= %s\n", data
->wpd_ScreenTitleString
));
533 case MUIA_IconWindowExt_Toolbar_NavigationMethod
:
534 *store
= (IPTR
)data
->wpd_NavigationMethod
;
537 case MUIA_IconWindowExt_Toolbar_Enabled
:
538 *store
= (IPTR
)data
->wpd_ToolbarEnabled
;
542 rv
= DoSuperMethodA(CLASS
, self
, (Msg
)message
);
549 ///ProcessGlobalChunk()
550 BOOL
WandererPrefs_ProccessGlobalChunk(Class
*CLASS
, Object
*self
, struct TagItem32
*global_chunk
, IPTR chunk_size
)
554 int i
= 0, tag_count
= (chunk_size
/ sizeof(struct TagItem32
));
557 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessGlobalChunk()\n"));
558 #warning "TODO: fix problems with endian-ness?"
560 for (i
= 0; i
< tag_count
; i
++)
564 /* prefs file is stored in little endian */
565 if (AROS_LE2LONG(global_chunk
[i
].ti_Tag
) == TAG_DONE
)
569 else if (AROS_LE2LONG(global_chunk
[i
].ti_Tag
) == MUIA_WandererPrefs_DefaultStack
)
571 #warning "TODO: We should have an option to set the DefaultStackSize in wanderers prefs, and push it onto workbench.library"
572 struct TagItem wbca_Tags
[] =
574 { WBCTRLA_SetDefaultStackSize
, (IPTR
)AROS_LE2LONG(global_chunk
[i
].ti_Data
) },
577 #warning "TODO: What should we use for the name arg in WorkbenchControlA"
578 WorkbenchControlA("", wbca_Tags
);
582 SET(self
, AROS_LE2LONG(global_chunk
[i
].ti_Tag
), AROS_LE2LONG(global_chunk
[i
].ti_Data
));
591 ///WPEditor_ProccessNetworkChunk()
592 BOOL
WPEditor_ProccessNetworkChunk(Class
*CLASS
, Object
*self
, UBYTE
*_viewSettings_Chunk
)
596 struct TagItem
*network_tags
= (struct TagItem
*)_viewSettings_Chunk
;
597 SET(self
, AROS_LE2LONG(network_tags
[0].ti_Tag
), AROS_LE2LONG(network_tags
[0].ti_Data
));
603 ///WPEditor_ProccessScreenTitleChunk()
604 BOOL
WPEditor_ProccessScreenTitleChunk(Class
*CLASS
, Object
*self
, UBYTE
*_ScreenTitle_Chunk
)
607 char *displayed_screentitle
= _ScreenTitle_Chunk
;
608 char *userscreentitle
= NULL
;
610 D(bug("[WANDERER.PREFS] WandererPrefs__ProccessScreenTitleChunk@@@@@@@@@: ScreenTitle Template = '%s'\n", _ScreenTitle_Chunk
));
612 if ((userscreentitle
= ProcessUserScreenTitle(_ScreenTitle_Chunk
)) != NULL
)
614 D(bug("[WANDERER.PREFS] WandererPrefs__ProccessScreenTitleChunk@@@@@@@@@: ProcessUserScreenTitle returns '%s'\n", userscreentitle
));
615 displayed_screentitle
= userscreentitle
;
618 SET(self
, MUIA_IconWindowExt_ScreenTitle_String
, displayed_screentitle
);
619 D(bug("[WANDERER.PREFS] WandererPrefs__ProccessScreenTitleChunk@@@@@@@@@: SCREENTITLE set\n"));
625 ///WandererPrefs_FindViewSettingsNode()
626 struct WandererPrefs_ViewSettingsNode
*WandererPrefs_FindViewSettingsNode(struct WandererPrefs_DATA
*data
, char *node_Name
)
628 struct WandererPrefs_ViewSettingsNode
*current_Node
= NULL
;
631 ForeachNode(&data
->wpd_ViewSettings
, current_Node
)
633 Foreach_Node(&data
->wpd_ViewSettings
, current_Node
);
636 if ((strcmp(current_Node
->wpbn_Name
, node_Name
)) == 0) return current_Node
;
642 ///WandererPrefs_ProccessViewSettingsChunk()
643 BOOL
WandererPrefs_ProccessViewSettingsChunk(Class
*CLASS
, Object
*self
, char *_viewSettings_ViewName
, UBYTE
*_viewSettings_Chunk
, IPTR chunk_size
)
647 struct WandererPrefs_ViewSettingsNode
*_viewSettings_Node
= NULL
;
649 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk()\n"));
651 _viewSettings_Node
= WandererPrefs_FindViewSettingsNode(data
, _viewSettings_ViewName
);
653 if (_viewSettings_Node
)
655 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk: Updating Existing node @ 0x%p\n", _viewSettings_Node
));
656 if (_viewSettings_Node
->wpbn_Background
)
657 FreeVec((APTR
)_viewSettings_Node
->wpbn_Background
);
658 #warning "TODO: Free any Cached backgrounds here .."
662 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk: Creating new node for '%s'\n", _viewSettings_ViewName
));
663 _viewSettings_Node
= AllocMem(sizeof(struct WandererPrefs_ViewSettingsNode
), MEMF_CLEAR
|MEMF_PUBLIC
);
665 _viewSettings_Node
->wpbn_Name
= AllocVec(strlen(_viewSettings_ViewName
) + 1, MEMF_CLEAR
|MEMF_PUBLIC
);
666 strcpy(_viewSettings_Node
->wpbn_Name
, _viewSettings_ViewName
);
668 _viewSettings_Node
->wpbn_NotifyObject
= (Object
*)NotifyObject
, End
;
670 _viewSettings_Node
->wpbn_NotifyObject
= MUI_NewObject(MUIC_Notify
, TAG_DONE
);
673 AddTail(&data
->wpd_ViewSettings
, &_viewSettings_Node
->wpbn_Node
);
676 _viewSettings_Node
->wpbn_Background
=(IPTR
) AllocVec(strlen(_viewSettings_Chunk
) + 1, MEMF_CLEAR
|MEMF_PUBLIC
);
677 strcpy((char *)_viewSettings_Node
->wpbn_Background
, _viewSettings_Chunk
);
678 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk: NAME BACKGROUND= %s\n",_viewSettings_Chunk
));
679 SET(_viewSettings_Node
->wpbn_NotifyObject
, MUIA_Background
, _viewSettings_Chunk
);
681 #warning "TODO: Cache backgrounds here .."
683 if (chunk_size
> (strlen(_viewSettings_Chunk
) + 1))
685 UBYTE _viewSettings_TagOffset
= ((strlen(_viewSettings_Chunk
) + 1)/4);
686 IPTR _viewSettings_TagCount
;
688 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk: Chunk has options Tag data ..\n"));
690 if ((_viewSettings_TagOffset
* 4) != (strlen(_viewSettings_Chunk
) + 1))
692 _viewSettings_TagOffset
= (_viewSettings_TagOffset
+ 1) * 4;
693 D(bug("[WPEditor] WPEditor_ProccessBackgroundChunk: String length unalined - rounding up (length %d, rounded %d) \n", strlen(_viewSettings_Chunk
) + 1, _viewSettings_TagOffset
));
697 _viewSettings_TagOffset
= _viewSettings_TagOffset
* 4;
698 D(bug("[WPEditor] WPEditor_ProccessBackgroundChunk: String length doesnt need aligned (length %d) \n", strlen(_viewSettings_Chunk
) + 1));
701 _viewSettings_TagCount
= ((chunk_size
- _viewSettings_TagOffset
)/sizeof(struct TagItem32
));
703 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk: %d Tags at offset %d ..\n", _viewSettings_TagCount
, _viewSettings_TagOffset
));
705 if (_viewSettings_Node
->wpbn_Options
!= NULL
)
707 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk: Freeing old background tag's @ 0x%p\n", _viewSettings_Node
->wpbn_Options
));
708 FreeVec(_viewSettings_Node
->wpbn_Options
);
709 _viewSettings_Node
->wpbn_Options
= NULL
;
712 _viewSettings_Node
->wpbn_Options
= AllocVec((_viewSettings_TagCount
+ 1) * sizeof(struct TagItem32
), MEMF_CLEAR
|MEMF_PUBLIC
);
713 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk: New tag storage @ 0x%p\n", _viewSettings_Node
->wpbn_Options
));
715 CopyMem(_viewSettings_Chunk
+ _viewSettings_TagOffset
, _viewSettings_Node
->wpbn_Options
, (_viewSettings_TagCount
) * sizeof(struct TagItem32
));
716 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk: Tags copied to storage \n"));
718 _viewSettings_Node
->wpbn_Options
[_viewSettings_TagCount
].ti_Tag
= TAG_DONE
;
722 for (i
= 0; i
< _viewSettings_TagCount
; i
++)
725 _viewSettings_Node
->wpbn_Options
[i
].ti_Tag
= AROS_LE2LONG(_viewSettings_Node
->wpbn_Options
[i
].ti_Tag
);
726 _viewSettings_Node
->wpbn_Options
[i
].ti_Data
= AROS_LE2LONG(_viewSettings_Node
->wpbn_Options
[i
].ti_Data
);
728 D(bug("[WANDERER.PREFS] WandererPrefs_ProccessViewSettingsChunk: Setting Tag 0x%p Value %d\n", _viewSettings_Node
->wpbn_Options
[i
].ti_Tag
, _viewSettings_Node
->wpbn_Options
[i
].ti_Data
));
729 SET(_viewSettings_Node
->wpbn_NotifyObject
, _viewSettings_Node
->wpbn_Options
[i
].ti_Tag
, _viewSettings_Node
->wpbn_Options
[i
].ti_Data
);
737 ///WandererPrefs__MUIM_WandererPrefs_Reload()
738 IPTR WandererPrefs__MUIM_WandererPrefs_Reload
740 Class
*CLASS
, Object
*self
, Msg message
743 struct ContextNode
*context
;
744 struct IFFHandle
*handle
;
747 IPTR iff_parse_mode
= IFFPARSE_SCAN
;
748 UBYTE chunk_buffer
[IFF_CHUNK_BUFFER_SIZE
];
750 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload()\n"));
752 if (!(handle
= AllocIFF()))
755 handle
->iff_Stream
= (IPTR
)Open("ENV:SYS/Wanderer.prefs", MODE_OLDFILE
);
757 if (!handle
->iff_Stream
)
760 InitIFFasDOS(handle
);
762 if ((error
= OpenIFF(handle
, IFFF_READ
)) == 0)
764 if ((error
= StopChunk(handle
, ID_PREF
, ID_WANDR
)) == 0)
766 SET(self
, MUIA_WandererPrefs_Processing
, TRUE
);
769 if ((error
= ParseIFF(handle
, iff_parse_mode
)) == 0)
771 context
= CurrentChunk(handle
);
772 iff_parse_mode
= IFFPARSE_STEP
;
774 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload: Context 0x%p\n", context
));
776 if ((error
=ReadChunkBytes(handle
, chunk_buffer
, IFF_CHUNK_BUFFER_SIZE
)))
778 struct WandererPrefsIFFChunkHeader
*this_header
=(struct WandererPrefsIFFChunkHeader
*) chunk_buffer
;
779 char *this_chunk_name
= NULL
;
780 IPTR this_chunk_size
= AROS_LE2LONG(this_header
->wpIFFch_ChunkSize
);
782 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload: ReadChunkBytes() Chunk matches Prefs Header size ..\n"));
784 if ((this_chunk_name
= AllocVec(strlen(this_header
->wpIFFch_ChunkType
) +1,MEMF_ANY
|MEMF_CLEAR
)))
786 strcpy(this_chunk_name
, this_header
->wpIFFch_ChunkType
);
787 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload: Prefs Header for '%s' data size %d bytes\n", this_chunk_name
, this_chunk_size
));
789 if ((error
= ParseIFF(handle
, IFFPARSE_STEP
)) == IFFERR_EOC
)
791 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload: End of header chunk ..\n"));
793 if ((error
= ParseIFF(handle
, IFFPARSE_STEP
)) == 0)
795 context
= CurrentChunk(handle
);
797 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload: Context 0x%p\n", context
));
799 error
= ReadChunkBytes
806 if (error
== this_chunk_size
)
808 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload: ReadChunkBytes() Chunk matches Prefs Data size .. (%d)\n", error
));
809 if ((strcmp(this_chunk_name
, "wanderer:global")) == 0)
811 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload: Process data for wanderer global chunk ..\n"));
812 WandererPrefs_ProccessGlobalChunk(CLASS
, self
,(struct TagItem32
*) chunk_buffer
, this_chunk_size
);
814 else if ((strcmp(this_chunk_name
, "wanderer:network")) == 0)
816 D(bug("[WPEditor] WPEditor__MUIM_PrefsEditor_ImportFH: Process data for wanderer network config chunk ..\n"));
817 WPEditor_ProccessNetworkChunk(CLASS
, self
, chunk_buffer
);
819 else if ((strcmp(this_chunk_name
, "wanderer:screentitle")) == 0)
821 D(bug("[WPEditor] WPEditor__MUIM_PrefsEditor_ImportFH: Process data for wanderer screentitle config chunk ..size=%d\n", error
));
822 D(bug("[WPEditor] WPEditor__MUIM_PrefsEditor_ImportFH: Process data for wanderer screentitle STRING= %s\n", chunk_buffer
));
823 WPEditor_ProccessScreenTitleChunk(CLASS
, self
, chunk_buffer
);
826 else if ((strncmp(this_chunk_name
, "wanderer:viewsettings", strlen("wanderer:viewsettings"))) == 0)
828 char *view_name
= this_chunk_name
+ strlen("wanderer:viewsettings") + 1;
829 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload: Process data for wanderer background chunk '%s'..\n", view_name
));
830 WandererPrefs_ProccessViewSettingsChunk(CLASS
, self
, view_name
, chunk_buffer
, this_chunk_size
);
832 }//END if (error == this_chunk_size)
833 if ((error
= ParseIFF(handle
, IFFPARSE_STEP
)) == IFFERR_EOC
)
835 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_Reload: TAG_DONE) of Data chunk ..\n"));
837 }//END if ((error = ParseIFF(handle, IFFPARSE_STEP)) == 0)
838 }//END if ((error = ParseIFF(handle, IFFPARSE_STEP)) == IFFERR_EOC)
839 }//END if ((this_chunk_name = AllocVec(strlen(this_header->wpIFFch_ChunkType) +1,MEMF_ANY|MEMF_CLEAR)))
840 }//END if ((error=ReadChunkBytes(handle, chunk_buffer, IFF_CHUNK_BUFFER_SIZE)))
844 D(bug("[WANDERER.PREFS] ParseIFF() failed, returncode %ld!\n", error
));
846 }//END if ((error = ParseIFF(handle, iff_parse_mode)) == 0)
848 } while (error
!= IFFERR_EOF
);
849 SET(self
, MUIA_WandererPrefs_Processing
, FALSE
);
853 D(bug("[WANDERER.PREFS] StopChunk() failed, returncode %ld!\n", error
));
861 D(bug("[WANDERER.PREFS] Failed to open stream!, returncode %ld!\n", error
));
862 //ShowError(_(MSG_CANT_OPEN_STREAM));
864 }//END if ((error = StopChunk(handle, ID_PREF, ID_WANDR)) == 0)
866 Close((BPTR
)handle
->iff_Stream
);
874 ///WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject()
875 IPTR WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject
877 Class
*CLASS
, Object
*self
, struct MUIP_WandererPrefs_ViewSettings_GetNotifyObject
*message
881 struct WandererPrefs_ViewSettingsNode
*current_Node
= NULL
;
883 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject()\n"));
885 if ((current_Node
= WandererPrefs_FindViewSettingsNode(data
, message
->Background_Name
)))
887 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject: Returning Object for existing record\n"));
888 return (IPTR
) current_Node
->wpbn_NotifyObject
;
891 current_Node
= AllocMem(sizeof(struct WandererPrefs_ViewSettingsNode
), MEMF_CLEAR
|MEMF_PUBLIC
);
892 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject: Created new node ..\n"));
894 current_Node
->wpbn_Name
= AllocVec(strlen(message
->Background_Name
) + 1, MEMF_CLEAR
|MEMF_PUBLIC
);
895 strcpy(current_Node
->wpbn_Name
, message
->Background_Name
);
897 current_Node
->wpbn_NotifyObject
= (Object
*)NotifyObject
, End
;
899 current_Node
->wpbn_NotifyObject
= MUI_NewObject(MUIC_Notify
, TAG_DONE
);
901 AddTail(&data
->wpd_ViewSettings
, ¤t_Node
->wpbn_Node
);
903 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject: Notify Object @ 0x%p\n", current_Node
->wpbn_NotifyObject
));
905 return (IPTR
) current_Node
->wpbn_NotifyObject
;
910 #warning "TODO: Replace with propper 64bit check"
911 /* 32bit replacements for utility.library tag funcs */
912 struct TagItem32
* NextTag32Item(struct TagItem32
** tagListPtr
)
914 if(!(*tagListPtr
)) return NULL
;
918 switch ((*tagListPtr
)->ti_Tag
)
924 (*tagListPtr
) = NULL
;
928 (*tagListPtr
) += (*tagListPtr
)->ti_Data
+ 1;
932 /* Use post-increment (return will return the current value and
933 then tagListPtr will be incremented) */
934 return (struct TagItem32
*)(*tagListPtr
)++;
943 struct TagItem32
* FindTag32Item(ULONG tagValue
, struct TagItem32
*tagList
)
945 struct TagItem32
*tag
;
946 const struct TagItem32
*tagptr
= tagList
;
948 while ((tag
= NextTag32Item((struct TagItem32
**)&tagptr
)))
950 if (tag
->ti_Tag
== tagValue
) return tag
;
959 ULONG
GetTag32Data(ULONG tagValue
, ULONG defaultVal
, struct TagItem32
*tagList
)
961 struct TagItem32
*ti
= NULL
;
963 if ((tagList
!= NULL
) && (ti
= FindTag32Item(tagValue
, tagList
)))
970 ///WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute()
971 IPTR WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute
973 Class
*CLASS
, Object
*self
, struct MUIP_WandererPrefs_ViewSettings_GetAttribute
*message
977 struct WandererPrefs_ViewSettingsNode
*current_Node
= NULL
;
979 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute()\n"));
981 if ((current_Node
= WandererPrefs_FindViewSettingsNode(data
, message
->Background_Name
)) != NULL
)
983 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute: Found Background Record ..\n"));
984 if (message
->AttributeID
== MUIA_Background
)
986 if (current_Node
->wpbn_Background
) return current_Node
->wpbn_Background
;
988 else if (current_Node
->wpbn_Options
)
990 if (sizeof(IPTR
) > 4)
992 ULONG retVal
= GetTag32Data(message
->AttributeID
, (ULONG
)-1,(struct TagItem32
*) current_Node
->wpbn_Options
);
994 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute: Using internal GetTag32Data()\n"));
996 if (retVal
!= (ULONG
)-1)
1001 D(bug("[WANDERER.PREFS] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute: Using utility.library->GetTagData()\n"));
1002 return (IPTR
)GetTagData(message
->AttributeID
, (IPTR
)-1, (struct TagItem
*) current_Node
->wpbn_Options
);
1009 /*** Setup ******************************************************************/
1012 WandererPrefs
, NULL
, MUIC_Notify
, NULL
,
1013 OM_NEW
, struct opSet
*,
1015 OM_SET
, struct opSet
*,
1016 OM_GET
, struct opGet
*,
1017 MUIM_WandererPrefs_Reload
, Msg
,
1018 MUIM_WandererPrefs_ViewSettings_GetNotifyObject
, struct MUIP_WandererPrefs_ViewSettings_GetNotifyObject
*,
1019 MUIM_WandererPrefs_ViewSettings_GetAttribute
, struct MUIP_WandererPrefs_ViewSettings_GetAttribute
*