[Kernel/XAM] CloseContent: Close files related to closed content
This commit is contained in:
parent
f298d7620a
commit
29f28b8b60
|
@ -15,6 +15,7 @@
|
||||||
#include "xenia/base/filesystem.h"
|
#include "xenia/base/filesystem.h"
|
||||||
#include "xenia/base/string.h"
|
#include "xenia/base/string.h"
|
||||||
#include "xenia/kernel/kernel_state.h"
|
#include "xenia/kernel/kernel_state.h"
|
||||||
|
#include "xenia/kernel/xfile.h"
|
||||||
#include "xenia/kernel/xobject.h"
|
#include "xenia/kernel/xobject.h"
|
||||||
#include "xenia/vfs/devices/host_path_device.h"
|
#include "xenia/vfs/devices/host_path_device.h"
|
||||||
|
|
||||||
|
@ -197,6 +198,7 @@ X_RESULT ContentManager::CloseContent(const std::string_view root_name) {
|
||||||
if (it == open_packages_.end()) {
|
if (it == open_packages_.end()) {
|
||||||
return X_ERROR_FILE_NOT_FOUND;
|
return X_ERROR_FILE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
CloseOpenedFilesFromContent(root_name);
|
||||||
|
|
||||||
auto package = it->second;
|
auto package = it->second;
|
||||||
open_packages_.erase(it);
|
open_packages_.erase(it);
|
||||||
|
@ -272,6 +274,28 @@ bool ContentManager::IsContentOpen(const ContentData& data) const {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ContentManager::CloseOpenedFilesFromContent(
|
||||||
|
const std::string_view root_name) {
|
||||||
|
// TODO(Gliniak): Cleanup this code to care only about handles
|
||||||
|
// related to provided content
|
||||||
|
const std::vector<object_ref<XFile>> all_files_handles =
|
||||||
|
kernel_state_->object_table()->GetObjectsByType<XFile>(
|
||||||
|
XObject::Type::File);
|
||||||
|
|
||||||
|
std::string resolved_path = "";
|
||||||
|
kernel_state_->file_system()->FindSymbolicLink(std::string(root_name) + ':',
|
||||||
|
resolved_path);
|
||||||
|
|
||||||
|
for (const object_ref<XFile>& file : all_files_handles) {
|
||||||
|
std::string file_path = file->entry()->absolute_path();
|
||||||
|
bool is_file_inside_content = utf8::starts_with(file_path, resolved_path);
|
||||||
|
|
||||||
|
if (is_file_inside_content) {
|
||||||
|
file->ReleaseHandle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace xam
|
} // namespace xam
|
||||||
} // namespace kernel
|
} // namespace kernel
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
|
@ -159,6 +159,7 @@ class ContentManager {
|
||||||
X_RESULT DeleteContent(const ContentData& data);
|
X_RESULT DeleteContent(const ContentData& data);
|
||||||
std::filesystem::path ResolveGameUserContentPath();
|
std::filesystem::path ResolveGameUserContentPath();
|
||||||
bool IsContentOpen(const ContentData& data) const;
|
bool IsContentOpen(const ContentData& data) const;
|
||||||
|
void CloseOpenedFilesFromContent(const std::string_view root_name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::filesystem::path ResolvePackageRoot(uint32_t content_type);
|
std::filesystem::path ResolvePackageRoot(uint32_t content_type);
|
||||||
|
|
Loading…
Reference in New Issue