зеркало из https://github.com/mozilla/pjs.git
177 строки
6.9 KiB
C
177 строки
6.9 KiB
C
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||
|
*
|
||
|
* The contents of this file are subject to the Netscape Public License
|
||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||
|
* http://www.mozilla.org/NPL/
|
||
|
*
|
||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||
|
* for the specific language governing rights and limitations under the
|
||
|
* NPL.
|
||
|
*
|
||
|
* The Initial Developer of this code under the NPL is Netscape
|
||
|
* Communications Corporation. Portions created by Netscape are
|
||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||
|
* Reserved.
|
||
|
*/
|
||
|
|
||
|
#ifndef ITAPEFS_H
|
||
|
#define ITAPEFS_H
|
||
|
|
||
|
#ifdef EDITOR
|
||
|
//
|
||
|
// Abstract output file stream.
|
||
|
//
|
||
|
class IStreamOut {
|
||
|
public:
|
||
|
IStreamOut();
|
||
|
virtual ~IStreamOut();
|
||
|
|
||
|
virtual void Write( char *pBuffer, int32 iCount )=0;
|
||
|
|
||
|
// NOTICE: the implementation is not pure. There is a default
|
||
|
// implementation that implements this function interms of
|
||
|
// 'Write'.
|
||
|
virtual int Printf( char * pFormat, ... );
|
||
|
|
||
|
enum EOutStreamStatus {
|
||
|
EOS_NoError,
|
||
|
EOS_DeviceFull,
|
||
|
EOS_FileError
|
||
|
};
|
||
|
|
||
|
virtual EOutStreamStatus Status(){ return EOS_NoError; }
|
||
|
|
||
|
// implemented in terms of the interface.
|
||
|
void WriteInt( int32 i ){ Write( (char*)&i, sizeof( int32 ) ); }
|
||
|
void WriteZString( char* pString);
|
||
|
void WritePartialZString( char* pString, int32 start, int32 end);
|
||
|
private:
|
||
|
char* stream_buffer; // used to implement Printf
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Abstract File System
|
||
|
//-----------------------------------------------------------------------
|
||
|
typedef void
|
||
|
EDT_ITapeFileSystemComplete( XP_Bool bSuccess, void *pArg );
|
||
|
|
||
|
class ITapeFileSystem {
|
||
|
PRBool m_FirstBinary; // is the first file really binary, not text?
|
||
|
public:
|
||
|
ITapeFileSystem() { m_FirstBinary = PR_FALSE; }
|
||
|
// ITapeFileSystem::File, ITapeFileSystem::Publish, or
|
||
|
// ITapeFileSystem::MailSend,
|
||
|
enum {File,Publish,MailSend};
|
||
|
virtual intn GetType() = 0;
|
||
|
|
||
|
// This function is called before anything else. It tells the file
|
||
|
// system the base url for the URLs added in AddFile().
|
||
|
// An actual file, not a directory.
|
||
|
virtual void SetSourceBaseURL( char* pURL )=0;
|
||
|
|
||
|
// DESCRIPTION:
|
||
|
//
|
||
|
// Add a name to the file system. It is up to the file system to localize
|
||
|
// the name. For example, I could add 'http://home.netsacpe.com/
|
||
|
// and the file system might decide that it should be called 'index.html'
|
||
|
// if the file system were DOS, the url might be converted to INDEX.HTML
|
||
|
//
|
||
|
// pMIMEType may be NULL. In this case if the tape file system needs the
|
||
|
// MIME type, it must figure it out by itself.
|
||
|
//
|
||
|
// RETURNS: index of the file (0 based), OR
|
||
|
// ITapeFileSystem::Error if an error adding name, OR
|
||
|
// ITapeFileSystem::SourceDestSame if adding
|
||
|
// this name would result in the source and destination being the same, and thus
|
||
|
// no point in copying the file.
|
||
|
//
|
||
|
// The first file added must be the root HTML document. (It is ok for the root
|
||
|
// document to have the same source and dest URL).
|
||
|
//
|
||
|
virtual intn AddFile( char* pURL, char *pMIMEType, int16 iCharSetID)=0;
|
||
|
|
||
|
// Return the number of files added to the file system.
|
||
|
virtual intn GetNumFiles()=0;
|
||
|
|
||
|
// Returns the absolute version of the URL given in AddFile(), using the
|
||
|
// URL given in SetSourceBaseURL() as the base.
|
||
|
// Allocated with XP_STRDUP().
|
||
|
virtual char* GetSourceURL(intn iFileIndex)=0;
|
||
|
|
||
|
// Return the absolute destination of the HTML doc if meaningful, else return
|
||
|
// NULL. Almost the same as "GetDestPathURL()+GetDestURL(0)" except that this call
|
||
|
// will work before file 0 has been added to the file system.
|
||
|
virtual char* GetDestAbsURL()=0;
|
||
|
|
||
|
// Gets the name of the RELATIVE url to place in the file. String is
|
||
|
// allocated with XP_STRDUP();
|
||
|
//
|
||
|
virtual char* GetDestURL( intn iFileIndex )=0;
|
||
|
|
||
|
// Return the path URL associated with the ITapeFilesystem or NULL if there is none.
|
||
|
// If NULL is returned, all URLs returned by GetDestURL() must be absolute.
|
||
|
//
|
||
|
// i.e. for a file or remote HTTP based ITapeFileSystem, this is the directory where the images are
|
||
|
// stored. For a MHTML ITapeFileSystem this is NULL.
|
||
|
//
|
||
|
// String is allocated with XP_STRDUP().
|
||
|
virtual char* GetDestPathURL() = 0;
|
||
|
|
||
|
//
|
||
|
// Returns the name to display when saving the file, can be the same as
|
||
|
// GetURLName. String is allocated with XP_STRDUP();
|
||
|
//
|
||
|
virtual char* GetHumanName( intn iFileIndex )=0;
|
||
|
|
||
|
enum {
|
||
|
Error = -1, SourceDestSame = -2
|
||
|
};
|
||
|
|
||
|
// Does the file referenced by iFileIndex already exist?
|
||
|
// E.g. for the MHTML version, this will always return FALSE.
|
||
|
virtual XP_Bool FileExists(intn iFileIndex) = 0;
|
||
|
|
||
|
// Will we be creating a new non-temporary file on the local machine.
|
||
|
// Used to update SiteManager.
|
||
|
virtual XP_Bool IsLocalPersistentFile(intn iFileIndex) = 0;
|
||
|
|
||
|
// ### mwelch Added so that multipart/related message saver can properly construct
|
||
|
// messages using quoted/forwarded part data.
|
||
|
// Tell the tape file system the mime type of a particular part.
|
||
|
// Calling this overrides any previously determined mime type for this part.
|
||
|
virtual void CopyURLInfo(intn iFileIndex, const URL_Struct *pURL) = 0;
|
||
|
|
||
|
//
|
||
|
// Opens the output stream. Returns a stream that can be written to or NULL if error. All
|
||
|
// 'AddFile's occur before the first OpenStream.
|
||
|
// Do not delete the returned stream, just call CloseStream() when done.
|
||
|
//
|
||
|
virtual IStreamOut *OpenStream( intn iFileIndex )=0;
|
||
|
|
||
|
virtual void CloseStream( intn iFileIndex )=0;
|
||
|
|
||
|
// Called on completion, TRUE if completed successfully, FALSE if it failed.
|
||
|
// The caller should not reference the ITapeFileSystem after calling Complete().
|
||
|
// Caller does not free up memory for ITapeFileSystem, Complete() causes file system to delete itself.
|
||
|
//
|
||
|
// The tape file system will call pfComplete with pArg and with whether the ITapeFileSystem
|
||
|
// completed successfully. Note: the ITapeFileSystem may call pfComplete() with TRUE even if
|
||
|
// ITapeFileSystem::Complete() was given FALSE.
|
||
|
// pfComplete may be NULL. Call to pfComplete may be synchronous or asynchronous.
|
||
|
//
|
||
|
// The ITapeFileSystem will call pfComplete(success,pArg) before deleting itself. I.e. the ITapeFileSystem is still valid
|
||
|
// when it calls pfComplete().
|
||
|
virtual void Complete( Bool bSuccess, EDT_ITapeFileSystemComplete *pfComplete, void *pArg )=0;
|
||
|
|
||
|
inline PRBool IsFirstBinary(void) { return m_FirstBinary; }
|
||
|
inline void SetFirstBinary(void) { m_FirstBinary = PR_TRUE; }
|
||
|
inline void ResetFirstBinary(void) { m_FirstBinary = PR_FALSE; }
|
||
|
};
|
||
|
|
||
|
#endif // EDITOR
|
||
|
|
||
|
#endif
|