Internet Browser: Difference between revisions

No edit summary
Line 248: Line 248:
| 7
| 7
| Lobby
| Lobby
|}
=== WebSession ===
With [5.0.0+] sdk-nso added <code>nn::web::Session::</code>. WebApplet (Web shim title) doesn't seem to implement this, unknown if other titles do.
This is for sending/receiving [[#SessionMessage]]s via applet Interactive storage.
During state init, max_messages is set to 0xA and max_size is set to 0x5000, with message_count=0 and cur_size=0.
When sending messages, there has to be an available message slot available (<code>max_messages!=message_count</code>), and there has to be enough space avilable (<code>msghdr_contentsize+0x10 + cur_size <= max_size</code>). After pushing the storage, message_count is incremented and cur_size is increased by <code>msghdr_contentsize+0x10</code>.
When receiving messages, it will repeatedly pop Interactive output storage until no more are available. If the ID is not 0x1000/0x0, the message is ignored. Otherwise:
* Ack: Verifies that message_count is not already 0, then decrements it. Then cur_size is decreased by the u32 loaded from msgcontent+0.
* 0x0: Does some validation. Copies the first 8-bytes from the header to the user [[#SessionMessage]]. Reads the message content into the user [[#SessionMessage]], when contentsize is non-zero. Then sends an Ack with the storage size.
==== SessionMessage ====
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x10
| [[#SessionMessageHeader]]
|-
| 0x10
| Size from header
| Message content
|}
==== SessionMessageHeader ====
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x4
| Message ID
|-
| 0x4
| 0x4
| Content size following the header.
|-
| 0x8
| 0x8
| Unused
|}
==== IDs ====
{| class="wikitable" border="1"
|-
!  ID
!  Content size
!  Description
|-
| 0x0
| Arbitrary
| Arbitrary content.
|-
| 0x1000
| 0x8
| Ack. Content: first u32 is the entire storage size of the message being acked, while the second u32 is 0.
|}
|}