1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_PACKAGE_ID_H_
#define COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_PACKAGE_ID_H_
#include <iosfwd>
#include <optional>
#include <string>
#include <string_view>
#include "components/services/app_service/public/cpp/app_types.h"
namespace apps {
// An identifier for an installable app package. Package IDs are stable and
// globally unique across app platforms, which makes them suitable for
// identifying apps when communicating with external systems.
//
// Package ID is a composite key of "Package Type" and a string
// "Identifier", which is the platform-specific unique ID for the package.
// Package IDs have a canonical string format of the form
// "<package_type_name>:<identifier>".
//
// Package IDs only support a subset of app types supported by App Service.
// Currently, the supported types are:
//
// PackageType | Type name | Identifier value | Example Package ID string
// ------------|-------------|-----------------------|--------------------------
// kArc | "android" | package name | "android:com.foo.bar"
// kBorealis | "steam" | Steam Game ID | "steam:123456"
// kChromeApp | "chromeapp" | Extension ID | "chromeapp:mmfbcljfglbok"
// kGeForceNow | "gfn" | GeForce Game ID | "gfn:123456"
// kSystem | "system" | policy ID | "system:file_manager"
// kWeb | "web" | processed manifest ID | "web:https://app.com/id"
// kWebsite | "website" | start URL | "website:https://app.co/"
class COMPONENT_EXPORT(APP_TYPES) PackageId {
public:
// Creates a Package ID from PackageType and opaque package identifier.
// `package_type` must be a supported type from the table above, and
// `identifier` must be a non-empty string.
PackageId(PackageType package_type, std::string_view identifier);
// Creates a PackageId for an unknown package.
PackageId();
PackageId(const PackageId&);
PackageId& operator=(const PackageId&);
friend bool operator==(const PackageId&, const PackageId&) = default;
friend auto operator<=>(const PackageId&, const PackageId&) = default;
// Parses a package ID from the canonical string format. Returns
// std::nullopt if parsing failed. This method will never parse an "unknown"
// PackageId. That is, `PackageId::FromString(PackageId().ToString())` returns
// std::nullopt.
static std::optional<PackageId> FromString(
std::string_view package_id_string);
// Returns the package ID formatted in canonical string form.
std::string ToString() const;
// Returns the package type for the package. The type can be
// PackageType::kUnknown if the PackageId is for an unknown package.
PackageType package_type() const { return package_type_; }
// Returns the platform-specific identifier for the package (i.e. manifest ID
// for web apps, package name for ARC apps). The identifier is guaranteed to
// be non-empty, but no other verification is performed.
const std::string& identifier() const { return identifier_; }
private:
PackageType package_type_;
std::string identifier_;
};
COMPONENT_EXPORT(APP_TYPES)
std::ostream& operator<<(std::ostream& out, const PackageId& package_id);
} // namespace apps
#endif // COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_PACKAGE_ID_H_
|