195 lines
8.1 KiB
C
195 lines
8.1 KiB
C
![]() |
/*
|
||
|
** Command & Conquer Generals(tm)
|
||
|
** Copyright 2025 Electronic Arts Inc.
|
||
|
**
|
||
|
** This program is free software: you can redistribute it and/or modify
|
||
|
** it under the terms of the GNU General Public License as published by
|
||
|
** the Free Software Foundation, either version 3 of the License, or
|
||
|
** (at your option) any later version.
|
||
|
**
|
||
|
** This program is distributed in the hope that it will be useful,
|
||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
** GNU General Public License for more details.
|
||
|
**
|
||
|
** You should have received a copy of the GNU General Public License
|
||
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
// //
|
||
|
// (c) 2001-2003 Electronic Arts Inc. //
|
||
|
// //
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
//----------------------------------------------------------------------------=
|
||
|
//
|
||
|
// Westwood Studios Pacific.
|
||
|
//
|
||
|
// Confidential Information
|
||
|
// Copyright(C) 2001 - All Rights Reserved
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Project: WSYS Library
|
||
|
//
|
||
|
// Module: IO
|
||
|
//
|
||
|
// File name: wsys/File.h
|
||
|
//
|
||
|
// Created: 4/23/01
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#ifndef __FILE_H
|
||
|
#define __FILE_H
|
||
|
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Includes
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "lib/basetype.h"
|
||
|
#include "Common/AsciiString.h"
|
||
|
#include "Common/GameMemory.h"
|
||
|
// include FileSystem.h as it will be used alot with File.h
|
||
|
//#include "Common/FileSystem.h"
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Forward References
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Type Defines
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
//===============================
|
||
|
// File
|
||
|
//===============================
|
||
|
/**
|
||
|
* File is an interface class for basic file operations.
|
||
|
*
|
||
|
* All code should use the File class and not its derivatives, unless
|
||
|
* absolutely necessary. Also FS::Open should be used to create File objects and open files.
|
||
|
*/
|
||
|
//===============================
|
||
|
|
||
|
class File : public MemoryPoolObject
|
||
|
{
|
||
|
MEMORY_POOL_GLUE_ABC(File)
|
||
|
// friend doesn't play well with MPO (srj)
|
||
|
// friend class FileSystem;
|
||
|
|
||
|
public:
|
||
|
|
||
|
enum access
|
||
|
{
|
||
|
NONE = 0x00000000,
|
||
|
READ = 0x00000001, ///< Access file for reading
|
||
|
WRITE = 0x00000002, ///< Access file for writing
|
||
|
APPEND = 0x00000004, ///< Seek to end of file on open
|
||
|
CREATE = 0x00000008, ///< Create file if it does not exist
|
||
|
TRUNCATE = 0x00000010, ///< Delete all data in file when opened
|
||
|
TEXT = 0x00000020, ///< Access file as text data
|
||
|
BINARY = 0x00000040, ///< Access file as binary data
|
||
|
READWRITE = (READ | WRITE),
|
||
|
ONLYNEW = 0x00000080, ///< Only create file if it does not exist
|
||
|
|
||
|
// NOTE: STREAMING is Mutually exclusive with WRITE
|
||
|
STREAMING = 0x00000100 ///< Do not read this file into a ram file, read it as requested.
|
||
|
};
|
||
|
|
||
|
enum seekMode
|
||
|
{
|
||
|
START, ///< Seek position is relative to start of file
|
||
|
CURRENT, ///< Seek position is relative to current file position
|
||
|
END ///< Seek position is relative from the end of the file
|
||
|
};
|
||
|
|
||
|
protected:
|
||
|
|
||
|
AsciiString m_nameStr; ///< Stores file name
|
||
|
Int m_access; ///< How the file was opened
|
||
|
Bool m_open; ///< Has the file been opened
|
||
|
Bool m_deleteOnClose; ///< delete File object on close()
|
||
|
|
||
|
|
||
|
File(); ///< This class can only used as a base class
|
||
|
//virtual ~File();
|
||
|
|
||
|
public:
|
||
|
|
||
|
|
||
|
Bool eof();
|
||
|
virtual Bool open( const Char *filename, Int access = 0 ); ///< Open a file for access
|
||
|
virtual void close( void ); ///< Close the file !!! File object no longer valid after this call !!!
|
||
|
|
||
|
virtual Int read( void *buffer, Int bytes ) = NULL ; /**< Read the specified number of bytes from the file in to the
|
||
|
* memory pointed at by buffer. Returns the number of bytes read.
|
||
|
* Returns -1 if an error occured.
|
||
|
*/
|
||
|
virtual Int write( const void *buffer, Int bytes ) = NULL ; /**< Write the specified number of bytes from the
|
||
|
* memory pointed at by buffer to the file. Returns the number of bytes written.
|
||
|
* Returns -1 if an error occured.
|
||
|
*/
|
||
|
virtual Int seek( Int bytes, seekMode mode = CURRENT ) = NULL; /**< Sets the file position of the next read/write operation. Returns the new file
|
||
|
* position as the number of bytes from the start of the file.
|
||
|
* Returns -1 if an error occured.
|
||
|
*
|
||
|
* seekMode determines how the seek is done:
|
||
|
*
|
||
|
* START : means seek to the specified number of bytes from the start of the file
|
||
|
* CURRENT: means seek the specified the number of bytes from the current file position
|
||
|
* END: means seek the specified number of bytes back from the end of the file
|
||
|
*/
|
||
|
virtual void nextLine(Char *buf = NULL, Int bufSize = 0) = 0; ///< reads until it reaches a new-line character
|
||
|
|
||
|
virtual Bool scanInt(Int &newInt) = 0; ///< read an integer from the current file position.
|
||
|
virtual Bool scanReal(Real &newReal) = 0; ///< read a real number from the current file position.
|
||
|
virtual Bool scanString(AsciiString &newString) = 0; ///< read a string from the current file position.
|
||
|
|
||
|
virtual Bool print ( const Char *format, ...); ///< Prints formated string to text file
|
||
|
virtual Int size( void ); ///< Returns the size of the file
|
||
|
virtual Int position( void ); ///< Returns the current read/write position
|
||
|
|
||
|
|
||
|
void setName( const char *name ); ///< Set the name of the file
|
||
|
const char* getName( void ) const; ///< Returns a pointer to the name of the file
|
||
|
Int getAccess( void ) const; ///< Returns file's access flags
|
||
|
|
||
|
void deleteOnClose ( void ); ///< Causes the File object to delete itself when it closes
|
||
|
|
||
|
/**
|
||
|
Allocate a buffer large enough to hold entire file, read
|
||
|
the entire file into the buffer, then close the file.
|
||
|
the buffer is owned by the caller, who is responsible
|
||
|
for freeing is (via delete[]). This is a Good Thing to
|
||
|
use because it minimizes memory copies for BIG files.
|
||
|
*/
|
||
|
virtual char* readEntireAndClose() = 0;
|
||
|
virtual File* convertToRAMFile() = 0;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// Inlining
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline const char* File::getName( void ) const { return m_nameStr.str(); }
|
||
|
inline void File::setName( const char *name ) { m_nameStr.set(name); }
|
||
|
inline Int File::getAccess( void ) const { return m_access; }
|
||
|
inline void File::deleteOnClose( void ) { m_deleteOnClose = TRUE; }
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#endif // __FILE_H
|