366 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			366 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //
 | |
| // FILEATTR.CPP
 | |
| //
 | |
| //  Source file for ArchiveLib 1.0
 | |
| //
 | |
| //  Copyright (c) Greenleaf Software, Inc. 1994
 | |
| //  All Rights Reserved
 | |
| //
 | |
| // CONTENTS
 | |
| //
 | |
| //  ALFileAttributes::operator new()
 | |
| //  ALFileAttributes::ALFileAttributes()
 | |
| //  ALFileAttributes::~ALFileAttributes()
 | |
| //  ALFileAttributes::SetFromPackedAttributes()
 | |
| //  ALFileAttributes::SetFromWin32Attributes()
 | |
| //  ALFileAttributes::SetFromDosAttributes()
 | |
| //  ALFileAttributes::PackedAttributes()
 | |
| //  ALFileAttributes::GetDosAttributes()
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This file contains all of the source to support the ALFileAttributes
 | |
| //  class.  Even though this is in theory a standalone, independent class,
 | |
| //  it really has not life of its own.  It always exists as a data
 | |
| //  member embedded in ALStorage.  The only reason these functions aren't
 | |
| //  member functions of ALStorage was simply to modularize things a bit.
 | |
| //  As it is, it makes pretty good sense as a class of its own.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //  May 25, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| #include "arclib.h"
 | |
| #pragma hdrstop
 | |
| 
 | |
| #if XVT_OS != XVT_OS_SCOUNIX
 | |
| #include <dos.h>
 | |
| #endif
 | |
| 
 | |
| #include "fileattr.h"
 | |
| 
 | |
| //
 | |
| // void * ALFileAttributes::operator new( size_t size )
 | |
| //
 | |
| // ARGUMENTS:
 | |
| //
 | |
| //  size  :  The amount of storage that needs to be allocated for
 | |
| //           this object.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  A pointer to the storage.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  When using the DLL version of ArchiveLib, it is a good idea to
 | |
| //  allocate the storage for objects from inside the DLL, since they
 | |
| //  will be freed inside the DLL.  If we don't have the new operator
 | |
| //  for a class, its storage will be allocated from the EXE before
 | |
| //  the constructor code is called.  Then, when it is time to free
 | |
| //  the storage, the delete operator will be called inside the DLL.
 | |
| //  Not good, right?
 | |
| //
 | |
| //  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.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 25, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| #if defined( AL_BUILDING_DLL )
 | |
| void AL_DLL_FAR * AL_PROTO ALFileAttributes::operator new( size_t size )
 | |
| {
 | |
|   return ::new char[ size ];
 | |
| }
 | |
| #endif
 | |
| 
 | |
| //
 | |
| // ALFileAttributes::ALFileAttributes()
 | |
| //
 | |
| // ARGUMENTS:
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Constructor, no return.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This is the only constructor for class ALFileAttributes.  It does
 | |
| //  nothing more than set all of the bits to 0.  I was thinking that
 | |
| //  it might be a good idea to set them to -1 instead, indicating that
 | |
| //  they are presently in an unknown state.  I would want to set them
 | |
| //  to 0 when I called Create(), and read them in when I call Open().
 | |
| //  Just thinking out loud.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 25, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| AL_PROTO ALFileAttributes::ALFileAttributes()
 | |
| {
 | |
|   miReadOnly = 0;
 | |
|   miSystem = 0;
 | |
|   miHidden = 0;
 | |
|   miArchive = 0;
 | |
| }
 | |
| 
 | |
| //
 | |
| // ALFileAttributes::~ALFileAttributes()
 | |
| //
 | |
| // ARGUMENTS:
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Destructor, no returns.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  The destructor doesn't have to worry about freeing any dynamic
 | |
| //  storage or anything like that, so it gets to do a great big nothing.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 25, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| AL_PROTO ALFileAttributes::~ALFileAttributes()
 | |
| {
 | |
| }
 | |
| 
 | |
| //
 | |
| // void ALFileAttributes::SetFromPackedAttributes( short int attributes )
 | |
| //
 | |
| // ARGUMENTS:
 | |
| //
 | |
| //  attributes  : A set of attributes that have been packed into a
 | |
| //                short int using our internal bit ordering:
 | |
| //
 | |
| //                  X | X | X | X | A | H | S | R
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing, a void function.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  The packed format is how we actually store file attributes in an
 | |
| //  archive.  When we read in the directory from an archive, we can
 | |
| //  use this function to apply the packed attribute bits to a storage
 | |
| //  object.  All it has to do is set the four bits internal to the
 | |
| //  class.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 25, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| void AL_PROTO ALFileAttributes::
 | |
| SetFromPackedAttributes( short int attributes )
 | |
| {
 | |
|   miReadOnly = ( attributes & 1 ) != 0;
 | |
|   miSystem = ( attributes & 2 ) != 0;
 | |
|   miHidden = ( attributes & 4 ) != 0;
 | |
|   miArchive = ( attributes & 8 ) != 0;
 | |
| }
 | |
| 
 | |
| //
 | |
| // void ALFileAttributes::SetFromWin32Attributes( DWORD win32_attributes )
 | |
| //
 | |
| // ARGUMENTS:
 | |
| //
 | |
| //  attributes  : The set of file attributes as defined for Win32s.
 | |
| //                These are the attributes you get back from the
 | |
| //                GetFileAttributes() function call.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing, a void function.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  When the ALFile class opens a file under Win32s, it reads in
 | |
| //  the file attributes with a call to GetFileAttributes.  It can then store
 | |
| //  those file attributes in the ALFileAttributes member of ALStorage
 | |
| //  by calling this function.
 | |
| //
 | |
| //  Converting the data to our internal format is simply a matter of picking
 | |
| //  bits out of a DWORD.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 25, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| #if defined( AL_WIN32S )
 | |
| 
 | |
| void AL_PROTO ALFileAttributes::
 | |
| SetFromWin32Attributes( DWORD win32_attributes )
 | |
| {
 | |
|   miReadOnly = ( win32_attributes & FILE_ATTRIBUTE_READONLY ) != 0;
 | |
|   miSystem = ( win32_attributes & FILE_ATTRIBUTE_SYSTEM ) != 0;
 | |
|   miHidden = ( win32_attributes & FILE_ATTRIBUTE_HIDDEN ) != 0;
 | |
|   miArchive = ( win32_attributes & FILE_ATTRIBUTE_ARCHIVE ) != 0;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| //
 | |
| // void ALFileAttributes::SetFromDosAttributes( unsigned dos_attributes )
 | |
| //
 | |
| // ARGUMENTS:
 | |
| //
 | |
| //  attributes  : The set of file attributes as defined for MS-DOS.
 | |
| //                These are the attributes you get back from the
 | |
| //                _dos_getfileattr() function call.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing, a void function.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  When the ALFile class opens a file under MS-DOS or Windows, it reads in
 | |
| //  the file attributes with a call to _dos_getfileattr().  It can then store
 | |
| //  those file attributes in the ALFileAttributes member of ALStorage
 | |
| //  by calling this function.
 | |
| //
 | |
| //  Converting the data to our internal format is simply a matter of picking
 | |
| //  bits out of an unsigned int
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 25, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| #if !defined( AL_WIN32S )
 | |
| 
 | |
| void AL_PROTO ALFileAttributes::SetFromDosAttributes( unsigned dos_attributes )
 | |
| {
 | |
|   miReadOnly = ( dos_attributes & _A_RDONLY ) != 0;
 | |
|   miSystem = ( dos_attributes & _A_SYSTEM ) != 0;
 | |
|   miHidden = ( dos_attributes & _A_HIDDEN ) != 0;
 | |
|   miArchive = ( dos_attributes & _A_ARCH ) != 0;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| //
 | |
| // unsigned short int ALFileAttributes::PackedAttributes()
 | |
| //
 | |
| // ARGUMENTS:
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  An unsigned short int containing the four file attribute bits, packed
 | |
| //  into the format we use to store file attributes in an archive:
 | |
| //
 | |
| //
 | |
| //                  X | X | X | X | A | H | S | R
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  When it comes time to write an archive directory out to disk, we need
 | |
| //  to store the file attributes in a consistent format.  This format
 | |
| //  is our internal packed attribute format.  You can get the file attributes
 | |
| //  in this packed attribute format with a call to this function.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 25, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| unsigned short int AL_PROTO ALFileAttributes::PackedAttributes()
 | |
| {
 | |
|   int result = 0;
 | |
| 
 | |
|   result |= miReadOnly ? 1 : 0;
 | |
|   result |= miSystem ? 2 : 0;
 | |
|   result |= miHidden ? 4 : 0;
 | |
|   result |= miArchive ? 8 : 0;
 | |
|   return (unsigned short int ) result;
 | |
| }
 | |
| 
 | |
| //
 | |
| // unsigned short int ALFileAttributes::GetDosAttributes()
 | |
| //
 | |
| // ARGUMENTS:
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  The set of file attributes, packed into the order that MS-DOS
 | |
| //  expects them for the _dos_setfileattr() function call.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  When we are closing a file that we have to set the time stamp and
 | |
| //  attributes for, this function is used to get the attributes.
 | |
| //  Under MS-DOS at least.  All it needs to do is repack some bits
 | |
| //  into the order that MS-DOS expects.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 26, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| #if !defined( AL_WIN32S )
 | |
| 
 | |
| unsigned short int AL_PROTO ALFileAttributes::GetDosAttributes()
 | |
| {
 | |
|   int result = 0;
 | |
|   result |= miReadOnly ? _A_RDONLY : 0;
 | |
|   result |= miSystem ? _A_SYSTEM : 0;
 | |
|   result |= miHidden ? _A_HIDDEN : 0;
 | |
|   result |= miArchive ? _A_ARCH : 0;
 | |
|   return (unsigned short int) result;
 | |
| }
 | |
| #endif //#if !defined( AL_WIN32S )
 | |
| 
 | |
| //
 | |
| // DWORD ALFileAttributes::GetWin32Attributes()
 | |
| //
 | |
| // ARGUMENTS:
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  The set of file attributes, packed into the order that Win32s
 | |
| //  expects them for the SetFileAttributes() function call.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  When we are closing a file that we have to set the time stamp and
 | |
| //  attributes for, this function is used to get the attributes.
 | |
| //  Under Win32s at least.  All it needs to do is repack some bits
 | |
| //  into the order that Win32s expects.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 26, 1994  1.0A  : First release
 | |
| //
 | |
| 
 | |
| #if defined( AL_WIN32S )
 | |
| 
 | |
| DWORD AL_PROTO ALFileAttributes::GetWin32Attributes()
 | |
| {
 | |
|   DWORD result = 0;
 | |
|   result |= miReadOnly ? FILE_ATTRIBUTE_READONLY : 0;
 | |
|   result |= miSystem ? FILE_ATTRIBUTE_SYSTEM : 0;
 | |
|   result |= miHidden ? FILE_ATTRIBUTE_HIDDEN : 0;
 | |
|   result |= miArchive ? FILE_ATTRIBUTE_ARCHIVE : 0;
 | |
|   return result;
 | |
| }
 | |
| #endif //#if !defined( AL_WIN32S )
 |