| 372 | } |
| 373 | |
| 374 | s32 read_request(SaveGame::Request &rr) |
| 375 | { |
| 376 | _allocator->deallocate(rr.data); |
| 377 | rr.data = NULL; |
| 378 | rr.size = 0; |
| 379 | |
| 380 | const Stat st = _filesystem.stat(rr.basename); |
| 381 | if (st.file_type == Stat::NO_ENTRY) |
| 382 | return SaveError::MISSING; |
| 383 | if (st.file_type != Stat::REGULAR) |
| 384 | return SaveError::IO_ERROR; |
| 385 | |
| 386 | File *file = _filesystem.open(rr.basename, FileOpenMode::READ); |
| 387 | CE_ENSURE(file != NULL); |
| 388 | if (!file->is_open()) { |
| 389 | _filesystem.close(*file); |
| 390 | return SaveError::IO_ERROR; |
| 391 | } |
| 392 | |
| 393 | const u32 size = file->size(); |
| 394 | rr.data = _allocator->allocate(size + 1); |
| 395 | rr.size = size; |
| 396 | |
| 397 | const s32 io_result = do_chunked_io(*file, rr.data, size, IO_READ, rr); |
| 398 | _filesystem.close(*file); |
| 399 | if (io_result != SaveError::SUCCESS) |
| 400 | return io_result; |
| 401 | ((char *)rr.data)[rr.size] = '\0'; |
| 402 | |
| 403 | return SaveError::SUCCESS; |
| 404 | } |
| 405 | |
| 406 | s32 write_request(SaveGame::Request &rr) |
| 407 | { |