| 477 | } |
| 478 | |
| 479 | PF_API PF_HANDLE pf_pbo_open(const char* path) { |
| 480 | ClearError(); |
| 481 | if (!path) { SetError("null path"); return nullptr; } |
| 482 | try { |
| 483 | auto* pbo = new PFPbo(); |
| 484 | std::string bankName = StripPboExt(path); |
| 485 | if (!pbo->bank.open(RString(bankName.c_str()))) { |
| 486 | SetError("Failed to open PBO"); |
| 487 | delete pbo; |
| 488 | return nullptr; |
| 489 | } |
| 490 | pbo->bank.Lock(); |
| 491 | if (pbo->bank.error()) { |
| 492 | SetError("PBO read error"); |
| 493 | pbo->bank.Unlock(); |
| 494 | delete pbo; |
| 495 | return nullptr; |
| 496 | } |
| 497 | pbo->bank.ForEach(PboCollectEntry, &pbo->entries); |
| 498 | return pbo; |
| 499 | } catch (const std::exception& e) { |
| 500 | SetError(e.what()); |
| 501 | return nullptr; |
| 502 | } |
| 503 | } |
| 504 | |
| 505 | PF_API void pf_pbo_close(PF_HANDLE pbo) { |
| 506 | if (!pbo) return; |
no test coverage detected