From 628b62efb1810e03ddbdde11db419a8906f73ce3 Mon Sep 17 00:00:00 2001 From: NicJA Date: Wed, 18 Mar 2009 01:09:04 +0000 Subject: [PATCH] Duplicate FIB in iconlistso that its data is valid when re-used. Cleanup icondirlist source git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@30951 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- workbench/system/Wanderer/Classes/icondrawerlist.c | 311 +++++++++++---------- workbench/system/Wanderer/Classes/iconlist.c | 71 ++--- 2 files changed, 193 insertions(+), 189 deletions(-) diff --git a/workbench/system/Wanderer/Classes/icondrawerlist.c b/workbench/system/Wanderer/Classes/icondrawerlist.c index b1cae4281b..ff29fc8956 100644 --- a/workbench/system/Wanderer/Classes/icondrawerlist.c +++ b/workbench/system/Wanderer/Classes/icondrawerlist.c @@ -117,123 +117,123 @@ Read icons in **************************************************************************/ static int IconDrawerList__ParseContents(struct IClass *CLASS, Object *obj) { - struct IconDrawerList_DATA *data = INST_DATA(CLASS, obj); - BPTR lock = NULL, tmplock = NULL; - char filename[256]; - char namebuffer[512]; - ULONG list_DisplayFlags = 0; + struct IconDrawerList_DATA *data = INST_DATA(CLASS, obj); + BPTR lock = NULL, tmplock = NULL; + char filename[256]; + char namebuffer[512]; + ULONG list_DisplayFlags = 0; D(bug("[IconDrawerList]: %s()\n", __PRETTY_FUNCTION__)); - if (!data->drawer) return 1; + if (!data->drawer) return 1; - lock = Lock(data->drawer, SHARED_LOCK); + lock = Lock(data->drawer, SHARED_LOCK); - if (lock) - { - struct FileInfoBlock *fib = AllocDosObject(DOS_FIB, NULL); - if (fib) + if (lock) { - if (Examine(lock, fib)) - { - GET(obj, MUIA_IconList_DisplayFlags, &list_DisplayFlags); + struct FileInfoBlock *fib = AllocDosObject(DOS_FIB, NULL); + if (fib) + { + if (Examine(lock, fib)) + { + GET(obj, MUIA_IconList_DisplayFlags, &list_DisplayFlags); D(bug("[IconDrawerList] %s: DisplayFlags = 0x%p\n", __PRETTY_FUNCTION__, list_DisplayFlags)); - while(ExNext(lock, fib)) - { - int len = strlen(fib->fib_FileName); - struct IconEntry *this_Icon; + while(ExNext(lock, fib)) + { + int len = strlen(fib->fib_FileName); + struct IconEntry *this_Icon; - memset(namebuffer, 0, 512); - strcpy(filename, fib->fib_FileName); + memset(namebuffer, 0, 512); + strcpy(filename, fib->fib_FileName); D(bug("[IconDrawerList] %s: '%s', len = %d\n", __PRETTY_FUNCTION__, filename, len)); - if (len >= 5) - { - if (!Stricmp(&filename[len-5],".info")) - { - /* Its a .info file .. skip "disk.info" and just ".info" files*/ - if ((len == 5) || ((len == 9) && (!Strnicmp(filename, "Disk", 4)))) - { + if (len >= 5) + { + if (!Stricmp(&filename[len-5],".info")) + { + /* Its a .info file .. skip "disk.info" and just ".info" files*/ + if ((len == 5) || ((len == 9) && (!Strnicmp(filename, "Disk", 4)))) + { D(bug("[IconDrawerList] %s: Skiping file named disk.info or just .info ('%s')\n", __PRETTY_FUNCTION__, filename)); - continue; - } + continue; + } - strcpy(namebuffer, data->drawer); - memset((filename + len - 5), 0, 1); //Remove the .info section - AddPart(namebuffer, filename, sizeof(namebuffer)); + strcpy(namebuffer, data->drawer); + memset((filename + len - 5), 0, 1); //Remove the .info section + AddPart(namebuffer, filename, sizeof(namebuffer)); D(bug("[IconDrawerList] %s: Checking for .info files real file '%s'\n", __PRETTY_FUNCTION__, namebuffer)); - if ((tmplock = Lock(namebuffer, SHARED_LOCK))) - { - /* We have a real file so skip it for now and let it be found seperately */ + if ((tmplock = Lock(namebuffer, SHARED_LOCK))) + { + /* We have a real file so skip it for now and let it be found seperately */ D(bug("[IconDrawerList] %s: File found .. skipping\n", __PRETTY_FUNCTION__)); - UnLock(tmplock); - continue; - } - } - } + UnLock(tmplock); + continue; + } + } + } D(bug("[IconDrawerList] %s: Registering file '%s'\n", __PRETTY_FUNCTION__, filename)); - strcpy(namebuffer, data->drawer); - AddPart(namebuffer, filename, sizeof(namebuffer)); + strcpy(namebuffer, data->drawer); + AddPart(namebuffer, filename, sizeof(namebuffer)); - this_Icon = NULL; - - if ((this_Icon = (struct IconEntry *)DoMethod(obj, MUIM_IconList_CreateEntry, (IPTR)namebuffer, (IPTR)filename, (IPTR)fib, (IPTR)NULL, 0))) - { + this_Icon = NULL; + + if ((this_Icon = (struct IconEntry *)DoMethod(obj, MUIM_IconList_CreateEntry, (IPTR)namebuffer, (IPTR)filename, (IPTR)fib, (IPTR)NULL, 0))) + { D(bug("[IconDrawerList] %s: Icon entry allocated @ 0x%p\n", __PRETTY_FUNCTION__, this_Icon)); - sprintf(namebuffer + strlen(namebuffer), ".info"); - if ((tmplock = Lock(namebuffer, SHARED_LOCK))) - { + sprintf(namebuffer + strlen(namebuffer), ".info"); + if ((tmplock = Lock(namebuffer, SHARED_LOCK))) + { D(bug("[IconDrawerList] %s: File has a .info file .. updating info\n", __PRETTY_FUNCTION__)); - UnLock(tmplock); - if (!(this_Icon->ie_Flags & ICONENTRY_FLAG_HASICON)) - this_Icon->ie_Flags |= ICONENTRY_FLAG_HASICON; - } + UnLock(tmplock); + if (!(this_Icon->ie_Flags & ICONENTRY_FLAG_HASICON)) + this_Icon->ie_Flags |= ICONENTRY_FLAG_HASICON; + } + + if (list_DisplayFlags & ICONLIST_DISP_SHOWINFO) + { + if ((this_Icon->ie_Flags & ICONENTRY_FLAG_HASICON) && !(this_Icon->ie_Flags & ICONENTRY_FLAG_VISIBLE)) + this_Icon->ie_Flags |= ICONENTRY_FLAG_VISIBLE; + } + else if (!(this_Icon->ie_Flags & ICONENTRY_FLAG_VISIBLE)) + { + this_Icon->ie_Flags |= ICONENTRY_FLAG_VISIBLE; + } + this_Icon->ie_IconNode.ln_Pri = 0; - if (list_DisplayFlags & ICONLIST_DISP_SHOWINFO) - { - if ((this_Icon->ie_Flags & ICONENTRY_FLAG_HASICON) && !(this_Icon->ie_Flags & ICONENTRY_FLAG_VISIBLE)) - this_Icon->ie_Flags |= ICONENTRY_FLAG_VISIBLE; - } - else if (!(this_Icon->ie_Flags & ICONENTRY_FLAG_VISIBLE)) - { - this_Icon->ie_Flags |= ICONENTRY_FLAG_VISIBLE; - } - this_Icon->ie_IconNode.ln_Pri = 0; - if (fib->fib_DirEntryType == ST_FILE) { - this_Icon->ie_IconListEntry.type = ST_FILE; + this_Icon->ie_IconListEntry.type = ST_FILE; D(bug("[IconDrawerList] %s: ST_FILE Entry created\n", __PRETTY_FUNCTION__)); } else if (fib->fib_DirEntryType == ST_USERDIR) { - this_Icon->ie_IconListEntry.type = ST_USERDIR; + this_Icon->ie_IconListEntry.type = ST_USERDIR; D(bug("[IconDrawerList] %s: ST_USERDIR Entry created\n", __PRETTY_FUNCTION__)); } else { D(bug("[IconDrawerList] %s: Unknown Entry Type created\n", __PRETTY_FUNCTION__)); } - } - else - { + } + else + { D(bug("[IconDrawerList] %s: Failed to Register file!!!\n", __PRETTY_FUNCTION__)); - } + } + } + } + + FreeDosObject(DOS_FIB, fib); } - } - - FreeDosObject(DOS_FIB, fib); + + UnLock(lock); } - - UnLock(lock); - } - return 1; + return 1; } /// @@ -243,31 +243,31 @@ OM_NEW **************************************************************************/ IPTR IconDrawerList__OM_NEW(struct IClass *CLASS, Object *obj, struct opSet *message) { - struct IconDrawerList_DATA *data = NULL; - struct TagItem *tag = NULL, - *tags = NULL; + struct IconDrawerList_DATA *data = NULL; + struct TagItem *tag = NULL, + *tags = NULL; D(bug("[IconDrawerList]: %s()\n", __PRETTY_FUNCTION__)); - obj = (Object *)DoSuperNewTags(CLASS, obj, NULL, - TAG_MORE, (IPTR) message->ops_AttrList); + obj = (Object *)DoSuperNewTags(CLASS, obj, NULL, + TAG_MORE, (IPTR) message->ops_AttrList); - if (!obj) return FALSE; + if (!obj) return FALSE; - data = INST_DATA(CLASS, obj); + data = INST_DATA(CLASS, obj); - /* parse initial taglist */ - for (tags = message->ops_AttrList; (tag = NextTagItem((const struct TagItem **)&tags)); ) - { - switch (tag->ti_Tag) + /* parse initial taglist */ + for (tags = message->ops_AttrList; (tag = NextTagItem((const struct TagItem **)&tags)); ) { - case MUIA_IconDrawerList_Drawer: - data->drawer = StrDup((char *)tag->ti_Data); - break; + switch (tag->ti_Tag) + { + case MUIA_IconDrawerList_Drawer: + data->drawer = StrDup((char *)tag->ti_Data); + break; + } } - } D(bug("[IconDrawerList] obj = %ld\n", obj)); - return (IPTR)obj; + return (IPTR)obj; } /// @@ -277,18 +277,18 @@ OM_DISPOSE **************************************************************************/ IPTR IconDrawerList__OM_DISPOSE(struct IClass *CLASS, Object *obj, Msg message) { - struct IconDrawerList_DATA *data = INST_DATA(CLASS, obj); + struct IconDrawerList_DATA *data = INST_DATA(CLASS, obj); D(bug("[IconDrawerList]: %s()\n", __PRETTY_FUNCTION__)); - - if (data->drawer) - { + + if (data->drawer) + { D(bug("[IconDrawerList] %s: Freeing DIR name storage for '%s'\n", __PRETTY_FUNCTION__, data->drawer)); - FreeVec(data->drawer); - } + FreeVec(data->drawer); + } - return DoSuperMethodA(CLASS, obj, message); + return DoSuperMethodA(CLASS, obj, message); } /// @@ -298,28 +298,29 @@ OM_SET **************************************************************************/ IPTR IconDrawerList__OM_SET(struct IClass *CLASS, Object *obj, struct opSet *message) { - struct IconDrawerList_DATA *data = INST_DATA(CLASS, obj); - struct TagItem *tag = NULL, - *tags = NULL; + struct IconDrawerList_DATA *data = INST_DATA(CLASS, obj); + struct TagItem *tag = NULL, + *tags = NULL; D(bug("[IconDrawerList]: %s()\n", __PRETTY_FUNCTION__)); - /* parse initial taglist */ - for (tags = message->ops_AttrList; (tag = NextTagItem((const struct TagItem **)&tags)); ) - { - switch (tag->ti_Tag) + /* parse initial taglist */ + for (tags = message->ops_AttrList; (tag = NextTagItem((const struct TagItem **)&tags)); ) { - case MUIA_IconDrawerList_Drawer: - if (data->drawer) FreeVec(data->drawer); + switch (tag->ti_Tag) + { + case MUIA_IconDrawerList_Drawer: + if (data->drawer) + FreeVec(data->drawer); - data->drawer = StrDup((char*)tag->ti_Data); - DoMethod(obj, MUIM_IconList_Update); + data->drawer = StrDup((char*)tag->ti_Data); + DoMethod(obj, MUIM_IconList_Update); - break; + break; + } } - } - return DoSuperMethodA(CLASS, obj, (Msg)message); + return DoSuperMethodA(CLASS, obj, (Msg)message); } /// @@ -329,19 +330,19 @@ OM_GET **************************************************************************/ IPTR IconDrawerList__OM_GET(struct IClass *CLASS, Object *obj, struct opGet *message) { - /* small macro to simplify return value storage */ + /* small macro to simplify return value storage */ #define STORE *(message->opg_Storage) - struct IconDrawerList_DATA *data = INST_DATA(CLASS, obj); + struct IconDrawerList_DATA *data = INST_DATA(CLASS, obj); D(bug("[IconDrawerList]: %s()\n", __PRETTY_FUNCTION__)); - switch (message->opg_AttrID) - { - case MUIA_IconDrawerList_Drawer: STORE = (IPTR)data->drawer; return 1; - } + switch (message->opg_AttrID) + { + case MUIA_IconDrawerList_Drawer: STORE = (IPTR)data->drawer; return 1; + } - if (DoSuperMethodA(CLASS, obj, (Msg) message)) return 1; - return 0; + if (DoSuperMethodA(CLASS, obj, (Msg) message)) return 1; + return 0; #undef STORE } /// @@ -352,24 +353,24 @@ MUIM_IconList_Update **************************************************************************/ IPTR IconDrawerList__MUIM_IconList_Update(struct IClass *CLASS, Object *obj, struct MUIP_IconList_Update *message) { - //struct IconEntry *node; + //struct IconEntry *node; D(bug("[IconDrawerList]: %s()\n", __PRETTY_FUNCTION__)); - DoMethod(obj, MUIM_IconList_Clear); + DoMethod(obj, MUIM_IconList_Clear); - /* If not in setup do nothing */ + /* If not in setup do nothing */ #warning "TODO: Handle MADF_SETUP" // if (!(_flags(obj) & MADF_SETUP)) return 1; - IconDrawerList__ParseContents(CLASS, obj); + IconDrawerList__ParseContents(CLASS, obj); - /*_Sort takes care of icon placement and redrawing for us*/ - DoMethod(obj, MUIM_IconList_Sort); + /*_Sort takes care of icon placement and redrawing for us*/ + DoMethod(obj, MUIM_IconList_Sort); - DoSuperMethodA(CLASS, obj, (Msg) message); + DoSuperMethodA(CLASS, obj, (Msg) message); - return 1; + return 1; } /// @@ -377,37 +378,37 @@ D(bug("[IconDrawerList]: %s()\n", __PRETTY_FUNCTION__)); #if WANDERER_BUILTIN_ICONDRAWERLIST BOOPSI_DISPATCHER(IPTR, IconDrawerList_Dispatcher, CLASS, obj, message) { - #ifdef __AROS__ - switch (message->MethodID) - #else - struct IClass *CLASS = cl; - Msg message = msg; +#ifdef __AROS__ + switch (message->MethodID) +#else + struct IClass *CLASS = cl; + Msg message = msg; - switch (msg->MethodID) - #endif - { - case OM_NEW: return IconDrawerList__OM_NEW(CLASS, obj, (struct opSet *)message); - case OM_DISPOSE: return IconDrawerList__OM_DISPOSE(CLASS, obj, message); - case OM_SET: return IconDrawerList__OM_SET(CLASS, obj, (struct opSet *)message); - case OM_GET: return IconDrawerList__OM_GET(CLASS, obj, (struct opGet *)message); - - #ifdef __AROS__ - case MUIM_IconList_Update: return IconDrawerList__MUIM_Update(CLASS, obj, (APTR)message); - #else - case MUIM_IconList_Update: return IconDrawerList__MUIM_IconList_Update(CLASS, obj, (APTR)message); - #endif - } - return DoSuperMethodA(CLASS, obj, message); + switch (msg->MethodID) +#endif + { + case OM_NEW: return IconDrawerList__OM_NEW(CLASS, obj, (struct opSet *)message); + case OM_DISPOSE: return IconDrawerList__OM_DISPOSE(CLASS, obj, message); + case OM_SET: return IconDrawerList__OM_SET(CLASS, obj, (struct opSet *)message); + case OM_GET: return IconDrawerList__OM_GET(CLASS, obj, (struct opGet *)message); + +#ifdef __AROS__ + case MUIM_IconList_Update: return IconDrawerList__MUIM_Update(CLASS, obj, (APTR)message); +#else + case MUIM_IconList_Update: return IconDrawerList__MUIM_IconList_Update(CLASS, obj, (APTR)message); +#endif + } + return DoSuperMethodA(CLASS, obj, message); } BOOPSI_DISPATCHER_END #ifdef __AROS__ /* Class descriptor. */ const struct __MUIBuiltinClass _MUI_IconDrawerList_desc = { - MUIC_IconDrawerList, - MUIC_IconList, - sizeof(struct IconDrawerList_DATA), - (void*)IconDrawerList_Dispatcher + MUIC_IconDrawerList, + MUIC_IconList, + sizeof(struct IconDrawerList_DATA), + (void*)IconDrawerList_Dispatcher }; #endif #endif @@ -415,7 +416,7 @@ const struct __MUIBuiltinClass _MUI_IconDrawerList_desc = { #ifndef __AROS__ struct MUI_CustomClass *initIconDrawerListClass(void) { - return (struct MUI_CustomClass *) MUI_CreateCustomClass(NULL, NULL, IconList_Class, sizeof(struct IconDrawerList_DATA), ENTRY(IconDrawerList_Dispatcher)); + return (struct MUI_CustomClass *) MUI_CreateCustomClass(NULL, NULL, IconList_Class, sizeof(struct IconDrawerList_DATA), ENTRY(IconDrawerList_Dispatcher)); } #endif diff --git a/workbench/system/Wanderer/Classes/iconlist.c b/workbench/system/Wanderer/Classes/iconlist.c index a56c3a6293..ef6626a28a 100644 --- a/workbench/system/Wanderer/Classes/iconlist.c +++ b/workbench/system/Wanderer/Classes/iconlist.c @@ -3209,44 +3209,47 @@ D(bug("[IconList] %s: Failed to Allocate Entry label string Storage!\n", __PRETT /*file info block*/ if(message->fib != NULL) { - entry->ie_FileInfoBlock = message->fib; - - if (entry->ie_FileInfoBlock->fib_DirEntryType > 0) - { - strcpy(entry->ie_TxtBuf_SIZE, "Drawer"); - } - else + if ((entry->ie_FileInfoBlock = AllocMem(sizeof(struct FileInfoBlock), MEMF_CLEAR)) != NULL) { - FmtSizeToString(entry->ie_TxtBuf_SIZE, entry->ie_FileInfoBlock->fib_Size); - } + CopyMem(message->fib, entry->ie_FileInfoBlock, sizeof(struct FileInfoBlock)); + + if (entry->ie_FileInfoBlock->fib_DirEntryType > 0) + { + strcpy(entry->ie_TxtBuf_SIZE, "Drawer"); + } + else + { + FmtSizeToString(entry->ie_TxtBuf_SIZE, entry->ie_FileInfoBlock->fib_Size); + } - dt.dat_Stamp = entry->ie_FileInfoBlock->fib_Date; - dt.dat_Format = FORMAT_DEF; - dt.dat_Flags = 0; - dt.dat_StrDay = NULL; - dt.dat_StrDate = entry->ie_TxtBuf_DATE; - dt.dat_StrTime = entry->ie_TxtBuf_TIME; + dt.dat_Stamp = entry->ie_FileInfoBlock->fib_Date; + dt.dat_Format = FORMAT_DEF; + dt.dat_Flags = 0; + dt.dat_StrDay = NULL; + dt.dat_StrDate = entry->ie_TxtBuf_DATE; + dt.dat_StrTime = entry->ie_TxtBuf_TIME; - DateToStr(&dt); - DateStamp(&now); + DateToStr(&dt); + DateStamp(&now); - /*if modified today show time, otherwise just show date*/ - if (now.ds_Days == entry->ie_FileInfoBlock->fib_Date.ds_Days) - entry->ie_Flags |= ICONENTRY_FLAG_TODAY; - else - entry->ie_Flags &= ~ICONENTRY_FLAG_TODAY; - - sp = entry->ie_TxtBuf_PROT; - *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_SCRIPT) ? 's' : '-'; - *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_PURE) ? 'p' : '-'; - *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_ARCHIVE) ? 'a' : '-'; - *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_READ) ? '-' : 'r'; - *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_WRITE) ? '-' : 'w'; - *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_EXECUTE) ? '-' : 'e'; - *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_DELETE) ? '-' : 'd'; - *sp++ = '\0'; - - entry->ie_IconListEntry.type = entry->ie_FileInfoBlock->fib_DirEntryType; + /*if modified today show time, otherwise just show date*/ + if (now.ds_Days == entry->ie_FileInfoBlock->fib_Date.ds_Days) + entry->ie_Flags |= ICONENTRY_FLAG_TODAY; + else + entry->ie_Flags &= ~ICONENTRY_FLAG_TODAY; + + sp = entry->ie_TxtBuf_PROT; + *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_SCRIPT) ? 's' : '-'; + *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_PURE) ? 'p' : '-'; + *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_ARCHIVE) ? 'a' : '-'; + *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_READ) ? '-' : 'r'; + *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_WRITE) ? '-' : 'w'; + *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_EXECUTE) ? '-' : 'e'; + *sp++ = (entry->ie_FileInfoBlock->fib_Protection & FIBF_DELETE) ? '-' : 'd'; + *sp++ = '\0'; + + entry->ie_IconListEntry.type = entry->ie_FileInfoBlock->fib_DirEntryType; + } } else { -- 2.11.4.GIT