Milán Major

netscape-revival

1 branch
Code

dist/Linux2.6_DBG.OBJ/include/xp_file.h

/* -*- 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_ */