9 Commits
Author SHA1 Message Date
Mikaël Capelle 8331290047 Reorganize repository to build proper CMake targets. 2024-07-11 15:43:39 +02:00
Mikael CAPELLE 4f7aeaf4f1 Start move to clean CMake. 2024-07-11 13:40:59 +02:00
Jeremy Rimpo 4f32506570 Restore mistakenly removed size increment
- Should fix missing texture data
2024-07-11 01:55:00 -05:00
Jeremy Rimpo bf840701de Merge pull request #3 from ModOrganizer2/dev/archive_preview
WIP: Archive preview support
2024-07-05 16:23:38 -05:00
Mikaël Capelle 37f139a236 Modification to use external DDS.h header in MO2. (#4) 2024-07-01 17:13:21 +02:00
Jeremy Rimpo 3a277db0fb Restore changes for PByte pointers 2024-06-25 20:19:39 -05:00
Jeremy Rimpo 701bc58e9a Merge pull request #2 from ModOrganizer2/starfield_support
Update to latest BSArch / xEdit
2024-06-24 01:03:08 -05:00
Jeremy Rimpo c535689ef4 Migrate to newer data types 2024-06-22 15:39:13 -05:00
Jeremy Rimpo 3219ade30e Update to latest BSArch / xEdit
- Supports Starfield and FO4 NG archives
- Other code improvements
- Removed some old functions
2024-06-22 05:32:40 -05:00
27 changed files with 1641 additions and 833 deletions
+1
View File
@@ -134,6 +134,7 @@ ui_*.h
*.jsc
Makefile*
*build-*
vsbuild
# Qt unit tests
target_wrapper.*
+104 -81
View File
@@ -1,73 +1,92 @@
cmake_minimum_required(VERSION 3.16)
option(copy_dll_to_binary_dir "Will copy libbsarch DLL to the binary directory. May not work if libbsarch is used as a subproject" ON)
include(CMakePackageConfigHelpers)
# Project
project(libbsarch CXX)
# Add library to build.
add_library(libbsarch SHARED
src/DDS.h
src/libbsarch.h
src/libbsarch.cpp
src/libbsarch.def
)
target_compile_features(libbsarch PRIVATE cxx_std_11)
# Preprocessor definitions
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
if(MSVC)
target_compile_options(libbsarch PRIVATE /W3 /MDd /Od /EHsc)
endif()
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
if(MSVC)
target_compile_options(libbsarch PRIVATE /W3 /Zi /EHsc)
endif()
endif()
target_compile_definitions(libbsarch PRIVATE BSARCH_DLL_EXPORT)
#We only want the lib file. The DLL will be provided by Delphi
#Removing the generated DLL
add_custom_command(TARGET libbsarch POST_BUILD
COMMAND ${CMAKE_COMMAND} -E remove
${CMAKE_CURRENT_BINARY_DIR}/libbsarch.dll)
############################################################
# libbsarch_OOP #
############################################################
find_package(mo2-dds-header CONFIG REQUIRED)
find_package(Qt6 COMPONENTS Core REQUIRED)
add_library(libbsarch_OOP STATIC
src/base_types.hpp
src/bs_archive_auto.cpp
src/bs_archive_auto.hpp
src/bs_archive.cpp
src/bs_archive.h
src/bs_archive_entries.cpp
src/bs_archive_entries.h
src/dds.h
get_target_property(SRCS mo2::dds-header SOURCES)
src/libbsarch.hpp
src/libbsarch.h
src/dds.h
# libbsarch
add_library(libbsarch SHARED)
target_sources(libbsarch
PRIVATE
src/libbsarch.cpp
src/libbsarch.def
PUBLIC
FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include
FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/libbsarch.h
)
target_include_directories(libbsarch PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch)
set_target_properties(libbsarch PROPERTIES DEBUG_POSTFIX "d" CXX_STANDARD 11)
target_link_libraries(libbsarch PUBLIC mo2::dds-header)
target_compile_definitions(libbsarch PRIVATE BSARCH_DLL_EXPORT)
src/utils/convertible_string.cpp
src/utils/convertible_string.hpp
src/utils/convertible_ostream.cpp
src/utils/convertible_ostream.hpp
src/utils/string_convert.cpp
src/utils/string_convert.hpp
# preprocessor definitions
if(MSVC)
target_compile_options(libbsarch PRIVATE
/W3 /EHsc /MP
$<$<CONFIG:DEBUG>:/MDd /Od>
$<$<CONFIG:RELEASE>:/Zi>
)
endif()
## Copying the corresponding DLL ##
# libbsarch_OOP
add_library(libbsarch_OOP STATIC)
#Finding 32 or 64bits
target_sources(libbsarch_OOP
PRIVATE
src/bs_archive_entries.cpp
src/utils/string_convert.cpp
src/utils/convertible_ostream.cpp
src/utils/convertible_string.cpp
src/bs_archive_auto.cpp
src/bs_archive.cpp
PUBLIC
FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include
FILES
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/base_types.hpp
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/bs_archive_auto.hpp
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/bs_archive.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/bs_archive_entries.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/libbsarch.hpp
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/libbsarch.h
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/utils/convertible_string.hpp
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/utils/convertible_ostream.hpp
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/utils/string_convert.hpp
)
target_include_directories(libbsarch_OOP PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch
${CMAKE_CURRENT_SOURCE_DIR}/include/libbsarch/utils)
target_link_libraries(libbsarch_OOP PUBLIC mo2::dds-header)
set_target_properties(libbsarch_OOP PROPERTIES
DEBUG_POSTFIX "d"
CXX_STANDARD 17
)
if (MSVC)
target_compile_options(libbsarch_OOP PRIVATE /MP)
endif()
# adding Qt support
if(Qt6_FOUND)
message("libbsarch: Qt6 found, enabling Qt support")
target_link_libraries(libbsarch_OOP PUBLIC Qt::Core)
target_compile_definitions(libbsarch PUBLIC "LIBBSARCH_QT_SUPPORT")
target_compile_definitions(libbsarch_OOP PUBLIC "LIBBSARCH_QT_SUPPORT")
endif()
# target_link_libraries(libbsarch_OOP PUBLIC libbsarch)
# install
# finding 32 or 64bits
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
# 64 bits
set(lib_delphi "${CMAKE_CURRENT_SOURCE_DIR}/delphi/lib64")
@@ -78,30 +97,34 @@ elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
message("libbsarch: using 32bits DLL")
endif()
if(copy_dll_to_binary_dir)
#Finding debug or release
if(CMAKE_BUILD_TYPE MATCHES DEBUG)
set(libbsarch_dll_path "${lib_delphi}/libbsarchd.dll")
else()
set(libbsarch_dll_path "${lib_delphi}/libbsarch.dll")
endif()
install(TARGETS libbsarch libbsarch_OOP EXPORT libbsarchTargets FILE_SET HEADERS)
install(FILES $<TARGET_PDB_FILE:libbsarch> DESTINATION pdb OPTIONAL)
install(EXPORT libbsarchTargets
FILE mo2-libbsarch-targets.cmake
NAMESPACE mo2::
DESTINATION lib/cmake/mo2-libbsarch
)
#Actually copying the DLL
add_custom_command(TARGET libbsarch POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${libbsarch_dll_path}
${CMAKE_BINARY_DIR}/libbsarch.dll)
message("libbsarch: Copying the DLL to ${CMAKE_BINARY_DIR}/libbsarch.dll")
endif()
# install the true DLLs
install(FILES ${lib_delphi}/libbsarch.dll DESTINATION bin CONFIGURATIONS Release RelWithDebInfo MinSizeRel)
install(FILES ${lib_delphi}/libbsarchd.dll DESTINATION bin CONFIGURATIONS Debug)
#Adding Qt support
if(Qt6_FOUND)
message("libbsarch: Qt6 found, enabling Qt support")
target_link_libraries(libbsarch_OOP PUBLIC Qt::Core)
target_compile_definitions(libbsarch PUBLIC "QT")
target_compile_definitions(libbsarch_OOP PUBLIC "QT")
endif()
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/mo2-libbsarch-config.cmake"
INSTALL_DESTINATION "lib/cmake/mo2-libbsarch"
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
target_link_libraries(libbsarch_OOP PUBLIC libbsarch)
target_compile_features(libbsarch_OOP PRIVATE cxx_std_17)
target_compile_definitions(libbsarch_OOP PRIVATE _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/mo2-libbsarch-config-version.cmake"
VERSION "0.0.13"
COMPATIBILITY AnyNewerVersion
ARCH_INDEPENDENT
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/mo2-libbsarch-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/mo2-libbsarch-config-version.cmake
DESTINATION lib/cmake/mo2-libbsarch
)
+17
View File
@@ -0,0 +1,17 @@
{
"configurePresets": [
{
"binaryDir": "${sourceDir}/vsbuild",
"toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"generator": "Visual Studio 17 2022",
"name": "vs2022-windows"
}
],
"buildPresets": [
{
"name": "vs2022-windows",
"configurePreset": "vs2022-windows"
}
],
"version": 4
}
+4 -2
View File
@@ -1,4 +1,5 @@
# BSArchive DLL and C++ bindings
BSArchive Dynamic Link Library and C++ bindings
## How to build
@@ -9,7 +10,7 @@ BSArchive Dynamic Link Library and C++ bindings
## How to use
With CMake:
With CMake:
Use ``add_subdirectory`` and ``target_link_library``
Then ``#include "libbsarch.h"`` for the C wrapper, or ``#include "bs_archive_auto"`` for the C++ wrapper.
See the example for code use.
@@ -20,4 +21,5 @@ Use `libbsarch.dll` (provided in delphi/lib), `libbsarch.lib` and `libbsarch.h`
## Credits
The original BSArchive can be found at: https://github.com/TES5Edit/TES5Edit/tree/dev/Tools/BSArchive
The version in this project had been modified for better compatibility with C/C++ and allow the users to allocate their own memory in some cases.
The version in this project had been modified for better compatibility with C/C++ and
allow the users to allocate their own memory in some cases.
+24
View File
@@ -0,0 +1,24 @@
@PACKAGE_INIT@
include ( "${CMAKE_CURRENT_LIST_DIR}/mo2-libbsarch-targets.cmake" )
target_link_libraries(mo2::libbsarch PUBLIC mo2::libbsarch_OOP)
# libbsarch is usually be build in Debug or Release/RelWithDebInfo, so we need to map
# missing configurations to avoid issue with CMP0111
list(FIND _LIBBSARCH_CONFIGURATIONS "RELEASE" _LIBBSARCH_HAS_RELEASE)
if (_LIBBSARCH_HAS_RELEASE EQUAL -1)
set_target_properties(mo2::libbsarch PROPERTIES
MAP_IMPORTED_CONFIG_MINSIZEREL RelWithDebInfo
MAP_IMPORTED_CONFIG_RELEASE RelWithDebInfo
)
set_property(TARGET mo2::libbsarch APPEND PROPERTY IMPORTED_CONFIGURATIONS MINSIZEREL)
set_property(TARGET mo2::libbsarch APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
else()
set_target_properties(mo2::libbsarch PROPERTIES
MAP_IMPORTED_CONFIG_MINSIZEREL Release
MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release
)
set_property(TARGET mo2::libbsarch APPEND PROPERTY IMPORTED_CONFIGURATIONS MINSIZEREL)
set_property(TARGET mo2::libbsarch APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
endif()
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+17 -29
View File
@@ -68,7 +68,7 @@ end;
function bsa_entry_list_create:Pointer; stdcall;
begin
try
Result := TwbBSEntryList.Create;
Result := TStringList.Create;
except
Result := nil;
end;
@@ -78,8 +78,8 @@ function bsa_entry_list_free(obj: Pointer): TwbBSResultMessage; stdcall;
begin
Result.code := Ord(BSA_RESULT_NONE);
try
TwbBSEntryList(obj).Clear();
TwbBSEntryList(obj).free;
TStringList(obj).Clear();
TStringList(obj).free;
except
on E: Exception do
exception_handler(E, Result);
@@ -89,7 +89,7 @@ end;
function bsa_entry_list_count(obj: Pointer): Integer; stdcall;
begin
try
Result := TwbBSEntryList(obj).Count;
Result := TStringList(obj).Count;
except
Result := Ord(BSA_RESULT_EXCEPTION);
end;
@@ -99,7 +99,7 @@ function bsa_entry_list_add(obj: Pointer; const aEntryString: PChar): TwbBSResul
begin
Result.code := Ord(BSA_RESULT_NONE);
try
TwbBSEntryList(obj).Add(String(aEntryString));
TStringList(obj).Add(String(aEntryString));
except
on E: Exception do
exception_handler(E, Result);
@@ -109,7 +109,7 @@ end;
function bsa_entry_list_get(obj: Pointer; const aIndex: Cardinal; const aStringBufferSize: Cardinal; const aStringBuffer: PChar): Integer; stdcall;
begin
try
Result := string_to_cstring_end(TwbBSEntryList(obj).Strings[aIndex], aStringBufferSize, aStringBuffer);
Result := string_to_cstring_end(TStringList(obj).Strings[aIndex], aStringBufferSize, aStringBuffer);
except
Result := Integer(BSA_RESULT_EXCEPTION);
end;
@@ -148,11 +148,11 @@ begin
end;
end;
function bsa_create_archive(obj: Pointer; const aFilePath: PChar; aType: TBSArchiveType; aFileList: TwbBSEntryList): TwbBSResultMessage; stdcall;
function bsa_create_archive(obj: Pointer; const aFilePath: PChar; aType: TBSArchiveType; aFileList: TStringList): TwbBSResultMessage; stdcall;
begin
Result.code := Ord(BSA_RESULT_NONE);
try
TwbBSArchive(obj).CreateArchiveCompat(String(aFilePath), aType, aFileList);
TwbBSArchive(obj).CreateArchive(String(aFilePath), aType, aFileList);
except
on E: Exception do
exception_handler(E, Result);
@@ -196,7 +196,7 @@ function bsa_add_file_from_memory(obj: Pointer; const aFilePath: PChar; const aS
begin
Result.code := Ord(BSA_RESULT_NONE);
try
TwbBSArchive(obj).AddFileDataCompat(String(aFilePath), aSize, aData);
TwbBSArchive(obj).AddFileData(String(aFilePath), aSize, aData);
except
on E: Exception do
exception_handler(E, Result);
@@ -216,7 +216,7 @@ function bsa_extract_file_data_by_record(obj: Pointer; aFileRecord: Pointer): Tw
begin
Result.message.code := Ord(BSA_RESULT_NONE);
try
Result.buffer := TwbBSArchive(obj).ExtractFileDataCompat(aFileRecord);
Result.buffer := TwbBSArchive(obj).ExtractFileData(aFileRecord);
except
on E: Exception do
buffer_exception_handler(E, Result);
@@ -227,7 +227,7 @@ function bsa_extract_file_data_by_filename(obj: Pointer; const aFilePath: PChar)
begin
Result.message.code := Ord(BSA_RESULT_NONE);
try
Result.buffer := TwbBSArchive(obj).ExtractFileDataCompat(String(aFilePath));
Result.buffer := TwbBSArchive(obj).ExtractFileData(String(aFilePath));
except
on E: Exception do
buffer_exception_handler(E, Result);
@@ -238,7 +238,7 @@ function bsa_file_data_free(obj: Pointer; fileDataResult: TwbBSResultMessageBuff
begin
Result.code := Ord(BSA_RESULT_NONE);
try
TwbBSArchive(obj).ReleaseFileDataCompat(fileDataResult.buffer);
TwbBSArchive(obj).ReleaseFileData(fileDataResult.buffer);
except
on E: Exception do
exception_handler(E, Result);
@@ -256,11 +256,11 @@ begin
end;
end;
function bsa_iterate_files(obj: Pointer; aProc: TBSFileIterationProcCompat; aContext: Pointer): TwbBSResultMessage; stdcall;
function bsa_iterate_files(obj: Pointer; aProc: TBSFileIterationProc; aContext: Pointer): TwbBSResultMessage; stdcall;
begin
Result.code := Ord(BSA_RESULT_NONE);
try
TwbBSArchive(obj).IterateFilesCompat(aProc, aContext);
TwbBSArchive(obj).IterateFiles(aProc, aContext);
except
on E: Exception do
exception_handler(E, Result);
@@ -276,28 +276,17 @@ begin
end;
end;
function bsa_get_resource_list(obj: Pointer; const aEntryResultList: TwbBSEntryList; aFolder: PChar): TwbBSResultMessage; stdcall;
function bsa_get_resource_list(obj: Pointer; const aEntryResultList: TStringList; aFolder: PChar): TwbBSResultMessage; stdcall;
begin
Result.code := Ord(BSA_RESULT_NONE);
try
TwbBSArchive(obj).ResourceListCompat(aEntryResultList, String(aFolder));
TwbBSArchive(obj).ResourceList(aEntryResultList, String(aFolder));
except
on E: Exception do
exception_handler(E, Result);
end;
end;
function bsa_resolve_hash(obj: Pointer; const aHash: UInt64; const aEntryResultList: TwbBSEntryList): TwbBSResultMessage; stdcall;
begin
Result.code := Ord(BSA_RESULT_NONE);
try
TwbBSArchive(obj).ResolveHashCompat(aHash, aEntryResultList);
except
on E: Exception do
exception_handler(E, Result);
end;
end;
function bsa_close(obj: Pointer): TwbBSResultMessage; stdcall;
begin
Result.code := Ord(BSA_RESULT_NONE);
@@ -374,7 +363,7 @@ begin
TwbBSArchive(obj).ShareData := shareData;
end;
procedure bsa_file_dds_info_callback_set(obj: Pointer; aProc: TBSFileDDSInfoProcCompat; aContext: Pointer); stdcall;
procedure bsa_file_dds_info_callback_set(obj: Pointer; aProc: TBSFileDDSInfoProc; aContext: Pointer); stdcall;
begin
TwbBSArchive(obj).DDSInfoProc := aProc;
TwbBSArchive(obj).DDSInfoProcContext := aContext;
@@ -403,7 +392,6 @@ exports
bsa_file_dds_info_callback_set,
bsa_close,
bsa_resolve_hash,
bsa_get_resource_list,
bsa_file_exists,
bsa_iterate_files,
+758 -8
View File
File diff suppressed because it is too large Load Diff
+655 -428
View File
File diff suppressed because it is too large Load Diff
@@ -1,7 +1,9 @@
#pragma once
#include "dds.h"
#include <dxgiformat.h>
#include <DDS.h>
#include <stdint.h>
#ifdef BSARCH_DLL_EXPORT
@@ -75,7 +77,9 @@ typedef enum bsa_archive_type_e
baFO3,
baSSE,
baFO4,
baFO4dds
baFO4dds,
baSF,
baSFdds
} bsa_archive_type_t;
typedef void (*bsa_file_dds_info_proc_t)(bsa_archive_t archive,
@@ -123,8 +127,6 @@ bsa_iterate_files(bsa_archive_t archive, bsa_file_iteration_proc_t file_iteratio
BSARCH_DLL_API(bool) bsa_file_exists(bsa_archive_t archive, const wchar_t *file_path);
BSARCH_DLL_API(bsa_result_message_t)
bsa_get_resource_list(bsa_archive_t archive, bsa_entry_list_t entry_result_list, const wchar_t *folder);
BSARCH_DLL_API(bsa_result_message_t)
bsa_resolve_hash(bsa_archive_t archive, uint64_t hash, bsa_entry_list_t entry_result_list);
BSARCH_DLL_API(bsa_result_message_t) bsa_close(bsa_archive_t archive);
BSARCH_DLL_API(uint32_t)
@@ -29,7 +29,7 @@ public:
operator std::ostream &();
operator std::wostream &();
#ifdef QT
#ifdef LIBBSARCH_QT_SUPPORT
operator QDebug();
convertible_ostream &operator<<(const QString &rh);
#endif
@@ -6,11 +6,12 @@
//See https://stackoverflow.com/questions/4804298/how-to-convert-wstring-into-string
#include "string_convert.hpp"
#ifdef QT
#ifdef LIBBSARCH_QT_SUPPORT
#include <QString>
#endif
#include "string_convert.hpp"
namespace libbsarch {
class convertible_string
{
@@ -23,23 +24,20 @@ public:
convertible_string(const char *const val_array, bool to_native_path = true);
convertible_string(const std::wstring &wvalue, bool to_native_path = true);
convertible_string(const wchar_t *const wval_array, bool to_native_path = true);
#ifdef QT
convertible_string(const QString &qsvalue, bool to_native_path = true);
#endif
/* assignment operators */
convertible_string &operator=(const std::string &value);
convertible_string &operator=(const std::wstring &wvalue);
convertible_string &operator=(const wchar_t *wvalue);
#ifdef QT
convertible_string &operator=(const QString &qsvalue);
#endif
/* implicit conversion operators */
operator std::string() const;
operator std::wstring() const;
operator const wchar_t *() const;
#ifdef QT
#ifdef LIBBSARCH_QT_SUPPORT
convertible_string(const QString &qsvalue, bool to_native_path = true);
convertible_string &operator=(const QString &qsvalue);
operator QString() const;
#endif

Some files were not shown because too many files have changed in this diff Show More