/* * Copyright 1995, 1996 Perforce Software. All rights reserved. * * This file is part of Perforce - the FAST SCM System. */ /* * FileSys.h - OS specific file manipulation * * Public classes: * * FileSys - a file handle, with all the trimmings * * Static Public methods: * * FileSys::Create() - create a FileSys, given its file type * FileSys::CreateTemp() - create, destructor deletes the file * FileSys::CreateGloablTemp() - Temp, constructor makes a global name * FileSys::Perm() - translate string perm to enum * * Public methods: * * FileSys::Set() - set file name * FileSys::Name() - get file name * FileSys::GetType() - get type previously set * FileSys::IsTextual() - return if type is one of text types * FileSys::IsExec() - return if type indicates executable bit set * FileSys::DoIndirectWrites() - updates should write temp/rename * * FileSys::MakeGlobalTemp() - make a temp name in a global directory * FileSys::MakeLocalTemp() - make a temp name in same dir as file * * FileSys::IsDeleteOnClose() - will file be removed on close? * FileSys::SetDeleteOnClose() - file will be removed * FileSys::ClearDeleteOnClose() - file won't be removed * * FileSys::Perms() - set file permission for close after write * FileSys::ModTime() - set mod time for close after write * FileSys::ChmodTime() - use modTime value to change mod time directly * * FileSys::Open() - open named file according to mode * FileSys::Write() - write a block into file * FileSys::Read() - read a block from file * FileSys::ReadLine() - read a line into string * FileSys::ReadWhole() - read whole file into string * FileSys::Close() - close file description * * FileSys::Stat() - return flags if file exists, writable * FileSys::Truncate() - set file to zero length if it exists * FileSys::Unlink() - remove single file * * FileSys::GetFd() - return underlying int fd, FST_BINARY only * FileSys::GetSize() - return file size, FST_BINARY,TEXT,ATEXT only * FileSys::Seek() - seek to offset, FST_BINARY,TEXT,ATEXT only * FileSys::Tell() - file position, FST_BINARY,TEXT,ATEXT only * * FileSys::ScanDir() - return a list of directory contents * FileSys::MkDir() - make a directory for the current file * FileSys::RmDir() - remove the directory of the current file * FileSys::Rename() - rename file to target * FileSys::ReadFile() - open, read whole file into string, close * FileSys::WriteFile() - open, write whole file from string, close * FileSys::Chmod() - change permissions * FileSys::Compare() - compare file against target * FileSys::Copy - copy one file to another * FileSys::Digest() - return a fingerprint of the file contents * FileSys::Chmod2() - copy a file to get ownership and set perms * * FileSys::CheckType() - look at the file and see if it is binary, etc */ enum FileSysType { // Base types FST_TEXT = 0x0001, // file is text FST_BINARY = 0x0002, // file is binary FST_GZIP = 0x0003, // file is gzip FST_DIRECTORY = 0x0005, // it's a directory FST_SYMLINK = 0x0006, // it's a symlink FST_RESOURCE = 0x0007, // Macintosh resource file FST_SPECIAL = 0x0008, // not a regular file FST_MISSING = 0x0009, // no file at all FST_CANTTELL = 0x000A, // can read file to find out FST_EMPTY = 0x000B, // file is empty FST_UNICODE = 0x000C, // file is unicode FST_GUNZIP = 0x000D, // stream is gzip FST_UTF16 = 0x000E, // stream is utf8 convert to utf16 FST_MASK = 0x000F, // mask for types // Modifiers FST_M_APPEND = 0x0010, // open always append FST_M_EXCL = 0x0020, // open exclusive create FST_M_SYNC = 0x0040, // fsync on close FST_M_EXEC = 0x0100, // file is executable FST_M_APPLE = 0x0200, // apple single/double encoding FST_M_COMP = 0x0400, // file is somehow compressed FST_M_MASK = 0x0ff0, // mask for modifiers // Line ending types, loosely mapped to LineType FST_L_LOCAL = 0x0000, // LineTypeLocal FST_L_LF = 0x1000, // LineTypeRaw FST_L_CR = 0x2000, // LineTypeCr FST_L_CRLF = 0x3000, // LineTypeCrLf FST_L_LFCRLF = 0x4000, // LineTypeLfcrlf FST_L_MASK = 0xf000, // mask for LineTypes // Composite types, for filesys.cc FST_ATEXT = 0x0011, // append-only text FST_XTEXT = 0x0101, // executable text FST_RTEXT = 0x1001, // raw text FST_RXTEXT = 0x1101, // executable raw text FST_CBINARY = 0x0402, // pre-compressed binary FST_XBINARY = 0x0102, // executable binary FST_APPLETEXT = 0x0201, // apple format text FST_APPLEFILE = 0x0202, // apple format binary FST_XAPPLEFILE = 0x0302, // executable apple format binary FST_XUNICODE = 0x010C, // executable unicode text FST_XUTF16 = 0x010E, // stream is utf8 convert to utf16 FST_RCS = 0x1041 // RCS temporary file: raw text, sync on close }; enum FileStatFlags { FSF_EXISTS = 0x01, // file exists FSF_WRITEABLE = 0x02, // file is user-writable FSF_DIRECTORY = 0x04, // file is a directory FSF_SYMLINK = 0x08, // file is symlink FSF_SPECIAL = 0x10, // file is not regular FSF_EXECUTABLE = 0x20, // file is executable FSF_EMPTY = 0x40, // file is empty FSF_HIDDEN = 0x80 // file is invisible (hidden) } ; enum FileOpenMode { FOM_READ, // open for reading FOM_WRITE // open for writing } ; enum FilePerm { FPM_RO, // leave file read-only FPM_RW, // leave file read-write FPM_ROO // leave file read-only (owner) } ; class StrArray; class CharSetCvt; class MD5; class FileSys { public: // Creators static FileSys *Create( FileSysType type ); static FileSys *CreateTemp( FileSysType type ) { FileSys *f = Create( type ); f->SetDeleteOnClose(); return f; } static FileSys *CreateGlobalTemp( FileSysType type ) { FileSys *f = Create( type ); f->SetDeleteOnClose(); f->MakeGlobalTemp(); return f; } static FilePerm Perm( const char *p ); static int BufferSize(); int IsUnderPath( const StrPtr &path ); // Get/set perms, modtime void Perms( FilePerm p ) { perms = p; } void ModTime( StrPtr *u ) { modTime = u->Atoi(); } void ModTime( time_t t ) { modTime = (int)t; } // Set filesize hint for NT fragmentation avoidance void SetSizeHint( offL_t l ) { sizeHint = l; } offL_t GetSizeHint() { return sizeHint; } // Initialize digest void SetDigest( MD5 *m ) { checksum = m; } // Get type info FileSysType GetType() { return type; } int IsExec() { return ( type & FST_M_EXEC ); } int IsTextual() { return ( type & FST_MASK ) == FST_TEXT || ( type & FST_MASK ) == FST_UNICODE || ( type & FST_MASK ) == FST_UTF16; } int IsUnicode() { return ( type & FST_MASK ) == FST_UNICODE || ( type & FST_MASK ) == FST_UTF16; } int IsSymlink() { return ( type & FST_MASK ) == FST_SYMLINK; } // Read/write file access, provided by derived class FileSys(); virtual ~FileSys(); virtual void Set( const StrPtr &name ); virtual StrPtr *Path() { return &path; } virtual int DoIndirectWrites(); virtual void Translator( CharSetCvt * ); virtual void Open( FileOpenMode mode, Error *e ) = 0; virtual void Write( const char *buf, int len, Error *e ) = 0; virtual int Read( char *buf, int len, Error *e ) = 0; virtual void Close( Error *e ) = 0; virtual int Stat() = 0; virtual int StatModTime() = 0; virtual void Truncate( Error *e ) = 0; virtual void Unlink( Error *e = 0 ) = 0; virtual void Rename( FileSys *target, Error *e ) = 0; virtual void Chmod( FilePerm perms, Error *e ) = 0; virtual void ChmodTime( Error *e ) = 0; // NB: these for ReadFile only; interface will likely change virtual int GetFd(); virtual offL_t GetSize(); virtual void Seek( offL_t offset, Error * ); virtual offL_t Tell(); // Convenience wrappers for above void Chmod( Error *e ) { Chmod( perms, e ); } void Chmod( const char *perms, Error *e ) { Chmod( Perm( perms ), e ); } char * Name() { return Path()->Text(); } void Set( const char *name ) { Set( StrRef( name ) ); } void Write( const StrPtr &b, Error *e ) { Write( b.Text(), b.Length(), e ); } void Write( const StrPtr *b, Error *e ) { Write( b->Text(), b->Length(), e ); } // Tempfile support void MakeGlobalTemp(); virtual void MakeLocalTemp( char *file ); int IsDeleteOnClose() { return isTemp; } void SetDeleteOnClose() { isTemp = 1; } void ClearDeleteOnClose() { isTemp = 0; } // Meta operations virtual StrArray *ScanDir( Error *e ); virtual void MkDir( const StrPtr &p, Error *e ); void MkDir( Error *e ) { MkDir( path, e ); } virtual void RmDir( const StrPtr &p, Error *e ); void RmDir( Error *e = 0 ) { RmDir( path, e ); } FileSysType CheckType(); # if defined ( OS_MACOSX ) FileSysType CheckTypeMac(); # endif // Type generic operations virtual int ReadLine( StrBuf *buf, Error *e ); void ReadWhole( StrBuf *buf, Error *e ); // Type generic, whole file operations void ReadFile( StrBuf *buf, Error *e ); void WriteFile( const StrPtr *buf, Error *e ); int Compare( FileSys *other, Error *e ); void Copy( FileSys *targetFile, FilePerm perms, Error *e ); virtual void Digest( StrBuf *digest, Error *e ); void Chmod2( FilePerm perms, Error *e ); void Chmod2( const char *p, Error *e ) { Chmod2( Perm( p ), e ); } void Cleanup(); // Character Set operations void SetCharSetPriv( int x = 0 ) { charSet = x; } int GetCharSetPriv() { return charSet; } void SetContentCharSetPriv( int x = 0 ) { content_charSet = x; } int GetContentCharSetPriv() { return content_charSet; } protected: FileOpenMode mode; // read or write FilePerm perms; // leave read-only or read-write int modTime; // stamp file mod date on close offL_t sizeHint; // how big will the file get ? StrBuf path; FileSysType type; MD5 *checksum; // if verifying file transfer private: void TempName( char *buf ); int isTemp; int charSet; int content_charSet; } ;
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 7893 | Johan Nilsson |
OFFLINE CHANGELIST 10 - SUBMITTED ON 2011/03/23 11:18:27 Upgrade project files to VS2010 and switching to msbuild for the entire project. Retargeted everything to .NET4 Client Profile for the time being, due to VS2010 C++ limitations (can't target anything other than 4.0 without complicating the setup too much). Shouldn't be too hard to retarget later if push comes to shove. Added VS2010 P4API stuff directly inside this project also to make things easier to get up and running for the moment. Removed old static P4API libraries. ____________________________________________________________ OFFLINE CHANGELIST 9 - SUBMITTED ON 2011/03/22 07:35:31 Converted to VS2010 |