/* -*- Mode: C; tab-width: 4 -*- */
#ifndef _XP_File_
#define _XP_File_
/*-----------------------------------------------------------------------------
XPFile.h
Cross-Platform File API
Macintosh file system is not organized in the same hierarchy as UNIX and PC
':' is a separator character instead of '/', '~', '/../' constructs do not
work. Basically, you cannot easily open a file using a pathname.
Because different types of files need to be stored in different
directories, the XP_FileOpen API takes a file type and file name as an
argument. Semantics of how file is opened vary with type.
"Personal" files are stored in the user's "home" directory (~ on unix,
launch point or system folder on Mac, dunno about Windows). File names
may be ignored since there's no reason for multiple personal files.
"Temporary" files are stored in /tmp or the equivalent
"URL" is the only type that allows access to anywhere on the disk
File Type File name Semantics
xpURL url part after file:/// Platform specific
without #aklsdf
xpGlobalHistory - Opens personal global history
xpKeyChain - Opens personal key chain
xpUserPrefs - Opens personal prefs file
xpCache name without path Opens a cache file
xpExtCache Fully qualified path Opens an external cache file
xpTemporary local filename Opens a temporary file
xpNewsrc - Opens a .newsrc file
xpSignature - Opens a .signature file
xpCertDB - Opens cert DB
xpCertDBNameIDX - Opens cert name index
xpKeyDB - Opens key DB
-----------------------------------------------------------------------------*/
#ifdef XP_UNIX
# include <dirent.h>
# include <sys/stat.h>
#endif /* XP_UNIX */
#ifdef XP_MAC
# ifndef _UNIX
# include <unix.h>
# endif
# include <Types.h>
# include <Files.h>
#endif /* XP_MAC */
#ifdef XP_WIN
# include "winfile.h"
#endif /* XP_WIN */
/*-----------------------------------------------------------------------------
Types - NOT prototypes
Protoypes go further down.
-----------------------------------------------------------------------------*/
typedef enum XP_FileType {
xpUserPrefs,
xpKeyChain,
xpGlobalHistory,
xpHotlist,
xpTemporary,
xpURL,
xpCache,
xpMimeTypes,
xpCacheFAT,
xpNewsRC,
xpSNewsRC,
xpTemporaryNewsRC,
xpNewsgroups,
xpSNewsgroups,
xpHTTPCookie,
xpProxyConfig,
xpSocksConfig,
xpSignature,
xpNewsrcFileMap,
xpFileToPost,
xpMailFolder,
xpMailFolderSummary,
xpMailSort, /* File that specifies which mail folders
to file which messages. */
xpMailPopState,
xpBookmarks,
xpCertDB,
xpCertDBNameIDX,
xpKeyDB,
xpSecModuleDB,
xpExtCache,
xpExtCacheIndex, /* index of external indexes */
xpXoverCache, /* Cache of XOVER files. This
filename always takes the form
"hostname/groupname" (except for calls
to XP_MakeDirectory, where it is just
"hostname").*/
xpEditColorScheme, /* ifdef EDITOR Families of "good" color combinations */
xpCryptoPolicy, /* Export Policy control file */
xpPKCS12File /* used for PKCS 12 certificate transport */
} XP_FileType;
#define XP_FILE_READ "r"
#define XP_FILE_READ_BIN "rb"
#define XP_FILE_WRITE "w"
#define XP_FILE_WRITE_BIN "wb"
#define XP_FILE_APPEND "a"
#define XP_FILE_APPEND_BIN "ab"
#define XP_FILE_UPDATE "r+"
#define XP_FILE_TRUNCATE "w+"
#ifdef SUNOS4
/* XXX SunOS4 hack -- make this universal by using r+b and w+b */
#define XP_FILE_UPDATE_BIN "r+"
#define XP_FILE_TRUNCATE_BIN "w+"
#else
#define XP_FILE_UPDATE_BIN "rb+"
#define XP_FILE_TRUNCATE_BIN "wb+"
#endif
#ifdef XP_MAC
#define XP_STAT_READONLY( statinfo ) (0)
#else
#define XP_STAT_READONLY( statinfo ) ((statinfo.st_mode & S_IWRITE) == 0)
#endif
typedef FILE * XP_File;
typedef char * XP_FilePerm;
#ifdef XP_WIN
typedef struct _stat XP_StatStruct;
#endif
#ifdef XP_UNIX
typedef struct stat XP_StatStruct;
#endif
#if defined (XP_MAC)
typedef struct stat XP_StatStruct;
#endif
#if defined(XP_UNIX) || defined(XP_WIN)
typedef DIR * XP_Dir;
typedef struct dirent XP_DirEntryStruct;
#endif
#ifdef XP_MAC
/* Mac has non-stdio definitions of XP_Dir and XP_DirEntryStruct */
typedef struct macdstat {
char d_name[300];
} XP_DirEntryStruct;
typedef struct dirstruct {
XP_DirEntryStruct dirent;
FSSpec dirSpecs;
short index; /* Index for looping in XP_OpenDir */
XP_FileType type;
} *XP_Dir;
#endif /* XP_MAC */
/*-----------------------------------------------------------------------------
Prototypes
-----------------------------------------------------------------------------*/
XP_BEGIN_PROTOS
/* returns an abolute path name for use in passing to an XP_FileOpen call.
*
* WARNING: Unlike the older version of this routine (XP_FileName) this one
* returns a malloc'd string.
*/
PUBLIC char *WH_FileName (const char *name, XP_FileType type);
/* returns a "true" local pathname that can be used in native file calls
* it is a string
* noop on Win and Unix, but a must for the Mac
* use it when you need to pass around the full path to other applications
* the input is the string returned by WH_FileName
*
* WARNING: Unlike the older version of this routine (XP_FileName) this one
* returns a malloc'd string.
*/
PUBLIC char *WH_FilePlatformName(const char * name);
/* Returns a pathname of a file suitable for use as temporary storage.
* If the file type is xpCache, then this ***MUST*** return a relative
* pathname. Otherwise, it merely must return something acceptable to
* XP_FileOpen.
*
* WARNING: Unlike the older version of this routine (XP_FileName) this one
* returns a malloc'd string.
*/
extern char * WH_TempName(XP_FileType type, const char * prefix);
extern char* XP_TempDirName(void);
/* Various other wrappers for stdio.h
*/
extern XP_File XP_FileOpen (const char* name, XP_FileType type,
const XP_FilePerm permissions);
extern int XP_Stat(const char * name, XP_StatStruct * outStat,
XP_FileType type);
extern XP_Dir XP_OpenDir(const char * name, XP_FileType type);
extern void XP_CloseDir(XP_Dir dir);
extern XP_DirEntryStruct *XP_ReadDir(XP_Dir dir);
extern int XP_FileRename(const char * from, XP_FileType fromtype,
const char * to, XP_FileType totype);
extern int XP_FileRemove(const char * name, XP_FileType type);
extern int XP_MakeDirectory(const char* name, XP_FileType type);
extern int XP_RemoveDirectory(const char *name, XP_FileType type);
/* Truncate a file to be a given length. It is important (especially on the
Mac) to make sure not to ever call this if you have the file opened. */
extern int XP_FileTruncate(const char* name, XP_FileType type, int32 length);
extern int XP_FileWrite (const void* source, int32 count, XP_File file);
extern char * XP_FileReadLine(char * dest, int32 bufferSize, XP_File file);
extern long XP_FileTell( XP_File file );
extern int XP_FileFlush( XP_File file );
extern int XP_FileClose(XP_File file);
/* Defines */
#define XP_Fileno fileno
#define XP_FileSeek(file,offset,whence) fseek ((file), (offset), (whence))
#define XP_FileRead(dest,count,file) fread ((dest), 1, (count), (file))
#define XP_FileTell(file) ftell(file)
#define XP_FileFlush(file) fflush(file)
/* varargs make it impossible to do any other way */
#define XP_FilePrintf fprintf
/* XP_GetNewsRCFiles returns a null terminated array of pointers to malloc'd
* filename's. Each filename represents a different newsrc file.
*
* return only the filename since the path is not needed or wanted.
*
* Netlib is expecting a string of the form:
* [s]newsrc-host.name.domain[:port]
*
* examples:
* newsrc-news.mcom.com
* snewsrc-flop.mcom.com
* newsrc-news.mcom.com:118
* snewsrc-flop.mcom.com:1191
*
* the port number is optional and should only be
* there when different from the default.
* the "s" in front of newsrc signifies that
* security is to be used.
*
* return NULL on critical error or no files
*/
extern char ** XP_GetNewsRCFiles(void);
/* #ifdef EDITOR */
/* If pszLocalName is not NULL, we return the full pathname
* in local platform syntax. Caller must free this string.
* Returns TRUE if file already exists
* Windows version implemented in winfe\fegui.cpp
*/
extern Bool XP_ConvertUrlToLocalFile(const char * szURL, char **pszLocalName);
/* Construct a temporary filename in same directory as supplied "file:///" type URL
* Used as write destination for saving edited document
* User must free string.
* Windows version implemented in winfe\fegui.cpp
*/
extern char * XP_BackupFileName( const char * szURL );
/* #endif */
XP_END_PROTOS
#if defined(XP_UNIX) || defined(XP_WIN)
/* Unix and Windows preferences communicate with the netlib through these
global variables. Netlib does "something sensible" if they are NULL.
*/
extern char *FE_UserNewsHost;
extern char *FE_UserNewsRC;
extern char *FE_TempDir;
extern char *FE_CacheDir;
extern char *FE_DownloadDir;
extern char *FE_GlobalHist;
#endif /* XP_UNIX || XP_WIN */
/* Each of the three patforms seem to have subtly different opinions
about which functions should be aliases for their stdio counterparts,
and which should be real functions.
Note that on the platform in question, these #defines will override
the prototypes above.
*/
#if defined(XP_UNIX) || defined(XP_WIN)
# define XP_FileReadLine(destBuffer, bufferSize, file) \
fgets(destBuffer, bufferSize, file)
#endif /* XP_UNIX || XP_WIN */
#ifdef XP_UNIX
# define XP_OpenDir(name, type) opendir((name))
# define XP_ReadDir(DirPtr) readdir((DirPtr))
# define XP_CloseDir(DirPtr) closedir((DirPtr))
#endif /* XP_UNIX */
#if defined(XP_MAC) || defined(XP_WIN)
/* #### Note! This defn is dangerous because `count' is evaluated twice! */
# define XP_FileWrite(source, count, file) \
fwrite((void*)(source), 1, \
(size_t) ((count) == -1 ? strlen((char*)source) : (count)), \
(file))
# define XP_FileClose(file) fclose ((file))
#endif /* XP_MAC || XP_WIN */
#ifdef XP_MAC /* Some extra mac-specific weirdness. */
/* general Name->FSSpec conversion */
OSErr XP_FileSpec(const char *name, XP_FileType type, FSSpec* spec);
extern int xp_MacToUnixErr( OSErr err );
/* This function is only implemented on the mac (because it can only be
implemented efficiently there.) Implementing on the other platforms
to just return some magic value would lead to weird, rare bugs in the
cache cleanup code; so simply don't call this on the other platforms.
*/
extern int XP_FileNumberOfFilesInDirectory(const char * dir_name,
XP_FileType type);
#endif /* XP_MAC */
XP_Bool XP_FileIsFullPath(const char * name);
#endif /* _XP_File_ */