From 3f65a3a383641bba0a17c9b98f5037a4783e1f54 Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 25 Jun 2016 01:41:25 +0100 Subject: [PATCH] add object scan call --- src/object/ObjectRepository.cpp | 96 ++++++++++++++++++++++++--------- src/object_list.c | 2 +- 2 files changed, 71 insertions(+), 27 deletions(-) diff --git a/src/object/ObjectRepository.cpp b/src/object/ObjectRepository.cpp index 70c1382534..72527c4532 100644 --- a/src/object/ObjectRepository.cpp +++ b/src/object/ObjectRepository.cpp @@ -21,6 +21,7 @@ #include "../core/Guard.hpp" #include "../core/IStream.hpp" #include "../core/Memory.hpp" +#include "../core/Path.hpp" #include "../core/String.hpp" #include "ObjectRepository.h" @@ -56,7 +57,8 @@ class ObjectRepository : public IObjectRepository public: void LoadOrConstruct() { - _queryDirectoryResult = QueryDirectory(); + ClearItems(); + QueryDirectory(); if (!Load()) { Construct(); @@ -79,9 +81,67 @@ public: } private: + void ClearItems() + { + for (uint32 i = 0; i < _items.size(); i++) + { + FreeItem(&_items[i]); + } + _items.clear(); + } + + void QueryDirectory() + { + QueryDirectoryResult * result = &_queryDirectoryResult; + + // Enumerate through each object in the directory + int enumFileHandle = platform_enumerate_files_begin(gRCT2AddressObjectDataPath); + if (enumFileHandle != INVALID_HANDLE) + { + file_info enumFileInfo; + while (platform_enumerate_files_next(enumFileHandle, &enumFileInfo)) + { + result->TotalFiles++; + result->TotalFileSize += enumFileInfo.size; + result->FileDateModifiedChecksum ^= + (uint32)(enumFileInfo.last_modified >> 32) ^ + (uint32)(enumFileInfo.last_modified & 0xFFFFFFFF); + result->FileDateModifiedChecksum = ror32(result->FileDateModifiedChecksum, 5); + } + platform_enumerate_files_end(enumFileHandle); + } + } + void Construct() { - // TODO + utf8 objectDirectory[MAX_PATH]; + Path::GetDirectory(objectDirectory, sizeof(objectDirectory), gRCT2AddressObjectDataPath); + + int enumFileHandle = platform_enumerate_files_begin(gRCT2AddressObjectDataPath); + if (enumFileHandle != INVALID_HANDLE) + { + file_info enumFileInfo; + while (platform_enumerate_files_next(enumFileHandle, &enumFileInfo)) + { + utf8 objectPath[MAX_PATH]; + String::Set(objectPath, sizeof(objectPath), objectDirectory); + Path::Append(objectPath, sizeof(objectPath), enumFileInfo.path); + + ScanObject(objectPath); + } + platform_enumerate_files_end(enumFileHandle); + } + } + + void ScanObject(utf8 * path) + { + rct_object_entry entry; + if (!object_load_entry(path, &entry)) + { + return; + } + + __nop(); } bool Load() @@ -236,30 +296,6 @@ private: platform_get_user_directory(buffer, nullptr); strcat(buffer, "objects.idx"); } - - static QueryDirectoryResult QueryDirectory() - { - QueryDirectoryResult result = { 0 }; - - // Enumerate through each object in the directory - int enumFileHandle = platform_enumerate_files_begin(gRCT2AddressObjectDataPath); - if (enumFileHandle != INVALID_HANDLE) - { - file_info enumFileInfo; - while (platform_enumerate_files_next(enumFileHandle, &enumFileInfo)) - { - result.TotalFiles++; - result.TotalFileSize += enumFileInfo.size; - result.FileDateModifiedChecksum ^= - (uint32)(enumFileInfo.last_modified >> 32) ^ - (uint32)(enumFileInfo.last_modified & 0xFFFFFFFF); - result.FileDateModifiedChecksum = ror32(result.FileDateModifiedChecksum, 5); - } - platform_enumerate_files_end(enumFileHandle); - } - - return result; - } }; static ObjectRepository * _objectRepository = nullptr; @@ -273,3 +309,11 @@ IObjectRepository * GetObjectRepository() } return _objectRepository; } + +extern "C" +{ + void object_list_load() + { + IObjectRepository * objRepo = GetObjectRepository(); + } +} diff --git a/src/object_list.c b/src/object_list.c index 19cbc4f301..2fcf94c9cd 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -276,7 +276,7 @@ static int object_list_query_directory(int *outTotalFiles, uint64 *outTotalFileS * * rct2: 0x006A8B40 */ -void object_list_load() +void object_list_load_old() { int enumFileHandle, totalFiles, fileDateModifiedChecksum; uint64 totalFileSize;