#include "prx/libSceShare/include/Api.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include #include #include #include #include namespace { void Require(bool value) { if (!value) std::abort(); } } int main() { constexpr std::int32_t notSupported = static_cast(0x81960007); std::uint8_t param[64]{}; using Capture = int (APS5_VABI*)(const void*, std::int32_t*); std::int32_t reqId = 7; constexpr std::int32_t invalidParam = static_cast(0x81960002); const auto checkExtended = [&](int (APS5_VABI* capture)(const TParam*, std::int32_t*), std::uint64_t size) { std::uint64_t fields[5]{}; reqId = 7; Require(capture(reinterpret_cast(fields), &reqId) == invalidParam && reqId == 7); Require(capture(nullptr, &reqId) == invalidParam && reqId == 7); fields[0] = size; Require(capture(reinterpret_cast(fields), &reqId) == notSupported && reqId == -1); Require(capture(reinterpret_cast(fields), nullptr) == notSupported); if (size == 40) { fields[2] = 1; reqId = 7; Require(capture(reinterpret_cast(fields), &reqId) == invalidParam && reqId == -1); fields[3] = 1; Require(capture(reinterpret_cast(fields), nullptr) == notSupported); fields[3] |= std::uint64_t{1} << 32; Require(capture(reinterpret_cast(fields), nullptr) == invalidParam); } }; checkExtended(sceShareCaptureScreenshotExtended, 24); checkExtended(sceShareCaptureVideoClipExtended, 40); for (Capture capture : {sceShareCaptureScreenshot, sceShareCaptureVideoClip}) { reqId = 7; Require(capture(param, &reqId) == notSupported); Require(reqId == -1); reqId = 7; Require(capture(nullptr, &reqId) == notSupported); Require(reqId == -1); Require(capture(param, nullptr) == notSupported); } Require(sceShareOpenMenuForContent(param) == notSupported); Require(sceShareOpenMenuForContent(nullptr) == notSupported); std::uint8_t status[18]; std::memset(status, 0x5a, sizeof(status)); Require(sceShareGetCurrentStatus(1, reinterpret_cast(status)) == 0); for (std::size_t index = 0; index < sizeof(status); ++index) Require(status[index] == (index < 16 ? 0 : 0x5a)); std::memset(status, 0x5a, sizeof(status)); Require(sceShareGetCurrentStatus(0xffffffffu, reinterpret_cast(status)) == 0); Require(status[0] == 0 && status[15] == 0 && status[16] == 0x5a); std::memset(status, 0x5a, sizeof(status)); Require(sceShareGetCurrentStatus(0, reinterpret_cast(status)) == invalidParam); Require(status[0] == 0x5a); Require(sceShareGetCurrentStatus(1, nullptr) == invalidParam); std::uint32_t running[2]{0xffffffffu, 0x5a5a5a5au}; Require(sceShareGetRunningStatus(running) == 0); Require(running[0] == 0 && running[1] == 0x5a5a5a5au); Require(sceShareGetRunningStatus(nullptr) == invalidParam); Require(sceShareSetContentParamForApplicationTitle("title") == 0); Require(sceShareSetContentParamForApplicationTitle(nullptr) == invalidParam); Require(sceShareSetContentParamForApplicationTitle("") == invalidParam); std::string title(5119, 'a'); Require(sceShareSetContentParamForApplicationTitle(title.c_str()) == 0); title.push_back('a'); Require(sceShareSetContentParamForApplicationTitle(title.c_str()) == invalidParam); return 0; }