home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / comm / net / inetutils / contrib / sabot17.lha / Sabot / Source / mm.c next >
C/C++ Source or Header  |  1994-02-27  |  11KB  |  584 lines

  1. /* Sabot */
  2.  
  3. #include <exec/types.h>
  4. #include <exec/libraries.h>
  5. #include <exec/memory.h>
  6. #include <dos/dos.h>
  7. #include <dos/notify.h>
  8. #include <dos/dostags.h>
  9. #include <libraries/dos.h>
  10. #include <workbench/workbench.h>
  11. #include <workbench/startup.h>
  12.  
  13. #include <proto/icon.h>
  14. #include <proto/exec.h>
  15. #include <proto/wb.h>
  16. #include <proto/dos.h>
  17.  
  18. #include <strings.h>
  19. #include <stdlib.h>
  20. #include <stdio.h>
  21. #include <wb2cli.h>
  22.  
  23. #define BIGSTRING 255
  24. #define SMALLSTRING 128
  25.  
  26. enum args
  27.     {
  28.     MAIL,
  29.     NOMAIL,
  30.     OLDMAIL,
  31.     MAILBOX,
  32.     ICONNAME,
  33.     XPOS,
  34.     YPOS,
  35.     CLICKCOMMAND,
  36.     CLICKSTACK,
  37.     MAILCOMMAND,
  38.     MAILSTACK,
  39.     DROPCOMMAND,
  40.     DROPSTACK,
  41.     BEEPLOTS,
  42.     COUNTDELETE,
  43.     MAILRDY
  44.     };
  45.  
  46.  
  47. void __regargs __chkabort(void) {}
  48. int __oslibversion=37;
  49. long __stack = 20000;
  50. static const char VersionID[]="\0$VER:Sabot 1.7 (27.2.94) By Scott Ellis";
  51.  
  52. extern struct DosLibrary *DOSBase;
  53. extern struct WBStartup *_WBenchMsg;
  54. struct Library *IconBase;
  55. struct Library *WorkbenchBase;
  56.  
  57. char *havemail;
  58. char *nomail;
  59. char *oldmail;
  60. char *watch;
  61. char *iconname;
  62. char *clickcomname;
  63. char *mailcomname;
  64. char *dropcomname;
  65. char *dropname;
  66. char *droptemp;
  67.  
  68. BOOL mailrdy;
  69. ULONG xpos;
  70. ULONG ypos;
  71.  
  72. BOOL beeplots=FALSE;
  73. ULONG clickcomstack=20000;
  74. ULONG mailcomstack=20000;
  75. ULONG dropcomstack=20000;
  76.  
  77. LONG mbsize=0;
  78. LONG prevsize=0;
  79.  
  80. struct AppIcon *appicon=NULL;
  81. struct DiskObject *image=NULL;
  82. struct MsgPort *myport=NULL;
  83.  
  84. enum active_args
  85.     {
  86.     NONE,
  87.     OLD,
  88.     NEW
  89.     };
  90.  
  91. USHORT active=NONE;
  92. BOOL beeped=FALSE;
  93. BOOL countdelete=FALSE;
  94.  
  95. BOOL addicon(struct MsgPort *, struct DiskObject *);
  96. void killicon( void );
  97. BOOL getimage( char * );
  98. void killimage( void );
  99. void changeicon( void );
  100. void doinfo( void );
  101. void compare( void );
  102. BOOL parse( int, char ** );
  103. void docommand(char *, int);
  104. BOOL makevars( void );
  105. void freevars( void );
  106.  
  107. int main (int argc, char **argv)
  108. {
  109.     struct AppMessage *appmsg;
  110.     struct NotifyRequest *note;
  111.  
  112.     struct MsgPort *mailport=NULL;
  113.     ULONG mailportsig=NULL;
  114.  
  115.     BOOL going=TRUE;
  116.     ULONG mysig;
  117.     LONG signum;
  118.     LONG count;
  119.     ULONG myportsig;
  120.  
  121.     if ( !makevars() )
  122.     {
  123.         freevars();
  124.         return(20);
  125.     }
  126.  
  127.     WB2CLI( _WBenchMsg , __stack , DOSBase); /* Creates Path for System()'ed commands */
  128.  
  129.     if ( !parse( argc, argv) )
  130.     {
  131.         freevars();
  132.         return(5);
  133.     }
  134.  
  135.     if (mailrdy)
  136.     {
  137.         if ( mailport=CreatePort("T:MailRdy",0) )
  138.         {
  139.             mailportsig = 1L << mailport->mp_SigBit;
  140.         }
  141.     }
  142.  
  143.     if ( (IconBase=OpenLibrary("icon.library",37)) && (WorkbenchBase=OpenLibrary("workbench.library",37)) )
  144.     {
  145.         if ( getimage(nomail) )
  146.         {
  147.             if ( myport=CreatePort(NULL,0) )
  148.             {
  149.                 myportsig = 1L << myport->mp_SigBit;
  150.  
  151.                 if ( addicon(myport,image) )
  152.                 {
  153.                     if ( note=AllocVec(sizeof(struct NotifyRequest),MEMF_CLEAR) )
  154.                     {
  155.                         if ( (signum=AllocSignal(-1L)) != -1)
  156.                         {
  157.                             note->nr_Name=watch;
  158.                             note->nr_Flags=NRF_SEND_SIGNAL;
  159.                             note->nr_stuff.nr_Signal.nr_Task= (struct Task *)FindTask(NULL);
  160.                             note->nr_stuff.nr_Signal.nr_SignalNum=signum;
  161.  
  162.                             if ( (StartNotify(note))==DOSTRUE )
  163.                             {
  164.                                 doinfo();
  165.                                 if ( mbsize )        /* Show appropriate icon on startup */
  166.                                 {
  167.                                     active=OLD;
  168.                                     changeicon();
  169.                                 }
  170.  
  171.                                 while ( going )
  172.                                 {
  173.                                     mysig = Wait( myportsig | SIGBREAKF_CTRL_C | (1L << signum) | mailportsig );
  174.  
  175.                                     if ( mysig & SIGBREAKF_CTRL_C )
  176.                                     {
  177.                                         going=FALSE;
  178.                                     }
  179.  
  180.                                     if (mysig & mailportsig)
  181.                                     {
  182.                                         active=OLD;
  183.                                         changeicon();
  184.                                     }
  185.  
  186.                                     if (mysig & (1L << signum))
  187.                                     {
  188.                                         doinfo();
  189.                                         compare();
  190.                                     }
  191.  
  192.                                     if ( mysig & myportsig)
  193.                                     {
  194.                                         if ( mailrdy && (active!=NONE) )
  195.                                         {
  196.                                             active=NONE;
  197.                                             changeicon();
  198.                                         }
  199.  
  200.                                         while( appmsg=(struct AppMessage *)GetMsg(myport) )
  201.                                         {
  202.                                             if ( appmsg->am_NumArgs==0L )
  203.                                             {
  204.                                                 if ( clickcomname )
  205.                                                 {
  206.                                                     docommand(clickcomname,clickcomstack);
  207.                                                 }
  208.                                                 prevsize=mbsize;
  209.                                             }
  210.                                             else if ( appmsg->am_NumArgs > 0L )
  211.                                             {
  212.                                                 if ( dropcomname )
  213.                                                 {
  214.                                                     count = appmsg->am_NumArgs;
  215.  
  216.                                                     while ( count )
  217.                                                     {
  218.                                                         --count;
  219.  
  220.                                                         if (NameFromLock(appmsg->am_ArgList[count].wa_Lock,dropname,BIGSTRING))
  221.                                                         {
  222.                                                             if(AddPart(dropname,appmsg->am_ArgList[count].wa_Name,BIGSTRING))
  223.                                                             {
  224.                                                                 sprintf(droptemp,"%s %s",dropcomname,dropname);
  225.                                                                 docommand(droptemp,dropcomstack);
  226.                                                             }
  227.                                                         }
  228.  
  229.                                                         strcpy(droptemp,"");
  230.                                                         strcpy(dropname,"");
  231.                                                     }
  232.                                                 }
  233.                                             }
  234.                                             ReplyMsg( (struct Message *)appmsg );
  235.                                         }
  236.                                     }
  237.                                 }
  238.                             }
  239.                             FreeSignal(signum);
  240.                         }
  241.                         EndNotify(note);
  242.                         FreeVec(note);
  243.                     }
  244.                 }
  245.                 killicon();
  246.             }
  247.  
  248.             while(appmsg=(struct AppMessage *)GetMsg(myport))
  249.             {
  250.                 ReplyMsg((struct Message *)appmsg);
  251.             }
  252.  
  253.             DeletePort(myport);
  254.         }
  255.         killimage();
  256.     }
  257.  
  258.     if (mailport)
  259.     {
  260.         DeletePort(mailport);
  261.     }
  262.  
  263.     CloseLibrary(WorkbenchBase);
  264.     CloseLibrary(IconBase);
  265.  
  266.     freevars();
  267.  
  268.     return(0);
  269. }
  270.  
  271. BOOL addicon(struct MsgPort *port, struct DiskObject *image)
  272. {
  273.     if ( appicon=AddAppIconA(0L,0L,iconname,port,NULL,image,NULL) )
  274.     {
  275.         return(TRUE);
  276.     }
  277.  
  278.     return(FALSE);
  279. }
  280.  
  281. void killicon( void )
  282. {
  283.     RemoveAppIcon(appicon);
  284. }
  285.  
  286. BOOL getimage( char *name )
  287. {
  288.     if ( image=GetDiskObject(name) )
  289.     {
  290.         image->do_Type=NULL;
  291.         image->do_CurrentX=xpos;
  292.         image->do_CurrentY=ypos;
  293.         return(TRUE);
  294.     }
  295.  
  296.     return(FALSE);
  297. }
  298.  
  299. void killimage( void )
  300. {
  301.     if (image)
  302.     {
  303.         FreeDiskObject(image);
  304.     }
  305. }
  306.  
  307. void changeicon( void )
  308. {
  309.     killicon();
  310.     killimage();
  311.  
  312.     switch (active)
  313.     {
  314.         case OLD:
  315.             getimage(oldmail);
  316.             break;
  317.  
  318.         case NEW:
  319.             getimage(havemail);
  320.             break;
  321.  
  322.         case NONE:
  323.             getimage(nomail);
  324.             break;
  325.     }
  326.  
  327.     addicon(myport,image);
  328. }
  329.  
  330. void doinfo( void )
  331. {
  332.     BPTR lock;
  333.     struct FileInfoBlock *fib;
  334.  
  335.     if ( lock=Lock(watch,ACCESS_READ) )
  336.     {
  337.         if ( fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,TAG_END) )
  338.         {
  339.             Examine(lock,fib);
  340.  
  341.             mbsize=fib->fib_Size;
  342.  
  343.             FreeDosObject(DOS_FIB,fib);
  344.         }
  345.     }
  346.     else
  347.     {
  348.         if ( countdelete ) mbsize=0;
  349.     }
  350.  
  351.     UnLock(lock);
  352. }
  353.  
  354. void compare( void )
  355. {
  356. /*printf("mbsize=%i prevsize=%i active=%i\n",mbsize,prevsize,active);*/
  357.  
  358.     if (mbsize)
  359.     {
  360.         if ( mbsize > (prevsize+130) ) /* Allow 130 bytes of breathing room */
  361.         {
  362.             if (active!=NEW)
  363.             {
  364.                 active=NEW;
  365.                 changeicon();
  366.             }
  367.  
  368.             if ( mailcomname && ( !beeped || beeplots) )
  369.             {
  370.                 docommand(mailcomname,mailcomstack);
  371.                 beeped=TRUE;
  372.             }
  373.         }
  374.         else
  375.         {
  376.             active=OLD;
  377.             changeicon();
  378.             beeped=FALSE;
  379.         }
  380.     }
  381.     else
  382.     {
  383.         active=NONE;
  384.         changeicon();
  385.         beeped=FALSE;
  386.     }
  387.  
  388.     prevsize=mbsize;
  389. }
  390.  
  391. BOOL parse(int argc, char *argv[])
  392. {
  393.     struct RDArgs    *RDA;
  394.     LONG         ArgumentArray[17] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
  395.     char        **ToolArrayIndex,
  396.                 *ToolStringIndex,
  397.                 *Template;
  398.     struct DiskObject    *DiskObject;
  399.  
  400.     if (IconBase = OpenLibrary("icon.library", 36L ) )
  401.         {
  402.  
  403.         RDA = AllocDosObjectTags(DOS_RDARGS, TAG_DONE);
  404.         RDA->RDA_ExtHelp = NULL;
  405.  
  406.         if ( argc == 0 )
  407.         {
  408.             CurrentDir(_WBenchMsg->sm_ArgList->wa_Lock);
  409.  
  410.             if ( DiskObject = GetDiskObject(_WBenchMsg->sm_ArgList->wa_Name) )
  411.             {
  412.                 for (ToolArrayIndex = DiskObject->do_ToolTypes; *ToolArrayIndex; ToolArrayIndex++ )
  413.                 {
  414.                     RDA->RDA_Source.CS_Length += (strlen(*ToolArrayIndex)+1);
  415.                 }
  416.                 RDA->RDA_Source.CS_Buffer = AllocVec(RDA->RDA_Source.CS_Length+1,MEMF_CLEAR);
  417.                 ToolStringIndex = RDA->RDA_Source.CS_Buffer;
  418.                 for (ToolArrayIndex = DiskObject->do_ToolTypes; *ToolArrayIndex; ToolArrayIndex++ )
  419.                 {
  420.                         ToolStringIndex = stpcpy(stpcpy(ToolStringIndex, *ToolArrayIndex)," ");
  421.                 }
  422.                 *(ToolStringIndex-1) = '\n';
  423.                 FreeDiskObject(DiskObject);
  424.             }
  425.  
  426.             Template = "Mail/A,NoMail/A,OldMail/A,MB=MailBox/A,IN=IconName/K,XPos/K/N,YPos/K/N,CC=ClickCommand/K,CS=ClickStack/K/N,MC=MailCommand/K,MS=MailStack/K/N,DC=DropCommand/K,DS=DropStack/K/N,BeepLots/S,CountDelete/S,MailRdy/S,ThrowAway/M";
  427.         }
  428.         else
  429.         {
  430.             Template = "Mail/A,NoMail/A,OldMail/A,MB=MailBox/A,IN=IconName/K,XPos/K/N,YPos/K/N,CC=ClickCommand/K,CS=ClickStack/K/N,MC=MailCommand/K,MS=MailStack/K/N,DC=DropCommand/K,DS=DropStack/K/N,BeepLots/S,CountDelete/S,MailRdy/S";
  431.         }
  432.  
  433.         if (RDA = ReadArgs(Template, ArgumentArray, RDA) )
  434.         {
  435.             strcpy(havemail,(char *)ArgumentArray[MAIL]);
  436.             strcpy(nomail,(char *)ArgumentArray[NOMAIL]);
  437.             strcpy(oldmail,(char *)ArgumentArray[OLDMAIL]);
  438.             strcpy(watch,(char *)ArgumentArray[MAILBOX]);
  439.  
  440.             if ( ArgumentArray[ICONNAME] )
  441.             {
  442.                 strcpy(iconname,(char *)ArgumentArray[ICONNAME]);
  443.             }
  444.             else
  445.             {
  446.                 strcpy(iconname,"MailBox");
  447.             }
  448.  
  449.             if ( ArgumentArray[XPOS] )
  450.             {
  451.                 xpos=*(int *)ArgumentArray[XPOS];
  452.             }
  453.             else
  454.             {
  455.                 xpos=NO_ICON_POSITION;
  456.             }
  457.  
  458.             if ( ArgumentArray[YPOS] )
  459.             {
  460.                 ypos=*(int *)ArgumentArray[YPOS];
  461.             }
  462.             else
  463.             {
  464.                 ypos=NO_ICON_POSITION;
  465.             }
  466.  
  467.             if ( ArgumentArray[CLICKCOMMAND] )
  468.             {
  469.                 strcpy(clickcomname,(char *)ArgumentArray[CLICKCOMMAND]);
  470.             }
  471.  
  472.             if ( ArgumentArray[CLICKSTACK] )
  473.             {
  474.                 clickcomstack=*(int *)ArgumentArray[CLICKSTACK];
  475.             }
  476.  
  477.             if ( ArgumentArray[MAILCOMMAND] )
  478.             {
  479.                 strcpy(mailcomname,(char *)ArgumentArray[MAILCOMMAND]);
  480.             }
  481.  
  482.             if ( ArgumentArray[MAILSTACK] )
  483.             {
  484.                 mailcomstack=*(int *)ArgumentArray[MAILSTACK];
  485.             }
  486.  
  487.             if ( ArgumentArray[DROPCOMMAND] )
  488.             {
  489.                 strcpy(dropcomname,(char *)ArgumentArray[DROPCOMMAND]);
  490.             }
  491.  
  492.             if ( ArgumentArray[DROPSTACK] )
  493.             {
  494.                 dropcomstack=*(int *)ArgumentArray[DROPSTACK];
  495.             }
  496.  
  497.             if ( ArgumentArray[BEEPLOTS] )
  498.             {
  499.                 beeplots=TRUE;
  500.             }
  501.  
  502.             if ( ArgumentArray[COUNTDELETE] )
  503.             {
  504.                 countdelete=TRUE;
  505.             }
  506.  
  507.             if ( ArgumentArray[MAILRDY] )
  508.             {
  509.                 mailrdy=TRUE;
  510.             }
  511.             else
  512.             {
  513.                 mailrdy=FALSE;
  514.             }
  515.  
  516.         }
  517.         else
  518.         {
  519.             PrintFault(IoErr(), NULL);
  520.             return(FALSE);
  521.         }
  522.  
  523.         FreeArgs(RDA);
  524.         FreeDosObject(DOS_RDARGS,RDA);
  525.             CloseLibrary(IconBase);
  526.     }
  527.     else
  528.     {
  529.         return(FALSE);
  530.     }
  531.     return(TRUE);
  532. }
  533.  
  534. void docommand(char *command, int stack)
  535. {
  536.     BPTR ofh,ifh;
  537.  
  538.     if ( ofh=Open("NIL:",MODE_READWRITE) )
  539.     {
  540.         if ( ifh=Open("NIL:",MODE_READWRITE) )
  541.         {
  542.             if ( SystemTags(    command,
  543.                         SYS_Input, ifh,
  544.                         SYS_Output, ofh,
  545.                         SYS_UserShell, DOSTRUE,
  546.                         SYS_Asynch, DOSTRUE,
  547.                         NP_StackSize, stack,
  548.                         NP_CopyVars, DOSTRUE,
  549.                         NP_Cli, DOSTRUE,
  550.                         TAG_END) != -1 )
  551.             {
  552.                 return;
  553.             }
  554.  
  555.             Close(ifh);
  556.         }
  557.         Close(ofh);
  558.     }
  559. }
  560.  
  561. BOOL makevars(void)
  562. {
  563.     if ( havemail=AllocVec(11*BIGSTRING,MEMF_CLEAR) )
  564.     {
  565.         nomail=havemail+BIGSTRING;
  566.         oldmail=nomail+BIGSTRING;
  567.         watch=oldmail+BIGSTRING;
  568.         iconname=watch+BIGSTRING;
  569.         clickcomname=iconname+BIGSTRING;
  570.         mailcomname=clickcomname+BIGSTRING;
  571.         dropcomname=mailcomname+BIGSTRING;
  572.         dropname=dropcomname+BIGSTRING;
  573.         droptemp=dropname+(2*BIGSTRING);
  574.         return(TRUE);
  575.     }
  576.     return(FALSE);
  577. }
  578.  
  579. void freevars(void)
  580. {
  581.     if (havemail) FreeVec(havemail);
  582. }
  583.  
  584.