home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / comm / net / amipop / source / pop_main.c < prev    next >
C/C++ Source or Header  |  1994-11-10  |  9KB  |  475 lines

  1. /* AmiPOP By Scott Ellis */
  2.  
  3. #include "pop.h"
  4.  
  5. static const char VersionID[]="\0$VER:AmiPOP 1.14 (10.11.94)";
  6.  
  7. /* Variables in pop.h */
  8.  
  9. char *pophost=NULL;
  10. char *username=NULL;
  11. char *password=NULL;
  12. char *passfake=NULL;
  13. char *maildir=NULL;
  14. char *cxname=NULL;
  15. char *cxdesc=NULL;
  16. char *hotkey=NULL;
  17. char *title=NULL;
  18. char *temp=NULL;
  19. char *buf=NULL;
  20. UBYTE *PubScreenName=NULL;
  21.  
  22. const char bum[]="Ok";
  23.  
  24. BOOL delmail=FALSE;
  25. BOOL checkper=FALSE;
  26. BOOL appfile=TRUE;
  27. BOOL winop=TRUE;
  28. BOOL notify=FALSE;
  29. BOOL immediate=FALSE;
  30. BOOL quiet=FALSE;
  31. BOOL once=FALSE;
  32.  
  33. int timecheck=10;
  34. int port=110;
  35.  
  36. struct MsgPort *amipop_mp=NULL;
  37. struct MsgPort *timer_mp=NULL;
  38. struct timerequest *timerio=NULL;
  39. CxObj *broker=NULL;
  40. struct Library *TimerBase=NULL;
  41. struct IntuitionBase *IntuitionBase=NULL;
  42. struct Library *GadToolsBase=NULL;
  43.  
  44.  
  45. struct NewBroker newbroker = {
  46.     NB_VERSION,   /* nb_Version - Version of the NewBroker structure */
  47.     "Not Active", /* nb_Name */
  48.     "Amiga POP © 1994 Scott Ellis",     /* nb_Title - Title of commodity that appears in CXExchange */
  49.     "Not Active", /* nb_Descr */
  50.     NBU_NOTIFY | NBU_UNIQUE ,            /* nb_Unique - Tells CX not to launch another commodity with same name */
  51.     COF_SHOW_HIDE,            /* nb_Flags - Tells CX if this commodity has a window */
  52.     0,            /* nb_Pri - This commodity's priority */
  53.     0,            /* nb_Port - MsgPort CX talks to */
  54.     0             /* nb_ReservedChannel - reserved for later use */
  55. };
  56.  
  57. struct EasyStruct ereq =
  58.     {
  59.     sizeof(struct EasyStruct),
  60.     0,
  61.     "AmiPOP Notice",
  62.     "%s",
  63.     "%s",
  64.     };
  65.  
  66. UWORD __chip waitPointer[] =
  67.     {
  68.     0x0000, 0x0000,     /* reserved, must be NULL */
  69.  
  70.     0x0400, 0x07C0,
  71.     0x0000, 0x07C0,
  72.     0x0100, 0x0380,
  73.     0x0000, 0x07E0,
  74.     0x07C0, 0x1FF8,
  75.     0x1FF0, 0x3FEC,
  76.     0x3FF8, 0x7FDE,
  77.     0x3FF8, 0x7FBE,
  78.     0x7FFC, 0xFF7F,
  79.     0x7EFC, 0xFFFF,
  80.     0x7FFC, 0xFFFF,
  81.     0x3FF8, 0x7FFE,
  82.     0x3FF8, 0x7FFE,
  83.     0x1FF0, 0x3FFC,
  84.     0x07C0, 0x1FF8,
  85.     0x0000, 0x07E0,
  86.  
  87.     0x0000, 0x0000,     /* reserved, must be NULL */
  88.     };
  89.  
  90. enum args
  91.     {
  92.     USERNAME,
  93.     PASSWORD,
  94.     POPHOST,
  95.     MAILDIR,
  96.     CHECKPER,
  97.     TIME,
  98.     DELETE,
  99.     APPEND,
  100.     NOWINDOW,
  101.     PORT,
  102.     NOTIFY,
  103.     CX_POPKEY,
  104.     IMMEDIATE,
  105.     QUIET,
  106.     PUBSCREEN,
  107.     ONCE
  108.     };
  109.  
  110. /* Configure SAS Specific routines */
  111.  
  112. void __regargs __chkabort(void) {}
  113. long __stack = 20000;
  114.  
  115. /* End SAS */
  116.  
  117. ULONG            sigmask=NULL;
  118. ULONG            cxsigflag=NULL;
  119. ULONG            timesigflag=NULL;
  120.  
  121. struct Library *IconBase;
  122. struct RDArgs   *RDA;
  123.  
  124. int main(int argc, char **argv)
  125. {
  126.     int foo=0;
  127.     ULONG    mysig;
  128.  
  129.     IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",37L);
  130.     GadToolsBase = OpenLibrary("gadtools.library",37L);
  131.  
  132.     if (GadToolsBase && IntuitionBase)
  133.     {
  134.         if (makevars())
  135.         {
  136.             freevars();
  137.             return(20);
  138.         }
  139.  
  140.         if ( parse(argc) )
  141.         {
  142.             if ( setuptime() )
  143.             {
  144.                 timesigflag = 1L << timer_mp->mp_SigBit;
  145.                 timereq();
  146.                 foo=1;
  147.  
  148.                 if ( setupcx() )
  149.                 {
  150.                     if (winop)
  151.                     {
  152.                         openup();
  153.                     }
  154.                 }
  155.                 else
  156.                 {
  157.                     foo=0;
  158.                 }
  159.             }
  160.         }
  161.         else
  162.         {
  163.             foo=0;
  164.         }
  165.  
  166.         if (once && foo)
  167.         {
  168.             MYGAD_BUTTONClicked();
  169.             foo=0;
  170.         }
  171.  
  172.         if (immediate && foo) MYGAD_BUTTONClicked(); /* Check mail immediately */
  173.  
  174.         while (foo)
  175.         {
  176.             if (winop)
  177.             {
  178.                 sigmask= 1 << Project0Wnd->UserPort->mp_SigBit ;
  179.             }
  180.             else
  181.             {
  182.                 sigmask= NULL;
  183.             }
  184.  
  185.             mysig=Wait ( sigmask | cxsigflag | timesigflag | SIGBREAKF_CTRL_C );
  186.  
  187.             if ( mysig & cxsigflag )
  188.             {
  189.                 foo=docx();
  190.             }
  191.                    if ( mysig & sigmask )
  192.             {
  193.                 foo=HandleProject0IDCMP();
  194.             }
  195.  
  196.             if ( mysig & timesigflag )
  197.             {
  198.                 if (checkper)
  199.                 {
  200.                     MYGAD_BUTTONClicked();
  201.                 }
  202.                 timereq();
  203.             }
  204.  
  205.             if (mysig & SIGBREAKF_CTRL_C )
  206.             {
  207.                 foo=0;
  208.             }
  209.         }
  210.  
  211.         closedown();
  212.  
  213.         closetime();
  214.  
  215.         closecx();
  216.  
  217.         freevars();
  218.  
  219.     }
  220.  
  221.     if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  222.     if (GadToolsBase) CloseLibrary(GadToolsBase);
  223.  
  224.     return(0);
  225. }
  226.  
  227. void openup(void)
  228. {
  229.     SetupScreen();
  230.     OpenProject0Window();
  231.  
  232.     winop=TRUE;
  233. }
  234.  
  235. void closedown(void)
  236. {
  237.     CloseProject0Window();
  238.     CloseDownScreen();
  239.  
  240.     winop=FALSE;
  241. }
  242.  
  243. BOOL parse( int argc )
  244. {
  245.     char    *OriginalTemplate =    "Username/K,Password/K,POPHost/K,MailDir/K,CheckPer/S,"
  246.                                 "Time/K/N,Delete/S,Append/S,NoWindow/S,Port/K/N,Notify/S,"
  247.                                 "Cx_Popkey/K,Immediate/S,Quiet/S,PubScreen/K,Once/S";
  248.  
  249.     LONG    *ArgumentArray;        /* array for storing arguments retrieved by */
  250.  
  251.     char    **ToolArrayIndex,    /* workbench tooltypes array */
  252.             *ToolStringIndex,    /* index into string of concatenated workbench tooltypes */
  253.             *Template;            /* readargs template - varies slightly for WB or CLI */
  254.  
  255.     struct DiskObject    *DiskObject;    /* pointer to diskobject associated with program icon */
  256.     WORD    ArgCount = 1;        /* number of arguments in template */
  257.  
  258.     const char none[]="None Given";
  259.  
  260.     RDA = AllocDosObjectTags(DOS_RDARGS, TAG_DONE);
  261.     RDA->RDA_ExtHelp = NULL;
  262.  
  263.     Template = AllocVec(strlen(OriginalTemplate)+16,MEMF_CLEAR);
  264.  
  265.     for (    ToolStringIndex = OriginalTemplate;
  266.             ToolStringIndex = strchr(ToolStringIndex,',');
  267.             ToolStringIndex++, ArgCount++);
  268.  
  269.     ArgumentArray = AllocVec((ArgCount+1)*4,MEMF_CLEAR);
  270.  
  271.     if (argc==0)
  272.     {
  273.         if (IconBase = OpenLibrary("icon.library", 36L ) )
  274.         {
  275.  
  276.             CurrentDir(_WBenchMsg->sm_ArgList->wa_Lock);
  277.  
  278.             if (DiskObject = GetDiskObject(_WBenchMsg->sm_ArgList->wa_Name))
  279.             {
  280.                 for (    ToolArrayIndex = DiskObject->do_ToolTypes;
  281.                         *ToolArrayIndex;
  282.                         ToolArrayIndex++)
  283.                 {
  284.                     RDA->RDA_Source.CS_Length += (strlen(*ToolArrayIndex)+1);
  285.                 }
  286.  
  287.                 if (RDA->RDA_Source.CS_Length)
  288.                 {
  289.                     RDA->RDA_Source.CS_Buffer = AllocVec(RDA->RDA_Source.CS_Length+1,MEMF_CLEAR);
  290.                     ToolStringIndex = RDA->RDA_Source.CS_Buffer;
  291.  
  292.                     for (    ToolArrayIndex = DiskObject->do_ToolTypes;
  293.                             *ToolArrayIndex;
  294.                             ToolArrayIndex++)
  295.                     {
  296.                         ToolStringIndex = stpcpy(stpcpy(ToolStringIndex,*ToolArrayIndex)," ");
  297.                     }
  298.  
  299.                     *(ToolStringIndex-1) = '\n';
  300.                     FreeDiskObject(DiskObject);
  301.                 }
  302.             }
  303.  
  304.             stpcpy(stpcpy(Template,OriginalTemplate),",ThrowAway/M");
  305.  
  306.             CloseLibrary(IconBase);
  307.         }
  308.     }
  309.     else
  310.     {
  311.         strcpy(Template,OriginalTemplate);
  312.     }
  313.  
  314.     RDA = ReadArgs(Template,ArgumentArray,RDA);
  315.  
  316.     FreeVec(Template);
  317.  
  318.     if (RDA)
  319.     {
  320.         if (ArgumentArray[USERNAME])
  321.         {
  322.             strcpy(username,(char *)ArgumentArray[USERNAME]);
  323.         }
  324.         else
  325.         {
  326.             strcpy(username,none);
  327.         }
  328.  
  329.         if (ArgumentArray[PASSWORD])
  330.         {
  331.             strcpy(password,(char *)ArgumentArray[PASSWORD]);
  332.         }
  333.         else
  334.         {
  335.             strcpy(password,"");
  336.         }
  337.  
  338.         if (ArgumentArray[POPHOST])
  339.         {
  340.             strcpy(pophost,(char *)ArgumentArray[POPHOST]);
  341.         }
  342.         else
  343.         {
  344.             strcpy(pophost,none);
  345.         }
  346.  
  347.         if (ArgumentArray[MAILDIR])
  348.         {
  349.             strcpy(maildir,(char *)ArgumentArray[MAILDIR]);
  350.         }
  351.         else
  352.         {
  353.             strcpy(maildir,none);
  354.         }
  355.  
  356.         checkper=(BOOL)ArgumentArray[CHECKPER];
  357.  
  358.         if (ArgumentArray[TIME])
  359.         {
  360.             timecheck=*(int *)ArgumentArray[TIME];
  361.         }
  362.  
  363.         delmail=(BOOL)ArgumentArray[DELETE];
  364.         appfile=(BOOL)ArgumentArray[APPEND];
  365.         winop=!( (BOOL)ArgumentArray[NOWINDOW] );
  366.  
  367.         if (ArgumentArray[PORT])
  368.         {
  369.             port = *(int *)ArgumentArray[PORT];
  370.         }
  371.  
  372.         notify=(BOOL)ArgumentArray[NOTIFY];
  373.  
  374.         if (ArgumentArray[CX_POPKEY])
  375.         {
  376.             strcpy(hotkey,(char *)ArgumentArray[CX_POPKEY]);
  377.         }
  378.  
  379.         if (ArgumentArray[IMMEDIATE])
  380.         {
  381.             immediate=TRUE;
  382.         }
  383.  
  384.         if (ArgumentArray[QUIET])
  385.         {
  386.             quiet=TRUE;
  387.         }
  388.  
  389.         if (ArgumentArray[PUBSCREEN])
  390.         {
  391.             strcpy(PubScreenName,(UBYTE *)ArgumentArray[PUBSCREEN]);
  392.         }
  393.  
  394.         if (ArgumentArray[ONCE])
  395.         {
  396.             once=TRUE;
  397.         }
  398.  
  399.         FreeParameters(ArgumentArray);
  400.  
  401.         return(TRUE);
  402.     }
  403.     else
  404.     {
  405.         FreeParameters(ArgumentArray);
  406.  
  407.         return(FALSE);
  408.     }
  409. }
  410.  
  411. void FreeParameters(LONG *ArgumentArray)
  412. {
  413.     if (RDA)
  414.     {
  415.         if ((RDA->RDA_Source.CS_Length) && (RDA->RDA_Source.CS_Buffer))
  416.         {
  417.             FreeVec(RDA->RDA_Source.CS_Buffer);
  418.         }
  419.  
  420.         FreeArgs(RDA);
  421.         FreeDosObject(DOS_RDARGS,RDA);
  422.     }
  423.     else
  424.     {
  425.         PrintFault(IoErr(), NULL);
  426.     }
  427.  
  428.     if (ArgumentArray)
  429.     {
  430.         FreeVec(ArgumentArray);
  431.     }
  432. }
  433.  
  434.  
  435. int doreq( const char *mes, const char *but)
  436. {
  437.     LONG answer;
  438.  
  439.     if ( !quiet )
  440.     {
  441.         answer= EasyRequest(NULL, &ereq, NULL, mes, but);
  442.  
  443.         if (Project0Wnd)
  444.         {
  445.             SetWindowTitles(Project0Wnd,Project0Wdt, (UBYTE *) ~0);
  446.         }
  447.  
  448.         return(answer);
  449.     }
  450. }
  451.  
  452. BOOL makevars(void)
  453. {
  454.     if ( pophost=AllocVec((7*BIGSTRING)+(4*SMALLSTRING)+(2*BUFSIZE)+(256),MEMF_CLEAR) )
  455.     {
  456.         username=pophost+BIGSTRING;
  457.         password=username+SMALLSTRING;
  458.         passfake=password+SMALLSTRING;
  459.         maildir=passfake+SMALLSTRING;
  460.         cxname=maildir+BIGSTRING;
  461.         cxdesc=cxname+BIGSTRING;
  462.         hotkey=cxdesc+(3*BIGSTRING);
  463.         title=hotkey+BIGSTRING;
  464.         temp=title+256;
  465.         buf=temp+BUFSIZE;
  466.         PubScreenName=buf+BUFSIZE;
  467.         return(FALSE);
  468.     }
  469.     return(TRUE);
  470. }
  471.  
  472. void freevars(void)
  473. {
  474.     if (pophost) FreeVec(pophost);
  475. }