/* WIDE AREA INFORMATION SERVER SOFTWARE:
   Developed by Thinking Machines Corporation and put into the public
   domain with no guarantees or restrictions.
*/

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

#ifndef _H_WAIS_protocol_
#define _H_WAIS_protocol_

#include "cdialect.h"
#include "zprot.h"
#include "ztype1.h"

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



#ifndef DF_INDEPENDENT
#define	DF_INDEPENDENT		1
#define DF_LATER		2
#define DF_EARLIER		3
#define DF_SPECIFIED_RANGE	4
#endif


#define CT_document		0
#define CT_byte			1
#define CT_line			2
#define CT_paragraph	3


#define QT_RelevanceFeedbackQuery	"3"
#define QT_TextRetrievalQuery		QT_BooleanQuery


#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


#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


#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 { 
	any*	DocumentID;
	char*   Type;
	long	ChunkCode;
	union {
		long	Pos;
		any*	ID;
	} ChunkStart;
	union {
		long	Pos;
		any*	ID;
	} ChunkEnd;
	} DocObj;
	
/*----------------------------------------------------------------------*/


typedef struct WAISInitResponse {
	long				ChunkCode;
	long				ChunkIDLength;
	char*				ChunkMarker;
	char*				HighlightMarker;
	char* 				DeHighlightMarker;
	char*				NewlineCharacters;
	
	} 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;

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


#ifdef __cplusplus

extern "C"
	{
#endif 

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

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

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

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

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

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

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

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

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

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

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

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

#ifdef __cplusplus
	}
#endif 

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

#endif