BCAT services: Difference between revisions
News docs |
|||
Line 200: | Line 200: | ||
On [1.0.0] these are <nowiki>"nn::news::detail::ipc::INewsService"</nowiki>, see [[#INewsService]]. | On [1.0.0] these are <nowiki>"nn::news::detail::ipc::INewsService"</nowiki>, see [[#INewsService]]. | ||
News entries are fetched from CDN[https://switchbrew.org/wiki/Network#Others]. | |||
Metadata for each entry is stored and queried from an internal SQLite database. | |||
Official software uses sqlite[https://www.sqlite.org/download.html] for processing. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 223: | Line 227: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 10100 || PostLocalNews | | 10100 || [[#PostLocalNews]] | ||
|- | |- | ||
| 20100 || SetPassphrase | | 20100 || SetPassphrase | ||
Line 259: | Line 263: | ||
| 40201 || ClearSubscriptionStatusAll | | 40201 || ClearSubscriptionStatusAll | ||
|- | |- | ||
| 90100 || GetNewsDatabaseDump | | 90100 || [[#GetNewsDatabaseDump]] | ||
|} | |} | ||
=== PostLocalNews === | |||
Takes an input buffer msgpack. | |||
=== 30110 === | === 30110 === | ||
Line 270: | Line 277: | ||
=== 30210 === | === 30210 === | ||
Returns the Database version retrieved from system setting news!db_version | Returns the Database version retrieved from system setting news!db_version | ||
=== GetNewsDatabaseDump === | |||
Dumps internal SQLite file. | |||
== INewlyArrivedEventHolder == | == INewlyArrivedEventHolder == | ||
Line 278: | Line 288: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || Get | | 0 || [[#Get]] | ||
|} | |} | ||
=== Get === | |||
Returns readable event. | |||
Event is signaled on PostLocalNews or on fetch from CDN if the file doesn't exist. | |||
== INewsDataService == | == INewsDataService == | ||
Line 288: | Line 302: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || Open | | 0 || [[#Open]] | ||
|- | |- | ||
| 1 || OpenWithNewsRecordV1 | | 1 || [[#OpenWithNewsRecordV1]] | ||
|- | |- | ||
| 2 || Read | | 2 || [[#Read]] | ||
|- | |- | ||
| 3 || GetSize | | 3 || [[#GetSize]] | ||
|- | |- | ||
| 1001 || [6.0.0+] OpenWithNewsRecord | | 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 == | == INewsDatabaseService == | ||
Line 328: | Line 357: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || Get | | 0 || [[#Get]] | ||
|} | |} | ||
=== Get === | |||
Returns readable event. | |||
Event is signaled on fetch from CDN if the file already exists. | |||
== IUnknown2 == | == IUnknown2 == | ||
Line 345: | Line 378: | ||
|- | |- | ||
| 3 || | | 3 || | ||
|} | |||
= NewsDatabase = | |||
Internal SQLite database. Has a second version since 6.0.0. | |||
{| class="wikitable" border="1" | |||
|- | |||
! 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 = | |||
{| class="wikitable" border="1" | |||
|- | |||
! 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 = | |||
{| class="wikitable" border="1" | |||
|- | |||
! 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 | |||
|- | |||
|} | |} | ||
Revision as of 05:30, 17 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.
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. |
INewsService
This is "nn::news::detail::ipc::INewsService".
Cmd | Name |
---|---|
10100 | #PostLocalNews |
20100 | SetPassphrase |
30100 | GetSubscriptionStatus |
30101 | [3.0.0+] GetTopicList |
#30110 | [6.0.0+] |
30200 | #IsSystemUpdateRequired |
30201 | [8.0.0+] |
#30210 | [10.0.0+] |
30300 | RequestImmediateReception |
30400 | [3.0.0+] DecodeArchiveFile |
30500 | [8.0.0+] ? (Takes a total of 8-bytes of input, a handle, and a type-0x9 input buffer, returns an #IUnknown2) |
30900 | [1.0.0] (No input, returns an #INewlyArrivedEventHolder) |
30901 | [1.0.0] (No input, returns an #INewsDataService) |
30902 | [1.0.0] (No input, returns an #INewsDatabaseService) |
40100 | SetSubscriptionStatus |
40101 | [3.0.0+] RequestAutoSubscription |
40200 | ClearStorage |
40201 | ClearSubscriptionStatusAll |
90100 | #GetNewsDatabaseDump |
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
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+].
Cmd | Name |
---|---|
0 | |
1 | |
2 | |
3 |
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