home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / comm / ums / SUMSTools.lha / UMS / Tools / SUMSTools / Source / sumsexport.c < prev    next >
C/C++ Source or Header  |  1995-08-03  |  4KB  |  210 lines

  1.  
  2. #include "sumstl.h"
  3.  
  4. #include <stdio.h>
  5. #include <ctype.h>
  6.  
  7. #ifdef __SASC
  8. #include <dos.h>
  9. #endif
  10.  
  11. #include "umsfilter.h"
  12. #include "date.h"
  13.  
  14. /* SMAKE */
  15.  
  16.  
  17. /*** version string ***/
  18. static char VersionString[] = "$VER: sumsexport "VERSION;
  19.  
  20. static char UsageString[] = "\
  21.      U=User            : user name.\n\
  22.      P=Password        : user's password.\n\
  23.     FI=Filter          : filter specification.\n\
  24.      O=SetExportedFlag : if existing, exported flag is set.\n\
  25.      B=Backwards       : if existing, messages are scanned backwards.\n\
  26.      S=Server          : server name.\n\n\
  27. ";
  28.  
  29.  
  30. /*** template ***/
  31. static char *TemplateString = "U=User=Name/A,P=Password/A,FI=Filter/A,E=SetExportedFlag/S,B=Backwards/S,S=Server/K";
  32. enum opts {
  33.     OPT_USER, OPT_PASSWORD, OPT_FILTER, OPT_SETEXPORTEDFLAG, OPT_BACKWARDS, OPT_SERVER,
  34.     OPT_COUNT};
  35. static LONG opts[OPT_COUNT];
  36.  
  37.  
  38.  
  39.  
  40. /*** global vars ***/
  41. extern struct DosLibrary *DOSBase;
  42. struct Library *UMSBase=NULL;
  43.  
  44. static char filteradd[] = " AND readaccess=1 AND viewaccess=1";
  45.  
  46. #define FILTERADDSTR  filteradd
  47. #define NULLFILTERSTR (&filteradd[5])
  48. #define FILTERADDLEN  35
  49.  
  50.  
  51. /*** break stuff ***/
  52. int brk(void)
  53. {
  54.     return(0);
  55. }
  56.  
  57. #define ABORTED (SetSignal(0, 0) & SIGBREAKF_CTRL_C)
  58.  
  59.  
  60. /*** main ***/
  61. int main(int argc, char *argv[])
  62. {
  63.     ULONG erg = RETURN_ERROR, umserr=0;
  64.     struct RDArgs *args_ptr;
  65.  
  66.     onbreak(brk);
  67.  
  68.     if(argc<2 || *argv[1] == '?')
  69.     {
  70.         fprintf(stderr, "\33[1m%s\33[0m, written by Klaus Melchior, Public Domain.\n\nTemplate: %s\n%s", &VersionString[6], TemplateString, UsageString);
  71.     }
  72.  
  73.     {
  74.         int i;
  75.  
  76.         for (i=0; i<OPT_COUNT; i++)
  77.             opts[i]=NULL;
  78.     }
  79.  
  80.     if(args_ptr = ReadArgs(TemplateString, opts, NULL))
  81.     {
  82.         char *filter;
  83.         int direction = 1;
  84.         BOOL set_exported;
  85.  
  86.         set_exported = opts[OPT_SETEXPORTEDFLAG];
  87.  
  88.         if(opts[OPT_BACKWARDS])
  89.             direction = -1;
  90.  
  91.         if(!(filter = malloc(strlen((char *)(opts[OPT_FILTER]))+FILTERADDLEN)))
  92.         {
  93.             fprintf(stderr, "\7Out of memory.\n");
  94.             FreeArgs(args_ptr);
  95.             return(20);
  96.         }
  97.  
  98.         if(opts[OPT_FILTER] && *(char *)opts[OPT_FILTER])
  99.         {
  100.             strcpy(filter, (char *)opts[OPT_FILTER]);
  101.             strcat(filter, FILTERADDSTR);
  102.         }
  103.         else
  104.         {
  105.             strcpy(filter, NULLFILTERSTR);
  106.         }
  107.  
  108.         if(UMSBase = OpenLibrary(UMSNAME, UMSVERSION))
  109.         {
  110.             UMSAccount acc;
  111.  
  112.             if(acc = UMSRLogin((char *)opts[OPT_SERVER], (char *)opts[OPT_USER], (char *)opts[OPT_PASSWORD]))
  113.             {
  114.                 int fi;
  115.                 char *text_fields[UMSNUMFIELDS];
  116.  
  117.                 if(!(fi = UmsFilterExpression(filter, acc, 0, 0, 1)))
  118.                 {
  119.                     ULONG nr=0, date, count=0;
  120.  
  121.                     erg = RETURN_OK;
  122.                     while((!umserr) && (nr = UMSSearchTags(acc,
  123.                                 UMSTAG_SearchLast     , nr,
  124.                                 UMSTAG_SearchLocal    , TRUE,
  125.                                 UMSTAG_SearchMask     , 1,
  126.                                 UMSTAG_SearchMatch    , 1,
  127.                                 UMSTAG_SearchDirection, direction,
  128.                                 TAG_DONE)) )
  129.                     {
  130.                         if(ABORTED)
  131.                         {
  132.                             fprintf(stderr, "\7*** User break.\n");
  133.                             erg = RETURN_WARN;
  134.                             break;
  135.                         }
  136.  
  137.                         if(UMSReadMsgTags(acc,
  138.                             UMSTAG_RMsgNum    , nr,
  139.                             UMSTAG_RMsgDate   , &date,
  140.                             UMSTAG_RTextFields, text_fields,
  141.                             UMSTAG_RReadAll   , TRUE,
  142.                             UMSTAG_RNoUpdate  , TRUE,
  143.                             TAG_DONE))
  144.                         {
  145.                             int i;
  146.  
  147.                             /*** UMS specific format ***/
  148.                             printf("?Date %8ld%c", date, 0);
  149.  
  150.                             for(i=1; i<UMSNUMFIELDS; i++)
  151.                                 if(text_fields[i])
  152.                                     printf("%c%s%c", i + 64, text_fields[i], 0);
  153.  
  154.                             if(text_fields[UMSCODE_MsgText])
  155.                                 printf("%c%s%c", UMSCODE_MsgText + 64, text_fields[UMSCODE_MsgText], 0);
  156.  
  157.                             printf("%c", 0);
  158.  
  159.                             count++;
  160.                             UMSFreeMsg(acc, nr);
  161.  
  162.                             if(set_exported)
  163.                                 UMSExportedMsg(acc, nr);
  164.  
  165.                             umserr = UMSErrNum(acc);
  166.                         }
  167.  
  168.                     }
  169.  
  170.                     if(umserr)
  171.                     {
  172.                         fprintf(stderr, "UMS-Error %d: %s\n", UMSErrNum(acc), UMSErrTxt(acc));
  173.                         erg = RETURN_WARN;
  174.  
  175.                         /* kludge for bad behavior of UMSSearchTags() */
  176.                         if(umserr==UMSERR_ServerTerminated)
  177.                             erg = RETURN_ERROR;
  178.                     }
  179.                     else
  180.                     {
  181.                         fprintf(stderr, "Exported %ld message(s).\n", count);
  182.                         if(!count)
  183.                             erg = RETURN_WARN;
  184.                     }
  185.                 }
  186.                 else
  187.                     fprintf(stderr, "\7Expression Error %ld\n", fi);
  188.  
  189.                 UMSLogout(acc);
  190.             }
  191.             else
  192.                 fprintf(stderr, "\7UMS-Login failed.\n");
  193.  
  194.             CloseLibrary(UMSBase);
  195.         }
  196.         else
  197.             fprintf(stderr,"\7Could not open ums.library V10.\n");
  198.  
  199.         FreeArgs(args_ptr);
  200.     }
  201.     else
  202.     {
  203.         PrintFault(IoErr(), NULL);
  204.  
  205.         return(RETURN_ERROR);
  206.     }
  207.  
  208.     return(erg);
  209. }
  210.