/* File access in libwww ** FILE ACCESS ** ** These are routines for local file access used by WWW browsers and servers. ** Implemented by HTFile.c. ** ** If the file is not a local file, then we pass it on to HTFTP in case it ** can be reached by FTP. */ #ifndef HTFILE_H #define HTFILE_H #include #include #ifndef HTML_H #include /* SCW */ #endif /* HTML_H */ /* ** Controlling globals ** ** These flags control how directories and files are represented as ** hypertext, and are typically set by the application from command ** line options, etc. */ extern int HTDirAccess; /* Directory access level */ #define HT_DIR_FORBID 0 /* Altogether forbidden */ #define HT_DIR_SELECTIVE 1 /* If HT_DIR_ENABLE_FILE exists */ #define HT_DIR_OK 2 /* Any accesible directory */ #define HT_DIR_ENABLE_FILE ".www_browsable" /* If exists, can browse */ extern int HTDirReadme; /* Include readme files in listing? */ /* Values: */ #define HT_DIR_README_NONE 0 /* No */ #define HT_DIR_README_TOP 1 /* Yes, first */ #define HT_DIR_README_BOTTOM 2 /* Yes, at the end */ #define HT_DIR_README_FILE "README" /* ** Convert filenames between local and WWW formats */ extern char * HTURLPath_toFile PARAMS((CONST char * name, BOOL expand_all)); extern char * HTnameOfFile_WWW PARAMS((CONST char * name, BOOL WWW_prefix, BOOL expand_all)); #define HTLocalName(name) HTnameOfFile_WWW(name,TRUE,TRUE) #define HTfullURL_toFile(name) HTnameOfFile_WWW(name,FALSE,TRUE) #define HTpartURL_toFile(name) HTnameOfFile_WWW(name,FALSE,FALSE) /* ** Make a WWW name from a full local path name */ extern char * WWW_nameOfFile PARAMS((CONST char * name)); /* ** Generate the name of a cache file */ extern char * HTCacheFileName PARAMS((CONST char * name)); /* ** Output directory titles ** ** This is (like the next one) used by HTFTP. It is common code to generate ** the title and heading 1 and the parent directory link for any anchor. ** ** changed to return TRUE if parent directory link was generated, ** FALSE otherwise - KW */ extern BOOL HTDirTitles PARAMS(( HTStructured * target, HTAnchor * anchor, BOOL tildeIsTop)); /* ** Check existence. */ extern int HTStat PARAMS(( CONST char * filename, struct stat * data)); /* Load a document. ** ---------------- */ extern int HTLoadFile PARAMS(( CONST char * addr, HTParentAnchor * anchor, HTFormat format_out, HTStream * sink)); /* ** Output a directory entry ** ** This is used by HTFTP.c for example -- it is a common routine for ** generating a linked directory entry. */ extern void HTDirEntry PARAMS(( HTStructured * target, /* in which to put the linked text */ CONST char * tail, /* last part of directory name */ CONST char * entry)); /* name of this entry */ /* ** HTSetSuffix: Define the representation for a file suffix ** ** This defines a mapping between local file suffixes and file content ** types and encodings. ** ** ON ENTRY, ** ** suffix includes the "." if that is important (normally, yes!) ** ** representation is MIME-style content-type ** ** encoding is MIME-style content-transfer-encoding ** (8bit, 7bit, etc) or HTTP-style content-encoding ** (gzip, compress etc.) ** ** quality an a priori judgement of the quality of such files ** (0.0..1.0) ** ** HTSetSuffix5 has one more parameter for a short description of the type ** which is otherwise derived from the representation: ** ** desc is a short textual description, or NULL ** ** Examples: HTSetSuffix(".ps", "application/postscript", "8bit", 1.0); ** Examples: HTSetSuffix(".psz", "application/postscript", "gzip", 1.0); ** A MIME type could also indicate a non-trivial encoding on its own ** ("application/x-compressed-tar"), but in that case don't use enconding ** to also indicate it but use "binary" etc. */ extern void HTSetSuffix5 PARAMS(( CONST char * suffix, CONST char * representation, CONST char * encoding, CONST char * desc, double quality)); #define HTSetSuffix(suff,rep,enc,q) HTSetSuffix5(suff, rep, enc, NULL, q) /* ** HTFileFormat: Get Representation and Encoding from file name. ** ** ON EXIT, ** ** return The represntation it imagines the file is in. ** ** *pEncoding The encoding (binary, 7bit, etc). See HTSetSuffix. */ extern HTFormat HTFileFormat PARAMS(( CONST char * filename, HTAtom ** pEncoding, CONST char ** pDesc)); /* ** HTCharsetFormat: Revise the file format in relation to the Lynx charset. ** ** This checks the format associated with an anchor for ** for an extended MIME Content-Type, and if a charset is ** indicated, sets Lynx up for proper handling in relation ** to the currently selected character set. - FM */ extern HTFormat HTCharsetFormat PARAMS(( HTFormat format, HTParentAnchor * anchor, int default_LYhndl)); /* Get various pieces of meta info from file name. ** ----------------------------------------------- ** ** LYGetFileInfo fills in information that can be determined without ** an actual (new) access to the filesystem, based on current suffix ** and character set configuration. If the file has been loaded and ** parsed before (with the same URL generated here!) and the anchor ** is still around, some results may be influenced by that (in ** particular, charset info from a META tag - this is not actually ** tested!). ** The caller should not keep pointers to the returned objects around ** for too long, the valid lifetimes vary. In particular, the returned ** charset string should be copied if necessary. If return of the ** file_anchor is requested, that one can be used to retrieve ** additional bits of info that are stored in the anchor object and ** are not covered here; as usual, don't keep pointers to the ** file_anchor longer than necessary since the object may disappear ** through HTuncache_current_document or at the next document load. ** - kw */ extern void LYGetFileInfo PARAMS(( CONST char * filename, HTParentAnchor ** pfile_anchor, HTFormat * pformat, HTAtom ** pencoding, CONST char** pdesc, CONST char** pcharset, int * pfile_cs)); /* ** Determine file value from file name. */ extern float HTFileValue PARAMS(( CONST char * filename)); /* ** Determine compression type from file name, by looking at its suffix. */ typedef enum { cftNone , cftCompress , cftGzip , cftBzip2 } CompressFileType; extern CompressFileType HTCompressFileType PARAMS(( char * filename, char * dots, char ** suffix)); /* ** Determine write access to a file. ** ** ON EXIT, ** ** return value YES if file can be accessed and can be written to. ** ** BUGS ** ** Isn't there a quicker way? */ #if defined(HAVE_CONFIG_H) #ifndef HAVE_GETGROUPS #define NO_GROUPS #endif #else #ifdef VMS #define NO_GROUPS #endif /* VMS */ #ifdef NO_UNIX_IO #define NO_GROUPS #endif /* NO_UNIX_IO */ #ifdef PCNFS #define NO_GROUPS #endif /* PCNFS */ #ifdef NOUSERS #define NO_GROUPS #endif /* PCNFS */ #endif /* HAVE_CONFIG_H */ extern BOOL HTEditable PARAMS((CONST char * filename)); /* Make a save stream. ** ------------------- */ extern HTStream * HTFileSaveStream PARAMS(( HTParentAnchor * anchor)); /* ** Determine a suitable suffix, given the representation. ** ** ON ENTRY, ** ** rep is the atomized MIME style representation ** enc is an encoding (8bit, binary, gzip, compress,..) ** ** ON EXIT, ** ** returns a pointer to a suitable suffix string if one has ** been found, else NULL. */ extern CONST char * HTFileSuffix PARAMS(( HTAtom* rep, CONST char* enc)); /* ** The Protocols */ #ifdef GLOBALREF_IS_MACRO extern GLOBALREF (HTProtocol,HTFTP); extern GLOBALREF (HTProtocol,HTFile); #else GLOBALREF HTProtocol HTFTP, HTFile; #endif /* GLOBALREF_IS_MACRO */ #endif /* HTFILE_H */ /* end of HTFile */