Files
AnyPS5/docs/dev/debt/libSceNpCppWebApi.md
T
Dean a142f7b0dd Merge pull request #9015 from akkadbakkad89/feat/np-webapi-up-generics
feat(libSceNpCppWebApi): cover the UserProfile models and remaining Common instantiations
2026-10-27 10:28:47 +13:00

9.9 KiB

libSceNpCppWebApi technical debt

Silent stubs

  • sce::Np::CppWebApi::Common (libSceNpCppWebApi) - the finish overrides of TransactionBase<...> (13 instantiations), DownStreamTransaction<...> (2 instantiations) and Vector<IntrusivePtr<Leaderboards::V1::User>>::pushBack return success without doing work; a failed request never produces a transaction to finish. Transaction<...>::setOnFinishedCallback and TransactionBase<...>::setResponseInformationOption (5 instantiations each, the UserProfile::V1, ProfanityFilter::V2 and CommunicationRestrictionStatus::V3 responses) return success without storing the callback or the option: start fails, so neither is ever used. The constructors and destructors of the same five Transaction<...> instantiations succeed without keeping state
  • sce::Np::CppWebApi::Leaderboards::V1 (libSceNpCppWebApi) - request-body and parameter bookkeeping succeeds without storing state: GetRankingRequestBody::set{StartSerialRank,Group,Limit,Users,Offset}, RecordScoreRequestBody::set{Comment,SmallData,NeedsTmpRank,ComparedDateTime,PcId}, User::{setAccountId,setPcId}, BoardsApi::ParameterToGetBoardDefinition::{initialize,terminate}, RecordApi::ParameterToRecordLargeData::{initialize,terminate}, RecordApi::ParameterToRecordScore::{initialize,setxPsnAtomicOperation,terminate}, ViewApi::ParameterToGetLargeDataByObjectId::{initialize,terminate}, ViewApi::ParameterToGetRanking::{initialize,setgetRankingRequestBody,terminate}
  • sce::Np::CppWebApi::SessionManager::V1 (libSceNpCppWebApi) - parameter bookkeeping succeeds without storing state: PlayerSessionsApi::ParameterToCreatePlayerSessions::{ctor,dtor,initialize}, PlayerSessionsApi::ParameterToGetPlayerSessionInvitations::{ctor,dtor,initialize,setfields,setinvitationInvalidFilter}, PlayerSessionsApi::ParameterToJoinPlayerSessionAsPlayer::{ctor,dtor,initialize,terminate}, PlayerSessionsApi::ParameterToLeavePlayerSession::{ctor,dtor,initialize}, RequestPlayerSession::set{MaxSpectators,InvitableUserType,JoinableUserType,ExclusiveLeaderPrivileges}, RequestPlayerSessionPlayer::setPushContexts
  • sce::Np::CppWebApi::TitleCloudStorage::V1 and InGameCatalog::V5 (libSceNpCppWebApi) - DataApi::ParameterToDownloadData, DataApi::ParameterToGetMultiDataStatusesByUser and ContainerApi::ParameterToGetContainer keep only whether they are initialized. initialize, terminate and the string setters return the codes of the module bundled with PPSA21564: 0x80553503 for a null LibContext or string, 0x80553502 for a LibContext that Common::initialize did not set or a parameter not yet initialized, 0x8055350f for a second initialize and 0x80553510 for terminate without one. They store none of the values, and ParameterToGetContainer::set{sort,offset,limit,serviceLabel} store nothing either: only a request would read them
  • sce::Np::CppWebApi::UserProfile::V1, ProfanityFilter::V2, CommunicationRestrictionStatus::V3 (libSceNpCppWebApi) - parameter bookkeeping succeeds without storing state: FriendsApi::ParameterToGetFriends, PresenceApi::ParameterToGetBasicPresences, BlocksApi::ParameterToGetBlockingUsers, ProfanityApi::ParameterToFilterProfanity and CommunicationRestrictionStatusApi::ParameterToGetCommunicationRestrictionStatus, each {ctor,dtor,initialize,terminate}

Unknown function info

  • sce::Np::CppWebApi (libSceNpCppWebApi) - every request entry point (API calls, transaction start/getResponse/readData, the *Factory::creates) returns SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN offline. The constant's name and value follow the reference tables in shadPS4 np_error.h and fpPS4 np_error.pas, where 0x80552907 is ORBIS_NP_WEBAPI_ERROR_NOT_SIGNED_IN and 0x80552901 is OUT_OF_MEMORY (no UNAVAILABLE exists in the 0x80552901-0x8055291F range); it is the code a signed-out console returns from these entry points. The earlier 0x80552901 value came from the module the previous implementation shipped, which used the same incorrect constant
  • sce::Np::CppWebApi::Common::IntrusivePtr (libSceNpCppWebApi) - the 0x18-byte layout (object, deleter, LibContext*) and the offset of the 32-bit reference count in the pointee (0x00, 0x30 for Vector) come from the module bundled with one title (PPSA21564); other SDK versions are not checked. The destructor throws on the last reference of a pointer without a deleter: destroying the object needs its destructor and the LibContext allocator, which are not implemented
  • sce::Np::CppWebApi::Common::String (libSceNpCppWebApi) - the 0x20-byte layout (32-bit reference count, buffer at 0x08, buffer size at 0x10, LibContext* at 0x18) comes from the module bundled with one title (PPSA21564); other SDK versions are not checked. append grows the buffer with the host allocator and the destructor frees it, instead of going through the LibContext allocator. pushBack into Vector<String> stores a deep copy, so a destroyed temporary cannot invalidate the stored element; a title that byte-copies a String with a live buffer would still double-free, as nothing increments the reference count
  • sce::Np::CppWebApi::Common::Vector (libSceNpCppWebApi) - imported by PPSA03671, whose dump ships no libSceNpCppWebApi.prx. A Vector handle is an IntrusivePtr over a shared body; bodies created by pushBack use a host-side layout with the reference count at 0x30, matching the adopted-body convention measured on PPSA21564. The pointer/deleter constructor adopts a title-provided body released through the stored deleter; pushBack on such a body throws, since its element layout is unknown. begin, end, iterators and copyFrom throw: the only Vectors the title reads back come from failed transactions, which never produce one. empty, size and operator[] read the host-created body honestly and throw on title-provided bodies
  • sce::Np::CppWebApi::SessionManager2V1 (libSceNpCppWebApi) - imported by PPSA03671. Offline, the factories, PlayerSessionsApi calls and transaction start/getResponse/readData fail with SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; parameter setters, initialize, terminate, constructors and destructors succeed without keeping state, as no request is ever sent. Response-body accessors (getSessionId, getPlayerSessions, getInvitations, the IsSet queries) throw: a failed request never produces a response object
  • sce::Np::CppWebApi::UserProfile::V1, ProfanityFilter::V2, CommunicationRestrictionStatus::V3 (libSceNpCppWebApi) - imported by an Epic Online Services module whose dump ships no libSceNpCppWebApi.prx. The reference-count offset 0x00 of ResponseHeaderBase and WebApiFilterRequest is assumed from the other objects, not measured. Offline, the five API calls, WebApiFilterRequestFactory::create and the transactions' start/getResponseHeaders fail with SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN. Response accessors, ResponseHeaderBase::getHeaderValue and the Vector/Iterator members over IntrusivePtr<UserProfile::V1::BasicPresence> and unsigned long throw: a failed request never produces a response
  • libSceNpCppWebApi (libSceNpCppWebApi) - unimplemented stubs have their parameter lists, const qualifiers and return types aligned with the demangled symbols confirmed by NID matching in #8143. They cover response-body accessors, iterators, and uninstantiated transactions in Leaderboards::V1, SessionManager::V1, InGameCatalog::V5, TitleCloudStorage::V1, and Common templates: each mangled name gives the method and parameter types, but the runtime layout of response objects and errors are unverified on console, so each call continues to throw NotImplemented_nid_no_patch. No call site is recorded for them
  • sce::Np::CppWebApi::SessionManager2V1 and sce::Np::CppWebApi::InGameCatalog2V5 (libSceNpCppWebApi) - 198 further exports imported by PPSA20397, named from aerolib. API calls, factories and transaction start/getResponse* fail SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; parameter bookkeeping succeeds without state; IntrusivePtr/Vector helpers follow the layouts above, with Vector::empty/size/operator[] reading host-created bodies and throwing on title-provided ones. Response accessors, iterators, Vector::begin/end/copyFrom and transaction abort/getId/operator= throw: a failed request produces no response object, and aborting or renumbering a transaction that never ran has no defined outcome
  • sce::Np::CppWebApi::UserProfile::V1, sce::Np::CppWebApi::CommunicationRestrictionStatus::V3 and the remaining sce::Np::CppWebApi::Common instantiations (libSceNpCppWebApi) - 87 further exports imported by PPSA20397, plus the previously-throwing ContainerApi::ParameterToGetContainer lifecycle and getContainer. API verbs and transaction start/getResponse fail SCE_NP_WEBAPI_ERROR_NOT_SIGNED_IN; parameter and model bookkeeping (initialize, terminate, set*, constructors, destructors) succeeds without state. BasicProfile/BasicPresence/PersonalDetail response accessors, *IsSet queries, Get*Response getters, vector begin/end, iterator dereference/compare and transaction abort/getId/operator= throw: no response object exists offline and the model layouts are unverified