
#include "sumstl.h"

#include <stdio.h>
#include <ctype.h>

#ifdef __SASC
#include <dos.h>
#endif

#include "umsfilter.h"
#include "date.h"

/* SMAKE */


/*** version string ***/
static char VersionString[] = "$VER: sumsexport "VERSION;

static char UsageString[] = "\
     U=User            : user name.\n\
     P=Password        : user's password.\n\
    FI=Filter          : filter specification.\n\
     O=SetExportedFlag : if existing, exported flag is set.\n\
     B=Backwards       : if existing, messages are scanned backwards.\n\
     S=Server          : server name.\n\n\
";


/*** template ***/
static char *TemplateString = "U=User=Name/A,P=Password/A,FI=Filter/A,E=SetExportedFlag/S,B=Backwards/S,S=Server/K";
enum opts {
	OPT_USER, OPT_PASSWORD, OPT_FILTER, OPT_SETEXPORTEDFLAG, OPT_BACKWARDS, OPT_SERVER,
	OPT_COUNT};
static LONG opts[OPT_COUNT];




/*** global vars ***/
extern struct DosLibrary *DOSBase;
struct Library *UMSBase=NULL;

static char filteradd[] = " AND readaccess=1 AND viewaccess=1";

#define FILTERADDSTR  filteradd
#define NULLFILTERSTR (&filteradd[5])
#define FILTERADDLEN  35


/*** break stuff ***/
int brk(void)
{
	return(0);
}

#define ABORTED (SetSignal(0, 0) & SIGBREAKF_CTRL_C)


/*** main ***/
int main(int argc, char *argv[])
{
	ULONG erg = RETURN_ERROR, umserr=0;
	struct RDArgs *args_ptr;

	onbreak(brk);

	if(argc<2 || *argv[1] == '?')
	{
		fprintf(stderr, "\33[1m%s\33[0m, written by Klaus Melchior, Public Domain.\n\nTemplate: %s\n%s", &VersionString[6], TemplateString, UsageString);
	}

	{
		int i;

		for (i=0; i<OPT_COUNT; i++)
			opts[i]=NULL;
	}

	if(args_ptr = ReadArgs(TemplateString, opts, NULL))
	{
		char *filter;
		int direction = 1;
		BOOL set_exported;

		set_exported = opts[OPT_SETEXPORTEDFLAG];

		if(opts[OPT_BACKWARDS])
			direction = -1;

		if(!(filter = malloc(strlen((char *)(opts[OPT_FILTER]))+FILTERADDLEN)))
		{
			fprintf(stderr, "\7Out of memory.\n");
			FreeArgs(args_ptr);
			return(20);
		}

		if(opts[OPT_FILTER] && *(char *)opts[OPT_FILTER])
		{
			strcpy(filter, (char *)opts[OPT_FILTER]);
			strcat(filter, FILTERADDSTR);
		}
		else
		{
			strcpy(filter, NULLFILTERSTR);
		}

		if(UMSBase = OpenLibrary(UMSNAME, UMSVERSION))
		{
			UMSAccount acc;

			if(acc = UMSRLogin((char *)opts[OPT_SERVER], (char *)opts[OPT_USER], (char *)opts[OPT_PASSWORD]))
			{
				int fi;
				char *text_fields[UMSNUMFIELDS];

				if(!(fi = UmsFilterExpression(filter, acc, 0, 0, 1)))
				{
					ULONG nr=0, date, count=0;

					erg = RETURN_OK;
					while((!umserr) && (nr = UMSSearchTags(acc,
					            UMSTAG_SearchLast     , nr,
					            UMSTAG_SearchLocal    , TRUE,
					            UMSTAG_SearchMask     , 1,
					            UMSTAG_SearchMatch    , 1,
								UMSTAG_SearchDirection, direction,
					            TAG_DONE)) )
					{
						if(ABORTED)
						{
							fprintf(stderr, "\7*** User break.\n");
							erg = RETURN_WARN;
							break;
						}

						if(UMSReadMsgTags(acc,
						    UMSTAG_RMsgNum    , nr,
							UMSTAG_RMsgDate   , &date,
						    UMSTAG_RTextFields, text_fields,
						    UMSTAG_RReadAll   , TRUE,
						    UMSTAG_RNoUpdate  , TRUE,
						    TAG_DONE))
						{
							int i;

							/*** UMS specific format ***/
							printf("?Date %8ld%c", date, 0);

							for(i=1; i<UMSNUMFIELDS; i++)
								if(text_fields[i])
									printf("%c%s%c", i + 64, text_fields[i], 0);

							if(text_fields[UMSCODE_MsgText])
								printf("%c%s%c", UMSCODE_MsgText + 64, text_fields[UMSCODE_MsgText], 0);

							printf("%c", 0);

							count++;
							UMSFreeMsg(acc, nr);

							if(set_exported)
								UMSExportedMsg(acc, nr);

							umserr = UMSErrNum(acc);
						}

					}

					if(umserr)
					{
						fprintf(stderr, "UMS-Error %d: %s\n", UMSErrNum(acc), UMSErrTxt(acc));
						erg = RETURN_WARN;

						/* kludge for bad behavior of UMSSearchTags() */
						if(umserr==UMSERR_ServerTerminated)
							erg = RETURN_ERROR;
					}
					else
					{
						fprintf(stderr, "Exported %ld message(s).\n", count);
						if(!count)
							erg = RETURN_WARN;
					}
				}
				else
					fprintf(stderr, "\7Expression Error %ld\n", fi);

				UMSLogout(acc);
			}
			else
				fprintf(stderr, "\7UMS-Login failed.\n");

			CloseLibrary(UMSBase);
		}
		else
			fprintf(stderr,"\7Could not open ums.library V10.\n");

		FreeArgs(args_ptr);
	}
	else
	{
		PrintFault(IoErr(), NULL);

		return(RETURN_ERROR);
	}

	return(erg);
}
