| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/developer/debug/shared/component_utils.h" |
| |
| namespace debug_ipc { |
| |
| namespace { |
| |
| const char kUrlPackagePreamble[] = "fuchsia-pkg://fuchsia.com/"; |
| const char kUrlComponentPreamble[] = "#meta/"; |
| |
| } // namespace |
| |
| bool ExtractComponentFromPackageUrl(const std::string& url, |
| ComponentDescription* out) { |
| // We check if we're matching a pkg url |
| // Pattern: |
| // |
| // fuchsia-pkg://fuchsia.com/<PKG>#meta/<COMPONENT>.cmx |
| size_t package_preamble_start = url.find(kUrlPackagePreamble); |
| if (package_preamble_start == std::string::npos) |
| return false; |
| |
| // Account for last \0. |
| size_t package_start = |
| package_preamble_start + sizeof(kUrlPackagePreamble) - 1; |
| size_t package_end = url.find(kUrlComponentPreamble, package_start); |
| if (package_end == std::string::npos) |
| return false; |
| |
| // Account for last \0. |
| size_t component_start = package_end + sizeof(kUrlComponentPreamble) - 1; |
| size_t component_end = url.find(".cmx", component_start); |
| if (component_end == std::string::npos) |
| return false; |
| |
| out->package_name = url.substr(package_start, package_end - package_start); |
| out->component_name = |
| url.substr(component_start, component_end - component_start); |
| return true; |
| } |
| |
| } // namespace debug_ipc |