714dd74636
git-svn-id: svn://10.65.10.50/trunk@5350 c028cbd2-c16b-5b4b-a496-9718f37d4682
493 lines
20 KiB
C++
Executable File
493 lines
20 KiB
C++
Executable File
/*
|
|
* MEMSTORE.H
|
|
*
|
|
* Header file for ArchiveLib 2.0
|
|
*
|
|
* Copyright (c) 1994-1996 Greenleaf Software, Inc.
|
|
* All Rights Reserved
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
* This header file contains the class declaration for ALMemoryBase and
|
|
* its three descendants.
|
|
*
|
|
* CLASS DEFINITIONS:
|
|
*
|
|
* ALMemoryBase
|
|
* ALMemory
|
|
* ALHugeMemory
|
|
* ALWinMemory
|
|
*
|
|
* REVISION HISTORY
|
|
*
|
|
* February 14, 1996 2.0A : New release
|
|
*
|
|
*/
|
|
|
|
#ifndef _MEMSTORE_H
|
|
#define _MEMSTORE_H
|
|
|
|
#include "arclib.h"
|
|
|
|
#if defined( __cplusplus )
|
|
|
|
/*
|
|
* class ALMemoryBase : public ALStorage
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
* Class ALMemoryBase is ALStorage class that serves as a parent
|
|
* class to three other classes. The three derived classes store
|
|
* data in three different types of memory buffers: standard buffers
|
|
* created from the heap, huge buffers created from the far heap, and
|
|
* windows memory blocks created using the Windows API.
|
|
*
|
|
* ALMemoryBase doesn't know much about pointers on its own, so it
|
|
* has some pure virtual functions that have to get filled in by
|
|
* the derived classes. They are the classes that you instantiate
|
|
* to create memory based storage objects.
|
|
*
|
|
* DATA MEMBERS
|
|
*
|
|
* mfUserOwnsBuffer : If this flag is set, it indicates that the user
|
|
* owns the buffer, not the class. This means
|
|
* the class can't grow the buffer if it runs out
|
|
* of space, and it can't delete it in the
|
|
* ALMemoryBase destructor.
|
|
*
|
|
* mlUserBufferSize : The actual size of the buffer, whether it is
|
|
* owned by the user or not. This is a long always.
|
|
*
|
|
* MEMBER FUNCTIONS
|
|
*
|
|
* ALMemoryBase() : The constructor, only called by derived classes.
|
|
* ~ALMemoryBase() : The virtual destructor.
|
|
* operator new() : Memory allocation operator, only used when the
|
|
* library is in a DLL. Note that this isn't the
|
|
* operator used to allocate the buffer, just the
|
|
* one to allocate a class object.
|
|
* _LoadBuffer() : A virtual function defined in the derived class.
|
|
* When more data is needed from the memory buffer,
|
|
* this class gets called.
|
|
* _FlushBuffer() : Another virtual function that will be defined
|
|
* in the derived class. When ALMemoryBase decides
|
|
* it needs to store some data, it has to call this
|
|
* function to do the work.
|
|
* Open() : Open the storage object for reading and writing.
|
|
* Create() : Create a new buffer to write to.
|
|
* Close() : Close the existing memory object.
|
|
* LoadBuffer() : Load a new block from the memory object into
|
|
* the I/O buffer. (Needs _LoadBuffer() to do the work.)
|
|
* FlushBuffer() : Flush the contents of the I/O buffer, sending
|
|
* the contents into the memory object. (Needs to
|
|
* call _FlushBuffer() to do the work).
|
|
* Seek() : Seek to a new location in the memory object.
|
|
* Rename() : Give the object a new name. Names are pretty
|
|
* irrelevant for memory objects, feel free to use
|
|
* whatever you want here.
|
|
* UnRename() : Restore the old name.
|
|
* Delete() : Delete the memory object. It is gone forever.
|
|
* RenameToBackup() : Give the memory object an arbitrary new name.
|
|
* GrowUserBuffer() : A private function used to give us more space
|
|
* when the memory object is owner of the buffer.
|
|
* This is pure virtual, it must be implemented
|
|
* by a derived memory class.
|
|
*
|
|
* REVISION HISTORY
|
|
*
|
|
* February 14, 1996 2.0: New release
|
|
*/
|
|
|
|
class AL_CLASS_TYPE ALMemoryBase : public ALStorage { /* Tag public class */
|
|
/*
|
|
* Constructors, destructors, assignment operator, friends, declarations
|
|
*/
|
|
|
|
public :
|
|
AL_PROTO ALMemoryBase( const char AL_DLL_FAR *buffer_name = "",
|
|
ALCase name_case = AL_MIXED );
|
|
virtual AL_PROTO ~ALMemoryBase();
|
|
#if defined( AL_USING_DLL ) || defined( AL_BUILDING_DLL )
|
|
void AL_DLL_FAR * AL_PROTO operator new( size_t size );
|
|
#endif
|
|
/*
|
|
* As usual, I don't want the compiler to generate a default copy constructor,
|
|
* or an assignment operator here. I force it to back off by declaring them
|
|
* here. They do not exist!
|
|
*/
|
|
private :
|
|
AL_PROTO ALMemoryBase( ALMemoryBase AL_DLL_FAR & );
|
|
ALMemoryBase AL_DLL_FAR & AL_PROTO operator=( const ALMemoryBase AL_DLL_FAR & );
|
|
|
|
/*
|
|
* Member functions, grouped by category.
|
|
*
|
|
*
|
|
* Protected member manipulation, used inside library, not for public use.
|
|
*/
|
|
protected :
|
|
virtual void AL_PROTO _LoadBuffer( long address ) = 0;
|
|
virtual void AL_PROTO _FlushBuffer( long address ) = 0;
|
|
/*
|
|
* The file I/O access public interface
|
|
*/
|
|
public :
|
|
virtual int AL_PROTO Open();
|
|
virtual int AL_PROTO Create( long desired_size = -1L );
|
|
virtual int AL_PROTO Close();
|
|
virtual int AL_PROTO LoadBuffer( long address );
|
|
virtual int AL_PROTO FlushBuffer();
|
|
virtual int AL_PROTO Seek( long address );
|
|
|
|
/*
|
|
* File name and underlying object manipulation public interface
|
|
*/
|
|
public :
|
|
virtual int AL_PROTO Rename( const char AL_DLL_FAR *new_name = 0,
|
|
int delete_on_clash = 1 );
|
|
virtual int AL_PROTO UnRename( int delete_on_clash = 1 );
|
|
virtual int AL_PROTO Delete() = 0;
|
|
virtual int AL_PROTO RenameToBackup( int delete_on_clash = 1 );
|
|
/*
|
|
* Unique to this class
|
|
*/
|
|
protected :
|
|
virtual int AL_PROTO GrowUserBuffer( long minimum_new_size ) = 0;
|
|
/*
|
|
* Data members
|
|
*/
|
|
protected :
|
|
public : /* Should some of these might be better off private */
|
|
int mfUserOwnsBuffer;
|
|
long mlUserBufferSize;
|
|
AL_CLASS_TAG( _ALMemoryBaseTag );
|
|
};
|
|
|
|
/*
|
|
* class ALMemory : ALMemoryBase
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
* Class ALMemory is an ALStorage class that stores its data in
|
|
* buffers allocated from the default heap. This means that it
|
|
* has a pointer to a memory buffer using an unadorned pointer, and
|
|
* it can keep track of its length in a size_t integer.
|
|
*
|
|
* It has to define all of the functions that were left as pure
|
|
* virtual in ALMemoryBase. These functions are all the functions
|
|
* that actually manage or use the memory buffer.
|
|
*
|
|
* DATA MEMBERS
|
|
*
|
|
* mpcUserBuffer : A pointer to the big buffer that is going to
|
|
* hold the data. This is a buffer that gets
|
|
* allocated with malloc() and realloc(), and
|
|
* released using free(). Retro, but cool.
|
|
*
|
|
* MEMBER FUNCTIONS
|
|
*
|
|
* ALMemory() : The constructor. This is where you decide
|
|
* whether to let ALMemory allocate and manage
|
|
* your buffer, or decide to use your own buffer.
|
|
* ~ALMemory() : The virtual destructor.
|
|
* operator new() : Memory allocation operator, only used when the
|
|
* library is in a DLL. Note that this isn't the
|
|
* operator used to allocate the buffer, just the
|
|
* one to allocate a class object.
|
|
* _LoadBuffer() : A virtual function defined that loads more
|
|
* data out of the memory buffer so it can
|
|
* be stuffed into the I/O buffer.
|
|
* _FlushBuffer() : Another virtual function that takes data out
|
|
* of the I/O buffer and stuffs it into the
|
|
* memory buffer.
|
|
* GrowUserBuffer() : A private function used to give us more space
|
|
* when the memory object is owner of the buffer.
|
|
* This function tries to call realloc() to do
|
|
* its work. The presence of realloc() accounts
|
|
* for the reason we use free() and malloc() instead
|
|
* of new and delete.
|
|
* Clone() : If you place an ALMemory object in a toolkit,
|
|
* this function can be called to create a new
|
|
* ALMemory object.
|
|
* Open() : Open the storage object for reading and writing.
|
|
* Create() : Create a new buffer to write to.
|
|
* Delete() : Delete the memory object. It is gone forever.
|
|
* Close() : Close the existing memory object.
|
|
*
|
|
* REVISION HISTORY
|
|
*
|
|
* February 14, 1996 2.0: New release
|
|
*/
|
|
|
|
class AL_CLASS_TYPE ALMemory : public ALMemoryBase { /* Tag public class */
|
|
/*
|
|
* Constructors, destructors, assignment operator, friends, declarations
|
|
*/
|
|
public :
|
|
AL_PROTO ALMemory( const char AL_DLL_FAR *buffer_name = "",
|
|
char AL_DLL_FAR *user_buffer = 0,
|
|
size_t user_buffer_size = 0,
|
|
ALCase name_case = AL_MIXED );
|
|
virtual AL_PROTO ~ALMemory();
|
|
#if defined( AL_USING_DLL ) || defined( AL_BUILDING_DLL )
|
|
void AL_DLL_FAR * AL_PROTO operator new( size_t size );
|
|
#endif
|
|
/*
|
|
* As usual, I don't want the compiler to generate a default copy constructor,
|
|
* or an assignment operator here. I force it to back off by declaring them
|
|
* here. They do not exist!
|
|
*/
|
|
protected :
|
|
AL_PROTO ALMemory( ALMemory AL_DLL_FAR & );
|
|
ALMemory AL_DLL_FAR & AL_PROTO operator=( const ALMemory AL_DLL_FAR & );
|
|
protected :
|
|
virtual void AL_PROTO _LoadBuffer( long address );
|
|
virtual void AL_PROTO _FlushBuffer( long address );
|
|
/*
|
|
* Unique to this class
|
|
*/
|
|
protected :
|
|
virtual int AL_PROTO GrowUserBuffer( long minimum_new_size );
|
|
public :
|
|
virtual ALStorage AL_DLL_FAR * AL_PROTO Clone( const char AL_DLL_FAR *name,
|
|
int object_type ) const;
|
|
virtual int AL_PROTO Open();
|
|
virtual int AL_PROTO Create( long desired_size = -1L );
|
|
virtual int AL_PROTO Delete();
|
|
virtual int AL_PROTO Close();
|
|
char AL_DLL_FAR *mpcUserBuffer;
|
|
AL_CLASS_TAG( _ALMemoryTag );
|
|
};
|
|
|
|
/*
|
|
* class ALHugeMemory : ALMemoryBase
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
* Class ALHugeMemory is an ALStorage class that stores its data in
|
|
* huge buffers allocated from the far heap. If you are writing
|
|
* 16 bit programs under MS-DOS, this gives you a way to create
|
|
* memory based storage objects that can span more than 64Kbytes.
|
|
*
|
|
* DATA MEMBERS
|
|
*
|
|
* mpcUserBuffer : A pointer to the huge buffer that is going to
|
|
* hold the data. This is a buffer that gets
|
|
* allocated with halloc() or faralloc().
|
|
*
|
|
* MEMBER FUNCTIONS
|
|
*
|
|
* ALHugeMemory() : The constructor. This is where you decide
|
|
* whether to let ALHugeMemory allocate and manage
|
|
* your buffer, or decide to use your own buffer.
|
|
* ~ALHugeMemory() : The virtual destructor.
|
|
* operator new() : Memory allocation operator, only used when the
|
|
* library is in a DLL. Note that this isn't the
|
|
* operator used to allocate the buffer, just the
|
|
* one to allocate a class object.
|
|
* _LoadBuffer() : A virtual function defined that loads more
|
|
* data out of the memory buffer so it can
|
|
* be stuffed into the I/O buffer.
|
|
* _FlushBuffer() : Another virtual function that takes data out
|
|
* of the I/O buffer and stuffs it into the
|
|
* memory buffer.
|
|
* GrowUserBuffer() : A private function used to give us more space
|
|
* when the memory object is owner of the buffer.
|
|
* This function tries to call farrealloc() to do
|
|
* its work.
|
|
* Clone() : If you place an ALHugeMemory object in a toolkit,
|
|
* this function can be called to create a new
|
|
* ALHugeMemory object.
|
|
* Open() : Open the storage object for reading and writing.
|
|
* Create() : Create a new buffer to write to.
|
|
* Delete() : Delete the memory object. It is gone forever.
|
|
* Close() : Close the existing memory object.
|
|
*
|
|
* REVISION HISTORY
|
|
*
|
|
* February 14, 1996 2.0: New release
|
|
*/
|
|
|
|
|
|
#if !defined( AL_FLAT_MODEL )
|
|
|
|
class AL_CLASS_TYPE ALHugeMemory : public ALMemoryBase { /* Tag public class */
|
|
/*
|
|
* Constructors, destructors, assignment operator, friends, declarations
|
|
*/
|
|
public :
|
|
AL_PROTO ALHugeMemory( const char AL_DLL_FAR *buffer_name = "",
|
|
char _huge *user_buffer = 0,
|
|
long user_buffer_size = 0,
|
|
ALCase name_case = AL_MIXED );
|
|
virtual AL_PROTO ~ALHugeMemory();
|
|
#if defined( AL_USING_DLL ) || defined( AL_BUILDING_DLL )
|
|
void AL_DLL_FAR * AL_PROTO operator new( size_t size );
|
|
#endif
|
|
/*
|
|
* As usual, I don't want the compiler to generate a default copy constructor,
|
|
* or an assignment operator here. I force it to back off by declaring them
|
|
* here. They do not exist!
|
|
*/
|
|
protected :
|
|
AL_PROTO ALHugeMemory( ALHugeMemory AL_DLL_FAR & );
|
|
ALHugeMemory AL_DLL_FAR & AL_PROTO operator=( const ALHugeMemory AL_DLL_FAR & );
|
|
protected :
|
|
virtual void AL_PROTO _LoadBuffer( long address );
|
|
virtual void AL_PROTO _FlushBuffer( long address );
|
|
/*
|
|
* Unique to this class
|
|
*/
|
|
protected :
|
|
virtual int AL_PROTO GrowUserBuffer( long minimum_new_size );
|
|
public :
|
|
virtual ALStorage AL_DLL_FAR * AL_PROTO Clone( const char AL_DLL_FAR *name,
|
|
int object_type ) const;
|
|
virtual int AL_PROTO Open();
|
|
virtual int AL_PROTO Create( long desired_size = -1L );
|
|
virtual int AL_PROTO Delete();
|
|
virtual int AL_PROTO Close();
|
|
char _huge *mpcUserBuffer;
|
|
AL_CLASS_TAG( _ALHugeMemoryTag );
|
|
};
|
|
|
|
#endif /* #if !defined( AL_FLAT_MODEL ) */
|
|
|
|
/*
|
|
* class ALWinMemory : ALMemoryBase
|
|
*
|
|
* DESCRIPTION
|
|
*
|
|
* Class ALWinMemory is an ALStorage class that stores its data in
|
|
* huge buffers allocated from the Windows heap. If you are writing
|
|
* 16 bit programs, this gives you a way to create memory based storage
|
|
* objects that can span more than 64Kbytes.
|
|
*
|
|
* DATA MEMBERS
|
|
*
|
|
* mpcUserBuffer : A pointer to the huge buffer that is going to
|
|
* hold the data. This is a buffer that gets
|
|
* allocated with GlobalAlloc().
|
|
* mhUserMemoryHandle : The Window handle for the memory block.
|
|
*
|
|
* MEMBER FUNCTIONS
|
|
*
|
|
* ALWinMemory() : The constructor. This is where you decide
|
|
* whether to let ALWinMemory allocate and manage
|
|
* your buffer, or decide to use your own buffer.
|
|
* ~ALWinMemory() : The virtual destructor.
|
|
* operator new() : Memory allocation operator, only used when the
|
|
* library is in a DLL. Note that this isn't the
|
|
* operator used to allocate the buffer, just the
|
|
* one to allocate a class object.
|
|
* _LoadBuffer() : A virtual function defined that loads more
|
|
* data out of the memory buffer so it can
|
|
* be stuffed into the I/O buffer.
|
|
* _FlushBuffer() : Another virtual function that takes data out
|
|
* of the I/O buffer and stuffs it into the
|
|
* memory buffer.
|
|
* GrowUserBuffer() : A private function used to give us more space
|
|
* when the memory object is owner of the buffer.
|
|
* This function tries to call GlobalRealloc() to do
|
|
* its work.
|
|
* Clone() : If you place an ALHugeMemory object in a toolkit,
|
|
* this function can be called to create a new
|
|
* ALHugeMemory object.
|
|
* Open() : Open the storage object for reading and writing.
|
|
* Create() : Create a new buffer to write to.
|
|
* Delete() : Delete the memory object. It is gone forever.
|
|
* Close() : Close the existing memory object.
|
|
*
|
|
* REVISION HISTORY
|
|
*
|
|
* February 14, 1996 2.0: New release
|
|
*/
|
|
|
|
#if defined( AL_WINDOWS)
|
|
class AL_CLASS_TYPE ALWinMemory : public ALMemoryBase { /* Tag public class */
|
|
/*
|
|
* Constructors, destructors, assignment operator, friends, declarations
|
|
*/
|
|
public :
|
|
AL_PROTO ALWinMemory( const char AL_DLL_FAR *buffer_name = "",
|
|
char AL_HUGE *user_buffer = 0,
|
|
DWORD user_buffer_size = 0,
|
|
ALCase name_case = AL_MIXED );
|
|
virtual AL_PROTO ~ALWinMemory();
|
|
#if defined( AL_USING_DLL ) || defined( AL_BUILDING_DLL )
|
|
void AL_DLL_FAR * AL_PROTO operator new( size_t size );
|
|
#endif
|
|
/*
|
|
* As usual, I don't want the compiler to generate a default copy constructor,
|
|
* or an assignment operator here. I force it to back off by declaring them
|
|
* here. They do not exist!
|
|
*/
|
|
protected :
|
|
AL_PROTO ALWinMemory( ALWinMemory AL_DLL_FAR & );
|
|
ALWinMemory AL_DLL_FAR & AL_PROTO operator=( const ALWinMemory AL_DLL_FAR & );
|
|
protected :
|
|
virtual void AL_PROTO _LoadBuffer( long address );
|
|
virtual void AL_PROTO _FlushBuffer( long address );
|
|
/*
|
|
* Unique to this class
|
|
*/
|
|
protected :
|
|
virtual int AL_PROTO GrowUserBuffer( long minimum_new_size );
|
|
public :
|
|
virtual ALStorage AL_DLL_FAR * AL_PROTO Clone( const char AL_DLL_FAR *name,
|
|
int object_type ) const;
|
|
virtual int AL_PROTO Open();
|
|
virtual int AL_PROTO Create( long desired_size = -1L );
|
|
virtual int AL_PROTO Delete();
|
|
virtual int AL_PROTO Close();
|
|
HGLOBAL mhUserMemoryHandle;
|
|
char AL_HUGE *mpcUserBuffer;
|
|
AL_CLASS_TAG( _ALWinMemoryTag );
|
|
};
|
|
#endif
|
|
#else /* #if !defined( __cplusplus ) ... */
|
|
|
|
#if !defined( AL_FLAT_MODEL )
|
|
AL_LINKAGE hALStorage AL_FUNCTION
|
|
newALHugeMemory( char AL_DLL_FAR *buffer_name,
|
|
char _huge *user_buffer,
|
|
long user_buffer_size );
|
|
#endif
|
|
AL_LINKAGE hALStorage AL_FUNCTION
|
|
newALMemory( char AL_DLL_FAR *buffer_name,
|
|
char AL_DLL_FAR *user_buffer,
|
|
size_t user_buffer_size );
|
|
|
|
AL_LINKAGE void AL_FUNCTION
|
|
ALMemoryBaseSetBufferOwner( hALStorage this_object, int user_owns_buffer );
|
|
AL_LINKAGE long AL_FUNCTION
|
|
ALMemoryBaseGetBufferSize( hALStorage this_object );
|
|
AL_LINKAGE int AL_FUNCTION
|
|
ALMemoryBaseGetBufferOwner( hALStorage this_object );
|
|
|
|
AL_LINKAGE char AL_DLL_FAR * AL_FUNCTION
|
|
ALMemoryGetBuffer( hALStorage this_object );
|
|
|
|
#if !defined( AL_FLAT_MODEL )
|
|
|
|
AL_LINKAGE char _huge * AL_FUNCTION
|
|
ALHugeMemoryGetBuffer( hALStorage this_object );
|
|
|
|
#endif
|
|
|
|
#if defined( AL_WINDOWS )
|
|
|
|
AL_LINKAGE hALStorage AL_FUNCTION
|
|
newALWinMemory( char AL_DLL_FAR *buffer_name,
|
|
char AL_HUGE *user_buffer,
|
|
DWORD user_buffer_size );
|
|
AL_LINKAGE UINT AL_FUNCTION ALWinMemoryGetHandle( hALStorage this_object );
|
|
AL_LINKAGE char AL_HUGE * AL_FUNCTION
|
|
ALWinMemoryGetBuffer( hALStorage this_object );
|
|
|
|
#endif
|
|
|
|
#endif /* #if defined( __cplusplus ) ... #else ... */
|
|
|
|
#endif /* #ifndef _MEMSTORE_H */
|