# include "showUMSfield.h"
char *vers = "\0$VER: "VERSION" ("__DATE__")";

/* Globale Variablen */
struct DosLibrary * DOSBase = NULL;
struct Library *UMSBase = NULL;
struct Library *UtilityBase = NULL;
struct Library *UMSSupportBase;
UMSUserAccount account=0L;



  // Bezeichnung der UMS_Fields.
  static char *ums_field[] = {
  "      MsgText",   // 0
  "     FromName",   // 1
  "     FromAddr",   // 2
  "       ToName",   // 3
  "       ToAddr",   // 4
  "        MsgID",   // 5
  " CreationDate",   // 6
  "  ReceiveDate",   // 7
  "      ReferID",   // 8
  "        Group",   // 9
  "      Subject",   //10
  "   Attributes",   //11
  "     Comments",   //12
  " Organization",   //13
  " Distribution",   //14
  "       Folder",   //15
  "       FidoID",   //16
  "       MausID",   //17
  "   ReplyGroup",   //18
  "    ReplyName",   //19
  "    ReplyAddr",   //20
  "LogicalToName",   //21
  "LogicalToAddr",   //22
  "     FileName",   //23
  "    RFCMsgNum",   //24
  "            ?",   //25
  "            ?",   //26
  "            ?",   //27
  "            ?",   //28
  "            ?",   //29
  "            ?",   //30
  "            ?",   //31
  "     FidoText",   //32
  "    ErrorText",   //33
  "   Newsreader",   //34
  "  RfcAttribut",   //35
  "  FtnAttribut",   //36
  "  ZerAttribut",   //37
  " MausAttribut",   //38
  "            ?",   //39
  "            ?" };

void main(void)
  {

  struct RDArgs  *readargs;
  LONG            rargs[5];

  LONG      HeaderLength;
  LONG      TextLength;
  LONG      Date;
  UMSMsgNum ChainUp;
  UMSMsgNum ChainDn;
  UMSMsgNum ChainLt;
  UMSMsgNum ChainRt;
  UMSSet    GlobalStatus;
  UMSSet    UserStatus;
  UMSSet    LoginStatus;
  UMSMsgNum HardLink;
  UMSMsgNum SoftLink;
  LONG      CDate;

  UMSMsgNum MsgNum=0, TmpMsgNum=0;
  UMSMsgTextFields MsgArray;

  ULONG result=0;
  int loop=0, full=0, text=0, fi=0;
  
  char buffer[256], filter[256];

  printf("\n[33m%s[0m  © by Christian Rütgers (%s)\n\n",VERSION,__DATE__);

  OpenIt();

  rargs[0] = 0L;
  rargs[1] = 0L;
  rargs[2] = 0L;
  rargs[3] = 0L;
  rargs[4] = 0L;

  if (!(readargs = ReadArgs("USER/A,PASSWORD/A,FI=FILTER/K,FULL/S,TEXT/S", rargs, NULL))) {
      PrintFault(IoErr(), NULL);
      CloseIt(RETURN_WARN);
      }

  if (rargs[2])
      strcpy(filter,(UBYTE *) rargs[2]);
  else
      strcpy(filter,"\0");

  if (rargs[3])
      full=1;
  else
      full=0;

  if (rargs[4])
      text=1;
  else
      text=0;


  account = UMSLogin((UBYTE *) rargs[0], (UBYTE *) rargs[1]);
  if (account == 0)
    {
    printf("Account fehlerhaft\n (showUMSfield nicht im Config oder Server läuft nicht?)\n");
    CloseIt(RETURN_WARN);
      }

  // Besser hier schon freigeben. Sonst muss es in CloseIt mit einer globalen Var.
  FreeArgs(readargs);

  if(onbreak(&BreakTrap)) printf("Kann Break Trap nicht installieren\n");

  /* Löschen aller Bits mit -1 (Tip von Stefan Stunz) */
    UMSSelectTags(account,UMSTAG_SelWriteLocal,TRUE,
                        UMSTAG_SelUnset     ,-1,
                        TAG_DONE);

   if(*filter) {
		if ((fi = UMSSupportFilterExpression(filter,account,0,0,1))) {
         printf("\7Expression Error %ld\n",fi);
         CloseIt(RETURN_ERROR);
         }
		}
   else {
        /* Select alle neuen Msgs */
        result=UMSSelectTags(account,UMSTAG_SelMask, UMSUSTATF_ViewAccess |
                                     UMSUSTATF_PostPoned |
                                     UMSUSTATF_Old,
                                     UMSTAG_SelMatch, UMSUSTATF_ViewAccess,
                                     UMSTAG_SelWriteLocal, TRUE,
                                     UMSTAG_SelSet,        (1L<<0),
                                     TAG_DONE);
        }

   MsgNum=1;
   TmpMsgNum=0;
   while(MsgNum)
      {
      MsgNum=UMSSearchTags(account,UMSTAG_SearchLocal, TRUE,
                                   UMSTAG_SearchDirection,1,
                                   UMSTAG_SearchMask,(1L),
                                   UMSTAG_SearchMatch,(1L),
                                   UMSTAG_SearchLast,TmpMsgNum,
                                   TAG_DONE);

      if(MsgNum) /* Und noch eine neue Nachricht  */
         {
         if(!ReadUMSMsgTags(account,UMSTAG_RMsgNum,MsgNum,
                                    UMSTAG_RNoUpdate,1,
                                    UMSTAG_RTextFields,MsgArray,
                                    UMSTAG_RHeaderLength, &HeaderLength,
                                    UMSTAG_RTextLength,  &TextLength,
                                    UMSTAG_RMsgDate,     &Date,
                                    UMSTAG_RChainUp,     &ChainUp,
                                    UMSTAG_RChainDn,     &ChainDn,
                                    UMSTAG_RChainLt,     &ChainLt,
                                    UMSTAG_RChainRt,     &ChainRt,
                                    UMSTAG_RGlobalFlags, &GlobalStatus,
                                    UMSTAG_RUserFlags,   &UserStatus,
                                    UMSTAG_RLoginFlags,  &LoginStatus,
                                    UMSTAG_RHardLink,    &HardLink,
                                    UMSTAG_RSoftLink,    &SoftLink,
                                    UMSTAG_RMsgCDate,    &CDate,
                                    UMSTAG_RReadAll,NULL,
                                    TAG_DONE))
            printf("Can't read Msg No.:%lu  UMS-Error: %s\n",MsgNum, UMSErrTxt(account));
         else {
          printf("-----------------------------------------------------------------------------\n");
          printf("[1mMessage Num: %lu[0m----------\n",MsgNum);
          for(loop=1;loop<=40;loop++) {
            if(MsgArray[loop])
              printf("%s: --%s--\n",ums_field[loop],MsgArray[loop]);
            }
            if(MsgArray[127])
              printf("TempFileName: --%s--\n",MsgArray[127]);
          if(full){
             printf("\n[1mFullMode:[0m---------\n");
             if(HeaderLength) printf(" HeaderLength: %lu byte\n", HeaderLength);
             if(TextLength)   printf("   TextLength: %lu byte\n", TextLength);
             if(Date)         printf("         Date: %s\n", UMS2AmigaDate( Date, buffer));
             if(CDate)        printf("        CDate: %s\n", UMS2AmigaDate( CDate, buffer));
             if(ChainUp)      printf("      ChainUp: %lu\n", ChainUp);
             if(ChainDn)      printf("      ChainDn: %lu\n", ChainDn);
             if(ChainLt)      printf("      ChainLt: %lu\n", ChainLt);
             if(ChainRt)      printf("      ChainRt: %lu\n", ChainRt);
             if(HardLink)     printf("     HardLink: %lu\n", HardLink);
             if(SoftLink)     printf("     SoftLink: %lu\n", SoftLink);
             if(GlobalStatus) printf(" GlobalStatus: %s\n",  ParseGlobalFlags(GlobalStatus, buffer));
             if(UserStatus)   printf("   UserStatus: %s\n", ParseUserFlags(UserStatus, buffer));
             if(LoginStatus)  printf("  LoginStatus: %s\n", ParseLocalFlags(LoginStatus, buffer));
             }
          if(text) {
            printf("\n[1mMessageText:[0m---------\n");
            printf("%s\n",MsgArray[0]);
            }
          FreeUMSMsg(account,MsgNum);
          }
      TmpMsgNum=MsgNum;
      }
    else
      printf("-----------------------------------------------------------------------------\n");
      // printf("No more Messages UMS-Error: %s\n", UMSErrTxt(account));
    }
    CloseIt(RETURN_OK);
  }

/* ------------------------------------------------------------------------ */

void OpenIt()
{
    if (!(DOSBase = (struct DosLibrary *) OpenLibrary("dos.library", 37))) {
      printf("Ohne OS 2.0 oder höher geschieht hier nix mehr! (Dosbase) \n");
      CloseIt(RETURN_FAIL);
      }
    else if (!(UMSBase = (struct Library *) OpenLibrary("ums.library", 0L))) {
      printf("Keine UMS Library gefunden!\n");
      CloseIt(RETURN_FAIL);
      }
   else if (!(UtilityBase = OpenLibrary("utility.library", 37))) {
      printf("Keine Utility Library gefunden!\n");
		CloseIt(RETURN_FAIL);
		}
	else if (!(UMSSupportBase = (struct Library *) OpenLibrary("umssupport.library",0))) {
      printf("Keine umssupport.library gefunden!\n");
		CloseIt(RETURN_FAIL);
      }
}

/* ------------------------------------------------------------------------ */

void CloseIt(int ret)
{
    UMSLogout(account);
    if(DOSBase) CloseLibrary((struct Library *) DOSBase);
    if(UMSSupportBase) CloseLibrary((struct Library *) UMSSupportBase);
    if(UMSBase) CloseLibrary((struct Library *) UMSBase);
    if(UtilityBase) CloseLibrary((struct Library *) UtilityBase);
    exit(ret);
}

/* ------------------------------------------------------------------------ */

int BreakTrap(void)
{
    printf("\nBREAK on ums2m\n");
    CloseIt(RETURN_WARN);
    return(0);
    }

/* ------------------------------------------------------------------------ */

char *UMS2AmigaDate(ULONG RecTime, char *buffer)
   {
   struct ClockData *clockdata;

   strcpy(buffer,"-");
   if (clockdata = AllocMem(sizeof(struct ClockData), MEMF_CLEAR))
       {
       Amiga2Date(RecTime, clockdata);
       sprintf(buffer,"%02d:%02d %02d.%02d.%d",
           clockdata->hour,clockdata->min, clockdata->mday, clockdata->month, clockdata->year );
       FreeMem(clockdata, sizeof(struct ClockData));
       }
   return (buffer);
   }

/* ------------------------------------------------------------------------ */

char *ParseGlobalFlags(ULONG flags, char *buffer)
   {
   strcpy(buffer,'\0');
   if (flags & UMSGSTATF_Deleted) strcat(buffer, "Deleted ");
   if (flags & UMSGSTATF_Expired ) strcat(buffer, "Expired ");
   if (flags & UMSGSTATF_Exported) strcat(buffer, "Exported ");
   if (flags & UMSGSTATF_Orphan) strcat(buffer, "Orphan ");
   if (flags & UMSGSTATF_Link) strcat(buffer, "Link ");
   if (flags & UMSGSTATF_HardLink) strcat(buffer, "Hardlink ");
   if (flags & UMSGSTATF_Parked) strcat(buffer, "Parked ");
   if (flags & UMSGSTATF_HasFile) strcat(buffer, "HasFile ");
   return (buffer);
   }

/* ------------------------------------------------------------------------ */

char *ParseUserFlags(ULONG flags, char *buffer)
   {
   strcpy(buffer,'\0');
   if (flags & UMSUSTATF_Archive    ) strcat(buffer, "Archive ");
   if (flags & UMSUSTATF_Junk       ) strcat(buffer, "Junk ");
   if (flags & UMSUSTATF_PostPoned  ) strcat(buffer, "PostPoned ");
   if (flags & UMSUSTATF_Selected   ) strcat(buffer, "Selected ");
   if (flags & UMSUSTATF_Filtered   ) strcat(buffer, "Filtered ");
   if (flags & UMSUSTATF_Old        ) strcat(buffer, "Old ");
   if (flags & UMSUSTATF_WriteAccess) strcat(buffer, "WriteAccess ");
   if (flags & UMSUSTATF_ReadAccess ) strcat(buffer, "ReadAccess ");
   if (flags & UMSUSTATF_ViewAccess ) strcat(buffer, "ViewAccess ");
   if (flags & UMSUSTATF_Owner      ) strcat(buffer, "Owner ");
   return (buffer);
   }

/* ------------------------------------------------------------------------ */

char *ParseLocalFlags(ULONG flags, char *buffer)
   {
   int i=0;
   char intbuf[30];

   strcpy(buffer,'\0');
   for (i=0;i<=15;i++) {
      if (flags & (1L<<i)) {
         sprintf(intbuf, "Bit%d ",i);
         strcat(buffer, intbuf);
         }
      }
   return (buffer);
   }

