1476 lines
40 KiB
C++
Executable File
1476 lines
40 KiB
C++
Executable File
//
|
|
// STORAGE.CPP
|
|
//
|
|
// Source file for ArchiveLib 2.0
|
|
//
|
|
// Copyright (c) Greenleaf Software, Inc. 1994-1996
|
|
// All Rights Reserved
|
|
//
|
|
// CONTENTS
|
|
//
|
|
// ALStorage::operator new()
|
|
// ALStorage::ALStorage()
|
|
// ALStorage::~ALStorage()
|
|
// deleteALStorage()
|
|
// ALStorage::Open()
|
|
// ALStorageOpen()
|
|
// ALStorage::Create()
|
|
// ALStorageCreate()
|
|
// ALStorage::Close()
|
|
// ALStorageClose()
|
|
// ALStorage::ReadBuffer()
|
|
// ALStorageReadBuffer()
|
|
// ALStorageReadBufferVB32()
|
|
// ALStorage::WriteBuffer()
|
|
// ALStorageWriteBuffer()
|
|
// ALStorageWriteBufferVB32()
|
|
// ALStorage::WriteString()
|
|
// ALStorageWriteString()
|
|
// ALStorage::ReadString()
|
|
// ALStorage::Tell()
|
|
// ALStorageTell()
|
|
// ALStorage::WriteStorageObjectData()
|
|
// ALStorage::ReadStorageObjectData()
|
|
// ALStorage::ReadCopyright()
|
|
// ALStorageReadCopyright()
|
|
// ALStorageReadCopyrightVB()
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This file contains all of the source code for the member functions
|
|
// of ALStorage. AlStorage has pure virtual functions, so you can't
|
|
// ever instantiate one of these guys.
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// May 26, 1994 1.0A : First release
|
|
//
|
|
// July 7, 1994 1.0B : Minor bug fixes
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
#include "arclib.h"
|
|
#if !defined( AL_IBM )
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#include "_vbutil.h"
|
|
#include <string.h>
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::operator new()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Memory allocator used when ArchiveLib resides in a 16 bit DLL.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// void * ALStorage::operator new( size_t size )
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// None, internal C++ member function.
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// None, internal C++ member function.
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// None, internal C++ member function.
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// size : The number of bytes that the compiler has decided will be
|
|
// necessary to construct a new ALStorage object.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// When using a DLL, it is easy to get into a dangerous situation when
|
|
// creating objects whose ctor and dtor are both in the DLL. The problem
|
|
// arises because when you create an object using new, the memory for
|
|
// the object will be allocated from the EXE. However, when you destroy
|
|
// the object using delete, the memory is freed inside the DLL. Since
|
|
// the DLL doesn't really own that memory, bad things can happen.
|
|
//
|
|
// But, you say, won't the space just go back to the Windows heap regardless
|
|
// of who tries to free it? Maybe, but maybe not. If the DLL is using
|
|
// a subsegment allocation scheme, it might do some sort of local free
|
|
// before returning the space to the windows heap. That is the point where
|
|
// you could conceivably cook your heap.
|
|
//
|
|
// By providing our own version of operator new inside this class, we
|
|
// ensure that all memory allocation for the class will be done from
|
|
// inside the DLL, not the EXE calling the DLL.
|
|
//
|
|
// Note that this function will probably never be called. You can't
|
|
// instantiate an ALStorage object, because it has some pure virtual
|
|
// functions. So only derived classes get instantiated, and they
|
|
// really ought to have their own new operators.
|
|
|
|
// RETURNS
|
|
//
|
|
// A pointer to some memory that should have been pulled out of the
|
|
// heap for the DLL.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// May 24, 1994 1.0A : First release
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
#if defined( AL_BUILDING_DLL )
|
|
|
|
void AL_DLL_FAR * AL_PROTO
|
|
ALStorage::operator new( size_t size ) /* Tag protected function */
|
|
{
|
|
return ::new char[ size ];
|
|
}
|
|
|
|
#endif
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::ALStorage()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// The ALStorage constructor.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// ALStorage::ALStorage( const char *file_name,
|
|
// size_t size,
|
|
// const enum ALStorageType object_type,
|
|
// ALCase name_case = AL_MIXED );
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// None, this function is not available to C programmers.
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// None, this function is not available to VB programmers.
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// None, this function is not available to Delphi programmers.
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// file_name : The name to assign to the mName data member of the
|
|
// newly created storage object.
|
|
//
|
|
// size : The size of the I/O buffer that is going to be used
|
|
// for the storage object. ALFile uses 4096 as a default.
|
|
//
|
|
// object_type : The type of object, as defined in ALDEFS.H. Good
|
|
// values include AL_FILE_OBJECT and AL_MEMORY_OBJECT.
|
|
//
|
|
// name_case : The case sensitivity of the object name. For objects
|
|
// such as ALFile, AL_MIXED is a no-no. Those objects
|
|
// need to be forced to convert names to all upper
|
|
// or all lower, because the operating system considers
|
|
// file names to be case insensitive.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// The constructor for ALStorage gets called from the constructor of
|
|
// derived classes. It has to initialize all sorts of data members.
|
|
// First, in the initializer list, it sets up the mName data member,
|
|
// as well as muBufferSize and miStorageObjectType. The latter two
|
|
// data members are set to be const so I can make them public, which
|
|
// means we have to initialize them in the initializer list.
|
|
//
|
|
// In the body of the constructor, we initialize a bunch of data members,
|
|
// none of which mean anything at this point.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// Nothing, it is a constructor.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// N/A, not part of the public API.
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALFile::ALFile(), ALMemory::ALMemory()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
AL_PROTO
|
|
ALStorage::ALStorage( const char AL_DLL_FAR *file_name, /* Tag public function */
|
|
size_t size,
|
|
const enum ALStorageType object_type,
|
|
ALCase name_case /* = AL_MIXED */ )
|
|
: mName( file_name, name_case ),
|
|
miStorageObjectType( object_type ),
|
|
muBufferSize( size )
|
|
{
|
|
mpcBuffer = 0;
|
|
muBufferValidData = 0;
|
|
muWriteIndex = 0;
|
|
muReadIndex = 0;
|
|
mlFilePointer = 0;
|
|
miUpdateCrcFlag = 0;
|
|
mlCrc32 = 0xffffffffL;
|
|
mlSize = -1L;
|
|
mpMonitor = 0;
|
|
miCreated = 0;
|
|
if ( mName.GetName() == 0 )
|
|
mStatus.SetError( AL_CANT_OPEN_BUFFER,
|
|
"Allocation of buffer failed in "
|
|
"ALStorage constructor" );
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::~ALStorage()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// The ALStorage destructor.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// ALStorage::~ALStorage();
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// void deleteALStorage( hALStorage this_object );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Sub deleteALStorage Lib "AL20LW" (ByVal this_object&)
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// procedure deleteALStorage( this_object : hALStorage );
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A handle for (pointer to) the storage object that
|
|
// is going to be destroyed. Note that the C++ version
|
|
// of this function doesn't have this argument, since it
|
|
// has implicit access to 'this'.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// In debug mode, we first check to make sure we are destroying the
|
|
// right type of object.
|
|
//
|
|
// The only thing left to do is free up the I/O buffer if it is still
|
|
// allocated. This piece of work probably isn't necessary. Since this
|
|
// is a virtual destructor, we will be called after the destructors
|
|
// for the derived class. Any derived class that is doing its job
|
|
// will make sure that it calls Close() before destroying itself. If
|
|
// it doesn't, it will probably be leaving unfinished business behind
|
|
// that we aren't going to be able to deal with here. Even so, we will
|
|
// be diligent in our attention to detail.
|
|
//
|
|
//
|
|
// RETURNS
|
|
//
|
|
// Nothing.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
AL_PROTO
|
|
ALStorage::~ALStorage() /* Tag public function */
|
|
{
|
|
AL_ASSERT( GoodTag(), "~ALStorage: attempting to delete invalid object" );
|
|
if ( mpcBuffer )
|
|
Close();
|
|
}
|
|
|
|
#if !defined( AL_NO_C )
|
|
|
|
extern "C" AL_LINKAGE void AL_FUNCTION
|
|
deleteALStorage( hALStorage this_object ) /* Tag public function */
|
|
{
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "deleteALStorage" );
|
|
delete (ALStorage *) this_object;
|
|
}
|
|
|
|
#endif
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::Open()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Open a storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorage::Open()
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorageOpen( hALStorage this_object )
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageOpen Lib "AL20LW"
|
|
// (ByVal this_object&) As Integer
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageOpen( this_object : hALStorage ) : Integer;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to be opened. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// Any derived class needs to have its own Open() function. However,
|
|
// the derived class can also call this Open() function in the base
|
|
// class to do some odds and ends for it. The most important thing it
|
|
// does is allocate the I/O buffer, which is what makes ALStorage a
|
|
// relatively fast way to read and write data. Although the buffer
|
|
// is in place, there is no data in it, so this guy also sets up the
|
|
// indices and pointers to reflect that.
|
|
//
|
|
// Upon exit, all you need to to is start reading or writing, and the
|
|
// whole thing should be ready to go.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// AL_SUCCESS, or AL_CANT_OPEN_BUFFER on memory allocation failure.
|
|
// If the object was already in an error state, it is very possible to
|
|
// get some other error code < 0.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::Create(), ALStorage::Close()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
int AL_PROTO
|
|
ALStorage::Open() /* Tag public function */
|
|
{
|
|
if ( mStatus < AL_SUCCESS )
|
|
return mStatus;
|
|
if ( muBufferSize != 0 )
|
|
mpcBuffer = new unsigned char[ muBufferSize ];
|
|
muBufferValidData = 0;
|
|
muWriteIndex = 0;
|
|
muReadIndex = 0;
|
|
mlFilePointer = 0;
|
|
miUpdateCrcFlag = 0;
|
|
mlCrc32 = 0xffffffffL;
|
|
if ( mpcBuffer == 0 )
|
|
return mStatus.SetError( AL_CANT_OPEN_BUFFER,
|
|
"Allocation of buffer failed in Open()" );
|
|
return AL_SUCCESS;
|
|
}
|
|
|
|
#if !defined( AL_NO_C )
|
|
|
|
extern "C" AL_LINKAGE int AL_FUNCTION
|
|
ALStorageOpen( hALStorage this_object ) /* Tag public function */
|
|
{
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "ALStorageOpen" );
|
|
return ( (ALStorage *) this_object )->Open();
|
|
}
|
|
|
|
#endif
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::Create();
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Create a new storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorage::Create( long desired_size = - 1 );
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorageCreate( hALStorage this_object, long desired_size );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageCreate Lib "AL20LW"
|
|
// (ByVal this_object&, ByVal desired_size&) As Integer
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageCreate( this_object : hALStorage;
|
|
// desired_size : Long ) : Integer;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to be created. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// desired_size : If you know in advance how much space a storage object
|
|
// is going to occupy, you can pass that number as the
|
|
// desired_size argument. Some storage types, such as
|
|
// ALMemory, can make good use of this information. Others
|
|
// such as ALFile, could care less. In any case, the base
|
|
// class, ALStorage, ignores the info. If you don't know
|
|
// how many bytes the storage object is going to need,
|
|
// pass a -1L as the argument.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This function is nearly identical to ALStorage::Open().
|
|
//
|
|
// Any derived class needs to have its own Create() function. However,
|
|
// the derived class can also call this Create() function in the base
|
|
// class to do some odds and ends for it. The most important thing it
|
|
// does is allocate the I/O buffer, which is what makes ALStorage a
|
|
// relatively fast way to read and write data. Although the buffer
|
|
// is in place, there is no data in it, so this guy also sets up the
|
|
// indices and pointers to reflect that.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// AL_SUCCESS, or AL_CANT_OPEN_BUFFER on memory allocation failure.
|
|
// If the object was already in an error state, it is very possible to
|
|
// get some other error code < 0.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::Delete(), ALStorage::Open()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
int AL_PROTO
|
|
ALStorage::Create( long /* desired_size = - 1 */ ) /* Tag public function */
|
|
{
|
|
if ( mStatus < AL_SUCCESS )
|
|
return mStatus;
|
|
mpcBuffer = new unsigned char[ muBufferSize ];
|
|
muBufferValidData = 0;
|
|
muWriteIndex = 0;
|
|
muReadIndex = 0;
|
|
mlFilePointer = 0;
|
|
miUpdateCrcFlag = 0;
|
|
mlSize = 0; //If the file has been opened previously, mlSize might be non-zero
|
|
mlCrc32 = 0xffffffffL;
|
|
miCreated = 1;
|
|
if ( mpcBuffer == 0 )
|
|
return mStatus.SetError( AL_CANT_OPEN_BUFFER,
|
|
"Allocation of buffer failed in Open()" );
|
|
return AL_SUCCESS;
|
|
}
|
|
|
|
#if !defined( AL_NO_C )
|
|
|
|
extern "C" AL_LINKAGE int AL_FUNCTION
|
|
ALStorageCreate( hALStorage this_object, /* Tag public function */
|
|
long desired_size )
|
|
{
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "ALStorageCreate" );
|
|
if ( desired_size == AL_DEFAULT )
|
|
desired_size = -1;
|
|
return ( (ALStorage *) this_object )->Create( desired_size );
|
|
}
|
|
|
|
#endif
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::Close()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Close an ALStorage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorage::Close();
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorageClose( hALStorage this_object );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageClose Lib "AL20LW"
|
|
// (ByVal this_object&) As Integer
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageClose( this_object : hALStorage ) : Integer;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to be closed. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// Just like with Open(), most derived classes will have their own
|
|
// versions of Close(). They can call this version to delete the I/O
|
|
// buffer if they feel like it is too hard to do themselves.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// The current integer status of the object. Hopefully this will be
|
|
// AL_SUCCESS, but it could well be a value < AL_SUCCESS.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALFile::Create(), ALFile::Open()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
int AL_PROTO
|
|
ALStorage::Close() /* Tag public function */
|
|
{
|
|
if ( mpcBuffer ) {
|
|
delete[] mpcBuffer;
|
|
mpcBuffer = 0;
|
|
}
|
|
return mStatus;
|
|
}
|
|
|
|
#if !defined( AL_NO_C )
|
|
|
|
extern "C" AL_LINKAGE int AL_FUNCTION
|
|
ALStorageClose( hALStorage this_object ) /* Tag public function */
|
|
{
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "ALStorageClose" );
|
|
return ( (ALStorage *) this_object )->Close();
|
|
}
|
|
|
|
#endif
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::ReadBuffer()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Read in a buffer full of data.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// size_t ALStorage::ReadBuffer( unsigned char *buf, size_t length );
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// size_t ALStorageReadBuffer( hALStorage this_object,
|
|
// unsigned char *buffer,
|
|
// size_t length );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageReadBuffer Lib "AL20LW"
|
|
// (ByVal this_object&, ByVal buffer$, ByVal length%) As Integer
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageReadBuffer( this_object : hALStorage;
|
|
// buffer : PChar;
|
|
// length : Integer ) : Integer;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to be read. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// buf : The buffer that is going to receive input characters.
|
|
//
|
|
// length : The number of bytes you want to read.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// We could write a simple version of this function by just calling
|
|
// ReadChar() over and over, but it would be nice to do things
|
|
// a little more efficiently. Since we have this nice big buffer
|
|
// full of data ready to read, it makes sense to copy big chunks of
|
|
// it in one fell swoop. That is what this guy does. It sits in a loop
|
|
// doing a memcpy() followed by LoadBuffer() until all of the data
|
|
// that has been asked for got moved. As data is read in, we have to
|
|
// update the data member muReadIndex. Other data members will get
|
|
// updated by LoadBuffer().
|
|
//
|
|
// RETURNS
|
|
//
|
|
// The number of bytes read in, always. If this function generates an
|
|
// error, it will be found in the mStatus member.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::ReadChar(), ALStorage::WriteBuffer()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
size_t AL_PROTO
|
|
ALStorage::ReadBuffer( unsigned char AL_DLL_FAR *buf, /* Tag public function */
|
|
size_t length )
|
|
{
|
|
size_t bytes_left_to_read = length;
|
|
size_t buffer_bytes_available;
|
|
|
|
while ( bytes_left_to_read ) {
|
|
buffer_bytes_available = muBufferValidData - muReadIndex;
|
|
if ( buffer_bytes_available == 0 ) {
|
|
if ( LoadBuffer( mlFilePointer ) < 0 )
|
|
return length - bytes_left_to_read;
|
|
buffer_bytes_available = muBufferValidData;
|
|
}
|
|
if ( bytes_left_to_read <= buffer_bytes_available ) {
|
|
memcpy( buf, mpcBuffer + muReadIndex, bytes_left_to_read );
|
|
muReadIndex += bytes_left_to_read;
|
|
return length;
|
|
} else {
|
|
memcpy( buf, mpcBuffer + muReadIndex, buffer_bytes_available );
|
|
buf += buffer_bytes_available;
|
|
bytes_left_to_read -= buffer_bytes_available;
|
|
muReadIndex += buffer_bytes_available;
|
|
if ( LoadBuffer( mlFilePointer ) < 0 )
|
|
return length - bytes_left_to_read;
|
|
}
|
|
}
|
|
return length;
|
|
}
|
|
|
|
#if !defined( AL_NO_C )
|
|
|
|
extern "C" AL_LINKAGE size_t AL_FUNCTION
|
|
ALStorageReadBuffer( hALStorage this_object, /* Tag public function */
|
|
unsigned char AL_DLL_FAR *buffer,
|
|
size_t length )
|
|
{
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "ALStorageReadBuffer" );
|
|
AL_ASSERT( buffer != 0, "Passed a null buffer to ALStorageReadBuffer" );
|
|
return ( (ALStorage * ) this_object )->ReadBuffer( buffer, length );
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined( AL_VB32 )
|
|
extern "C" AL_LINKAGE size_t AL_FUNCTION
|
|
ALStorageReadBufferVB32( hALStorage this_object, /* Tag public function */
|
|
LPSAFEARRAY *ppsa,
|
|
size_t length )
|
|
{
|
|
unsigned char *p;
|
|
size_t result;
|
|
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "ALStorageReadBufferVB32" );
|
|
AL_ASSERT( SafeArrayGetDim( *ppsa ) > 0, "Array with < 1 dimensions in ALStorageWriteBufferVB32" );
|
|
//
|
|
// This doesn't work, don't know why
|
|
//
|
|
// int j = SafeArrayGetElemsize( *ppsa );
|
|
// wsprintf( buffer, "Array dim = %d j = %d length = %d", i, j, length );
|
|
// char buffer[ 81 ];
|
|
// MessageBox( 0, buffer, buffer, MB_OK );
|
|
// AL_ASSERT( j >= (int) length, "Buffer too small in ALStorageReadBufferVB32" );
|
|
// int j =
|
|
SafeArrayAccessData( *ppsa, (void **) &p );
|
|
result = ( (ALStorage * ) this_object )->ReadBuffer( p, length );
|
|
SafeArrayUnaccessData( *ppsa );
|
|
return result;
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::WriteBuffer()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Write a buffer to a storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// size_t ALStorage::WriteBuffer( const unsigned char *buf,
|
|
// size_t length );
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// size_t ALStorageWriteBuffer( hALStorage this_object,
|
|
// unsigned char *buffer,
|
|
// size_t length );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageWriteBuffer Lib "AL20LW"
|
|
// (ByVal this_object&, ByVal buffer$, ByVal length%) As Integer
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageWriteBuffer( this_object : hALStorage;
|
|
// buffer : PChar;
|
|
// length : Integer ) : Integer;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to be written to. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// buf : The buffer that is contains the output data.
|
|
//
|
|
// length : The number of bytes you want to write.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// We could write a simple version of this function by just calling
|
|
// WriteChar() over and over, but it would be nice to do things
|
|
// a little more efficiently. Since we have this nice big buffer
|
|
// just waiting for data, it makes sense to copy big chunks to
|
|
// it in one fell swoop. That is what this guy does. It sits in a loop
|
|
// doing a memcpy() followed by FlushBuffer() until all of the data
|
|
// that was ready to go has been sent. As data is written, we have to
|
|
// update the data member muWriteIndex. Other data members will get
|
|
// updated by FlushBuffer().
|
|
//
|
|
// RETURNS
|
|
//
|
|
// The number of bytes written, always. If this function generates an
|
|
// error, it will be found in the mStatus member.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::WriteChar(), ALStorage::ReadBuffer()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
size_t AL_PROTO
|
|
ALStorage::WriteBuffer( const unsigned char AL_DLL_FAR *buf, /* Tag public function */
|
|
size_t length )
|
|
{
|
|
size_t buffer_bytes_free;
|
|
size_t write_bytes_left = length;
|
|
|
|
if ( mStatus < 0 )
|
|
return 0;
|
|
while ( write_bytes_left > 0 ) {
|
|
buffer_bytes_free = muBufferSize - muWriteIndex;
|
|
if ( buffer_bytes_free == 0 ) {
|
|
if ( FlushBuffer() < 0 )
|
|
return length - write_bytes_left;
|
|
buffer_bytes_free = muBufferSize;
|
|
}
|
|
if ( write_bytes_left <= buffer_bytes_free ) {
|
|
memcpy( mpcBuffer + muWriteIndex, buf, write_bytes_left );
|
|
muWriteIndex += write_bytes_left;
|
|
return length;
|
|
} else {
|
|
memcpy( mpcBuffer + muWriteIndex, buf, buffer_bytes_free );
|
|
muWriteIndex += buffer_bytes_free;
|
|
buf += buffer_bytes_free;
|
|
write_bytes_left -= buffer_bytes_free;
|
|
if ( FlushBuffer() < 0 )
|
|
return length - write_bytes_left;
|
|
}
|
|
}
|
|
return length;
|
|
}
|
|
|
|
#if !defined( AL_NO_C )
|
|
|
|
extern "C" AL_LINKAGE size_t AL_FUNCTION
|
|
ALStorageWriteBuffer( hALStorage this_object, /* Tag public function */
|
|
unsigned char AL_DLL_FAR *buffer,
|
|
size_t length )
|
|
|
|
{
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "ALStorageWriteBuffer" );
|
|
AL_ASSERT( buffer != 0, "Passed a null buffer to ALStorageWriteBuffer" );
|
|
return ( (ALStorage * ) this_object )->WriteBuffer( buffer, length );
|
|
}
|
|
|
|
#endif
|
|
|
|
#if defined( AL_VB32 )
|
|
|
|
extern "C" AL_LINKAGE size_t AL_FUNCTION
|
|
ALStorageWriteBufferVB32( hALStorage this_object, /* Tag public function */
|
|
LPSAFEARRAY *ppsa,
|
|
size_t length )
|
|
|
|
{
|
|
unsigned char *p;
|
|
size_t result;
|
|
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "ALStorageWriteBufferVB32" );
|
|
AL_ASSERT( SafeArrayGetDim( *ppsa ) > 0, "Array with < 1 dimensions in ALStorageWriteBufferVB32" );
|
|
// i = SafeArrayGetElemsize( *ppsa );
|
|
// AL_ASSERT( i >= (int)length, "Buffer too small in ALStorageWriteBufferVB32" );
|
|
// int j =
|
|
SafeArrayAccessData( *ppsa, (void **) &p );
|
|
result = ( (ALStorage * ) this_object )->WriteBuffer( p, length );
|
|
SafeArrayUnaccessData( *ppsa );
|
|
return result;
|
|
}
|
|
|
|
#endif
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::WriteString()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Write a null terminated string to a storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorage::WriteString( const char AL_DLL_FAR *string_data );
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorageWriteString( hALStorage this_object,
|
|
// char *string );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageWriteString Lib "AL20LW"
|
|
// (ByVal this_object&, ByVal string_data$) As Integer
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageWriteString( this_object : hALStorage;
|
|
// string_data : PChar ) : Integer;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to have a string written to it. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// string_data : A C-style null terminated string to be written out in
|
|
// our portable format.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// We write random length data to archive directories using this special
|
|
// format, which is a 16 bit int describing the length of the data,
|
|
// followed by the data itself. All of the storage objects and compression
|
|
// engines write their own private data out using this format. This
|
|
// means that even if another class doesn't understand the content of data
|
|
// stored in this format, at least it knows how to read it in so as to
|
|
// move past it.
|
|
//
|
|
// This function won't write just any random data, it is specifically
|
|
// oriented towards C strings. This means it is mostly used to write
|
|
// file names and comments. Their are a few places where classes
|
|
// write private data that isn't kept in C strings, they just manually
|
|
// write the length with WriteGlShort(), followed by the data.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// AL_SUCCESS if things work, or an error code < AL_SUCCESS if an error
|
|
// occurs writing the data out.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::ReadString()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
int AL_PROTO
|
|
ALStorage::WriteString( const char AL_DLL_FAR *string_data ) /* Tag public function */
|
|
{
|
|
short unsigned int len;
|
|
if ( string_data != 0 )
|
|
len = (short unsigned int) strlen( string_data );
|
|
else
|
|
len = 0;
|
|
WriteGlShort( len );
|
|
if ( len )
|
|
WriteBuffer( (unsigned char *) string_data, len );
|
|
return mStatus;
|
|
}
|
|
|
|
#if !defined( AL_NO_C )
|
|
|
|
extern "C" AL_LINKAGE int AL_FUNCTION
|
|
ALStorageWriteString( hALStorage this_object, /* Tag public function */
|
|
char AL_DLL_FAR *string )
|
|
{
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "ALStorageWriteString" );
|
|
AL_ASSERT( string != 0, "Passing null string in ALStorageWriteString()" );
|
|
return ( (ALStorage *) this_object )->WriteString( string );
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::ReadString()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Read a string from a storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorage::ReadString( ALName &name,
|
|
// short int length = -1 );
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// None, we have problems with this in C/VB/Delphi.
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// None, we have problems with this in C/VB/Delphi.
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// None, we have problems with this in C/VB/Delphi.
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// name : A reference to the storage object that is going to be loaded
|
|
// up with a string. Note that using an ALName object is a good
|
|
// thing here, because we are going to have to dynamically allocate
|
|
// data based on how long the input string is. If we returned a
|
|
// char *, we would have problems, because the pointer would be
|
|
// allocated inside the DLL, but the user would have to free it
|
|
// outside the DLL. With an ALName, the data will be freed inside
|
|
// the DLL when the ALName object is destroyed.
|
|
//
|
|
// We can't pass around this ALName object to C/VB/Delphi, so they
|
|
// don't get access to this function. Sorry.
|
|
//
|
|
// length : Normally, you read the length in from the storage object,
|
|
// and then read in the data. But sometimes, you know the
|
|
// length in advance, and don't want to read it from the
|
|
// storage object. In that case, pass the length in this arg.
|
|
// O/w, pass -1.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This function is used internally by ArchiveLib. It is used to read
|
|
// random length blocks of data out of archives (or other storage objects).
|
|
//
|
|
// RETURNS
|
|
//
|
|
// AL_SUCCESS, or not.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::WriteString()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
int AL_PROTO
|
|
ALStorage::ReadString( ALName AL_DLL_FAR &name, /* Tag public function */
|
|
short int length /* = -1 */ )
|
|
{
|
|
if ( length == -1 ) {
|
|
if ( ReadGlShort( length ) < 0 )
|
|
return mStatus.SetError( AL_READ_ERROR,
|
|
"Error reading string length"
|
|
"in ReadString() for object %s",
|
|
mName.GetSafeName() );
|
|
}
|
|
char *new_string = new char[ length + 1 ];
|
|
if ( new_string ) {
|
|
ReadBuffer( (unsigned char *) new_string, length );
|
|
new_string[ length ] = '\0';
|
|
name = new_string;
|
|
delete[] new_string;
|
|
return AL_SUCCESS;
|
|
}
|
|
return mStatus.SetError( AL_CANT_ALLOCATE_MEMORY,
|
|
"Error allocating buffer space in call "
|
|
"to ReadString() for object %s",
|
|
mName.GetSafeName() );
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::Tell()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Return the current offset in the storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// long ALStorage::Tell();
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// long ALStorageTell( hALStorage this_object );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageTell Lib "AL20LW"
|
|
// (ByVal this_object&) As Long
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageTell( this_object : hALStorage ) : LongInt;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to have its offset returned. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// Because we are using buffered I/O here, figuring out the current
|
|
// position of the read write pointer is just a tiny bit more complicated
|
|
// than just checking a pointer. We have to find the physical location of
|
|
// the file pointer, then add in any offset created by the presence of
|
|
// data in the I/O buffer.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// A long integer indicating the current position of the read/write
|
|
// pointer for the file.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::Seek(), ALStorage::WriteBuffer()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
long AL_PROTO
|
|
ALStorage::Tell() /* Tag public function */
|
|
{
|
|
if ( muWriteIndex )
|
|
return mlFilePointer + muWriteIndex;
|
|
else
|
|
return mlFilePointer - muBufferValidData + muReadIndex;
|
|
|
|
}
|
|
|
|
#if !defined( AL_NO_C )
|
|
|
|
extern "C" AL_LINKAGE long AL_FUNCTION
|
|
ALStorageTell( hALStorage this_object ) /* Tag public function */
|
|
{
|
|
AL_ASSERT_OBJECT( this_object, ALStorage, "ALStorageTell" );
|
|
return ( (ALStorage *) this_object )->Tell();
|
|
}
|
|
|
|
#endif
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::WriteStorageObjectData()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Write out class-specific storage object data.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorage::WriteStorageObjectData( ALStorage * archive );
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// None, this is an internal callback virtual function.
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// None, this is an internal callback virtual function.
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// None, this is an internal callback virtual function.
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// archive : A pointer to the storage object where we are going to
|
|
// write the private data.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// All storage objects have the ability to create a private data block
|
|
// that will be stored along with the directory when creating an archive.
|
|
// None of the classes predefined in ArchiveLib use this data block, which
|
|
// means they use this function instead of providing their own virtual
|
|
// substitute. This function writes a private data block of exactly 0
|
|
// bytes in length. Our internal storage format means that a block
|
|
// of 0 bytes length takes 2 bytes to store.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// AL_SUCCESS if things went okay, otherwise an error code < AL_SUCCESS.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
int AL_PROTO
|
|
ALStorage::WriteStorageObjectData( ALStorage AL_DLL_FAR * archive ) /* Tag public function */
|
|
{
|
|
return archive->WriteGlShort( 0 );
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::ReadStorageObjectData()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Read in class specific data from an archive.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorage::ReadStorageObjectData( ALStorage * archive );
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// None, this is an internal callback virtual function.
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// None, this is an internal callback virtual function.
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// None, this is an internal callback virtual function.
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// archive : A pointer to the storage object where we are going to
|
|
// read in the private data..
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// All storage objects have the ability to create a private data block
|
|
// that will be stored along with the directory when creating an archive.
|
|
// None of the classes predefined in ArchiveLib use this data block, which
|
|
// means they use this function instead of providing their own virtual
|
|
// substitute. This function reads a private data block of exactly 0
|
|
// bytes in length. Our internal storage format means that a block
|
|
// of 0 bytes length takes 2 bytes to store.
|
|
//
|
|
// In debug mode, we get really bent out of shape if this data block
|
|
// doesn't look exactly like we expect it to.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// AL_SUCCESS if things went okay, otherwise an error code < AL_SUCCESS.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::WriteStorageObjectData()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
int AL_PROTO
|
|
ALStorage::ReadStorageObjectData( ALStorage AL_DLL_FAR * archive ) /* Tag public function */
|
|
{
|
|
short int temp;
|
|
int status = archive->ReadGlShort( temp );
|
|
AL_ASSERT( temp == 0, "ReadStorageObjectData: stored data is not null" );
|
|
return status;
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::ReadCopyright()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Read a copyright string for human display.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// char * ALStorage::ReadCopyright();
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// char * ALReadCopyright( void );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALReadCopyright Lib "AL20FW"
|
|
// Alias "ALReadCopyrightVB"
|
|
// As String
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALReadCopyright : PChar;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// None. Note that we don't have the usual this_object argument, because
|
|
// this is a static function. It's only in the ALStorage class to avoid
|
|
// name space clutter.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// It is a good idea for us to have a copyright notice embedded in the
|
|
// library. Hopefully, this notice will show up in any executables linked
|
|
// using this library, or in the DLL they link to.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// A pointer to a copyright notice.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release.
|
|
//
|
|
|
|
char *_al_copyright = "Copyright (c) 1994-1996 Greenleaf Software, Inc.\n"
|
|
"All Rights Reserved.\n";
|
|
|
|
char AL_DLL_FAR * AL_PROTO
|
|
ALStorage::ReadCopyright() /* Tag public function */
|
|
{
|
|
return _al_copyright;
|
|
}
|
|
|
|
#if !defined( AL_NO_C )
|
|
|
|
extern "C" AL_LINKAGE char AL_DLL_FAR * AL_FUNCTION
|
|
ALReadCopyright( void ) /* Tag public function */
|
|
{
|
|
return _al_copyright;
|
|
}
|
|
|
|
#if defined( AL_VB )
|
|
|
|
extern "C" AL_LINKAGE long AL_FUNCTION
|
|
ALReadCopyrightVB( void ) /* Tag public function */
|
|
{
|
|
return ALCreateVBString( _al_copyright,
|
|
(unsigned short int) _fstrlen( _al_copyright ) );
|
|
}
|
|
|
|
#elif defined( AL_VB32 )
|
|
|
|
extern "C" AL_LINKAGE BSTR AL_FUNCTION
|
|
ALReadCopyrightVB( void ) /* Tag public function */
|
|
{
|
|
return SysAllocStringByteLen( _al_copyright, strlen( _al_copyright ) );
|
|
}
|
|
|
|
#endif /* #if defined( AL_VB ) */
|
|
|
|
#endif /* #if !defined( AL_NO_C ) */
|
|
|