/* NoDelete V1.4E (C) HooverSoft 1990

       cc NoDelete +L
       ln NoDelete -lc32


*/


#ifdef AZTEC_C                                 /* Works under Manx, convert it
to Lattice */
                                                                       /* if
you don't mind the hassle...                       */

#include<intuition/intuition.h>
#include<intuition/intuitionbase.h>
#include<libraries/dos.h>
#include<libraries/dosextens.h>
#include<stdio.h>
/* #define DEBUG 1 */

char bodystring[80],extensions[10][10], titlebak[80], title[80];
ULONG answer, EXT_SET = 0L,  howmany = 0L;
UBYTE *position, *rindex();
ULONG OVERRIDE = 0L, SILENT = 0L;

struct FileHandle *output, *Output();

struct NewWindow mywindow = {
       100,0,  /* window XY origin relative to TopLeft of screen */
       350,10, /* window width and height */
       0,1,    /* detail and block pens */
       CLOSEWINDOW+VANILLAKEY, /* IDCMP flags */
       WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+SIMPLE_REFRESH,      /* other window
flags */
       NULL,   /* first gadget in gadget list */
       NULL,   /* custom CHECKMARK imagery */
       (UBYTE *)title, /* window title */
       NULL,   /* custom screen pointer */
       NULL,   /* custom bitmap */
       5,5,    /* minimum width and height */
       640,110, /* maximum width and height */
       WBENCHSCREEN    /* destination screen type */
       };


struct IntuiText body = {
       1,0,
       JAM1|COMPLEMENT,
       30,16,
       NULL,
       NULL,
       NULL
       };

struct IntuiText fbody = {
       1,0,
       JAM1|COMPLEMENT,
       30,5,
       NULL,
       (UBYTE *) "System tries to fool around...",
       &body
       };

struct IntuiText ok = {
       1,0,
       JAM1|COMPLEMENT,
       6,3,
       NULL,
       (UBYTE *)       "Yes, Delete!",
       NULL
       };

struct IntuiText no = {
       1,0,
       JAM1|COMPLEMENT,
       6,3,
       NULL,
       (UBYTE *)  "Oops, No Way!",
       NULL
       };


struct IntuiMessage *msg, *GetMsg();

struct IntuitionBase *IntuitionBase;
struct Window                  *mw, *aw, *OpenWindow();
struct Library                 *DosBase;
UBYTE                                          *filename;
void                                           *OpenLibrary();
struct Task                            *FindTask();

void NoDelete()
{
#asm
       public  _LVOSetProtection

       movem.l d0-d7/a0-a6,-(sp)
#endasm
       geta4();
#asm
       move.l  d1,_filename
#endasm

       if(EXT_SET)
               {

               position = rindex(filename, '.');
               if(!position)
                       goto delete_anyway;
               else
                       {
                       for(answer=0L; answer < howmany; answer++)             
        
                               {
                               if( (strcmp( (UBYTE *) position, (UBYTE *)
extensions[answer])) != 0L)
                                       continue;
                               else
                                       goto request;
                               }
                       }
               goto delete_anyway;             
               }       
request:
       strcpy(bodystring, "Delete File `");
       strcat(bodystring, (char *)filename);
       strcat(bodystring, "'?");
       body.IText = (UBYTE *) bodystring;
       aw = (struct Window *) IntuitionBase->ActiveWindow;
       answer = (long)AutoRequest(aw, &fbody, &ok, &no, NULL, NULL, 360L,
61L);
       if(!answer)ecsvax

       {
               ;
#asm
       movem.l (sp)+,d0-d7/a0-a6
       move.l  #1,d0
#endasm
       return;
       }

       if(answer)
       {

delete_anyway:
               ;
#asm

               move.l  _DosBase,a6             
               move.l  #$70f7,d0                       ;restore old vector
               move.w  d0,-72(a6)
               move.l  #$60000092,d0
               move.l  d0,-70(a6)
               
               tst.l           _OVERRIDE
               beq.s           _dont_unprotect

               move.l  _filename,d1


               move.l  #0,d2
               jsr             _LVOSetProtection(a6)

_dont_unprotect:

               move.l  _filename,d1
               jsr             -72(a6)                         ;DeleteFile()
call
#endasm

               ;

               SetFunction(DosBase, -72L, &NoDelete);

/* install our function */


#asm
               movem.l (sp)+,d0-d7/a0-a6
               move.l  #1,d0
#endasm
               return;
               }
       }
               

void quit(why)
UBYTE *why;
{
       if(!SILENT)
               Write(output, why, (ULONG) strlen(why) );
       SetTaskPri((struct Task *)FindTask(0L), 0L);
       if(DosBase)
       {
               ;
#asm
               move.l  _DosBase,a6             
               move.l  #$70f7,d0                       ;restore old vector
               move.w  d0,-72(a6)
               move.l  #$60000092,d0
               move.l  d0,-70(a6)
#endasm
               ;
       }

       if      (mw)
               CloseWindow(mw);

       if (DosBase)    
               CloseLibrary(DosBase);

       if (IntuitionBase)
               CloseLibrary(IntuitionBase);

       exit(0L);
}

/* test_nd() tests the DeleteFile vector to see if NoDelete is already 
       installed. Returns zero if NoDelete is installed, one if it is not.
*/
#asm
               public  _test_nd
_test_nd:

               move.l  _DosBase,a6
               cmpi.l  #$60000092,-70(a6)
               bne.s           _is_there                               
               moveq           #1,d0
               bra.s           _fuckoff
_is_there:
               moveq           #0,d0
_fuckoff:
               rts     
#endasm
void main(argc,argv)
long argc;
char *argv[];
       {

       static UBYTE *msg1 = (UBYTE *)"Installing NoDelete...";
       static UBYTE *msg2 = (UBYTE *)"done. NoDelete V1.4E (c) HooverSoft
1990\n\n";
       long i;

       DosBase = (struct Library *) OpenLibrary("dos.library",0L);
       output = Output();
       strcpy(title, (UBYTE *) "NoDelete V1.4E (c) HooverSoft");
       
       if(argc > 11)
               quit("Sorry, only 10 extensions allowed!\n");

       if(argc >= 2)
               {
               for(i=1; i<argc; i++)
                       {
       
                       if(argv[i][0] == '.')
                               {
                               EXT_SET = 1L;
                               strcpy(extensions[howmany], argv[i]);
                               howmany++;
                               }
                       else
                        continue;

#ifdef DEBUG
                       printf("Copied %s, Result: %s\n", argv[i],
extensions[i-1L]);
#endif 
                       }

#ifdef DEBUG
               printf("I found %ld extensions.\n", howmany);
#endif                 


               if(howmany)
                               strcat(title, (UBYTE *) " EXT SET");           
        

               for(i=1; i<argc; i++)
                       {
#ifdef DEBUG
                       printf("Scanning argv[%ld]: %s\n", i, (UBYTE *) argv[i]
);
#endif
                       if( (char) argv[i][0] == '-')
                               switch( (char) argv[i][1] )
                                       {
                                       case 'y':       if( atoi(argv[i+1]) <=
245L)
                                                                              
mywindow.TopEdge = atoi(argv[i+1]);
                                                                       break;

                                       case 'p':       if(atoi(argv[i+1]) <
10L && atoi(argv[i+1]) > -20L)
                                                                              
SetTaskPri((struct Task *)FindTask(0L),\
                                                                              
                                (long)atoi(argv[i+1]));
                                                                       else
                                                                              
SetTaskPri((struct Task *)FindTask(0L), -5L);
                                                                       break;

                                       case  'O':      OVERRIDE = 1L;
                                                                       break;
                               
                                       case  'S':      SILENT = 1L;
                                                                       break;
                               
                                       case default: break;
                                       }
                               /* end switch */
                       /*end if */
               /*end for */
                       }       
                                       
               }

       if(!howmany)
               {
               EXT_SET = 0L;
               strcat(title, (UBYTE *) " NO EXT");
               }

/* calculate dimension of TitleBar */

       mywindow.Width = ( strlen(title) * 8L) + 85L;
       mywindow.LeftEdge = (640L-mywindow.Width) / 2L;

       IntuitionBase =  OpenLibrary("intuition.library",0L);
       if(!SILENT)
               Write(output, msg1, (ULONG)strlen(msg1));

       if( !test_nd() && !SILENT )
               {
               Write(output, "NoDelete already installed.\n",28L);
               CloseLibrary(DosBase);
               CloseLibrary(IntuitionBase);
               exit(0L);
               }

       mw = OpenWindow(&mywindow);
       if(!mw)
               quit("Could not open Window.\n\n");
       if(!SILENT)
               Write(output, msg2, (ULONG)strlen(msg2));

       SetFunction(DosBase, -72L, &NoDelete); 

       for(;;)
               {
               Wait(1L << mw->UserPort->mp_SigBit);
getmsg:
               msg = GetMsg(mw->UserPort);
               ReplyMsg(msg);
               if (msg->Class == CLOSEWINDOW)
                       quit("NoDelete V1.4E exiting.\n\n");
               if(msg->Class == VANILLAKEY)
                       {
                       strcpy(titlebak, (UBYTE *) "Extensions: ");
                       for(i=0L; i < howmany ; i++)
                               {
                               strcat(titlebak, extensions[i]);
                               strcat(titlebak, " ");
                               }
                       SetWindowTitles(mw, titlebak);
                       Wait(1L << mw->UserPort->mp_SigBit);
                       SetWindowTitles(mw, title);
                       ReplyMsg( GetMsg(mw->UserPort) );
                       }

               else
                       continue;
               }
       }
#endif 
       
