BCAT services: Difference between revisions

No edit summary
No edit summary
(58 intermediate revisions by 9 users not shown)
Line 1: Line 1:
BCAT (Background Content Asymmetric synchronized delivery and Transmission) encompasses a set of content download/upload related services.
BCAT (Background Content Asymmetric synchronized delivery and Transmission) encompasses a set of content download/upload related services.


= BCAT services =
= bcat:a, bcat:m, bcat:u, bcat:s =
== bcat:u ==
These are "nn::bcat::ipc::IServiceCreator".


== bcat:s ==
These were added with [2.0.0+].


== bcat:m ==
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#CreateBcatService]]
|-
| 1 || [[#CreateDeliveryCacheStorageService]]
|-
| 2 || [[#CreateDeliveryCacheStorageServiceWithApplicationId]]
|-
| 3 || [2.0.0-2.3.0] [[#CreateDeliveryCacheProgressService]]
|-
| 4 || [2.0.0-2.3.0] [[#CreateDeliveryCacheProgressServiceWithApplicationId]]
|}
 
Equivalent to 3DS BOSS(SpotPass). See [[BCAT_Content_Container|here]] for BCAT-content-container.
 
== CreateBcatService ==
Takes an input u64 ProcessId. Returns an [[#IBcatService]].
 
== CreateDeliveryCacheStorageService ==
Takes an input u64 ProcessId. Returns an [[#IDeliveryCacheStorageService]].
 
== CreateDeliveryCacheStorageServiceWithApplicationId  ==
Takes an input u64 <code>nn::ApplicationId</code>. Returns an [[#IDeliveryCacheStorageService]].
 
== CreateDeliveryCacheProgressService  ==
Takes an input u64 ProcessId. Returns an [[#IDeliveryCacheProgressService]].
 
== CreateDeliveryCacheProgressServiceWithApplicationId  ==
Takes an input u64 <code>nn::ApplicationId</code>. returns an [[#IDeliveryCacheProgressService]].
 
== IBcatService ==
This is "nn::bcat::ipc::IBcatService".
 
This was added with [2.0.0+].
 
{| class="wikitable" border="1"
|-
! 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
|-
| 90101 || [11.0.0+] GetDeliveryTaskListForSystem
|-
| 90200 || [[#GetDeliveryList]]
|-
| 90201 || [3.0.0+] ClearDeliveryCacheStorage
|-
| 90202 || [8.0.0+] ClearDeliveryTaskSubscriptionStatus
|-
| 90300 || [3.0.0+] GetPushNotificationLog
|-
| 90301 || [11.0.0+] GetDeliveryCacheStorageUsage
|}
 
=== RequestSyncDeliveryCache ===
No input/output.
 
[3.0.0+] Now returns an [[#IDeliveryCacheProgressService]].
 
=== RequestSyncDeliveryCacheWithApplicationId ===
Takes an input u64 <code>nn::ApplicationId</code>. No output.
 
[3.0.0+] Now takes an additional 8-bytes of input, and returns an [[#IDeliveryCacheProgressService]].
 
=== GetDeliveryCacheStorageUpdateNotifier ===
Takes an input u64 <code>nn::ApplicationId</code>. Returns an [[#INotifierService]].
 
=== RequestSuspendDeliveryTask ===
Takes an input u64 <code>nn::ApplicationId</code>. Returns an [[#IDeliveryTaskSuspensionService]].
 
=== RegisterSystemApplicationDeliveryTask ===
Takes an input u64 <code>nn::ApplicationId</code>. No output.
 
=== UnregisterSystemApplicationDeliveryTask ===
Takes an input u64 <code>nn::ApplicationId</code>. No output.
 
=== SetPassphrase ===
Takes an input u64 <code>nn::ApplicationId</code> and a type-0x9 input buffer. 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::ipc::IDeliveryCacheProgressService".
 
This was added with [2.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetEvent
|-
| 1 || GetImpl
|}
 
== IDeliveryCacheStorageService ==
This is "nn::bcat::ipc::IDeliveryCacheStorageService".
 
This was added with [2.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || CreateFileService
|-
| 1 || CreateDirectoryService
|-
| 10 || EnumerateDeliveryCacheDirectory
|}
 
=== IDeliveryCacheFileService ===
This is "nn::bcat::ipc::IDeliveryCacheFileService".
 
This was added with [2.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || Open
|-
| 1 || Read
|-
| 2 || GetSize
|-
| 3 || GetDigest
|}
 
=== IDeliveryCacheDirectoryService ===
This is "nn::bcat::ipc::IDeliveryCacheDirectoryService".
 
This was added with [2.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || Open
|-
| 1 || Read
|-
| 2 || GetCount
|}
 
=== INotifierService ===
This is "nn::bcat::ipc::INotifierService".
 
Added with [8.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name || Notes
|-
| 0 || GetEvent ||
|}
 
=== IDeliveryTaskSuspensionService ===
This is "nn::bcat::ipc::IDeliveryTaskSuspensionService".
 
Added with [8.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetEvent
|}
 
= <nowiki>news:a, news:c, news:m, news:p, news:v</nowiki> =
These are <nowiki>"nn::news::detail::ipc::IServiceCreator"</nowiki>.
 
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.
 
All sessions have 32 sessions.
Permission masks are:
{| class="wikitable" border="1"
|-
! Name || Mask
|-
| <nowiki>news:a</nowiki> || 0xffffffff
|-
| <nowiki>news:p</nowiki> || 0x1
|-
| <nowiki>news:c</nowiki> || 0x2
|-
| <nowiki>news:v</nowiki> || 0x4
|-
| <nowiki>news:m</nowiki> || 0xd
|}
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#CreateNewsService|CreateNewsService]]
|-
| 1 || [[#CreateNewlyArrivedEventHolder|CreateNewlyArrivedEventHolder]]
|-
| 2 || [[#CreateNewsDataService|CreateNewsDataService]]
|-
| 3 || [[#CreateNewsDatabaseService|CreateNewsDatabaseService]]
|-
| 4 || [[#CreateOverwriteEventHolder|CreateOverwriteEventHolder]]
|}
 
== CreateNewsService ==
No input. Returns an [[#INewsService]].
 
== CreateNewlyArrivedEventHolder ==
No input. Returns an [[#INewlyArrivedEventHolder]].
 
== CreateNewsDataService ==
No input. Returns an [[#INewsDataService]].
 
Requires permission bit 2.
 
== CreateNewsDatabaseService ==
No input. Returns an [[#INewsDatabaseService]].
 
Requires permission bit 2.
 
== CreateOverwriteEventHolder ==
No input. Returns an [[#IOverwriteEventHolder]].
 
== INewsService ==
This is <nowiki>"nn::news::detail::ipc::INewsService"</nowiki>.
 
{| class="wikitable" border="1"
|-
! 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-18.1.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 [[#IDownloadContext]].
Downloaded files need to be encrypted [https://switchbrew.org/wiki/BCAT_Content_Container BCAT Content Container] (Crypto type 1-3).
Files will be decrypted before being stored in the transfer memory.
 
=== GetNewsDatabaseDump ===
Dumps internal SQLite file.
 
== INewlyArrivedEventHolder ==
This is <nowiki>"nn::news::detail::ipc::INewlyArrivedEventHolder"</nowiki>.
 
[19.0.0+] This is now <nowiki>"nn::news::detail::ipc::INewArrivalEventHolder"</nowiki>.
 
{| class="wikitable" border="1"
|-
! 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 <nowiki>"nn::news::detail::ipc::INewsDataService"</nowiki>.
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#Open]]
|-
| 1 || [[#OpenWithNewsRecordV1]]
|-
| 2 || [[#Read]]
|-
| 3 || [[#GetSize]]
|-
| 1001 || [6.0.0+] [[#OpenWithNewsRecord]]
|-
| 1100 || [19.0.0+]
|}
 
=== Open ===
Takes an input string. Opens file with the output of snprintf from <nowiki>"news:/data/%s"</nowiki> with input.
 
=== OpenWithNewsRecordV1 ===
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 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 <nowiki>"nn::news::detail::ipc::INewsDatabaseService"</nowiki>.
 
[19.0.0+] This is now <nowiki>"nn::news::detail::ipc::IDeviceNewsDatabaseService"</nowiki>.
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || GetListV1
|-
| 1 || Count
|-
| 2 || CountWithKey
|-
| 3 || UpdateIntegerValue
|-
| 4 || UpdateIntegerValueWithAddition
|-
| 5 || UpdateStringValue
|-
| 1000 || [6.0.0+] GetList
|}
 
== IOverwriteEventHolder ==
This is <nowiki>"nn::news::detail::ipc::IOverwriteEventHolder"</nowiki>.
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#Get]]
|}
 
=== Get ===
Returns readable event.
Event is signaled on fetch from CDN if the file already exists.
 
== IDownloadContext ==
This is <nowiki>"nn::news::detail::ipc::IDownloadContext"</nowiki>.
 
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).
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#Get]]
|-
| 1 || [[#Cancel]]
|-
| 2 || [[#GetResult]]
|-
| 3 || [[#GetSize]]
|}


== bcat:a ==
=== Get ===
Unofficial name.


Return event handle. Signaled on download finish.


= News services =
=== Cancel ===
Unofficial name.


== <nowiki>news:p</nowiki> ==
Cancels Download.


== <nowiki>news:v</nowiki> ==
=== GetResult ===
Unofficial name.


== <nowiki>news:m</nowiki> ==
Returns last result.


== <nowiki>news:c</nowiki> ==
=== GetSize ===
Unofficial name.


== <nowiki>news:a</nowiki> ==
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.


= Play Report services =
{| class="wikitable" border="1"
The "Play Report" (prepo) service uploads system and user information to a cloud server.
|-
This includes the following fields:
! Name
sys_info
! Type
data
! Exists
application_id
|-
event_id
| news_id || TEXT || All
operation_mode
|-
lc_recorded_at (followed by a timestamp)
| user_id || TEXT || All
nc_recorded_at (followed by a timestamp)
|-
nsa_id
| topic_id || TEXT || All
os_version
|-
| 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
|-
|}
 
= prepo:a, prepo:a2, prepo:m, prepo:u, prepo:s =
These are "nn::prepo::detail::ipc::IPrepoService".
 
{| class="wikitable" border="1"
|-
! 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
|-
| 10500 || [15.0.0+] SendReportWithUser
|-
| 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
|}
 
= mnpp:app =
This is "nn::mnpp::detail::ipc::IServiceForApplication".
 
This was added with [13.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#Initialize]]
|-
| 1 || [[#SubmitEvent]]
|}
 
== Initialize ==
Unofficial name.
 
Takes a PID-descriptor and a reserved input u64. No output.
 
Uses [[Glue_services#arp:r|arp:r]] commands [[Glue_services#GetApplicationInstanceId|GetApplicationInstanceId]] and [[Glue_services#GetApplicationLaunchProperty|GetApplicationLaunchProperty]] to get and store the application's [[NCM_services#ProgramId|ProgramId]].
 
== SubmitEvent ==
Unofficial name.


And the contents of the following file:
Takes an input [[Account_services#Uid|Uid]] and a type-0x5 input buffer. No output.
is_user_agreement_check_enabled.bin


All the information is periodically uploaded to the following URL:<br>
Uses the input buffer's contents to create a "mission event" which is later uploaded to "fw-api.%.nso.nintendo.net/v1/events".
https: //receive-%.dg.srv.nintendo.net/post


It also checks the validity of the device's authentication token using the following URL:<br>
= mnpp:sys =
https: //dauth-%.ndas.srv.nintendo.net/v1/device_auth_token
This is "nn::mnpp::detail::ipc::IServiceForSystem".


== prepo:u ==
This was added with [13.0.0+].


== prepo:s ==
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
! Cmd || Name
|-
|-
| 10100 ||
| 0 ||  
|-
|-
| 10101 ||
| 100 ||  
|-
|-
| 10200 ||
| 200 || [13.1.0-13.2.1]
|-
|-
| 10300 ||
| 300 || [13.1.0-14.1.2]
|-
|-
| 20100 ||
| 400 || [14.0.0-14.1.2]
|}
 
= mnpp:web =
This is "nn::mnpp::detail::ipc::IServiceForWebBrowser".
 
This was added with [13.0.0+].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
|-
| 20101 ||
| 0 ||  
|-
|-
| 30100 ||
| 1 || [14.0.0+]
|-
|-
| 40100 ||
| 10 || [14.0.0+]
|-
|-
| 40101 ||
| 20 || [14.0.0+]
|-
|-
| 90100 ||
| 100 || [16.1.0+]
|}
|}


== prepo:m ==
= 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


== prepo:a ==
And the contents of the following file:
is_user_agreement_check_enabled.bin
 
All the information is periodically uploaded to the following URL:<br>
* <nowiki>https://receive-%.dg.srv.nintendo.net/post</nowiki>
 
It also checks the validity of the device's authentication token using the following URL:<br>
* <nowiki>https://dauth-%.ndas.srv.nintendo.net/v1/device_auth_token</nowiki>


[[Category:Services]]
[[Category:Services]]