trainlog/docs/reviews/mtp_transport.md

112 lines
2.4 KiB
Markdown

# Direct USB/MTP transport checkpoint
## Status
```text
USB_MTP_DETECTION=PASS
MTP_STORAGE_ACCESS=PASS
MTP_ROOT_FOLDER_ACCESS=PASS
MTP_WRITE=PASS
MTP_LIST_FOLDER=PASS
MTP_READ=PASS
MTP_ROUNDTRIP=PASS
MTP_TRANSPORT_FOUNDATION=PASS
JSON_V1_MTP_TRANSFER=NEXT
TRAINLOG_FORMAT_V1=FROZEN
```
Trainlog now accesses Android file-transfer mode directly through Linux USB/MTP.
No GVFS mount, FUSE mount, file-manager mount, or manual mount/unmount cycle is
required.
## Detection
The discovery layer uses `libudev`.
Only physical USB devices with:
```text
DEVTYPE=usb_device
ID_MTP_DEVICE=1
```
are returned.
USB interface children such as `6-1:1.0` are deliberately ignored so one
physical phone is never reported several times.
The device record contains:
- USB bus number;
- USB device number;
- vendor/product IDs;
- vendor/model strings when available;
- serial number when available;
- sysfs path.
## MTP access
The transport layer uses `libmtp`.
The udev bus/device pair is matched against libmtp raw devices so Trainlog opens
the exact physical phone selected by discovery.
Implemented operations:
- enumerate MTP storage areas;
- expose capacity and free-space information;
- find or create a root folder;
- upload a local text file;
- list direct children of one MTP folder;
- download one MTP file to a local path.
Cached and uncached libmtp opening modes are kept separate because folder-tree
operations and direct `LIBMTP_Get_Files_And_Folders()` traversal have different
backend requirements.
## Physical validation
The checkpoint was validated against an Android Samsung device in USB
"file transfer" / MTP mode.
Observed storage:
```text
description = Stockage interne
storage_id = 0x00010001
access = read/write
```
Trainlog created:
```text
Stockage interne/
└── Trainlog/
└── trainlog-probe.txt
```
The probe was then listed, downloaded back to the Linux host, and compared
byte-for-byte with the original local content.
Final result:
```text
ROUNDTRIP=PASS Trainlog/trainlog-probe.txt
```
## Boundary
This checkpoint validates the transport foundation only.
It does **not** yet claim that a real Trainlog JSON v1 session has been
transferred or imported.
Next:
```text
1. define the Trainlog MTP exchange directory layout
2. transfer a real valid JSON v1 document
3. verify byte-for-byte readback
4. feed the downloaded document to the frozen v1 validator/import path
5. build the minimal Android recorder on top of that contract
```