Files
AnyPS5/docs/dev/debt/libSceNpCppWebApi.md
T

10 KiB

libSceNpCppWebApi technical debt

Silent stubs

  • sce::Np::CppWebApi::Common (libSceNpCppWebApi) - the finish overrides of 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 bookkeeping succeeds without storing state: GetRankingRequestBody::set{StartSerialRank,Group,Limit,Users,Offset}, RecordScoreRequestBody::set{Comment,SmallData,NeedsTmpRank,ComparedDateTime,PcId} and User::{setAccountId,setPcId}. BoardsApi::ParameterToGetBoardDefinition, RecordApi::ParameterToRecordLargeData, RecordApi::ParameterToRecordScore, ViewApi::ParameterToGetLargeDataByObjectId and ViewApi::ParameterToGetRanking keep only whether they are initialized, as the SessionManager::V1 parameters do: initialize and terminate return the codes of the module bundled with PPSA21564, 0x80553512 for an empty RecordScoreRequestBody included. They store none of the arguments, and setxPsnAtomicOperation and setgetRankingRequestBody store nothing either
  • sce::Np::CppWebApi::SessionManager::V1 (libSceNpCppWebApi) - RequestPlayerSession::set{MaxSpectators,InvitableUserType,JoinableUserType,ExclusiveLeaderPrivileges} and RequestPlayerSessionPlayer::setPushContexts succeed without storing state. The PlayerSessionsApi parameters ParameterToCreatePlayerSessions, ParameterToGetPlayerSessionInvitations, ParameterToJoinPlayerSessionAsPlayer and ParameterToLeavePlayerSession keep only whether they are initialized, as the TitleCloudStorage ones do: initialize, terminate and setinvitationInvalidFilter return the codes of the module bundled with PPSA21564, plus 0x80553512 when the request body of ParameterToCreatePlayerSessions or ParameterToJoinPlayerSessionAsPlayer is empty. They store none of the strings or bodies, and setfields stores nothing either: only a request would read them
  • 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 operator= throw: a failed request produces no response object. As start never succeeds here, TransactionBase::finish and abort return 0x80553508 and getId returns 0, which is what the module bundled with PPSA21564 returns while the two words its Transaction constructor zeroes are still unset
  • 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