Index: tools/webbt/compact_blacklist.py |
diff --git a/tools/webbt/compact_blacklist.py b/tools/webbt/compact_blacklist.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..0f5bd5d04e97a355792734005354e87dc0841762 |
--- /dev/null |
+++ b/tools/webbt/compact_blacklist.py |
@@ -0,0 +1,105 @@ |
+#!/usr/bin/env python |
scheib
2016/08/29 01:14:47
Let's place this file in tools/web_bluetooth/
|
+# Copyright (c) 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 |
+ |
+blacklist = collections.OrderedDict() |
+ |
+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 valid_uuid(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 |
+ |
+ |
+# Note: this function shortens all UUIDs that uses the Bluetooth base |
scheib
2016/08/29 01:14:47
s/uses/use/
|
+# UUID even thought 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. |
+def shorten_uuid(uuid): |
+ 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): |
+ 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 valid_uuid(uuid): |
+ raise InvalidUUIDException('Invalid UUID: %s' % line) |
+ uuid = shorten_uuid(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: |
+ sys.exit('Usage: %s <gatt_blacklist.txt>' % sys.argv[0]) |
+ |
+ try: |
+ with open(sys.argv[1]) as f: |
+ for line in f: |
+ process(line) |
+ print(','.join('%s:%s' % (uuid, blacklist[uuid]) for uuid in blacklist)) |
+ except Exception as e: |
+ sys.exit('Failed to compact blacklist. %s' % e) |
+ |
+ |
+if __name__ == '__main__': |
+ main() |