//===========================================================================//
// File:	filestrm.hpp                                                        //
// Project: MUNGA           Brick: Resource Manager		                    //
// Contents: Implementation Details of resource management                   //
//---------------------------------------------------------------------------//
//   Date    Who  Modification                                               //
// --------  ---  ---------------------------------------------------------- //
//---------------------------------------------------------------------------//
// Copyright (C) 1996, Virtual World Entertainment, Inc.                     //
//                      PROPRIETARY AND CONFIDENTIAL                         //
//===========================================================================//

#if !defined(FILESTRM_HPP)
#	define FILESTRM_HPP

#	if !defined(MEMSTRM_HPP)
#		include <memstrm.hpp>
#	endif

	//##########################################################################
	//########################    FileStream    ################################
	//##########################################################################

	class FileStream:
		public MemoryStream
	{
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Constructors
	//
	public:
		FileStream(
			const char* file_name = NULL,
			Logical writable = False
		);
		~FileStream()
			{Close();}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Status functions
	//
	public:
		void*
			GetPointer() const
				{
					Fail("No implementation possible for FileStream::GetPointer()");
					return NULL;
				}

		void
			SetPointer(void *new_pointer)
				{Fail("No implementation possible for FileStream::SetPointer(void*)");}
		void
			SetPointer(size_t index);

		MemoryStream&
			AdvancePointer(size_t count);

		MemoryStream&
			RewindPointer(size_t count);

		MemoryStream&
			ReadBytes(
				void *ptr,
				size_t number_of_bytes
			);
		MemoryStream&
			WriteBytes(
				const void *ptr,
				size_t number_of_bytes
			);

		void
			Open(
				const char* file_name = NULL,
				Logical writable = False
			);
		void
      	Close();
		Logical
			IsFileOpened()
				{return ((int) fileHandle) != -1;}

		Logical
      		TestInstance() const;

		static Logical
			TestClass();

		protected:
		void * fileHandle;
		Logical readOnly;

		static void*
			OpenImplementation(
				const char* file_name,
				Logical read_only
			);
		static void
			CloseImplementation(void * file_handle);
		static size_t
			SeekImplementation(
				void * file_handle,
				size_t where,
				Logical from_end = False
			);
		static size_t
			ReadImplementation(
				void * file_handle,
				void *buffer,
				size_t length
			);
		static size_t
			WriteImplementation(
				void * file_handle,
				const void* buffer,
				size_t length
			);
	};

#endif

