Compare commits
3 commits
e03f1c37bd
...
c55cc119fe
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c55cc119fe | ||
![]() |
30a54293e0 | ||
d19a7c3782 |
7 changed files with 100 additions and 7 deletions
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <stack>
|
||||||
|
|
||||||
#include "common/math_util.h"
|
#include "common/math_util.h"
|
||||||
#include "core/hle/service/apm/apm_controller.h"
|
#include "core/hle/service/apm/apm_controller.h"
|
||||||
|
@ -23,6 +24,7 @@
|
||||||
#include "core/hle/service/am/hid_registration.h"
|
#include "core/hle/service/am/hid_registration.h"
|
||||||
#include "core/hle/service/am/lifecycle_manager.h"
|
#include "core/hle/service/am/lifecycle_manager.h"
|
||||||
#include "core/hle/service/am/process_holder.h"
|
#include "core/hle/service/am/process_holder.h"
|
||||||
|
#include "core/hle/service/am/service/storage.h"
|
||||||
|
|
||||||
namespace Service::AM {
|
namespace Service::AM {
|
||||||
|
|
||||||
|
@ -97,6 +99,9 @@ struct Applet {
|
||||||
std::deque<std::vector<u8>> preselected_user_launch_parameter{};
|
std::deque<std::vector<u8>> preselected_user_launch_parameter{};
|
||||||
std::deque<std::vector<u8>> friend_invitation_storage_channel{};
|
std::deque<std::vector<u8>> friend_invitation_storage_channel{};
|
||||||
|
|
||||||
|
// Context Stack
|
||||||
|
std::stack<SharedPointer<IStorage>> context_stack{};
|
||||||
|
|
||||||
// Caller applet
|
// Caller applet
|
||||||
std::weak_ptr<Applet> caller_applet{};
|
std::weak_ptr<Applet> caller_applet{};
|
||||||
std::shared_ptr<AppletDataBroker> caller_applet_broker{};
|
std::shared_ptr<AppletDataBroker> caller_applet_broker{};
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -15,12 +18,12 @@ IProcessWindingController::IProcessWindingController(Core::System& system_,
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"},
|
{0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"},
|
||||||
{11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"},
|
{11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"},
|
||||||
{21, nullptr, "PushContext"},
|
{21, D<&IProcessWindingController::PushContext>, "PushContext"},
|
||||||
{22, nullptr, "PopContext"},
|
{22, D<&IProcessWindingController::PopContext>, "PopContext"},
|
||||||
{23, nullptr, "CancelWindingReservation"},
|
{23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"},
|
||||||
{30, nullptr, "WindAndDoReserved"},
|
{30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"},
|
||||||
{40, nullptr, "ReserveToStartAndWaitAndUnwindThis"},
|
{40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"},
|
||||||
{41, nullptr, "ReserveToStartAndWait"},
|
{41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
@ -51,4 +54,43 @@ Result IProcessWindingController::OpenCallingLibraryApplet(
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result IProcessWindingController::PushContext(SharedPointer<IStorage> context) {
|
||||||
|
LOG_INFO(Service_AM, "called");
|
||||||
|
m_applet->context_stack.push(context);
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IProcessWindingController::PopContext(Out<SharedPointer<IStorage>> out_context) {
|
||||||
|
LOG_INFO(Service_AM, "called");
|
||||||
|
|
||||||
|
if (m_applet->context_stack.empty()) {
|
||||||
|
LOG_ERROR(Service_AM, "Context stack is empty");
|
||||||
|
R_THROW(ResultUnknown);
|
||||||
|
}
|
||||||
|
|
||||||
|
*out_context = m_applet->context_stack.top();
|
||||||
|
m_applet->context_stack.pop();
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IProcessWindingController::CancelWindingReservation() {
|
||||||
|
LOG_WARNING(Service_AM, "STUBBED");
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IProcessWindingController::WindAndDoReserved() {
|
||||||
|
LOG_WARNING(Service_AM, "STUBBED");
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IProcessWindingController::ReserveToStartAndWaitAndUnwindThis() {
|
||||||
|
LOG_WARNING(Service_AM, "STUBBED");
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IProcessWindingController::ReserveToStartAndWait() {
|
||||||
|
LOG_WARNING(Service_AM, "STUBBED");
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service::AM
|
} // namespace Service::AM
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/hle/service/am/service/storage.h"
|
||||||
#include "core/hle/service/am/am_types.h"
|
#include "core/hle/service/am/am_types.h"
|
||||||
#include "core/hle/service/cmif_types.h"
|
#include "core/hle/service/cmif_types.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
@ -21,6 +25,12 @@ private:
|
||||||
Result GetLaunchReason(Out<AppletProcessLaunchReason> out_launch_reason);
|
Result GetLaunchReason(Out<AppletProcessLaunchReason> out_launch_reason);
|
||||||
Result OpenCallingLibraryApplet(
|
Result OpenCallingLibraryApplet(
|
||||||
Out<SharedPointer<ILibraryAppletAccessor>> out_calling_library_applet);
|
Out<SharedPointer<ILibraryAppletAccessor>> out_calling_library_applet);
|
||||||
|
Result PushContext(SharedPointer<IStorage> in_context);
|
||||||
|
Result PopContext(Out<SharedPointer<IStorage>> out_context);
|
||||||
|
Result CancelWindingReservation();
|
||||||
|
Result WindAndDoReserved();
|
||||||
|
Result ReserveToStartAndWaitAndUnwindThis();
|
||||||
|
Result ReserveToStartAndWait();
|
||||||
|
|
||||||
const std::shared_ptr<Applet> m_applet;
|
const std::shared_ptr<Applet> m_applet;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -67,6 +70,7 @@ ISelfController::ISelfController(Core::System& system_, std::shared_ptr<Applet>
|
||||||
{110, nullptr, "SetApplicationAlbumUserData"},
|
{110, nullptr, "SetApplicationAlbumUserData"},
|
||||||
{120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"},
|
{120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"},
|
||||||
{130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"},
|
{130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"},
|
||||||
|
{230, D<&ISelfController::Unknown230>, "Unknown230"},
|
||||||
{1000, nullptr, "GetDebugStorageChannel"},
|
{1000, nullptr, "GetDebugStorageChannel"},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
@ -404,4 +408,12 @@ Result ISelfController::SetRecordVolumeMuted(bool muted) {
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result ISelfController::Unknown230(u32 in_val, Out<u16> out_val) {
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called, in_val={}", in_val);
|
||||||
|
|
||||||
|
*out_val = 0;
|
||||||
|
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service::AM
|
} // namespace Service::AM
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -63,6 +66,7 @@ private:
|
||||||
Result SetAlbumImageTakenNotificationEnabled(bool enabled);
|
Result SetAlbumImageTakenNotificationEnabled(bool enabled);
|
||||||
Result SaveCurrentScreenshot(Capture::AlbumReportOption album_report_option);
|
Result SaveCurrentScreenshot(Capture::AlbumReportOption album_report_option);
|
||||||
Result SetRecordVolumeMuted(bool muted);
|
Result SetRecordVolumeMuted(bool muted);
|
||||||
|
Result Unknown230(u32 in_val, Out<u16> out_val);
|
||||||
|
|
||||||
Kernel::KProcess* const m_process;
|
Kernel::KProcess* const m_process;
|
||||||
const std::shared_ptr<Applet> m_applet;
|
const std::shared_ptr<Applet> m_applet;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -29,7 +32,7 @@ IQueryService::IQueryService(Core::System& system_) : ServiceFramework{system_,
|
||||||
{14, nullptr, "QueryRecentlyPlayedApplication"},
|
{14, nullptr, "QueryRecentlyPlayedApplication"},
|
||||||
{15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"},
|
{15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"},
|
||||||
{16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"},
|
{16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"},
|
||||||
{17, nullptr, "QueryLastPlayTime"},
|
{17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"},
|
||||||
{18, nullptr, "QueryApplicationPlayStatisticsForSystem"},
|
{18, nullptr, "QueryApplicationPlayStatisticsForSystem"},
|
||||||
{19, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
|
{19, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
|
||||||
};
|
};
|
||||||
|
@ -53,4 +56,13 @@ Result IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId(
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result IQueryService::QueryLastPlayTime(
|
||||||
|
Out<s32> out_entries, u8 unknown,
|
||||||
|
OutArray<LastPlayTime, BufferAttr_HipcMapAlias> out_last_play_times,
|
||||||
|
InArray<s32, BufferAttr_HipcMapAlias> application_ids) {
|
||||||
|
*out_entries = 1;
|
||||||
|
*out_last_play_times = {};
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service::NS
|
} // namespace Service::NS
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -23,6 +26,8 @@ struct PlayStatistics {
|
||||||
};
|
};
|
||||||
static_assert(sizeof(PlayStatistics) == 0x28, "PlayStatistics is an invalid size");
|
static_assert(sizeof(PlayStatistics) == 0x28, "PlayStatistics is an invalid size");
|
||||||
|
|
||||||
|
struct LastPlayTime {};
|
||||||
|
|
||||||
class IQueryService final : public ServiceFramework<IQueryService> {
|
class IQueryService final : public ServiceFramework<IQueryService> {
|
||||||
public:
|
public:
|
||||||
explicit IQueryService(Core::System& system_);
|
explicit IQueryService(Core::System& system_);
|
||||||
|
@ -31,6 +36,9 @@ public:
|
||||||
private:
|
private:
|
||||||
Result QueryPlayStatisticsByApplicationIdAndUserAccountId(
|
Result QueryPlayStatisticsByApplicationIdAndUserAccountId(
|
||||||
Out<PlayStatistics> out_play_statistics, bool unknown, u64 application_id, Uid account_id);
|
Out<PlayStatistics> out_play_statistics, bool unknown, u64 application_id, Uid account_id);
|
||||||
|
Result QueryLastPlayTime(Out<s32> out_entries, u8 unknown,
|
||||||
|
OutArray<LastPlayTime, BufferAttr_HipcMapAlias> out_last_play_times,
|
||||||
|
InArray<s32, BufferAttr_HipcMapAlias> application_ids);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::NS
|
} // namespace Service::NS
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue