// // ATTROS2.CPP // // Source file for ArchiveLib 2.0 // // Copyright (c) Greenleaf Software, Inc. 1994-1996 // All Rights Reserved // // CONTENTS // // ALFile::ReadAttributesFromFileSys() // ALFile::WriteAttributesToFileSys() // // DESCRIPTION // // These two files provide system-dependent functionality for ALFile. // It takes different code to set the attributes for files depending // on which O/S you are targetting. // // REVISION HISTORY // // February 14, 1996 2.0A : New release #include "arclib.h" #if !defined( AL_IBM ) #pragma hdrstop #endif #define INCL_DOSFILEMGR #include #include #include #include "filestor.h" #include "fileattr.h" // // NAME // // ALFile::ReadAttributesFromFileSys() // // PLATFORMS/ENVIRONMENTS // // OS/2 // C++ // // SHORT DESCRIPTION // // Read in the attributes of a file under OS/2. // // C++ SYNOPSIS // // #include "arclib.h" // #include "filestor.h" // // int ALFile::ReadAttributesFromFileSys(); // // C SYNOPSIS // // None, this internal protected function has no C version. // // VB SYNOPSIS // // None, this internal protected function has no VB version. // // DELPHI SYNOPSIS // // None, this internal protected function has no Delphi version. // // ARGUMENTS // // None. // // DESCRIPTION // // When an ALFile object is opened, we have to read the file attributes. // This is an O/S dependent function, but I don't want to have too many // #ifdefs, so I package it in a separate directory that gets compiled // in an environment dependent fashion. This particular file gets // compiled for any library that's using the OS/2 file system. // // All this function has to do is call the DosQueryFileInfo() function, // then translate the returned bits into the appropriate internal attribute // bits. Note that we don't try to translate any extended bits beyond // those in DOS compatiblity mode. If there is extra stuff that goes with // the HPFS, for example, we aren't paying any attention to it. // // RETURNS // // AL_SUCCESS or AL_CANT_OPEN_FILE. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release. // int AL_PROTO ALFile::ReadAttributesFromFileSys() /* Tag protected function */ { FILESTATUS3 InfoBuf; APIRET rc; rc = DosQueryFileInfo( miHandle, FIL_STANDARD, (PVOID) &InfoBuf, sizeof( InfoBuf ) ); if ( rc != 0 ) return mStatus.SetError( AL_CANT_OPEN_FILE, "Couldn't get file attribute " "information for %s. errno = %d.", mName.GetName(), rc ); mAttributes.miUnixBitsPresent = 0; mAttributes.miReadOnly = ( InfoBuf.attrFile & FILE_READONLY ) != 0; mAttributes.miSystem = ( InfoBuf.attrFile & FILE_SYSTEM ) != 0; mAttributes.miHidden = ( InfoBuf.attrFile & FILE_HIDDEN ) != 0; mAttributes.miArchive = ( InfoBuf.attrFile & FILE_ARCHIVED ) != 0; return AL_SUCCESS; } // // NAME // // ALFile::WriteAttributesToFileSys() // // PLATFORMS/ENVIRONMENTS // // OS/2 // C++ // // SHORT DESCRIPTION // // Set the attributes of a file under OS/2. // // C++ SYNOPSIS // // #include "arclib.h" // #include "filestor.h" // // int ALFile::WriteAttributesToFileSys(); // // C SYNOPSIS // // None, this internal protected function has no C version. // // VB SYNOPSIS // // None, this internal protected function has no VB version. // // DELPHI SYNOPSIS // // None, this internal protected function has no Delphi version. // // ARGUMENTS // // None. // // DESCRIPTION // // When an ALFile object is closed, we have to set the file attributes. // This is an O/S dependent function, but I don't want to have too many // #ifdefs, so I package it in a separate directory that gets compiled // in an environment dependent fashion. This particular file gets // compiled for any library that's using the OS/2 file system. // // This function calls DosSetPathInfo() to set both the time and date // stamp for the given file. This differs somewhat from the NT and // DOS versions of the function, which only set the attributes. // // RETURNS // // Nothing. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release. // void AL_PROTO ALFile::WriteAttributesToFileSys() /* Tag protected function */ { FILESTATUS3 InfoBuf; DosQueryPathInfo( (PSZ)(char*)mName, FIL_STANDARD, (PVOID) &InfoBuf, sizeof( InfoBuf ) ); if ( mAttributes.miReadOnly ) InfoBuf.attrFile |= FILE_READONLY; else InfoBuf.attrFile &= ~FILE_READONLY; if ( mAttributes.miSystem ) InfoBuf.attrFile |= FILE_SYSTEM; else InfoBuf.attrFile &= ~FILE_SYSTEM; if ( mAttributes.miHidden ) InfoBuf.attrFile |= FILE_HIDDEN; else InfoBuf.attrFile &= ~FILE_HIDDEN; if ( mAttributes.miArchive ) InfoBuf.attrFile |= FILE_ARCHIVED; else InfoBuf.attrFile &= ~FILE_ARCHIVED; struct tm tblock; mTimeDate.GetTimeDate( &tblock ); InfoBuf.ftimeCreation.hours = tblock.tm_hour; InfoBuf.ftimeCreation.minutes = tblock.tm_min; InfoBuf.ftimeCreation.twosecs = tblock.tm_sec / 2; InfoBuf.ftimeLastAccess.hours = tblock.tm_hour; InfoBuf.ftimeLastAccess.minutes = tblock.tm_min; InfoBuf.ftimeLastAccess.twosecs = tblock.tm_sec / 2; InfoBuf.ftimeLastWrite.hours = tblock.tm_hour; InfoBuf.ftimeLastWrite.minutes = tblock.tm_min; InfoBuf.ftimeLastWrite.twosecs = tblock.tm_sec / 2; InfoBuf.fdateCreation.day = tblock.tm_mday; InfoBuf.fdateCreation.month = tblock.tm_mon + 1; InfoBuf.fdateCreation.year = tblock.tm_year + 1900 - 1980; InfoBuf.fdateLastAccess.day = tblock.tm_mday; InfoBuf.fdateLastAccess.month = tblock.tm_mon + 1; InfoBuf.fdateLastAccess.year = tblock.tm_year + 1900 - 1980; InfoBuf.fdateLastWrite.day = tblock.tm_mday; InfoBuf.fdateLastWrite.month = tblock.tm_mon + 1; InfoBuf.fdateLastWrite.year = tblock.tm_year + 1900 -1980; DosSetPathInfo( (PSZ)(char*)mName, FIL_STANDARD, (PVOID) &InfoBuf, sizeof( InfoBuf ), 0L ); }