/*****************************************************************************/
/*
                                  Dir.h
*/
/*****************************************************************************/

#ifndef DIR_H_LOADED
#define DIR_H_LOADED 1

#include "wasd.h"
#include "file.h"

/**************/
/* structures */
/**************/

#pragma __member_alignment __save
#pragma member_alignment

typedef struct DirTaskStruct DIR_TASK;

struct DirTaskStruct
{
   BOOL  /* query string directive */
         AsIfNopFound,
         /* query string directive */
         AsIfNosFound,
         /* disables auto-scripting appending version */
         AutoScriptEnabled,
         /* */
         DirFormatBlockTotals,
         /* the original specification's file/type/version was not empty */
         DirSpecIncludedFilePart,
         /* directory style is formatted by table elements */
         DirStyleTabular,
         /* present a directory listing ("Index of") in a VMS-style */
         FormatLikeVms,
         /* make icon a plain-text link */
         IconLinkEnabled,
         /* query string directive */
         IncludeAnyReadme,
         /* */
         ListParentDir,
         /* */
         ListSubDir,
         /* make the file description a link */
         MakeDescriptionLink,
         /* allow query string to override .WWW_WASD */
         QueryOverride,
         /* HTTP header generated by directory lisitng, i.e. not embedded */
         ResponseHeaderSent,
         /* do not display the file's type (e.g. ".TXT") */
         ShowNoType,
         /* force director and file names to upper-case */
         ShowUpperCase;

   int  /* for sortable listing */
        ColSpanCount,
        /* */
        DirAccessOkState,
        /* */
        DirAccessOkStatus,
        /* header, footer, both, none */
        DirDelimit,
        /* listing font monospace (D) or inherit */
        DirFont,
        /* historical styles of WASD lisitings */
        DirStyle,
        /* page title */
        DirTitle,
        /* */
        DirectoryCount,
        /* */
        LayoutFaoLength, 
        /* */
        LayoutHeadingLength, 
        /* */
        DirSpecLength,
        /* */
        FieldWidthCdt,
        /* */
        FieldWidthDescription,
        /* */
        FieldWidthName,
        /* */
        FieldWidthOwner,
        /* */
        FieldWidthProtection,
        /* */
        FieldWidthRdt,
        /* */
        FieldWidthSize,
        /* */
        FileCount,
        /* */
        ReadMeFileIndex,
        /* */
        SizeKilo,
        /* buffer for most recent task status */
        TaskStatusBuffer,
        /* number of versions of a single file */
        VersionCount,
        /* when version of this contains the length of the last file name */
        VersionLength,
        /* index directive to display a maximum of this number of versions */
        VersionsOf;

   unsigned long  /* for directory module, file's allocated blocks */
                  TotalAllocatedBlocks,
                  /* for directory module, file's used blocks */
                  TotalUsedBlocks;

   char  /* pointer to heap storage URL equivalent of directory */
         *DirectoryPathPtr,
         /* */
         *DirFormatParentDirPath,
         /* page title string literal (if non-NULL) */
         *DirTitlePtr,
         /* pointer to column headings string */
         *LayoutHeadingPtr,
         /* pointer to directory layout string */
         *LayoutPtr,
         /* pointer to sys$fao() directive string */
         *LayoutFaoPtr,
         /* pointer to message string describing subdirectory */
         *MsgSubDirPtr,
         /* pointer to request specified content-type */
         *QueryContentTypePtr,
         /* query string for directives */
         *QueryStringPtr,
         /* allocated memory containing series of null-terminated strings */
         *ThesePtr;
                  
   char  /* scratch space for file description */
         Description [256],
         /* directory part of file specification */
         DirectoryPart [ODS_MAX_FILE_NAME_LENGTH+1],
         /* directory specification */
         DirPath [ODS_MAX_FILE_NAME_LENGTH+1],
         /* sort at page load */
         DirSort [2+1],
         /* directory path specification */
         DirSpec [ODS_MAX_FILE_NAME_LENGTH+1],
         /* file part of file specification */
         FilePart [ODS_MAX_FILE_NAME_LENGTH+1],
         /* */
         LinkTarget [sizeof(" target=\"\"")+32],
         /* only when specified as "/dir1/dir2" this contains "./dir2/" */
         RealPath [ODS_MAX_FILE_NAME_LENGTH+1],
         /* prepended script name */
         ScriptName [SCRIPT_NAME_SIZE],
         /* when doing version of this contains the last file name */
         VersionName [ODS_MAX_FILE_NAME_LENGTH+1];

   /* */
   CONTENT_TYPE  ContentInfo;

   /* used for retrieving file size, dates, etc. */
   FILE_QIO  FileAcpData;

   /* "on-disk structure" supporting both ODS-2 and ODS-5 */
   ODS_STRUCT  SearchOds;

   /* pointers to functions, used for specifying the next/AST task */
   REQUEST_AST NextTaskFunction;
   REQUEST_AST DirAccessOkAstFunction;
   REQUEST_AST DirFormatAstFunction;
};

#pragma __member_alignment __restore

/***********************/
/* function prototypes */
/***********************/

DirAccessOk (REQUEST_STRUCT*);
DirAuthorizationAst (REQUEST_STRUCT*);
DirBegin (REQUEST_STRUCT*, REQUEST_AST, char*, char*, char*, BOOL);
DirBeginDirectories (REQUEST_STRUCT*);
DirBeginDirectoriesParseAst (REQUEST_STRUCT*);
DirBeginFiles (REQUEST_STRUCT*);
DirBeginFilesParseAst (REQUEST_STRUCT*);
DirDirectString (REQUEST_STRUCT*, char*);
DirDirectories (REQUEST_STRUCT*);
DirDirectoriesAccessOkAst (REQUEST_STRUCT*);
DirEnd (REQUEST_STRUCT*);
DirEndDescription (REQUEST_STRUCT*);
DirEndOutput (REQUEST_STRUCT*);
DirFiles (REQUEST_STRUCT*);
DirFilePart (REQUEST_STRUCT*);
DirFormat (REQUEST_STRUCT*, REQUEST_AST, char*, BOOL);
DirFormatAcpInfoAst (REQUEST_STRUCT*);
DirFormatLayout (REQUEST_STRUCT*);
int DirFormatSize (uint64, char*, int, struct dsc$descriptor*);
DirHeading (REQUEST_STRUCT*);
int DirHttpHeader (REQUEST_STRUCT*);
DirReadMe (REQUEST_STRUCT*, void(*NextTaskFunction)(REQUEST_STRUCT*));
int DirIndexOf (REQUEST_STRUCT*, char*, char*);
DirReadMeTop (REQUEST_STRUCT*);
DirReadMeBottom (REQUEST_STRUCT*);
DirSearchDirectories (REQUEST_STRUCT*);
DirSearchFiles (REQUEST_STRUCT*);
BOOL DirTheseFiles (REQUEST_STRUCT*);
char* DirTitleInteger (REQUEST_STRUCT*);
int DirWwwWasd (REQUEST_STRUCT*);

#endif /* DIR_H_LOADED */

/*****************************************************************************/
