| 2536 | |
| 2537 | template <typename Request> |
| 2538 | void ApiWrap::requestFileReference( |
| 2539 | Data::FileOrigin origin, |
| 2540 | FileReferencesHandler &&handler, |
| 2541 | Request &&data) { |
| 2542 | const auto i = _fileReferenceHandlers.find(origin); |
| 2543 | if (i != end(_fileReferenceHandlers)) { |
| 2544 | i->second.push_back(std::move(handler)); |
| 2545 | return; |
| 2546 | } |
| 2547 | auto handlers = std::vector<FileReferencesHandler>(); |
| 2548 | handlers.push_back(std::move(handler)); |
| 2549 | _fileReferenceHandlers.emplace(origin, std::move(handlers)); |
| 2550 | |
| 2551 | request(std::move(data)).done([=](const auto &result) { |
| 2552 | const auto parsed = Data::GetFileReferences(result); |
| 2553 | for (const auto &p : parsed.data) { |
| 2554 | // Unpack here the parsed pair by hand to workaround a GCC bug. |
| 2555 | // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87122 |
| 2556 | const auto &origin = p.first; |
| 2557 | const auto &reference = p.second; |
| 2558 | const auto documentId = std::get_if<DocumentFileLocationId>( |
| 2559 | &origin); |
| 2560 | if (documentId) { |
| 2561 | _session->data().document( |
| 2562 | documentId->id |
| 2563 | )->refreshFileReference(reference); |
| 2564 | } |
| 2565 | const auto photoId = std::get_if<PhotoFileLocationId>(&origin); |
| 2566 | if (photoId) { |
| 2567 | _session->data().photo( |
| 2568 | photoId->id |
| 2569 | )->refreshFileReference(reference); |
| 2570 | } |
| 2571 | } |
| 2572 | const auto i = _fileReferenceHandlers.find(origin); |
| 2573 | Assert(i != end(_fileReferenceHandlers)); |
| 2574 | auto handlers = std::move(i->second); |
| 2575 | _fileReferenceHandlers.erase(i); |
| 2576 | for (auto &handler : handlers) { |
| 2577 | handler(parsed); |
| 2578 | } |
| 2579 | }).fail([=] { |
| 2580 | const auto i = _fileReferenceHandlers.find(origin); |
| 2581 | Assert(i != end(_fileReferenceHandlers)); |
| 2582 | auto handlers = std::move(i->second); |
| 2583 | _fileReferenceHandlers.erase(i); |
| 2584 | for (auto &handler : handlers) { |
| 2585 | handler(UpdatedFileReferences()); |
| 2586 | } |
| 2587 | }).send(); |
| 2588 | } |
| 2589 | |
| 2590 | void ApiWrap::refreshFileReference( |
| 2591 | Data::FileOrigin origin, |
nothing calls this directly
no test coverage detected