| // Copyright 2018 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. |
| |
| import 'dart:convert'; |
| import 'dart:typed_data'; |
| |
| import 'package:collection/collection.dart'; |
| import 'package:fidl_fuchsia_ledger/fidl.dart' as ledger; |
| |
| import 'uint8list_ops.dart'; |
| import 'version.dart'; |
| |
| /// Convenience wrapper of Ledger's page id. |
| /// For a given `pageName`, SledgePageId will generate a ledger.PageId with the |
| /// following format: sledge${sledgeVersion}_${hash(pageName)}. |
| class SledgePageId { |
| ledger.PageId _id; |
| |
| /// The prefix of the Ledger page managed by Sledge. |
| static final Uint8List prefix = utf8.encode(_sledgePageIdPrefix()); |
| |
| /// Convenience constructor that takes an optional string. |
| SledgePageId([String pageName = '']) { |
| pageName ??= ''; |
| |
| final Uint8List hashedPageName = hash(new Utf8Encoder().convert(pageName)); |
| |
| final encodedPageName = concatUint8Lists(prefix, hashedPageName); |
| |
| final trimmedEncodedPageName = encodedPageName.sublist(0, 16); |
| assert(trimmedEncodedPageName.length == 16); |
| |
| _id = new ledger.PageId(id: trimmedEncodedPageName); |
| } |
| |
| /// The Ledger's PageId. |
| // TODO: rename into ledgePageId. |
| ledger.PageId get id => _id; |
| |
| /// Returns the prefix of a ledger PageId managed by the current version of |
| /// Sledge. |
| static String _sledgePageIdPrefix() { |
| return 'sledge${sledgeVersion}_'; |
| } |
| |
| /// Returns true if the page identified with [pageId] is managed by this |
| /// version of Sledge. |
| static bool pageIsManagedBySledge(ledger.PageId pageId) { |
| final pageIdPrefix = getSublistView(pageId.id, end: prefix.length); |
| return new ListEquality<int>().equals(pageIdPrefix, prefix); |
| } |
| } |