From 7259d01dc00066bba4804bde2cab22ff7ce5826e Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Sat, 5 Apr 2025 08:45:53 +0200 Subject: [PATCH] [GEN][ZH] Readd WWVegas/WWLib/rcfile.cpp for w3dview This partially reverts commit 931d1051c376c4980780e2bb596cdb6ddbeb44c4 --- .../Source/WWVegas/WWLib/CMakeLists.txt | 2 + .../Libraries/Source/WWVegas/WWLib/rcfile.cpp | 129 ++++++++++++++++++ .../Libraries/Source/WWVegas/WWLib/rcfile.h | 95 +++++++++++++ .../Source/WWVegas/WWLib/CMakeLists.txt | 2 + .../Libraries/Source/WWVegas/WWLib/rcfile.cpp | 129 ++++++++++++++++++ .../Libraries/Source/WWVegas/WWLib/rcfile.h | 96 +++++++++++++ 6 files changed, 453 insertions(+) create mode 100644 Generals/Code/Libraries/Source/WWVegas/WWLib/rcfile.cpp create mode 100644 Generals/Code/Libraries/Source/WWVegas/WWLib/rcfile.h create mode 100644 GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/rcfile.cpp create mode 100644 GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/rcfile.h diff --git a/Generals/Code/Libraries/Source/WWVegas/WWLib/CMakeLists.txt b/Generals/Code/Libraries/Source/WWVegas/WWLib/CMakeLists.txt index a81aef267ab..18447bfab33 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WWLib/CMakeLists.txt +++ b/Generals/Code/Libraries/Source/WWVegas/WWLib/CMakeLists.txt @@ -23,6 +23,7 @@ set(WWLIB_SRC ramfile.cpp random.cpp rawfile.cpp + rcfile.cpp readline.cpp realcrc.cpp refcount.cpp @@ -83,6 +84,7 @@ set(WWLIB_SRC RAMFILE.H RANDOM.H RAWFILE.H + rcfile.h readline.h realcrc.h ref_ptr.h diff --git a/Generals/Code/Libraries/Source/WWVegas/WWLib/rcfile.cpp b/Generals/Code/Libraries/Source/WWVegas/WWLib/rcfile.cpp new file mode 100644 index 00000000000..7fbfe90299c --- /dev/null +++ b/Generals/Code/Libraries/Source/WWVegas/WWLib/rcfile.cpp @@ -0,0 +1,129 @@ +/* +** 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 . +*/ + +/*********************************************************************************************** + *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** + *********************************************************************************************** + * * + * Project Name : wwlib * + * * + * $Archive:: /Commando/Code/wwlib/rcfile.cpp $* + * * + * Author:: Greg Hjelstrom * + * * + * $Modtime:: 7/09/99 1:37p $* + * * + * $Revision:: 5 $* + * * + *---------------------------------------------------------------------------------------------* + * Functions: * + * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + +#include "rcfile.h" +#include + +const char * RESOURCE_FILE_TYPE_NAME = "File"; + + +ResourceFileClass::ResourceFileClass(HMODULE hmodule, char const *filename) : + ResourceName(NULL), + hModule(NULL), + FileBytes(NULL), + FilePtr(NULL), + EndOfFile(NULL) +{ + Set_Name(filename); + HRSRC hresource = FindResource(hmodule,ResourceName,RESOURCE_FILE_TYPE_NAME); + + if (hresource) { + HGLOBAL hglob = LoadResource(hmodule,hresource); + if (hglob) { + FileBytes = (unsigned char *)LockResource(hglob); + if (FileBytes) { + FilePtr = FileBytes; + EndOfFile = FileBytes + SizeofResource(hmodule,hresource); + } + } + } +} + +ResourceFileClass::~ResourceFileClass(void) +{ + if (ResourceName) + free(ResourceName); +} + +char const * ResourceFileClass::Set_Name(char const *filename) +{ + if (ResourceName) { + free(ResourceName); + ResourceName = NULL; + } + if (filename) { + ResourceName = strdup(filename); + } + return ResourceName; +} + +int ResourceFileClass::Read(void *buffer, int size) +{ + if (!FilePtr) return 0; + + if (FilePtr + size > EndOfFile) { + size = EndOfFile - FilePtr; + } + memcpy(buffer,FilePtr,size); + FilePtr += size; + return size; +} + +int ResourceFileClass::Seek(int pos, int dir) +{ + switch (dir) { + case SEEK_SET: + FilePtr = FileBytes + pos; + break; + + case SEEK_CUR: + FilePtr = FilePtr + pos; + break; + + case SEEK_END: + FilePtr = EndOfFile + pos; + break; + } + + if (FilePtr > EndOfFile) { + FilePtr = EndOfFile; + } + if (FilePtr < FileBytes) { + FilePtr = FileBytes; + } + + return FilePtr - FileBytes; +} + +int ResourceFileClass::Size(void) +{ + return EndOfFile - FileBytes; +} + +void ResourceFileClass::Error(int /*error*/, int /*canretry*/, char const * /*filename*/) +{ +} diff --git a/Generals/Code/Libraries/Source/WWVegas/WWLib/rcfile.h b/Generals/Code/Libraries/Source/WWVegas/WWLib/rcfile.h new file mode 100644 index 00000000000..f2344e6638b --- /dev/null +++ b/Generals/Code/Libraries/Source/WWVegas/WWLib/rcfile.h @@ -0,0 +1,95 @@ +/* +** 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 . +*/ + +/*********************************************************************************************** + *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** + *********************************************************************************************** + * * + * Project Name : wwlib * + * * + * $Archive:: /Commando/Code/wwlib/rcfile.h $* + * * + * Author:: Greg Hjelstrom * + * * + * $Modtime:: 7/09/99 1:37p $* + * * + * $Revision:: 7 $* + * * + *---------------------------------------------------------------------------------------------* + * Functions: * + * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +#if defined(_MSC_VER) +#pragma once +#endif + +#ifndef RCFILE_H +#define RCFILE_H + +#include "always.h" +#include "WWFILE.H" +#include "win.h" + +/* +** ResourceFileClass +** This is a file class which allows you to read from a binary file that you have +** imported into your resources. Just import the file as a custom resource of the +** type "File". Replace the "id" of the resource with its filename (change +** IDR_FILE1 to "MyFile.w3d") and then you will be able to access it by using this +** class. +*/ +class ResourceFileClass : public FileClass +{ + public: + + ResourceFileClass(HMODULE hmodule, char const *filename); + virtual ~ResourceFileClass(void); + + virtual char const * File_Name(void) const { return ResourceName; } + virtual char const * Set_Name(char const *filename); + virtual int Create(void) { return false; } + virtual int Delete(void) { return false; } + virtual bool Is_Available(int /*forced=false*/) { return Is_Open (); } + virtual bool Is_Open(void) const { return (FileBytes != NULL); } + + virtual int Open(char const * /*fname*/, int /*rights=READ*/) { return Is_Open(); } + virtual int Open(int /*rights=READ*/) { return Is_Open(); } + + virtual int Read(void *buffer, int size); + virtual int Seek(int pos, int dir=SEEK_CUR); + virtual int Size(void); + virtual int Write(void const * /*buffer*/, int /*size*/) { return 0; } + virtual void Close(void) { } + virtual void Error(int error, int canretry = false, char const * filename=NULL); + + virtual unsigned char *Peek_Data(void) const { return FileBytes; } + + protected: + + char * ResourceName; + + HMODULE hModule; + + unsigned char * FileBytes; + unsigned char * FilePtr; + unsigned char * EndOfFile; + +}; + + +#endif diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/CMakeLists.txt b/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/CMakeLists.txt index 5f0fb34cd1e..73c28c725bb 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/CMakeLists.txt +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/CMakeLists.txt @@ -26,6 +26,7 @@ set(WWLIB_SRC ramfile.cpp random.cpp rawfile.cpp + rcfile.cpp readline.cpp realcrc.cpp refcount.cpp @@ -89,6 +90,7 @@ set(WWLIB_SRC RAMFILE.H RANDOM.H RAWFILE.H + rcfile.h readline.h realcrc.h ref_ptr.h diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/rcfile.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/rcfile.cpp new file mode 100644 index 00000000000..83e3d520ea0 --- /dev/null +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/rcfile.cpp @@ -0,0 +1,129 @@ +/* +** Command & Conquer Generals Zero Hour(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 . +*/ + +/*********************************************************************************************** + *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** + *********************************************************************************************** + * * + * Project Name : wwlib * + * * + * $Archive:: /Commando/Code/wwlib/rcfile.cpp $* + * * + * Author:: Greg Hjelstrom * + * * + * $Modtime:: 7/09/99 1:37p $* + * * + * $Revision:: 5 $* + * * + *---------------------------------------------------------------------------------------------* + * Functions: * + * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + +#include "rcfile.h" +#include + +const char * RESOURCE_FILE_TYPE_NAME = "File"; + + +ResourceFileClass::ResourceFileClass(HMODULE hmodule, char const *filename) : + ResourceName(NULL), + hModule(NULL), + FileBytes(NULL), + FilePtr(NULL), + EndOfFile(NULL) +{ + Set_Name(filename); + HRSRC hresource = FindResource(hmodule,ResourceName,RESOURCE_FILE_TYPE_NAME); + + if (hresource) { + HGLOBAL hglob = LoadResource(hmodule,hresource); + if (hglob) { + FileBytes = (unsigned char *)LockResource(hglob); + if (FileBytes) { + FilePtr = FileBytes; + EndOfFile = FileBytes + SizeofResource(hmodule,hresource); + } + } + } +} + +ResourceFileClass::~ResourceFileClass(void) +{ + if (ResourceName) + free(ResourceName); +} + +char const * ResourceFileClass::Set_Name(char const *filename) +{ + if (ResourceName) { + free(ResourceName); + ResourceName = NULL; + } + if (filename) { + ResourceName = strdup(filename); + } + return ResourceName; +} + +int ResourceFileClass::Read(void *buffer, int size) +{ + if (!FilePtr) return 0; + + if (FilePtr + size > EndOfFile) { + size = EndOfFile - FilePtr; + } + memcpy(buffer,FilePtr,size); + FilePtr += size; + return size; +} + +int ResourceFileClass::Seek(int pos, int dir) +{ + switch (dir) { + case SEEK_SET: + FilePtr = FileBytes + pos; + break; + + case SEEK_CUR: + FilePtr = FilePtr + pos; + break; + + case SEEK_END: + FilePtr = EndOfFile + pos; + break; + } + + if (FilePtr > EndOfFile) { + FilePtr = EndOfFile; + } + if (FilePtr < FileBytes) { + FilePtr = FileBytes; + } + + return FilePtr - FileBytes; +} + +int ResourceFileClass::Size(void) +{ + return EndOfFile - FileBytes; +} + +void ResourceFileClass::Error(int /*error*/, int /*canretry*/, char const * /*filename*/) +{ +} diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/rcfile.h b/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/rcfile.h new file mode 100644 index 00000000000..510c455651c --- /dev/null +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WWLib/rcfile.h @@ -0,0 +1,96 @@ +/* +** Command & Conquer Generals Zero Hour(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 . +*/ + +/*********************************************************************************************** + *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** + *********************************************************************************************** + * * + * Project Name : wwlib * + * * + * $Archive:: /Commando/Code/wwlib/rcfile.h $* + * * + * Author:: Greg Hjelstrom * + * * + * $Modtime:: 11/02/01 1:21p $* + * * + * $Revision:: 8 $* + * * + *---------------------------------------------------------------------------------------------* + * Functions: * + * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + +#if defined(_MSC_VER) +#pragma once +#endif + +#ifndef RCFILE_H +#define RCFILE_H + +#include "always.h" +#include "WWFILE.H" +#include "win.h" + +/* +** ResourceFileClass +** This is a file class which allows you to read from a binary file that you have +** imported into your resources. Just import the file as a custom resource of the +** type "File". Replace the "id" of the resource with its filename (change +** IDR_FILE1 to "MyFile.w3d") and then you will be able to access it by using this +** class. +*/ +class ResourceFileClass : public FileClass +{ + public: + + ResourceFileClass(HMODULE hmodule, char const *filename); + virtual ~ResourceFileClass(void); + + virtual char const * File_Name(void) const { return ResourceName; } + virtual char const * Set_Name(char const *filename); + virtual int Create(void) { return false; } + virtual int Delete(void) { return false; } + virtual bool Is_Available(int /*forced=false*/) { return Is_Open (); } + virtual bool Is_Open(void) const { return (FileBytes != NULL); } + + virtual int Open(char const * /*fname*/, int /*rights=READ*/) { return Is_Open(); } + virtual int Open(int /*rights=READ*/) { return Is_Open(); } + + virtual int Read(void *buffer, int size); + virtual int Seek(int pos, int dir=SEEK_CUR); + virtual int Size(void); + virtual int Write(void const * /*buffer*/, int /*size*/) { return 0; } + virtual void Close(void) { } + virtual void Error(int error, int canretry = false, char const * filename=NULL); + virtual void Bias(int start, int length=-1) {} + + virtual unsigned char *Peek_Data(void) const { return FileBytes; } + + protected: + + char * ResourceName; + + HMODULE hModule; + + unsigned char * FileBytes; + unsigned char * FilePtr; + unsigned char * EndOfFile; + +}; + + +#endif