Index: tools/web_bluetooth/compact_blacklist.py |
diff --git a/tools/web_bluetooth/compact_blacklist.py b/tools/web_bluetooth/compact_blacklist.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..dae783f77a51ce3676c0a08e7bc363d3690a93bf |
--- /dev/null |
+++ b/tools/web_bluetooth/compact_blacklist.py |
@@ -0,0 +1,113 @@ |
+#!/usr/bin/env python |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Script for converting the Web Bluetooth GATT blacklist into the format |
+expected by ContentBrowserClient#GetWebBluetoothBlacklist. |
+ |
+See: |
+https://github.com/WebBluetoothCG/registries/blob/master/gatt_blacklist.txt |
+content/public/browser/content_browser_client.h |
+ |
+Usage: |
+ compact_blacklist.py <gatt_blacklist.txt> |
+""" |
+ |
+import collections |
+import string |
+import sys |
+ |
+UUID_LENGTH = 36 |
+UUID_BASE_POSTFIX = '-0000-1000-8000-00805f9b34fb' |
+ |
+ |
+class BadLineException(Exception): |
+ pass |
+ |
+ |
+class InvalidUUIDException(Exception): |
+ pass |
+ |
+ |
+class DuplicateUUIDException(Exception): |
+ pass |
+ |
+ |
+class InvalidExclusionException(Exception): |
+ pass |
+ |
+ |
+def ValidUUID(uuid): |
+ if len(uuid) != UUID_LENGTH: |
+ return False |
+ for i in range(UUID_LENGTH): |
+ if i in [8, 13, 18, 23]: |
+ if uuid[i] != '-': |
+ return False |
+ else: |
+ if uuid[i] not in string.hexdigits: |
+ return False |
+ return True |
+ |
+ |
+ |
+ |
+def ShortenUUID(uuid): |
+ """Shorten a UUUD that use Bluetooth base UUID. |
+ |
+ Note: this function shortens all UUIDs that use the Bluetooth base |
+ UUID even though the specification states that only an assigned UUID |
+ can be shortened. In this case it works fine, since the constructor in |
+ bluetooth_uuid.cc also works the same way. |
+ """ |
+ |
+ if uuid[8:] == UUID_BASE_POSTFIX: |
+ new_uuid = '%x' % int(uuid[:8], 16) |
+ if len(new_uuid) in [4, 8]: |
+ uuid = new_uuid |
+ return uuid |
+ |
+ |
+def Process(line, blacklist): |
+ line = line.strip().lower() |
+ if not line or line.startswith('#'): |
+ return |
+ fields = line.split() |
+ if len(fields) not in [1, 2]: |
+ raise BadLineException('Badly formatted line: %s' % line) |
+ uuid = fields[0] |
+ if not ValidUUID(uuid): |
+ raise InvalidUUIDException('Invalid UUID: %s' % line) |
+ uuid = ShortenUUID(uuid) |
+ if uuid in blacklist: |
+ raise DuplicateUUIDException('Duplicate UUID: %s' % line) |
+ if len(fields) == 1: |
+ blacklist[uuid] = 'e' |
+ elif fields[1] == 'exclude-writes': |
+ blacklist[uuid] = 'w' |
+ elif fields[1] == 'exclude-reads': |
+ blacklist[uuid] = 'r' |
+ else: |
+ raise InvalidExclusionException('Invalid exclusion value: %s' % line) |
+ |
+ |
+def main(): |
+ if len(sys.argv) != 2: |
+ print('Usage: %s <gatt_blacklist.txt>' % sys.argv[0]) |
+ return 1 |
+ |
+ try: |
+ blacklist = collections.OrderedDict() |
+ with open(sys.argv[1]) as f: |
+ for line in f: |
+ Process(line, blacklist) |
+ print(','.join('%s:%s' % (uuid, blacklist[uuid]) for uuid in blacklist)) |
+ return 0 |
+ except Exception as e: |
+ print('Failed to compact blacklist. %s' % e) |
+ return 1 |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main()) |