| 446 | } |
| 447 | |
| 448 | static dmResource::Result GetDependenciesInternal(DependencyIterContext* ctx, const dmhash_t url_hash) |
| 449 | { |
| 450 | ResourceMountsContext* mounts_ctx = (ResourceMountsContext*)ctx->m_Mounts; |
| 451 | DM_MUTEX_SCOPED_LOCK(mounts_ctx->m_Mutex); |
| 452 | |
| 453 | uint32_t num_mounts = mounts_ctx->m_Mounts.Size(); |
| 454 | bool only_missing = ctx->m_OnlyMissing; |
| 455 | bool include_requested_url = ctx->m_IncludeRequestedUrl; |
| 456 | |
| 457 | dmArray<dmhash_t> dependencies; // allocate it outside of the loop |
| 458 | |
| 459 | for (uint32_t i = 0; i < num_mounts; ++i) |
| 460 | { |
| 461 | ArchiveMount& mount = mounts_ctx->m_Mounts[i]; |
| 462 | |
| 463 | dmResource::Manifest* manifest; |
| 464 | dmResourceProvider::Result presult = dmResourceProvider::GetManifest(mount.m_Archive, &manifest); |
| 465 | if (presult != dmResourceProvider::RESULT_OK) |
| 466 | continue; |
| 467 | |
| 468 | dependencies.SetSize(0); |
| 469 | dmResource::Result result = dmResource::GetDependencies(manifest, url_hash, dependencies); |
| 470 | if (dmResource::RESULT_RESOURCE_NOT_FOUND == result) |
| 471 | continue; |
| 472 | |
| 473 | if (include_requested_url) { |
| 474 | // include only once |
| 475 | include_requested_url = false; |
| 476 | dependencies.OffsetCapacity(1); |
| 477 | int size = dependencies.Size(); |
| 478 | dependencies.SetSize(size + 1); |
| 479 | dependencies[size] = url_hash; |
| 480 | } |
| 481 | |
| 482 | uint32_t hash_len = dmResource::GetEntryHashLength(manifest); |
| 483 | |
| 484 | for (uint32_t d = 0; d < dependencies.Size(); ++d) |
| 485 | { |
| 486 | dmhash_t dep_hash = dependencies[d]; |
| 487 | bool* visited = ctx->m_Visited.Get(dep_hash); |
| 488 | if (visited) |
| 489 | continue; |
| 490 | |
| 491 | bool exists = true; |
| 492 | if (only_missing) |
| 493 | { |
| 494 | exists = ResourceExists(mounts_ctx, dep_hash) == dmResource::RESULT_OK; |
| 495 | } |
| 496 | |
| 497 | UpdateVisited(ctx->m_Visited, dep_hash, exists); |
| 498 | |
| 499 | // If we only want the missing ones |
| 500 | if (only_missing && exists) |
| 501 | continue; |
| 502 | |
| 503 | |
| 504 | SGetDependenciesResult result = {0}; |
| 505 | result.m_UrlHash = dep_hash; |
no test coverage detected