pjs/include/itapefs.h

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