[Kernel] - swapdisc fixes for gtav
This commit is contained in:
parent
3669645cd6
commit
b488740d10
|
@ -432,14 +432,16 @@ void EmulatorWindow::RecentList(int index) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::wstring EmulatorWindow::SwapNext() {
|
std::wstring EmulatorWindow::SwapNext(int8_t disc_number) {
|
||||||
std::wstring path = L"";
|
std::wstring path = L"";
|
||||||
|
|
||||||
auto file_picker = xe::ui::FilePicker::Create();
|
auto file_picker = xe::ui::FilePicker::Create();
|
||||||
file_picker->set_mode(ui::FilePicker::Mode::kOpen);
|
file_picker->set_mode(ui::FilePicker::Mode::kOpen);
|
||||||
file_picker->set_type(ui::FilePicker::Type::kFile);
|
file_picker->set_type(ui::FilePicker::Type::kFile);
|
||||||
file_picker->set_multi_selection(false);
|
file_picker->set_multi_selection(false);
|
||||||
file_picker->set_title(L"Select Content Package");
|
char titlebar[16];
|
||||||
|
sprintf(titlebar, "Select Disc:(%d)", disc_number);
|
||||||
|
file_picker->set_title(xe::to_wstring(titlebar));
|
||||||
file_picker->set_extensions({
|
file_picker->set_extensions({
|
||||||
{L"Supported Files", L"*.iso;*.xex;*.xcp;*.*"},
|
{L"Supported Files", L"*.iso;*.xex;*.xcp;*.*"},
|
||||||
{L"Disc Image (*.iso)", L"*.iso"},
|
{L"Disc Image (*.iso)", L"*.iso"},
|
||||||
|
@ -453,6 +455,11 @@ std::wstring EmulatorWindow::SwapNext() {
|
||||||
path = selected_files[0];
|
path = selected_files[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (path != L"") {
|
||||||
|
// Normalize the path and make absolute.
|
||||||
|
std::wstring abs_path = xe::to_absolute_path(path);
|
||||||
|
}
|
||||||
|
XELOGD("SwapNext Return Path:(%S)", path.c_str());
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ class EmulatorWindow {
|
||||||
|
|
||||||
void UpdateTitle();
|
void UpdateTitle();
|
||||||
void ToggleFullscreen();
|
void ToggleFullscreen();
|
||||||
static std::wstring SwapNext();
|
static std::wstring SwapNext(int8_t disc_number);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit EmulatorWindow(Emulator* emulator);
|
explicit EmulatorWindow(Emulator* emulator);
|
||||||
|
|
|
@ -488,21 +488,21 @@ DECLARE_XAM_EXPORT1(XamContentDelete, kContent, kImplemented);
|
||||||
dword_result_t XamSwapDisc(dword_t disc_number,
|
dword_result_t XamSwapDisc(dword_t disc_number,
|
||||||
pointer_t<kernel::X_KEVENT> completion_handle,
|
pointer_t<kernel::X_KEVENT> completion_handle,
|
||||||
lpstring_t error_message) {
|
lpstring_t error_message) {
|
||||||
|
|
||||||
|
// error_message not correct type/ptr
|
||||||
|
XELOGI("XamSwapDisc requests disc:(%d)", disc_number);
|
||||||
|
std::wstring local_path = app::EmulatorWindow::SwapNext(disc_number);
|
||||||
|
XELOGD("XamSwapDisc SwapNext returned path:( %S )", local_path.c_str());
|
||||||
|
if (local_path != L"") {
|
||||||
auto filesystem = kernel_state()->file_system();
|
auto filesystem = kernel_state()->file_system();
|
||||||
auto mount_path = "\\Device\\LauncherData";
|
auto mount_path = "\\Device\\LauncherData";
|
||||||
|
auto last_slash = local_path.find_last_of(xe::kPathSeparator);
|
||||||
|
auto last_dot = local_path.find_last_of('.');
|
||||||
|
|
||||||
if (filesystem->ResolveDevice(mount_path) != NULL) {
|
if (filesystem->ResolveDevice(mount_path) != NULL) {
|
||||||
filesystem->UnregisterDevice(mount_path);
|
filesystem->UnregisterDevice(mount_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// error_message not correct type/ptr
|
|
||||||
XELOGI("XamSwapDisc requests disc %d.", disc_number);
|
|
||||||
std::wstring local_path = app::EmulatorWindow::SwapNext();
|
|
||||||
XELOGI("SwapNext returned path %S.", local_path.c_str());
|
|
||||||
|
|
||||||
auto last_slash = local_path.find_last_of(xe::kPathSeparator);
|
|
||||||
auto last_dot = local_path.find_last_of('.');
|
|
||||||
|
|
||||||
if (last_dot < last_slash) {
|
if (last_dot < last_slash) {
|
||||||
last_dot = std::wstring::npos;
|
last_dot = std::wstring::npos;
|
||||||
}
|
}
|
||||||
|
@ -536,6 +536,7 @@ dword_result_t XamSwapDisc(dword_t disc_number,
|
||||||
filesystem->RegisterSymbolicLink("d:", mount_path);
|
filesystem->RegisterSymbolicLink("d:", mount_path);
|
||||||
filesystem->RegisterSymbolicLink("game:", mount_path);
|
filesystem->RegisterSymbolicLink("game:", mount_path);
|
||||||
|
|
||||||
|
}
|
||||||
// Resolve the pending disc swap event
|
// Resolve the pending disc swap event
|
||||||
auto kevent = xboxkrnl::xeKeSetEvent(completion_handle, 1, 0);
|
auto kevent = xboxkrnl::xeKeSetEvent(completion_handle, 1, 0);
|
||||||
|
|
||||||
|
@ -543,8 +544,10 @@ dword_result_t XamSwapDisc(dword_t disc_number,
|
||||||
auto object = XObject::GetNativeObject<XObject>(
|
auto object = XObject::GetNativeObject<XObject>(
|
||||||
kernel_state(),
|
kernel_state(),
|
||||||
kernel_memory()->virtual_membase() + (dword_t)completion_handle);
|
kernel_memory()->virtual_membase() + (dword_t)completion_handle);
|
||||||
|
|
||||||
if (object) {
|
if (object) {
|
||||||
object->Release();
|
XELOGI("XamSwapDisc Release object");
|
||||||
|
object->ReleaseHandle();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue