Chromium Code Reviews| 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() |