WIP: extend file notification support, toolbar and statusbar now load their prefs...
[AROS.git] / workbench / system / Wanderer / wandererprefs.c
blob65995467c869e5343e3d0c95eed14b3f85f5e24e
1 /*
2 Copyright 2004-2009, The AROS Development Team. All rights reserved.
3 $Id$
4 */
5 #include "portable_macros.h"
6 #ifdef __AROS__
7 #define DEBUG 0
8 #include <aros/debug.h>
10 #define MUIMASTER_YES_INLINE_STDARG
11 #endif
13 #define IFF_CHUNK_BUFFER_SIZE 1024
15 #include <exec/types.h>
16 #include <libraries/mui.h>
18 #ifdef __AROS__
19 #include <zune/customclasses.h>
20 #else
21 #include <zune_AROS/customclasses.h>
22 #endif
24 #include <proto/workbench.h>
26 #include <proto/utility.h>
28 #include <proto/dos.h>
30 #ifdef __AROS__
31 #include <proto/alib.h>
32 #endif
34 #include <proto/iffparse.h>
36 #ifdef __AROS__
37 #include <proto/aros.h>
38 #endif
40 #include <aros/arosbase.h>
41 #include <aros/inquire.h>
43 #include <string.h>
44 #include <stdio.h>
47 #if defined(__AMIGA__) && !defined(__PPC__)
48 #define NO_INLINE_STDARG
49 #endif
50 #ifndef _PROTO_INTUITION_H
51 #include <proto/intuition.h>
52 #endif
54 #include <proto/muimaster.h>
56 #include "wanderer.h"
57 #include "wandererprefs.h"
58 #include "Classes/iconlist_attributes.h"
59 #include "iconwindow_attributes.h"
60 #include "support.h"
61 #include "locale.h"
62 #include "version.h"
64 #ifdef __AROS__
65 #include <prefs/prefhdr.h>
66 #include <prefs/wanderer.h>
67 #else
68 #include <prefs_AROS/prefhdr.h>
69 #include <prefs_AROS/wanderer.h>
70 #endif
73 #ifndef __AROS__
74 #define DEBUG 1
76 #ifdef DEBUG
77 #define D(x) if (DEBUG) x
78 #ifdef __amigaos4__
79 #define bug DebugPrintF
80 #else
81 #define bug kprintf
82 #endif
83 #else
84 #define D(...)
85 #endif
86 #endif
88 #warning "TODO: Toolbars Attributes etc should be in an own file"
89 /*** Identifier Base ********************************************************/
90 #define MUIB_IconWindowExt_Toolbar (MUIB_IconWindowExt | 0x200000)
92 #define MUIA_IconWindowExt_Toolbar_NavigationMethod (MUIB_IconWindowExt_Toolbar | 0x00000002) /* ISG */
94 static CONST_STRPTR wandererPrefs_PrefsFile = "ENV:SYS/Wanderer/global.prefs";
95 static Object *wandererPrefs_PrefsObject;
96 struct Wanderer_FSHandler *wandererPrefs_PrefsNotifyHandler = NULL;
98 struct TagItem32 {
99 ULONG ti_Tag;
100 ULONG ti_Data;
103 /*** Instance Data **********************************************************/
104 struct WandererPrefs_DATA
106 ULONG wpd_NavigationMethod;
107 ULONG wpd_ToolbarEnabled;
108 ULONG wpd_ShowNetwork;
109 ULONG wpd_ShowUserFiles;
110 ULONG wpd_ScreenTitleString[IFF_CHUNK_BUFFER_SIZE];
112 struct List wpd_ViewSettings;
114 struct NotifyRequest wpd_PrefsNotifyRequest;
116 BOOL wpd_PROCESSING;
119 struct WandererPrefs_ViewSettingsNode
121 struct Node wpbn_Node;
122 char *wpbn_Name;
123 IPTR wpbn_Background;
124 struct TagItem32 *wpbn_Options;
125 Object *wpbn_NotifyObject;
128 /*** Macros *****************************************************************/
129 #define SETUP_INST_DATA struct WandererPrefs_DATA *data = INST_DATA(CLASS, self)
131 /*** Utility Functions ******************************************************/
132 ///SetString()
133 BOOL SetString(STRPTR *dst, STRPTR src)
135 if (src != NULL)
137 if ((*dst == NULL) || (strcmp(src, *dst) != 0))
139 STRPTR tmp =(STRPTR) StrDup(src);
141 if (tmp != NULL)
143 FreeVec(*dst);
144 *dst = tmp;
146 return TRUE;
151 return FALSE;
155 ///strtochar()
156 static unsigned char strtochar(STRPTR st)
158 return *st++;
161 /******** code from workbench/c/Info.c **************************************/
162 ///fmtlarge()
163 static void fmtlarge(UBYTE *buf, ULONG num)
165 UQUAD d;
166 UBYTE ch;
167 struct
169 IPTR val;
170 IPTR dec;
171 } array =
173 num,
177 if (num >= 1073741824)
179 //Gigabytes
180 array.val = num >> 30;
181 d = ((UQUAD)num * 10 + 536870912) / 1073741824;
182 array.dec = d % 10;
183 ch = strtochar((STRPTR)_(MSG_MEM_G));
185 else if (num >= 1048576)
187 //Megabytes
188 array.val = num >> 20;
189 d = ((UQUAD)num * 10 + 524288) / 1048576;
190 array.dec = d % 10;
191 ch = strtochar((STRPTR)_(MSG_MEM_M));
193 else if (num >= 1024)
195 //Kilobytes
196 array.val = num >> 10;
197 d = (num * 10 + 512) / 1024;
198 array.dec = d % 10;
199 ch = strtochar((STRPTR)_(MSG_MEM_K));
201 else
203 //Bytes
204 array.val = num;
205 array.dec = 0;
206 d = 0;
207 ch = strtochar((STRPTR)_(MSG_MEM_B));
210 if (!array.dec && (d > array.val * 10))
212 array.val++;
215 RawDoFmt(array.dec ? "%lu.%lu" : "%lu", &array, NULL, buf);
217 while (*buf)
219 buf++;
222 *buf++ = ch;
223 *buf = '\0';
227 ///findname()
228 /* Case-insensitive FindName()
229 * code from workbench/c/Version.c
231 static
232 struct Node *findname(struct List *list, CONST_STRPTR name)
234 struct Node *node;
235 #ifdef __AROS__
236 ForeachNode(list, node)
237 #else
238 Foreach_Node(list, node);
239 #endif
241 if (!Stricmp(node->ln_Name, (STRPTR) name))
243 return node;
247 return NULL;
251 ///ProcessUserScreenTitle()
252 /*pattern matching of user screentitle...;*/
253 STRPTR ProcessUserScreenTitle(STRPTR screentitle_Template)
255 /* Work in progress :-) */
256 int screentitle_TemplateLen;
257 STATIC char title[256];
258 char temp[256], buffer[256];
259 char infostr[10];
260 int screentitle_curChar;
262 if (screentitle_Template == NULL)
264 D(bug("[Wanderer:Prefs] ProcessUserScreenTitle(),EXTERN screentitle = NULL\n"));
265 return screentitle_Template;
267 else
269 D(bug("[Wanderer:Prefs] ProcessUserScreenTitle('%s')\n", screentitle_Template));
272 screentitle_TemplateLen = strlen(screentitle_Template);
274 if (screentitle_TemplateLen < 1)
276 D(bug("[Wanderer:Prefs] ProcessUserScreenTitle: EXTERN screentitle_TemplateLen = %d\n", screentitle_TemplateLen));
277 return (STRPTR) screentitle_TemplateLen;
280 strcpy(temp, screentitle_Template);
282 for (screentitle_curChar = 0; screentitle_curChar < screentitle_TemplateLen; screentitle_curChar++)
284 if (temp[screentitle_curChar]=='%')
286 if (screentitle_TemplateLen >= 3)
288 BOOL found = FALSE;
290 if (strncmp(temp + screentitle_curChar, "%wv", 3) == 0)
292 struct Library *MyLibrary = NULL;
294 #ifdef __AROS__
295 MyLibrary = (struct Library *)findname(&SysBase->LibList, "workbench.library");
296 //workbench.library is just opened, what is the sense of this istruction?
297 #else
298 MyLibrary = WorkbenchBase;
299 #endif
301 sprintf(infostr, "%ld.%ld",(long int) MyLibrary->lib_Version,(long int) MyLibrary->lib_Revision);
302 found = TRUE;
305 if (strncmp(temp + screentitle_curChar, "%ov", 3) == 0)
307 struct Library *AROSBase = OpenLibrary(AROSLIBNAME, AROSLIBVERSION);
309 if (AROSBase!=NULL)
311 UWORD ver = 0;
312 //UWORD kickrev = 0;
314 ArosInquire
316 AI_ArosVersion, (IPTR)&ver,
317 TAG_DONE
319 sprintf(infostr, "%d", ver);
320 CloseLibrary(AROSBase);
321 found = TRUE;
325 if (strncmp(temp + screentitle_curChar, "%os", 3) == 0)
327 struct Library *AROSBase = OpenLibrary(AROSLIBNAME, AROSLIBVERSION);
329 if (AROSBase != NULL)
331 ULONG ver = 0,
332 rev = 0;
334 ArosInquire
336 AI_ArosReleaseMajor, (IPTR)&ver,
337 AI_ArosReleaseMinor, (IPTR)&rev,
338 TAG_DONE
340 sprintf(infostr, "%ld.%ld", ver, rev);
341 CloseLibrary(AROSBase);
342 found = TRUE;
346 if (strncmp(temp + screentitle_curChar, "%wb", 3) == 0)
348 struct Library *AROSBase = OpenLibrary(AROSLIBNAME, AROSLIBVERSION);
350 if (AROSBase != NULL)
352 ULONG ver = 0;
353 ULONG rev = 0;
355 ArosInquire
357 AI_ArosReleaseMajor, (IPTR)&ver,
358 AI_ArosReleaseMinor, (IPTR)&rev,
359 TAG_DONE
361 sprintf(infostr, "%d.%d", WANDERERVERS, WANDERERREV);
362 CloseLibrary(AROSBase);
363 found = TRUE;
367 if (strncmp(temp + screentitle_curChar, "%pc", 3) == 0)
369 fmtlarge(infostr, AvailMem(MEMF_CHIP));
370 found = TRUE;
373 if (strncmp(temp + screentitle_curChar, "%pf", 3) == 0)
375 fmtlarge(infostr, AvailMem(MEMF_FAST));
376 found = TRUE;
379 if (strncmp(temp + screentitle_curChar, "%pt", 3) == 0)
381 fmtlarge(infostr, AvailMem(MEMF_ANY));
382 found = TRUE;
385 if (strncmp(temp + screentitle_curChar, "%PC", 3) == 0)
387 fmtlarge(infostr, AvailMem(MEMF_CHIP|MEMF_TOTAL));
388 found = TRUE;
391 if (strncmp(temp + screentitle_curChar, "%PF", 3) == 0)
393 fmtlarge(infostr, AvailMem(MEMF_FAST|MEMF_TOTAL));
394 found = TRUE;
397 if (strncmp(temp + screentitle_curChar, "%PT", 3) == 0)
399 fmtlarge(infostr, AvailMem(MEMF_ANY|MEMF_TOTAL));
400 found = TRUE;
403 if (found)
405 temp[screentitle_curChar + 1] = 's';
406 temp[screentitle_curChar + 2] = ' ';
408 sprintf(title, temp, infostr);
410 screentitle_curChar = screentitle_curChar + strlen(infostr);
411 strncpy(buffer, title, screentitle_curChar);
412 strcpy(&buffer[screentitle_curChar], &temp[(screentitle_curChar + 3) - strlen(infostr)]);
413 strcpy(temp, buffer);
415 screentitle_TemplateLen = screentitle_TemplateLen + strlen(infostr);
417 else
419 temp[screentitle_curChar] = '?';
420 temp[screentitle_curChar + 1] = '?';
421 temp[screentitle_curChar + 2] = '?';
422 sprintf(title, temp);
425 else
427 switch (screentitle_TemplateLen)
429 case 2:
430 temp[screentitle_curChar]= '?';
431 temp[screentitle_curChar + 1]= '?';
432 break;
433 case 1:
434 temp[screentitle_curChar] = '?';
436 sprintf(title, temp);
440 sprintf(title, temp);
442 return title;
446 ///ExpandEnvName()
447 /* Expand a passed in env: string to its full location */
448 /* Wanderer doesnt free this mem at the moment but should
449 incase it is every closed */
450 static STRPTR ExpandEnvName(STRPTR env_path)
452 BOOL ok = FALSE;
453 char tmp_envbuff[1024];
454 STRPTR fullpath = NULL;
455 BPTR env_lock = (BPTR) NULL;
457 env_lock = Lock("ENV:", SHARED_LOCK);
458 if (env_lock)
460 if (NameFromLock(env_lock, tmp_envbuff, 256)) ok = TRUE;
461 UnLock(env_lock);
464 if (ok)
466 if ((fullpath = AllocVec(strlen(tmp_envbuff) + strlen(env_path) + 1 + 1 - 4, MEMF_CLEAR | MEMF_PUBLIC)) != NULL)
468 strcpy(fullpath, tmp_envbuff);
469 AddPart(fullpath, env_path + 4, 1019);
470 return fullpath;
474 //We couldnt expand it so just use as is ..
475 return env_path;
480 IPTR WandererPrefs__HandleFSUpdate()
482 DoMethod(wandererPrefs_PrefsObject, MUIM_WandererPrefs_Reload);
483 return NULL;
486 /*** Methods ****************************************************************/
488 ///OM_NEW()
489 Object *WandererPrefs__OM_NEW(Class *CLASS, Object *self, struct opSet *message)
491 IPTR _wandererPrefs__FSNotifyPort = 0;
492 struct List *_wandererPrefs__FSNotifyList = NULL;
493 D(bug("[Wanderer:Prefs]:New()\n"));
495 _wandererPrefs__FSNotifyPort = GetTagData(MUIA_Wanderer_FileSysNotifyPort, (IPTR) NULL, message->ops_AttrList);
496 _wandererPrefs__FSNotifyList = GetTagData(MUIA_Wanderer_FileSysNotifyList, (IPTR) NULL, message->ops_AttrList);
498 self = (Object *) DoSuperMethodA(CLASS, self, (Msg) message);
500 if (self != NULL)
502 SETUP_INST_DATA;
504 wandererPrefs_PrefsObject = self;
506 /* Setup notification on prefs file --------------------------------*/
507 if (_wandererPrefs__FSNotifyList && ((wandererPrefs_PrefsNotifyHandler = AllocMem(sizeof(struct Wanderer_FSHandler), MEMF_CLEAR)) != NULL))
509 wandererPrefs_PrefsNotifyHandler->fshn_Node.ln_Name = ExpandEnvName(wandererPrefs_PrefsFile);
510 data->wpd_PrefsNotifyRequest.nr_Name = wandererPrefs_PrefsNotifyHandler->fshn_Node.ln_Name;
511 data->wpd_PrefsNotifyRequest.nr_Flags = NRF_SEND_MESSAGE;
512 data->wpd_PrefsNotifyRequest.nr_stuff.nr_Msg.nr_Port = _wandererPrefs__FSNotifyPort;
513 wandererPrefs_PrefsNotifyHandler->HandleFSUpdate = WandererPrefs__HandleFSUpdate;
515 if (StartNotify(&data->wpd_PrefsNotifyRequest))
517 D(bug("[Wanderer:Prefs] Wanderer__OM_NEW: Prefs-notification setup on '%s'\n", data->wpd_PrefsNotifyRequest.nr_Name));
519 else
521 D(bug("[Wanderer:Prefs] Wanderer__OM_NEW: FAILED to setup Prefs-notification!\n"));
523 AddTail(_wandererPrefs__FSNotifyList, &wandererPrefs_PrefsNotifyHandler->fshn_Node);
525 D(bug("[Wanderer:Prefs]:New - reloading\n"));
527 NewList(&data->wpd_ViewSettings);
529 data->wpd_PROCESSING = FALSE;
531 DoMethod(self, MUIM_WandererPrefs_Reload);
533 D(bug("[Wanderer:Prefs] obj = %ld\n", self));
534 return self;
538 ///OM_DISPOSE()
539 IPTR WandererPrefs__OM_DISPOSE(Class *CLASS, Object *self, Msg message)
541 SETUP_INST_DATA;
542 EndNotify(&data->wpd_PrefsNotifyRequest);
543 return DoSuperMethodA(CLASS, self, (Msg)message);
547 ///OM_SET()
548 IPTR WandererPrefs__OM_SET(Class *CLASS, Object *self, struct opSet *message)
550 SETUP_INST_DATA;
551 const struct TagItem *tstate = message->ops_AttrList;
552 struct TagItem *tag;
554 while ((tag = NextTagItem((TAGITEM)&tstate)) != NULL)
556 switch (tag->ti_Tag)
558 case MUIA_WandererPrefs_Processing:
559 data->wpd_PROCESSING = (BOOL)tag->ti_Data;
560 break;
561 case MUIA_IconWindowExt_NetworkBrowser_Show:
562 data->wpd_ShowNetwork = (LONG)tag->ti_Data;
563 break;
565 case MUIA_IconWindowExt_UserFiles_ShowFilesFolder:
566 data->wpd_ShowUserFiles = (LONG)tag->ti_Data;
567 break;
569 case MUIA_IconWindowExt_ScreenTitle_String:
570 strcpy((STRPTR)data->wpd_ScreenTitleString, (STRPTR)tag->ti_Data);
571 //data->wpd_ScreenTitleString = (LONG)tag->ti_Data;
572 break;
574 case MUIA_IconWindowExt_Toolbar_NavigationMethod:
575 data->wpd_NavigationMethod = (LONG)tag->ti_Data;
576 break;
580 return DoSuperMethodA(CLASS, self, (Msg)message);
584 ///OM_GET()
585 IPTR WandererPrefs__OM_GET(Class *CLASS, Object *self, struct opGet *message)
587 SETUP_INST_DATA;
588 IPTR *store = message->opg_Storage;
589 IPTR rv = TRUE;
591 switch (message->opg_AttrID)
593 case MUIA_WandererPrefs_Processing:
594 *store = (IPTR)data->wpd_PROCESSING;
595 break;
597 case MUIA_IconWindowExt_NetworkBrowser_Show:
598 *store = (IPTR)data->wpd_ShowNetwork;
599 break;
601 case MUIA_IconWindowExt_UserFiles_ShowFilesFolder:
602 *store = (IPTR)data->wpd_ShowUserFiles;
603 break;
605 case MUIA_IconWindowExt_ScreenTitle_String:
606 *store = (IPTR)data->wpd_ScreenTitleString;
607 D(bug("[Wanderer:Prefs] WandererPrefs__GET: MUIA_IconWindowExt_ScreenTitle_String '%s'\n", data->wpd_ScreenTitleString));
608 break;
610 case MUIA_IconWindowExt_Toolbar_NavigationMethod:
611 *store = (IPTR)data->wpd_NavigationMethod;
612 break;
614 default:
615 rv = DoSuperMethodA(CLASS, self, (Msg)message);
618 return rv;
622 ///ProcessGlobalChunk()
623 BOOL WandererPrefs_ProccessGlobalChunk(Class *CLASS, Object *self, struct TagItem32 *global_chunk, IPTR chunk_size)
625 //SETUP_INST_DATA;
627 int i = 0, tag_count = (chunk_size / sizeof(struct TagItem32));
628 BOOL cont = TRUE;
630 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessGlobalChunk()\n"));
631 #warning "TODO: fix problems with endian-ness?"
633 for (i = 0; i < tag_count; i++)
635 if (cont)
637 /* prefs file is stored in little endian */
638 if (AROS_LE2LONG(global_chunk[i].ti_Tag) == TAG_DONE)
640 cont = FALSE;
642 else if (AROS_LE2LONG(global_chunk[i].ti_Tag) == MUIA_WandererPrefs_DefaultStack)
644 #warning "TODO: We should have an option to set the DefaultStackSize in wanderers prefs, and push it onto workbench.library"
645 struct TagItem wbca_Tags[] =
647 { WBCTRLA_SetDefaultStackSize, (IPTR)AROS_LE2LONG(global_chunk[i].ti_Data) },
648 { TAG_DONE, 0 }
650 #warning "TODO: What should we use for the name arg in WorkbenchControlA"
651 WorkbenchControlA("", wbca_Tags);
653 else
655 SET(self, AROS_LE2LONG(global_chunk[i].ti_Tag), AROS_LE2LONG(global_chunk[i].ti_Data));
660 return TRUE;
664 ///WPEditor_ProccessNetworkChunk()
665 BOOL WPEditor_ProccessNetworkChunk(Class *CLASS, Object *self, UBYTE *_viewSettings_Chunk)
667 //SETUP_INST_DATA;
669 struct TagItem *network_tags = (struct TagItem *)_viewSettings_Chunk;
670 SET(self, AROS_LE2LONG(network_tags[0].ti_Tag), AROS_LE2LONG(network_tags[0].ti_Data));
672 return TRUE;
676 ///WPEditor_ProccessScreenTitleChunk()
677 BOOL WPEditor_ProccessScreenTitleChunk(Class *CLASS, Object *self, UBYTE *_ScreenTitle_Chunk)
679 //SETUP_INST_DATA;
680 char *displayed_screentitle = _ScreenTitle_Chunk;
681 char *userscreentitle = NULL;
683 D(bug("[Wanderer:Prefs] WandererPrefs__ProccessScreenTitleChunk@@@@@@@@@: ScreenTitle Template = '%s'\n", _ScreenTitle_Chunk));
685 if ((userscreentitle = ProcessUserScreenTitle(_ScreenTitle_Chunk)) != NULL)
687 D(bug("[Wanderer:Prefs] WandererPrefs__ProccessScreenTitleChunk@@@@@@@@@: ProcessUserScreenTitle returns '%s'\n", userscreentitle));
688 displayed_screentitle = userscreentitle;
691 SET(self, MUIA_IconWindowExt_ScreenTitle_String, displayed_screentitle);
692 D(bug("[Wanderer:Prefs] WandererPrefs__ProccessScreenTitleChunk@@@@@@@@@: SCREENTITLE set\n"));
694 return TRUE;
698 ///WandererPrefs_FindViewSettingsNode()
699 struct WandererPrefs_ViewSettingsNode *WandererPrefs_FindViewSettingsNode(struct WandererPrefs_DATA *data, char *node_Name)
701 struct WandererPrefs_ViewSettingsNode *current_Node = NULL;
703 #ifdef __AROS__
704 ForeachNode(&data->wpd_ViewSettings, current_Node)
705 #else
706 Foreach_Node(&data->wpd_ViewSettings, current_Node);
707 #endif
709 if ((strcmp(current_Node->wpbn_Name, node_Name)) == 0) return current_Node;
711 return NULL;
715 ///WandererPrefs_ProccessViewSettingsChunk()
716 BOOL WandererPrefs_ProccessViewSettingsChunk(Class *CLASS, Object *self, char *_viewSettings_ViewName, UBYTE *_viewSettings_Chunk, IPTR chunk_size)
718 SETUP_INST_DATA;
720 struct WandererPrefs_ViewSettingsNode *_viewSettings_Node = NULL;
722 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessViewSettingsChunk()\n"));
724 _viewSettings_Node = WandererPrefs_FindViewSettingsNode(data, _viewSettings_ViewName);
726 if (_viewSettings_Node)
728 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessViewSettingsChunk: Updating Existing node @ 0x%p\n", _viewSettings_Node));
729 if (_viewSettings_Node->wpbn_Background)
730 FreeVec((APTR)_viewSettings_Node->wpbn_Background);
731 #warning "TODO: Free any Cached backgrounds here .."
733 else
735 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessViewSettingsChunk: Creating new node for '%s'\n", _viewSettings_ViewName));
736 _viewSettings_Node = AllocMem(sizeof(struct WandererPrefs_ViewSettingsNode), MEMF_CLEAR|MEMF_PUBLIC);
738 _viewSettings_Node->wpbn_Name = AllocVec(strlen(_viewSettings_ViewName) + 1, MEMF_CLEAR|MEMF_PUBLIC);
739 strcpy(_viewSettings_Node->wpbn_Name, _viewSettings_ViewName);
740 #ifdef __AROS__
741 _viewSettings_Node->wpbn_NotifyObject = (Object *)NotifyObject, End;
742 #else
743 _viewSettings_Node->wpbn_NotifyObject = MUI_NewObject(MUIC_Notify, TAG_DONE);
744 #endif
746 AddTail(&data->wpd_ViewSettings, &_viewSettings_Node->wpbn_Node);
749 _viewSettings_Node->wpbn_Background =(IPTR) AllocVec(strlen(_viewSettings_Chunk) + 1, MEMF_CLEAR|MEMF_PUBLIC);
750 strcpy((char *)_viewSettings_Node->wpbn_Background, _viewSettings_Chunk);
751 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessViewSettingsChunk: NAME BACKGROUND= %s\n",_viewSettings_Chunk));
752 SET(_viewSettings_Node->wpbn_NotifyObject, MUIA_Background, _viewSettings_Chunk);
754 #warning "TODO: Cache backgrounds here .."
756 if (chunk_size > (strlen(_viewSettings_Chunk) + 1))
758 UBYTE _viewSettings_TagOffset = ((strlen(_viewSettings_Chunk) + 1)/4);
759 IPTR _viewSettings_TagCount;
761 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessViewSettingsChunk: Chunk has options Tag data ..\n"));
763 if ((_viewSettings_TagOffset * 4) != (strlen(_viewSettings_Chunk) + 1))
765 _viewSettings_TagOffset = (_viewSettings_TagOffset + 1) * 4;
766 D(bug("[WPEditor] WPEditor_ProccessBackgroundChunk: String length unalined - rounding up (length %d, rounded %d) \n", strlen(_viewSettings_Chunk) + 1, _viewSettings_TagOffset ));
768 else
770 _viewSettings_TagOffset = _viewSettings_TagOffset * 4;
771 D(bug("[WPEditor] WPEditor_ProccessBackgroundChunk: String length doesnt need aligned (length %d) \n", strlen(_viewSettings_Chunk) + 1));
774 _viewSettings_TagCount = ((chunk_size - _viewSettings_TagOffset)/sizeof(struct TagItem32));
776 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessViewSettingsChunk: %d Tags at offset %d ..\n", _viewSettings_TagCount, _viewSettings_TagOffset));
778 if (_viewSettings_Node->wpbn_Options != NULL)
780 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessViewSettingsChunk: Freeing old background tag's @ 0x%p\n", _viewSettings_Node->wpbn_Options));
781 FreeVec(_viewSettings_Node->wpbn_Options);
782 _viewSettings_Node->wpbn_Options = NULL;
785 _viewSettings_Node->wpbn_Options = AllocVec((_viewSettings_TagCount + 1) * sizeof(struct TagItem32), MEMF_CLEAR|MEMF_PUBLIC);
786 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessViewSettingsChunk: New tag storage @ 0x%p\n", _viewSettings_Node->wpbn_Options));
788 CopyMem(_viewSettings_Chunk + _viewSettings_TagOffset, _viewSettings_Node->wpbn_Options, (_viewSettings_TagCount) * sizeof(struct TagItem32));
789 D(bug("[Wanderer:Prefs] WandererPrefs_ProccessViewSettingsChunk: Tags copied to storage \n"));
791 _viewSettings_Node->wpbn_Options[_viewSettings_TagCount].ti_Tag = TAG_DONE;
794 int i = 0;
795 for (i = 0; i < _viewSettings_TagCount; i++)
797 #if AROS_BIG_ENDIAN
798 _viewSettings_Node->wpbn_Options[i].ti_Tag = AROS_LE2LONG(_viewSettings_Node->wpbn_Options[i].ti_Tag);
799 _viewSettings_Node->wpbn_Options[i].ti_Data = AROS_LE2LONG(_viewSettings_Node->wpbn_Options[i].ti_Data);
800 #endif
801 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));
802 SET(_viewSettings_Node->wpbn_NotifyObject, _viewSettings_Node->wpbn_Options[i].ti_Tag, _viewSettings_Node->wpbn_Options[i].ti_Data);
806 return TRUE;
810 ///WandererPrefs__MUIM_WandererPrefs_Reload()
811 IPTR WandererPrefs__MUIM_WandererPrefs_Reload
813 Class *CLASS, Object *self, Msg message
816 struct ContextNode *context;
817 struct IFFHandle *handle;
818 BOOL success = TRUE;
819 LONG error;
820 IPTR iff_parse_mode = IFFPARSE_SCAN;
821 UBYTE chunk_buffer[IFF_CHUNK_BUFFER_SIZE];
823 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload()\n"));
825 if (!(handle = AllocIFF()))
826 return FALSE;
828 handle->iff_Stream = (IPTR)Open(wandererPrefs_PrefsFile, MODE_OLDFILE);
830 if (!handle->iff_Stream)
831 return FALSE;
833 InitIFFasDOS(handle);
835 if ((error = OpenIFF(handle, IFFF_READ)) == 0)
837 if ((error = StopChunk(handle, ID_PREF, ID_WANDR)) == 0)
839 SET(self, MUIA_WandererPrefs_Processing, TRUE);
842 if ((error = ParseIFF(handle, iff_parse_mode)) == 0)
844 context = CurrentChunk(handle);
845 iff_parse_mode = IFFPARSE_STEP;
847 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload: Context 0x%p\n", context));
849 if ((error=ReadChunkBytes(handle, chunk_buffer, IFF_CHUNK_BUFFER_SIZE)))
851 struct WandererPrefsIFFChunkHeader *this_header =(struct WandererPrefsIFFChunkHeader *) chunk_buffer;
852 char *this_chunk_name = NULL;
853 IPTR this_chunk_size = AROS_LE2LONG(this_header->wpIFFch_ChunkSize);
855 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload: ReadChunkBytes() Chunk matches Prefs Header size ..\n"));
857 if ((this_chunk_name = AllocVec(strlen(this_header->wpIFFch_ChunkType) +1,MEMF_ANY|MEMF_CLEAR)))
859 strcpy(this_chunk_name, this_header->wpIFFch_ChunkType);
860 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload: Prefs Header for '%s' data size %d bytes\n", this_chunk_name, this_chunk_size));
862 if ((error = ParseIFF(handle, IFFPARSE_STEP)) == IFFERR_EOC)
864 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload: End of header chunk ..\n"));
866 if ((error = ParseIFF(handle, IFFPARSE_STEP)) == 0)
868 context = CurrentChunk(handle);
870 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload: Context 0x%p\n", context));
872 error = ReadChunkBytes
874 handle,
875 chunk_buffer,
876 this_chunk_size
879 if (error == this_chunk_size)
881 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload: ReadChunkBytes() Chunk matches Prefs Data size .. (%d)\n", error));
882 if ((strcmp(this_chunk_name, "wanderer:global")) == 0)
884 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload: Process data for wanderer global chunk ..\n"));
885 WandererPrefs_ProccessGlobalChunk(CLASS, self,(struct TagItem32 *) chunk_buffer, this_chunk_size);
887 else if ((strcmp(this_chunk_name, "wanderer:network")) == 0)
889 D(bug("[WPEditor] WPEditor__MUIM_PrefsEditor_ImportFH: Process data for wanderer network config chunk ..\n"));
890 WPEditor_ProccessNetworkChunk(CLASS, self, chunk_buffer);
892 else if ((strcmp(this_chunk_name, "wanderer:screentitle")) == 0)
894 D(bug("[WPEditor] WPEditor__MUIM_PrefsEditor_ImportFH: Process data for wanderer screentitle config chunk ..size=%d\n", error));
895 D(bug("[WPEditor] WPEditor__MUIM_PrefsEditor_ImportFH: Process data for wanderer screentitle STRING= %s\n", chunk_buffer));
896 WPEditor_ProccessScreenTitleChunk(CLASS, self, chunk_buffer);
899 else if ((strncmp(this_chunk_name, "wanderer:viewsettings", strlen("wanderer:viewsettings"))) == 0)
901 char *view_name = this_chunk_name + strlen("wanderer:viewsettings") + 1;
902 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload: Process data for wanderer background chunk '%s'..\n", view_name));
903 WandererPrefs_ProccessViewSettingsChunk(CLASS, self, view_name, chunk_buffer, this_chunk_size);
905 }//END if (error == this_chunk_size)
906 if ((error = ParseIFF(handle, IFFPARSE_STEP)) == IFFERR_EOC)
908 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_Reload: TAG_DONE) of Data chunk ..\n"));
910 }//END if ((error = ParseIFF(handle, IFFPARSE_STEP)) == 0)
911 }//END if ((error = ParseIFF(handle, IFFPARSE_STEP)) == IFFERR_EOC)
912 }//END if ((this_chunk_name = AllocVec(strlen(this_header->wpIFFch_ChunkType) +1,MEMF_ANY|MEMF_CLEAR)))
913 }//END if ((error=ReadChunkBytes(handle, chunk_buffer, IFF_CHUNK_BUFFER_SIZE)))
915 else
917 D(bug("[Wanderer:Prefs] ParseIFF() failed, returncode %ld!\n", error));
918 //success = FALSE;
919 }//END if ((error = ParseIFF(handle, iff_parse_mode)) == 0)
921 } while (error != IFFERR_EOF);
922 SET(self, MUIA_WandererPrefs_Processing, FALSE);
924 else
926 D(bug("[Wanderer:Prefs] StopChunk() failed, returncode %ld!\n", error));
927 //success = FALSE;
930 CloseIFF(handle);
932 else
934 D(bug("[Wanderer:Prefs] Failed to open stream!, returncode %ld!\n", error));
935 //ShowError(_(MSG_CANT_OPEN_STREAM));
936 success = FALSE;
937 }//END if ((error = StopChunk(handle, ID_PREF, ID_WANDR)) == 0)
939 Close((BPTR)handle->iff_Stream);
941 FreeIFF(handle);
943 return success;
947 ///WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject()
948 IPTR WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject
950 Class *CLASS, Object *self, struct MUIP_WandererPrefs_ViewSettings_GetNotifyObject *message
953 SETUP_INST_DATA;
954 struct WandererPrefs_ViewSettingsNode *current_Node = NULL;
956 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject()\n"));
958 if ((current_Node = WandererPrefs_FindViewSettingsNode(data, message->Background_Name)))
960 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject: Returning Object for existing record\n"));
961 return (IPTR) current_Node->wpbn_NotifyObject;
964 current_Node = AllocMem(sizeof(struct WandererPrefs_ViewSettingsNode), MEMF_CLEAR|MEMF_PUBLIC);
965 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject: Created new node ..\n"));
967 current_Node->wpbn_Name = AllocVec(strlen(message->Background_Name) + 1, MEMF_CLEAR|MEMF_PUBLIC);
968 strcpy(current_Node->wpbn_Name, message->Background_Name);
969 #ifdef __AROS__
970 current_Node->wpbn_NotifyObject = (Object *)NotifyObject, End;
971 #else
972 current_Node->wpbn_NotifyObject = MUI_NewObject(MUIC_Notify, TAG_DONE);
973 #endif
974 AddTail(&data->wpd_ViewSettings, &current_Node->wpbn_Node);
976 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetNotifyObject: Notify Object @ 0x%p\n", current_Node->wpbn_NotifyObject));
978 return (IPTR) current_Node->wpbn_NotifyObject;
982 ///NextTag32Item()
983 #warning "TODO: Replace with propper 64bit check"
984 /* 32bit replacements for utility.library tag funcs */
985 struct TagItem32 * NextTag32Item(struct TagItem32 ** tagListPtr)
987 if(!(*tagListPtr)) return NULL;
989 while (TRUE)
991 switch ((*tagListPtr)->ti_Tag)
993 case TAG_IGNORE:
994 break;
996 case TAG_END:
997 (*tagListPtr) = NULL;
998 return NULL;
1000 case TAG_SKIP:
1001 (*tagListPtr) += (*tagListPtr)->ti_Data + 1;
1002 continue;
1004 default:
1005 /* Use post-increment (return will return the current value and
1006 then tagListPtr will be incremented) */
1007 return (struct TagItem32 *)(*tagListPtr)++;
1010 (*tagListPtr) ++;
1015 ///FindTag32Item()
1016 struct TagItem32 * FindTag32Item(ULONG tagValue, struct TagItem32 *tagList)
1018 struct TagItem32 *tag;
1019 const struct TagItem32 *tagptr = tagList;
1021 while ((tag = NextTag32Item((struct TagItem32 **)&tagptr)))
1023 if (tag->ti_Tag == tagValue) return tag;
1026 return NULL;
1031 ///GetTag32Data()
1032 ULONG GetTag32Data(ULONG tagValue, ULONG defaultVal, struct TagItem32 *tagList)
1034 struct TagItem32 *ti = NULL;
1036 if ((tagList != NULL) && (ti = FindTag32Item(tagValue, tagList)))
1037 return ti->ti_Data;
1039 return defaultVal;
1043 ///WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute()
1044 IPTR WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute
1046 Class *CLASS, Object *self, struct MUIP_WandererPrefs_ViewSettings_GetAttribute *message
1049 SETUP_INST_DATA;
1050 struct WandererPrefs_ViewSettingsNode *current_Node = NULL;
1052 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute()\n"));
1054 if ((current_Node = WandererPrefs_FindViewSettingsNode(data, message->Background_Name)) != NULL)
1056 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute: Found Background Record ..\n"));
1057 if (message->AttributeID == MUIA_Background)
1059 if (current_Node->wpbn_Background) return current_Node->wpbn_Background;
1061 else if (current_Node->wpbn_Options)
1063 if (sizeof(IPTR) > 4)
1065 ULONG retVal = GetTag32Data(message->AttributeID, (ULONG)-1,(struct TagItem32 *) current_Node->wpbn_Options);
1067 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute: Using internal GetTag32Data()\n"));
1069 if (retVal != (ULONG)-1)
1070 return (IPTR)retVal;
1072 else
1074 D(bug("[Wanderer:Prefs] WandererPrefs__MUIM_WandererPrefs_ViewSettings_GetAttribute: Using utility.library->GetTagData()\n"));
1075 return (IPTR)GetTagData(message->AttributeID, (IPTR)-1, (struct TagItem *) current_Node->wpbn_Options);
1079 return (IPTR)-1;
1082 /*** Setup ******************************************************************/
1083 ZUNE_CUSTOMCLASS_7
1085 WandererPrefs, NULL, MUIC_Notify, NULL,
1086 OM_NEW, struct opSet *,
1087 OM_DISPOSE, Msg,
1088 OM_SET, struct opSet *,
1089 OM_GET, struct opGet *,
1090 MUIM_WandererPrefs_Reload, Msg,
1091 MUIM_WandererPrefs_ViewSettings_GetNotifyObject, struct MUIP_WandererPrefs_ViewSettings_GetNotifyObject *,
1092 MUIM_WandererPrefs_ViewSettings_GetAttribute, struct MUIP_WandererPrefs_ViewSettings_GetAttribute *