Difference between revisions of "BCAT services"

From Nintendo Switch Brew
Jump to navigation Jump to search
(News: add permission masks)
Line 334: Line 334:
  
 
=== Open ===
 
=== Open ===
Takes an input string. Opens file with the output of snprintf from "news:/data/%s" with input.
+
Takes an input string. Opens file with the output of snprintf from <nowiki>"news:/data/%s"</nowiki> with input.
  
 
=== OpenWithNewsRecordV1 ===
 
=== 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.
+
Takes an input [[#NewsRecordV1]]. Opens file with the output of snprintf of <nowiki>"news:/data/D00000000000000000000_%s.msgpack"</nowiki> with news_id if user_id is empty or else of <nowiki>"news:/data/U%s_%s.msgpack"</nowiki> with user_id and news_id of input.
  
 
=== Read ===
 
=== Read ===
Line 346: Line 346:
  
 
=== OpenWithNewsRecord===
 
=== OpenWithNewsRecord===
Takes an input #NewsRecord. Same behavior as [[#OpenWithNewsRecordV1]].
+
Takes an input [[#NewsRecord]]. Same behavior as [[#OpenWithNewsRecordV1]].
  
 
== INewsDatabaseService ==
 
== INewsDatabaseService ==

Revision as of 14:18, 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.

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+] ? (Takes a total of 8-bytes of input, a handle, and a type-0x9 input buffer, returns an #IUnknown2) 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

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