/* ** UpdateIcon - Icon control utility ** ** © Copyright 1992 by Olaf `Olsen' Barthel ** All Rights Reserved ** ** Public-domain, both commercial and noncommercial use ** of this program are permitted. */ /* System includes. */ #include #include #include #include #include /* Library prototypes. */ #include #include #include #include /* Argument vector offsets. */ enum { ARG_NAME,ARG_ADD,ARG_UPDATE,ARG_REPLACE,ARG_DEFAULTOOL,ARGCOUNT }; /* Version tag identifier. */ STATIC UBYTE *Version = "\0$VER: UpdateIcon 1.0 (18.4.92)"; /* Shared library identifiers. */ struct ExecBase *SysBase; struct DosLibrary *DOSBase; struct Library *IconBase; struct Library *UtilityBase; /* Main(): * * The one and only main routine. */ LONG __saveds Main() { struct Process *ThisProcess; LONG Result = RETURN_FAIL; /* Set up ExecBase pointer. */ SysBase = *(struct ExecBase **)4; /* Obtain current process identifier. */ ThisProcess = (struct Process *)SysBase -> ThisTask; /* Did we get started from Shell? */ if(ThisProcess -> pr_CLI) { /* Open dos.library */ if(DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",37)) { /* Open icon.library */ if(IconBase = OpenLibrary("icon.library",37)) { /* Open utility.library */ if(UtilityBase = OpenLibrary("utility.library",37)) { struct AnchorPath *Anchor; /* Allocate pattern matching data. */ if(Anchor = (struct AnchorPath *)AllocVec(sizeof(struct AnchorPath) + 256,MEMF_ANY | MEMF_CLEAR)) { STRPTR *Args; /* Allocate argument vector. */ if(Args = (STRPTR)AllocVec(sizeof(STRPTR) * ARGCOUNT,MEMF_ANY | MEMF_CLEAR)) { struct RDArgs *ArgsPtr; /* Allocate argument parser data. */ if(ArgsPtr = (struct RDArgs *)AllocDosObjectTags(DOS_RDARGS,TAG_DONE)) { /* Provide extra help infocmation. */ ArgsPtr -> RDA_ExtHelp = "\nUsage: UpdateIcon [Add] [Update]\n\ [Replace ] [DefaultTool ]\n\n\ `Add' adds an icon to a file which does not yet\n\ have an icon attached.\n\n\ `Update' updates the position of an icon.\n\n\ `Replace' replaces the default tool name of an icon by\n\ the name specified using `DefaultTool'.\n\n\ `DefaultTool' can be used in conjunction with `Replace' or\n\ alone by itself. In the latter case, any\n\ icon in question will have the default tool\n\ set to this name.\n"; /* Allow the pattern matching process to * be aborted by pressing ^C. */ Anchor -> ap_BreakBits = SIGBREAKF_CTRL_C; Anchor -> ap_Strlen = 256; /* Read the command arguments. */ if(ReadArgs("NAME,A=ADD/S,U=UPDATE/S,R=REPLACE/K,T=DEFAULTTOOL/K",(LONG *)Args,ArgsPtr)) { /* Did we get a name pattern? */ if(Args[ARG_NAME]) { struct DiskObject *Icon = NULL; BYTE Continue = TRUE, Match = FALSE; WORD Len; /* Look for the first matching file name. */ if(!MatchFirst(Args[ARG_NAME],Anchor)) { STRPTR Name = Anchor -> ap_Buf; /* So far, we have been pretty successful. */ Result = RETURN_OK; /* At least a single match has been made. */ Match = TRUE; /* Scan until no matches remain. */ for(;;) { Len = strlen(Name); /* Is the name likely to * have `.info' appended? */ if(Len > 5) { /* Check for `.info' suffix, * we don't wish to attach * icons to icon files. */ if(!Stricmp(&Name[Len - 5],".info")) { /* Look for the next matching file. */ if(MatchNext(Anchor)) { LONG Error = IoErr(); if(Error != ERROR_NO_MORE_ENTRIES) PrintFault(Error,"UpdateIcon"); break; } continue; } } /* Did we get a proper name? */ if(Name[0]) { /* Are we to add icons to files * which do not yet have an icon * attached? */ if(Args[ARG_ADD]) { /* Try to read the icon file if any. */ if(!(Icon = GetDiskObject(Name))) { /* No icon file present, * try to obtain a default * icon image. */ if(Icon = GetDiskObjectNew(Name)) { /* No fixed position for the * new icon, please. */ Icon -> do_CurrentX = NO_ICON_POSITION; Icon -> do_CurrentY = NO_ICON_POSITION; /* The icon file will be saved only * if there are no other actions * to execute using the icon data. */ if(!Args[ARG_UPDATE] && !Args[ARG_REPLACE] && !Args[ARG_DEFAULTOOL]) { /* Try to save the new icon * to disk... */ if(!PutDiskObject(Name,Icon)) { Printf("UpdateIcon: Could not save icon for \"%s\"!\a\n",Name); Continue = FALSE; } /* Free the icon data. */ FreeDiskObject(Icon); Icon = NULL; } } else { Printf("UpdateIcon: Could not get icon for \"%s\"!\a\n",Name); Continue = FALSE; } } else { /* The file already has a proper icon * attached. If not to be used later, * free it. */ if(!Args[ARG_UPDATE] && !Args[ARG_REPLACE] && !Args[ARG_DEFAULTOOL]) { FreeDiskObject(Icon); Icon = NULL; } } } /* Are we to update the icon * position? */ if(Args[ARG_UPDATE] && Continue) { /* Do we already have an * icon to work upon? */ if(!Icon) { /* Try to read the icon. */ if(!(Icon = GetDiskObject(Name))) { Printf("UpdateIcon: Could not get icon for \"%s\"!\a\n",Name); Continue = FALSE; } } /* Reset the icon position. */ if(Icon) { Icon -> do_CurrentX = NO_ICON_POSITION; Icon -> do_CurrentY = NO_ICON_POSITION; } } /* Are we to replace the default * tool of an icon with a different * tool name? */ if(Args[ARG_REPLACE] && !Continue) { /* Did the user give a * proper replacement * tool name? */ if(!Args[ARG_DEFAULTOOL]) { PrintFault(ERROR_REQUIRED_ARG_MISSING,"UpdateIcon"); Result = RETURN_ERROR; Continue = FALSE; } else { /* Do we already have an * icon to play with? */ if(!Icon) { if(!(Icon = GetDiskObject(Name))) { Printf("UpdateIcon: Could not get icon for \"%s\"!\a\n",Name); Continue = FALSE; } } if(Icon) { /* Does this icon have * a default tool? */ if(Icon -> do_DefaultTool) { /* If the tool name matches the one * we are to replace, replace it * with the new name. */ if(!Stricmp(Icon -> do_DefaultTool,Args[ARG_REPLACE])) Icon -> do_DefaultTool = (char *)Args[ARG_DEFAULTOOL]; } } } } else { /* Are we to supply a new default tool * for an existing icon? */ if(Args[ARG_DEFAULTOOL] && Continue) { /* Do we already have an * icon to work upon? */ if(!Icon) { if(!(Icon = GetDiskObject(Name))) { Printf("UpdateIcon: Could not get icon for \"%s\"!\a\n",Name); Continue = FALSE; } } /* Supply the new default tool name. */ if(Icon) Icon -> do_DefaultTool = (char *)Args[ARG_DEFAULTOOL]; } } /* That's all folks: * save the icon back to * disk. */ if(Icon) { /* Try to save the icon... */ if(!PutDiskObject(Name,Icon)) { Printf("UpdateIcon: Could not save icon for \"%s\"!\a\n",Name); Continue = FALSE; } else Result = RETURN_OK; /* Release the icon data. */ FreeDiskObject(Icon); Icon = NULL; } /* Did we get an error? */ if(!Continue) { Result = RETURN_FAIL; break; } } /* Look for the next matching name. */ if(MatchNext(Anchor)) { LONG Error = IoErr(); if(Error != ERROR_NO_MORE_ENTRIES) PrintFault(Error,"UpdateIcon"); break; } } } /* If no match has been * made, tell it to the * user. */ if(!Match) { Printf("UpdateIcon: No applicable objects.\n"); Result = RETURN_WARN; } /* Free pattern matching info. */ MatchEnd(Anchor); } else { PrintFault(ERROR_REQUIRED_ARG_MISSING,"UpdateIcon"); Result = RETURN_ERROR; } } else { PrintFault(IoErr(),"UpdateIcon"); Result = RETURN_ERROR; } /* Free argument data. */ FreeArgs(ArgsPtr); } else Printf("UpdateIcon: Could not allocate argument data!\a\n"); /* Free argument vector data. */ FreeVec(Args); } else Printf("UpdateIcon: Could not allocate argument data!\a\n"); /* Free pattern matching data. */ FreeVec(Anchor); } else Printf("UpdateIcon: Could not allocate AnchorPath!\a\n","icon.library"); /* Close the remaining libraries... */ CloseLibrary(UtilityBase); } else Printf("UpdateIcon: Could not open \"%s\"!\a\n","utility.library"); CloseLibrary(IconBase); } else Printf("UpdateIcon: Could not open \"%s\"!\a\n","icon.library"); CloseLibrary(DOSBase); } } else { /* Wait for startup message... */ WaitPort(&ThisProcess -> pr_MsgPort); /* Disable multitasking. */ Forbid(); /* Reply startup message. */ ReplyMsg(GetMsg(&ThisProcess -> pr_MsgPort)); } return(Result); }