BCAT services: Difference between revisions
| mNo edit summary |  →news:a, news:c, news:m, news:p, news:v:  document async downloader | ||
| Line 267: | Line 267: | ||
| | 30400 || [3.0.0+] DecodeArchiveFile || 2 | | 30400 || [3.0.0+] DecodeArchiveFile || 2 | ||
| |- | |- | ||
| | 30500 || [8.0.0+] ?  | | [[#30500]] || [8.0.0+] ? || 2 | ||
| |- | |- | ||
| | 30900 || [1.0.0] (No input, returns an [[#INewlyArrivedEventHolder]]) || 2 | | 30900 || [1.0.0] (No input, returns an [[#INewlyArrivedEventHolder]]) || 2 | ||
| Line 297: | Line 297: | ||
| === 30210 === | === 30210 === | ||
| Returns the Database version retrieved from system setting news!db_version | Returns the Database version retrieved from system setting news!db_version | ||
| === 30500 === | |||
| Takes a type-0x9 input buffer URL, the size of the transfer memory and a handle for the latter, returns an [[#IUnknown2]]. | |||
| === GetNewsDatabaseDump === | === GetNewsDatabaseDump === | ||
| Line 386: | Line 389: | ||
| == IUnknown2 == | == IUnknown2 == | ||
| This was added with [8.0.0+]. | This was added with [8.0.0+]. | ||
| On creation this object is enqueued and an event is signaled prompting a download from another thread (nn.news.Downloader). | |||
| (Made up names) | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 391: | Line 397: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 ||   | | 0 || [[#Get]] | ||
| |- | |- | ||
| | 1 ||   | | 1 || [[#Cancel]] | ||
| |- | |- | ||
| | 2 ||   | | 2 || [[#GetResult]] | ||
| |- | |- | ||
| | 3 ||   | | 3 || [[#GetSize]] | ||
| |} | |} | ||
| === Get === | |||
| Return event handle. Signaled on download finish. | |||
| === Cancel === | |||
| Cancels Download. | |||
| === GetResult === | |||
| Returns last result. | |||
| === GetSize === | |||
| Returns final decoded size. 0 if the result of [[#GetResult]] is not 0 or Download isn't finished/was canceled. | |||
| == NewsDatabase == | == NewsDatabase == | ||
Revision as of 17:07, 18 October 2020
BCAT (Background Content Asymmetric synchronized delivery and Transmission) encompasses a set of content download/upload related services.
bcat:a, bcat:m, bcat:u, bcat:s
These are "nn::bcat::detail::ipc::IServiceCreator".
These were added with [2.0.0+].
| Cmd | Name | Notes | 
|---|---|---|
| 0 | CreateBcatService | Takes an input u64 ProcessId, returns an #IBcatService | 
| 1 | CreateDeliveryCacheStorageService | Takes an input u64 ProcessId, returns an #IDeliveryCacheStorageService | 
| 2 | CreateDeliveryCacheStorageServiceWithApplicationId | Takes an input u64 TitleId, returns an #IDeliveryCacheStorageService | 
| 3 | [2.0.0-2.3.0] CreateDeliveryCacheProgressService | Takes an input u64 ProcessId, returns an #IDeliveryCacheProgressService | 
| 4 | [2.0.0-2.3.0] CreateDeliveryCacheProgressServiceWithApplicationId | Takes an input u64 TitleId, returns an #IDeliveryCacheProgressService | 
Equivalent to 3DS BOSS(SpotPass). See here for BCAT-content-container.
IBcatService
This is "nn::bcat::detail::ipc::IBcatService".
This was added with [2.0.0+].
| Cmd | Name | 
|---|---|
| 10100 | #RequestSyncDeliveryCache | 
| 10101 | [5.0.0+] RequestSyncDeliveryCacheWithDirectoryName | 
| 10200 | [5.0.0+] CancelSyncDeliveryCacheRequest | 
| 20100 | #RequestSyncDeliveryCacheWithApplicationId | 
| 20101 | [5.0.0+] RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName | 
| 20300 | [8.0.0+] #GetDeliveryCacheStorageUpdateNotifier | 
| 20301 | [8.0.0+] #RequestSuspendDeliveryTask | 
| 20400 | [9.0.0+] #RegisterSystemApplicationDeliveryTask | 
| 20401 | [9.0.0+] #UnregisterSystemApplicationDeliveryTask | 
| 20410 | [9.1.0+] SetSystemApplicationDeliveryTaskTimer | 
| 30100 | SetPassphrase | 
| 30101 | [2.0.0-2.3.0] | 
| 30102 | [2.0.0-2.3.0] | 
| 30200 | [3.0.0+] RegisterDeliveryTask | 
| 30201 | [3.0.0+] UnregisterDeliveryTask | 
| 30202 | [3.0.0+] BlockDeliveryTask | 
| 30203 | [3.0.0+] UnblockDeliveryTask | 
| 30210 | [9.1.0+] SetDeliveryTaskTimer | 
| 30300 | [8.0.0+] RegisterSystemApplicationDeliveryTasks | 
| 90100 | GetDeliveryTaskList | 
| 90200 | #GetDeliveryList | 
| 90201 | [3.0.0+] ClearDeliveryCacheStorage | 
| 90202 | [8.0.0+] ClearDeliveryTaskSubscriptionStatus | 
| 90300 | [3.0.0+] GetPushNotificationLog | 
RequestSyncDeliveryCache
No input/output.
[3.0.0+] Now returns an #IDeliveryCacheProgressService.
RequestSyncDeliveryCacheWithApplicationId
Takes an input u64 nn::ApplicationId, no output.
[3.0.0+] Now takes an additional 8-bytes of input, and returns an #IDeliveryCacheProgressService.
GetDeliveryCacheStorageUpdateNotifier
Takes an input u64 nn::ApplicationId, returns an #INotifierService.
RequestSuspendDeliveryTask
Takes an input u64 nn::ApplicationId, returns an #IDeliveryTaskSuspensionService.
RegisterSystemApplicationDeliveryTask
Takes an input u64 nn::ApplicationId, no output.
UnregisterSystemApplicationDeliveryTask
Takes an input u64 nn::ApplicationId, no output.
GetDeliveryList
Takes a type-0x6 output buffer, returns a total of 4-bytes of output.
[3.0.0+] Now takes a total of 8-bytes of input, and returns an additional 4-bytes of output.
IDeliveryCacheProgressService
This is "nn::bcat::detail::ipc::IDeliveryCacheProgressService".
This was added with [2.0.0+].
| Cmd | Name | 
|---|---|
| 0 | GetEvent | 
| 1 | GetImpl | 
IDeliveryCacheStorageService
This is "nn::bcat::detail::ipc::IDeliveryCacheStorageService".
This was added with [2.0.0+].
| Cmd | Name | 
|---|---|
| 0 | CreateFileService | 
| 1 | CreateDirectoryService | 
| 10 | EnumerateDeliveryCacheDirectory | 
IDeliveryCacheFileService
This is "nn::bcat::detail::ipc::IDeliveryCacheFileService".
This was added with [2.0.0+].
| Cmd | Name | 
|---|---|
| 0 | Open | 
| 1 | Read | 
| 2 | GetSize | 
| 3 | GetDigest | 
IDeliveryCacheDirectoryService
This is "nn::bcat::detail::ipc::IDeliveryCacheDirectoryService".
This was added with [2.0.0+].
| Cmd | Name | 
|---|---|
| 0 | Open | 
| 1 | Read | 
| 2 | GetCount | 
INotifierService
This is "nn::bcat::detail::ipc::INotifierService".
Added with [8.0.0+].
| Cmd | Name | Notes | 
|---|---|---|
| 0 | GetEvent | 
IDeliveryTaskSuspensionService
This is "nn::bcat::detail::ipc::IDeliveryTaskSuspensionService".
Added with [8.0.0+].
| Cmd | Name | Notes | 
|---|---|---|
| 0 | GetEvent | 
news:a, news:c, news:m, news:p, news:v
These are "nn::news::detail::ipc::IServiceCreator".
On [1.0.0] these are "nn::news::detail::ipc::INewsService", see #INewsService.
News entries are fetched from CDN[1]. Metadata for each entry is stored and queried from an internal SQLite database. Official software uses sqlite[2] for processing.
All sessions have 32 sessions. Permission masks are:
| Name | Mask | 
|---|---|
| news:a | 0xffffffff | 
| news:p | 0x1 | 
| news:c | 0x2 | 
| news:v | 0x4 | 
| news:m | 0xd | 
| Cmd | Name | Notes | 
|---|---|---|
| 0 | CreateNewsService | No input, returns an #INewsService. | 
| 1 | CreateNewlyArrivedEventHolder | No input, returns an #INewlyArrivedEventHolder. | 
| 2 | CreateNewsDataService | No input, returns an #INewsDataService. | 
| 3 | CreateNewsDatabaseService | No input, returns an #INewsDatabaseService. | 
| 4 | CreateOverwriteEventHolder | No input, returns an #IOverwriteEventHolder. | 
CreateNewsDataService and CreateNewsDatabaseService require permission bit 2.
INewsService
This is "nn::news::detail::ipc::INewsService".
| Cmd | Name | Required Permission Bits | 
|---|---|---|
| 10100 | #PostLocalNews | 0 | 
| 20100 | SetPassphrase | 1 | 
| 30100 | GetSubscriptionStatus | 1 or 2 | 
| 30101 | [3.0.0+] GetTopicList | 2 | 
| #30110 | [6.0.0+] | 2 | 
| 30200 | #IsSystemUpdateRequired | 2 | 
| 30201 | [8.0.0+] | 2 | 
| #30210 | [10.0.0+] | 2 | 
| 30300 | RequestImmediateReception | 2 | 
| 30400 | [3.0.0+] DecodeArchiveFile | 2 | 
| #30500 | [8.0.0+] ? | 2 | 
| 30900 | [1.0.0] (No input, returns an #INewlyArrivedEventHolder) | 2 | 
| 30901 | [1.0.0] (No input, returns an #INewsDataService) | 2 | 
| 30902 | [1.0.0] (No input, returns an #INewsDatabaseService) | 2 | 
| 40100 | SetSubscriptionStatus | 1 or 3 | 
| 40101 | [3.0.0+] RequestAutoSubscription | 3 | 
| 40200 | ClearStorage | 3 | 
| 40201 | ClearSubscriptionStatusAll | 1 or 3 | 
| 90100 | #GetNewsDatabaseDump | 4 | 
PostLocalNews
Takes an input buffer msgpack.
30110
Returns two u64s. Current usage and total size of the news-mounted savedata 0x8000000000000090.
IsSystemUpdateRequired
Matches the version in news-sys:/sup.version against the result from system setting news!system_version.
30210
Returns the Database version retrieved from system setting news!db_version
30500
Takes a type-0x9 input buffer URL, the size of the transfer memory and a handle for the latter, returns an #IUnknown2.
GetNewsDatabaseDump
Dumps internal SQLite file.
INewlyArrivedEventHolder
This is "nn::news::detail::ipc::INewlyArrivedEventHolder".
| Cmd | Name | 
|---|---|
| 0 | #Get | 
Get
Returns readable event. Event is signaled on PostLocalNews or on fetch from CDN if the file doesn't exist.
INewsDataService
This is "nn::news::detail::ipc::INewsDataService".
| Cmd | Name | 
|---|---|
| 0 | #Open | 
| 1 | #OpenWithNewsRecordV1 | 
| 2 | #Read | 
| 3 | #GetSize | 
| 1001 | [6.0.0+] #OpenWithNewsRecord | 
Open
Takes an input string. Opens file with the output of snprintf from "news:/data/%s" with input.
OpenWithNewsRecordV1
Takes an input #NewsRecordV1. Opens file with the output of snprintf of "news:/data/D00000000000000000000_%s.msgpack" with news_id if user_id is empty or else of "news:/data/U%s_%s.msgpack" with user_id and news_id of input.
Read
Read from file opened with #Open, #OpenWithNewsRecordV1 or #OpenWithNewsRecord.
GetSize
Get size of file opened with #Open, #OpenWithNewsRecordV1 or #OpenWithNewsRecord.
OpenWithNewsRecord
Takes an input #NewsRecord. Same behavior as #OpenWithNewsRecordV1.
INewsDatabaseService
This is "nn::news::detail::ipc::INewsDatabaseService".
| Cmd | Name | 
|---|---|
| 0 | GetListV1 | 
| 1 | Count | 
| 2 | CountWithKey | 
| 3 | UpdateIntegerValue | 
| 4 | UpdateIntegerValueWithAddition | 
| 5 | UpdateStringValue | 
| 1000 | [6.0.0+] GetList | 
IOverwriteEventHolder
This is "nn::news::detail::ipc::IOverwriteEventHolder".
| Cmd | Name | 
|---|---|
| 0 | #Get | 
Get
Returns readable event. Event is signaled on fetch from CDN if the file already exists.
IUnknown2
This was added with [8.0.0+]. On creation this object is enqueued and an event is signaled prompting a download from another thread (nn.news.Downloader).
(Made up names)
| Cmd | Name | 
|---|---|
| 0 | #Get | 
| 1 | #Cancel | 
| 2 | #GetResult | 
| 3 | #GetSize | 
Get
Return event handle. Signaled on download finish.
Cancel
Cancels Download.
GetResult
Returns last result.
GetSize
Returns final decoded size. 0 if the result of #GetResult is not 0 or Download isn't finished/was canceled.
NewsDatabase
Internal SQLite database. Has a second version since 6.0.0.
| Name | Type | Exists | 
|---|---|---|
| news_id | TEXT | All | 
| user_id | TEXT | All | 
| topic_id | TEXT | All | 
| application_ids | TEXT | All | 
| received_at | INTEGER | All | 
| published_at | INTEGER | All | 
| expire_at | INTEGER | All | 
| pickup_limit | INTEGER | All | 
| essential_pickup_limit | INTEGER | Only V2 | 
| priority | INTEGER | All | 
| deletion_priority | INTEGER | All | 
| age_limit | INTEGER | All | 
| surprise | INTEGER | All | 
| bashotorya | INTEGER | Only V1 | 
| decoration_type | INTEGER | Only V2 | 
| point | INTEGER | All | 
| read | INTEGER | All | 
| newly | INTEGER | All | 
| displayed | INTEGER | All | 
| opted_in | INTEGER | All | 
| point_status | INTEGER | All | 
| feedback | INTEGER | Only V2 | 
| extra_1 | INTEGER | All | 
| extra_2 | INTEGER | All | 
NewsRecordV1
| Offset | Size | SQLite association | 
|---|---|---|
| 0x0 | 0x18 | TEXT news_id | 
| 0x18 | 0x18 | TEXT user_id | 
| 0x30 | 0x8 | INTEGER received_id | 
| 0x38 | 0x4 | INTEGER news | 
| 0x3c | 0x4 | INTEGER newly | 
| 0x40 | 0x4 | INTEGER displayed | 
| 0x44 | 0x4 | none | 
NewsRecord
| Offset | Size | SQLite association | 
|---|---|---|
| 0x0 | 0x18 | TEXT news_id | 
| 0x18 | 0x18 | TEXT user_id | 
| 0x30 | 0x20 | TEXT topic_id | 
| 0x50 | 0x8 | INTEGER received_id | 
| 0x58 | 0x8 | none | 
| 0x60 | 0x4 | INTEGER decoration_type | 
| 0x64 | 0x4 | INTEGER read | 
| 0x68 | 0x4 | INTEGER newly | 
| 0x6c | 0x4 | INTEGER displayed | 
| 0x70 | 0x4 | INTEGER feedback | 
| 0x74 | 0x4 | none | 
| 0x78 | 0x4 | INTEGER extra_1 | 
| 0x7c | 0x4 | INTEGER extra_2 | 
prepo:a, prepo:a2, prepo:m, prepo:u, prepo:s
These are "nn::prepo::detail::ipc::IPrepoService".
| Cmd | Name | 
|---|---|
| 10100 | SaveReportOld ([1.0.0-5.1.0] SaveReport) | 
| 10101 | SaveReportWithUserOld ([1.0.0-5.1.0] SaveReportWithUser) | 
| 10102 | [6.0.0+] SaveReportOld2 ([1.0.0-9.2.0] SaveReport) | 
| 10103 | [6.0.0+] SaveReportWithUserOld2 ([1.0.0-9.2.0] SaveReportWithUser) | 
| 10104 | [10.0.0+] SaveReport | 
| 10105 | [10.0.0+] SaveReportWithUser | 
| 10200 | RequestImmediateTransmission | 
| 10300 | GetTransmissionStatus | 
| 10400 | [9.0.0+] GetSystemSessionId | 
| 20100 | SaveSystemReport | 
| 20101 | SaveSystemReportWithUser | 
| 20200 | [4.0.0+] SetOperationMode | 
| 30100 | ClearStorage | 
| 30200 | [6.0.0+] ClearStatistics | 
| 30300 | [6.0.0+] GetStorageUsage | 
| 30400 | [6.0.0+] GetStatistics | 
| 30401 | [6.0.0+] GetThroughputHistory | 
| 30500 | [6.0.0+] GetLastUploadError | 
| 30600 | [10.0.0+] GetApplicationUploadSummary | 
| 40100 | [2.0.0+] IsUserAgreementCheckEnabled | 
| 40101 | [2.0.0+] SetUserAgreementCheckEnabled | 
| 50100 | [10.0.0+] ReadAllApplicationReportFiles | 
| 90100 | [6.0.0+] ReadAllReportFiles ([1.0.0-5.1.0] GetStorageUsage) | 
| 90101 | [1.0.0] | 
| 90102 | [1.0.0] | 
| 90200 | [5.0.0-5.1.0] GetStatistics | 
| 90201 | [5.0.0-5.1.0] GetThroughputHistory | 
| 90300 | [5.0.0-5.1.0] GetLastUploadError | 
Data reporting
The "Play Report" (prepo) service uploads system and user information to a cloud server. This includes the following fields:
sys_info data application_id event_id operation_mode lc_recorded_at (followed by a timestamp) nc_recorded_at (followed by a timestamp) nsa_id os_version
And the contents of the following file:
is_user_agreement_check_enabled.bin
All the information is periodically uploaded to the following URL:
- https://receive-%.dg.srv.nintendo.net/post
It also checks the validity of the device's authentication token using the following URL:
- https://dauth-%.ndas.srv.nintendo.net/v1/device_auth_token