/*							HTVMS_WAISProt.h
**
**	Adaptation for Lynx by F.Macrides (macrides@sci.wfeb.edu)
**
**	31-May-1994 FM	Initial version.
**
**----------------------------------------------------------------------*/

/*
**	Routines originally from WProt.h -- FM
**
**----------------------------------------------------------------------*/
/* WIDE AREA INFORMATION SERVER SOFTWARE:
   No guarantees or restrictions.  See the readme file for the full standard
   disclaimer.	
  
   3.26.90	Harry Morris, morris@think.com
   3.30.90  Harry Morris 
   			-	removed chunk code from WAISSearchAPDU,
   			-	added makeWAISQueryType1Query() and readWAISType1Query() which
   				replace makeWAISQueryTerms() and makeWAISQueryDocs().
   4.11.90  HWM - added definitions of wais element set names
   4.14.90  HWM - changed symbol for relevance feedback query from QT_3 to 
   				  QT_RelevanceFeedbackQuery added QT_TextRetrievalQuery as a
   				  synonym for QT_BooleanQuery
				- renamed makeWAISType1Query() to makeWAISTextQuery()
				  renamed readWAISType1Query() to readWAISTextQuery()
   5.29.90  TS - added CSTFreeWAISFoo functions
*/

#ifndef _H_WAIS_protocol_
#define _H_WAIS_protocol_

#include <HTUtils.h>
#include <HTVMS_WaisUI.h>

/*----------------------------------------------------------------------*/
/* Data types / constants */

/* date factor constants */
#define	DF_INDEPENDENT		1
#define DF_LATER		2
#define DF_EARLIER		3
#define DF_SPECIFIED_RANGE	4

/* chunk types */
#define CT_document		0
#define CT_byte			1
#define CT_line			2
#define CT_paragraph	3

/* relevance feedback query */
#define QT_RelevanceFeedbackQuery	"3"
#define QT_TextRetrievalQuery		QT_BooleanQuery

/* new data tags */
#define DT_UserInformationLength	(data_tag)99
#define	DT_ChunkCode			(data_tag)100
#define	DT_ChunkIDLength		(data_tag)101
#define	DT_ChunkMarker			(data_tag)102
#define	DT_HighlightMarker		(data_tag)103
#define	DT_DeHighlightMarker		(data_tag)104
#define	DT_NewlineCharacters		(data_tag)105
#define	DT_SeedWords			(data_tag)106
#define	DT_DocumentIDChunk		(data_tag)107
#define	DT_ChunkStartID			(data_tag)108
#define	DT_ChunkEndID			(data_tag)109
#define	DT_TextList			(data_tag)110
#define	DT_DateFactor			(data_tag)111
#define	DT_BeginDateRange		(data_tag)112
#define	DT_EndDateRange			(data_tag)113
#define	DT_MaxDocumentsRetrieved	(data_tag)114
#define	DT_SeedWordsUsed		(data_tag)115
#define	DT_DocumentID			(data_tag)116
#define	DT_VersionNumber		(data_tag)117
#define	DT_Score			(data_tag)118
#define	DT_BestMatch			(data_tag)119
#define	DT_DocumentLength		(data_tag)120
#define	DT_Source			(data_tag)121
#define	DT_Date				(data_tag)122
#define	DT_Headline			(data_tag)123
#define	DT_OriginCity			(data_tag)124
#define	DT_PresentStartByte		(data_tag)125
#define	DT_TextLength			(data_tag)126
#define	DT_DocumentText			(data_tag)127
#define	DT_StockCodes			(data_tag)128
#define	DT_CompanyCodes			(data_tag)129
#define	DT_IndustryCodes		(data_tag)130

/* added by harry */
#define DT_DocumentHeaderGroup		(data_tag)150
#define DT_DocumentShortHeaderGroup	(data_tag)151
#define DT_DocumentLongHeaderGroup	(data_tag)152
#define DT_DocumentTextGroup		(data_tag)153
#define DT_DocumentHeadlineGroup 	(data_tag)154
#define DT_DocumentCodeGroup		(data_tag)155
#define DT_Lines					(data_tag)131 
#define	DT_TYPE_BLOCK				(data_tag)132
#define DT_TYPE						(data_tag)133

/* wais element sets */
#define ES_DocumentHeader		"Document Header"
#define ES_DocumentShortHeader	"Document Short Header"
#define ES_DocumentLongHeader	"Document Long Header"
#define ES_DocumentText			"Document Text"
#define ES_DocumentHeadline		"Document Headline"
#define ES_DocumentCodes		"Document Codes"

typedef struct DocObj { /* specifies a section of a document */
	any*	DocumentID;
	char*   Type;
	long	ChunkCode;
	union {
		long	Pos;
		any*	ID;
	} ChunkStart;
	union {
		long	Pos;
		any*	ID;
	} ChunkEnd;
	} DocObj;
	
/*----------------------------------------------------------------------*/
/* WAIS APDU extensions */

typedef struct WAISInitResponse {
	long				ChunkCode;
	long				ChunkIDLength;
	char*				ChunkMarker;
	char*				HighlightMarker;
	char* 				DeHighlightMarker;
	char*				NewlineCharacters;
	/* XXX  need to add UpdateFrequency and Update Time */
	} WAISInitResponse;

typedef struct WAISSearch {
	char*				SeedWords;
	DocObj**			Docs;
	char**				TextList;
	long				DateFactor;
	char*				BeginDateRange;
	char*				EndDateRange;
	long				MaxDocumentsRetrieved;
	} WAISSearch;

typedef struct WAISDocumentHeader {
	any*				DocumentID;
	long				VersionNumber;
	long				Score;     
	long				BestMatch; 
	long				DocumentLength;
	long 				Lines;
	char**				Types;
	char*				Source;
	char*				Date;
	char*				Headline;
	char*				OriginCity;
	} WAISDocumentHeader;

typedef struct WAISDocumentShortHeader {
	any*				DocumentID;
	long				VersionNumber;
	long				Score;     
	long				BestMatch; 
	long				DocumentLength;
	long 				Lines;
 	} WAISDocumentShortHeader;
 
typedef struct WAISDocumentLongHeader {
	any*				DocumentID;
	long				VersionNumber;
	long				Score;     
	long				BestMatch; 
	long				DocumentLength;
	long 				Lines;
	char**				Types;
	char*				Source;
	char*				Date;
	char*				Headline;
	char*				OriginCity;
	char*				StockCodes;
	char* 				CompanyCodes;
	char*				IndustryCodes;
 	} WAISDocumentLongHeader;

typedef struct WAISDocumentText {
	any*				DocumentID;
	long				VersionNumber;
	any*				DocumentText;
	} WAISDocumentText;
	
typedef struct WAISDocumentHeadlines {
	any*				DocumentID;
	long				VersionNumber;
	char*				Source;
	char*				Date;
	char*				Headline;
	char*				OriginCity;
	} WAISDocumentHeadlines;
	
typedef struct WAISDocumentCodes {
	any*				DocumentID;
	long				VersionNumber;
	char*				StockCodes;
	char*				CompanyCodes;
	char*				IndustryCodes;
	} WAISDocumentCodes;
	
typedef struct WAISSearchResponse {
	char*			       		SeedWordsUsed;
	WAISDocumentHeader** 		DocHeaders;
	WAISDocumentShortHeader** 	ShortHeaders;
	WAISDocumentLongHeader** 	LongHeaders;
	WAISDocumentText**			Text;
	WAISDocumentHeadlines**		Headlines;
	WAISDocumentCodes**			Codes;
	diagnosticRecord**			Diagnostics;
	} WAISSearchResponse;

/*----------------------------------------------------------------------*/
/* Functions */

char *
generate_search_apdu PARAMS((char* buff,  /* buffer to hold the apdu */
			  long *buff_len, /* number of bytes written to the buffer */
			  char *seed_words, /* string of the seed words */
			  char *database_name,
			  DocObj** docobjs,
			  long maxDocsRetrieved
			  ));

DocObj* makeDocObjUsingWholeDocument PARAMS((any* aDocID,char* type));
DocObj* makeDocObjUsingBytes PARAMS((any* aDocID,char* type,long start,long end));
DocObj* makeDocObjUsingLines PARAMS((any* aDocID,char* type,long start,long end));
DocObj* makeDocObjUsingParagraphs PARAMS((any* aDocID,char* type,any* start,any* end));
void freeDocObj PARAMS((DocObj* doc));

WAISInitResponse* makeWAISInitResponse PARAMS((long chunkCode,long chunkIDLen,
					    char* chunkMarker,char* highlightMarker,
					    char* deHighlightMarker,char* newLineChars));
void freeWAISInitResponse PARAMS((WAISInitResponse* init));

WAISSearch* makeWAISSearch PARAMS((
	char* seedWords,DocObj** docs,char** textList,
	long dateFactor,char* beginDateRange,char* endDateRange,
	long maxDocsRetrieved));
void freeWAISSearch PARAMS((WAISSearch* query));

WAISDocumentHeader* makeWAISDocumentHeader PARAMS((
	any* aDocID,long versionNumber,long score,long bestMatch,long docLen,
	long lines,char** types,char* source,char* date,char* headline,char* originCity));
void freeWAISDocumentHeader PARAMS((WAISDocumentHeader* header));
char* writeWAISDocumentHeader PARAMS((WAISDocumentHeader* header,char* buffer,long* len));
char* readWAISDocumentHeader PARAMS((WAISDocumentHeader** header,char* buffer));

WAISDocumentShortHeader* makeWAISDocumentShortHeader PARAMS((
	any* aDocID,long versionNumber,long score,long bestMatch,long docLen,long lines));
void freeWAISDocumentShortHeader PARAMS((WAISDocumentShortHeader* header));
char* writeWAISDocumentShortHeader PARAMS((WAISDocumentShortHeader* header,
                                   char* buffer,long* len));
char* readWAISDocumentShortHeader PARAMS((WAISDocumentShortHeader** header,char* buffer));

WAISDocumentLongHeader* makeWAISDocumentLongHeader PARAMS((
	any* aDocID,long versionNumber,long score,long bestMatch,long docLen,
	long lines,char** types,char* source,char* date, char* headline,char* originCity,
	char* stockCodes,char* companyCodes,char* industryCodes));
void freeWAISDocumentLongHeader PARAMS((WAISDocumentLongHeader* header));
char* writeWAISDocumentLongHeader PARAMS((WAISDocumentLongHeader* header,char* buffer,long* len));
char* readWAISDocumentLongHeader PARAMS((WAISDocumentLongHeader** header,char* buffer));

WAISSearchResponse* makeWAISSearchResponse PARAMS((
	char* seedWordsUsed,WAISDocumentHeader** docHeaders,
	WAISDocumentShortHeader** shortHeaders,
	WAISDocumentLongHeader** longHeaders,
	WAISDocumentText** text,WAISDocumentHeadlines** headlines,
	WAISDocumentCodes** codes,
	diagnosticRecord** diagnostics));
void freeWAISSearchResponse PARAMS((WAISSearchResponse* response));

WAISDocumentText* makeWAISDocumentText PARAMS((any* aDocID,long versionNumber,
				       any* documentText));
void freeWAISDocumentText PARAMS((WAISDocumentText* docText));
char* writeWAISDocumentText PARAMS((WAISDocumentText* docText,char* buffer,long* len));
char* readWAISDocumentText PARAMS((WAISDocumentText** docText,char* buffer));

WAISDocumentHeadlines* makeWAISDocumentHeadlines PARAMS((
	any* aDocID,long versionNumber,char* source,char* date,char* headline,
	char* originCity));
void freeWAISDocumentHeadlines PARAMS((WAISDocumentHeadlines* docHeadline));
char* writeWAISDocumentHeadlines PARAMS((WAISDocumentHeadlines* docHeadline,char* buffer,long* len));
char* readWAISDocumentHeadlines PARAMS((WAISDocumentHeadlines** docHeadline,char* buffer));

WAISDocumentCodes* makeWAISDocumentCodes PARAMS((
	any* aDocID,long versionNumber,char* stockCodes,char* companyCodes,
	char* industryCodes));
void freeWAISDocumentCodes PARAMS((WAISDocumentCodes* docCodes));
char* writeWAISDocumentCodes PARAMS((WAISDocumentCodes* docCodes,char* buffer,long* len));
char* readWAISDocumentCodes PARAMS((WAISDocumentCodes** docCodes,char* buffer));

any* makeWAISTextQuery PARAMS((DocObj** docs));
DocObj** readWAISTextQuery PARAMS((any* terms));

void CSTFreeWAISInitResponse PARAMS((WAISInitResponse* init));
void CSTFreeWAISSearch PARAMS((WAISSearch* query));
void CSTFreeDocObj PARAMS((DocObj* doc));
void CSTFreeWAISDocumentHeader PARAMS((WAISDocumentHeader* header));
void CSTFreeWAISDocumentShortHeader PARAMS((WAISDocumentShortHeader* header));
void CSTFreeWAISDocumentLongHeader PARAMS((WAISDocumentLongHeader* header));
void CSTFreeWAISSearchResponse PARAMS((WAISSearchResponse* response));
void CSTFreeWAISDocumentText PARAMS((WAISDocumentText* docText));
void CSTFreeWAISDocHeadlines PARAMS((WAISDocumentHeadlines* docHeadline));
void CSTFreeWAISDocumentCodes PARAMS((WAISDocumentCodes* docCodes));
void CSTFreeWAISTextQuery PARAMS(( any* query));

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

#endif /* ndef _H_WAIS_protocol_ */


/*
**	Routines originally from WMessage.h -- FM
**
**----------------------------------------------------------------------*/
/* WIDE AREA INFORMATION SERVER SOFTWARE
   No guarantees or restrictions.  See the readme file for the full standard
   disclaimer.    
   3.26.90
*/

/* wais-message.h
 *
 * This is the header outside of WAIS Z39.50 messages.  The header will be
 * printable ascii, so as to be transportable.  This header will precede each
 * Z39.50 APDU, or zero-length message if it is an ACK or NACK.  Be sure to
 * change hdr_vers current value if you change the structure of the header.
 *
 * The characters in the header are case insensitive so that the systems from
 * the past that only handle one case can at least read the header.
 *
 * 7.5.90 HWM - added constants
 * 7/5/90 brewster added funtion prototypes and comments
 * 11/30/90 HWM - went to version 2 (inits and typed retrieval)
 */

#ifndef WMESSAGE_H
#define WMESSAGE_H

#include <HTUtils.h>
#include <HTVMS_WaisUI.h>

typedef struct wais_header {
        char    msg_len[10];    /* length in bytes of following message */
        char    msg_type;       /* type of message: 'z'=Z39.50 APDU,
                                   'a'=ACK, 'n'=NACK */
        char    hdr_vers;       /* version of this header, currently = '2' */
        char    server[10];     /* name or address of server */
        char    compression;    /* <sp>=no compression, 'u'=unix compress */
        char    encoding;       /* <sp>=no encoding, 'h'=hexize, 
				   'u'=uuencode */
        char    msg_checksum;   /* XOR of every byte of message */
        } WAISMessage;

#define HEADER_LENGTH 	25	/* number of bytes needed to write a 
				   wais-header (not sizeof(wais_header)) */

#define HEADER_VERSION 	(long)'2'

/* message type */
#define Z3950			'z'  
#define ACK			'a'  
#define	NAK			'n'  

/* compression */
#define NO_COMPRESSION 		' ' 
#define UNIX_COMPRESSION 	'u' 

/* encoding */
#define NO_ENCODING		' '  
#define HEX_ENCODING	'h'  /* Swartz 4/3 encoding */
#define IBM_HEXCODING	'i'	 /* same as h but uses characters acceptable for IBM mainframes */
#define UUENCODE		'u'  


void readWAISPacketHeader PARAMS((char* msgBuffer,WAISMessage *header_struct));
long getWAISPacketLength PARAMS((WAISMessage* header));
void writeWAISPacketHeader PARAMS((char* header,long dataLen,long type,
				char* server,long compression,	
				long encoding,long version));

#endif /* ndef WMESSAGE_H */
