xref: /aosp_15_r20/external/cronet/build/android/pylib/content_settings.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker
6*6777b538SAndroid Build Coastguard Workerclass ContentSettings(dict):
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker  """A dict interface to interact with device content settings.
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker  System properties are key/value pairs as exposed by adb shell content.
11*6777b538SAndroid Build Coastguard Worker  """
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker  def __init__(self, table, device):
14*6777b538SAndroid Build Coastguard Worker    super().__init__()
15*6777b538SAndroid Build Coastguard Worker    self._table = table
16*6777b538SAndroid Build Coastguard Worker    self._device = device
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker  @staticmethod
19*6777b538SAndroid Build Coastguard Worker  def _GetTypeBinding(value):
20*6777b538SAndroid Build Coastguard Worker    if isinstance(value, bool):
21*6777b538SAndroid Build Coastguard Worker      return 'b'
22*6777b538SAndroid Build Coastguard Worker    if isinstance(value, float):
23*6777b538SAndroid Build Coastguard Worker      return 'f'
24*6777b538SAndroid Build Coastguard Worker    if isinstance(value, int):
25*6777b538SAndroid Build Coastguard Worker      return 'i'
26*6777b538SAndroid Build Coastguard Worker    if isinstance(value, int):
27*6777b538SAndroid Build Coastguard Worker      return 'l'
28*6777b538SAndroid Build Coastguard Worker    if isinstance(value, str):
29*6777b538SAndroid Build Coastguard Worker      return 's'
30*6777b538SAndroid Build Coastguard Worker    raise ValueError('Unsupported type %s' % type(value))
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker  def iteritems(self):
33*6777b538SAndroid Build Coastguard Worker    # Example row:
34*6777b538SAndroid Build Coastguard Worker    # 'Row: 0 _id=13, name=logging_id2, value=-1fccbaa546705b05'
35*6777b538SAndroid Build Coastguard Worker    for row in self._device.RunShellCommand(
36*6777b538SAndroid Build Coastguard Worker        'content query --uri content://%s' % self._table, as_root=True):
37*6777b538SAndroid Build Coastguard Worker      fields = row.split(', ')
38*6777b538SAndroid Build Coastguard Worker      key = None
39*6777b538SAndroid Build Coastguard Worker      value = None
40*6777b538SAndroid Build Coastguard Worker      for field in fields:
41*6777b538SAndroid Build Coastguard Worker        k, _, v = field.partition('=')
42*6777b538SAndroid Build Coastguard Worker        if k == 'name':
43*6777b538SAndroid Build Coastguard Worker          key = v
44*6777b538SAndroid Build Coastguard Worker        elif k == 'value':
45*6777b538SAndroid Build Coastguard Worker          value = v
46*6777b538SAndroid Build Coastguard Worker      if not key:
47*6777b538SAndroid Build Coastguard Worker        continue
48*6777b538SAndroid Build Coastguard Worker      if not value:
49*6777b538SAndroid Build Coastguard Worker        value = ''
50*6777b538SAndroid Build Coastguard Worker      yield key, value
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker  def __getitem__(self, key):
53*6777b538SAndroid Build Coastguard Worker    return self._device.RunShellCommand(
54*6777b538SAndroid Build Coastguard Worker        'content query --uri content://%s --where "name=\'%s\'" '
55*6777b538SAndroid Build Coastguard Worker        '--projection value' % (self._table, key), as_root=True).strip()
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker  def __setitem__(self, key, value):
58*6777b538SAndroid Build Coastguard Worker    if key in self:
59*6777b538SAndroid Build Coastguard Worker      self._device.RunShellCommand(
60*6777b538SAndroid Build Coastguard Worker          'content update --uri content://%s '
61*6777b538SAndroid Build Coastguard Worker          '--bind value:%s:%s --where "name=\'%s\'"' % (
62*6777b538SAndroid Build Coastguard Worker              self._table,
63*6777b538SAndroid Build Coastguard Worker              self._GetTypeBinding(value), value, key),
64*6777b538SAndroid Build Coastguard Worker          as_root=True)
65*6777b538SAndroid Build Coastguard Worker    else:
66*6777b538SAndroid Build Coastguard Worker      self._device.RunShellCommand(
67*6777b538SAndroid Build Coastguard Worker          'content insert --uri content://%s '
68*6777b538SAndroid Build Coastguard Worker          '--bind name:%s:%s --bind value:%s:%s' % (
69*6777b538SAndroid Build Coastguard Worker              self._table,
70*6777b538SAndroid Build Coastguard Worker              self._GetTypeBinding(key), key,
71*6777b538SAndroid Build Coastguard Worker              self._GetTypeBinding(value), value),
72*6777b538SAndroid Build Coastguard Worker          as_root=True)
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard Worker  def __delitem__(self, key):
75*6777b538SAndroid Build Coastguard Worker    self._device.RunShellCommand(
76*6777b538SAndroid Build Coastguard Worker        'content delete --uri content://%s '
77*6777b538SAndroid Build Coastguard Worker        '--bind name:%s:%s' % (
78*6777b538SAndroid Build Coastguard Worker            self._table,
79*6777b538SAndroid Build Coastguard Worker            self._GetTypeBinding(key), key),
80*6777b538SAndroid Build Coastguard Worker        as_root=True)
81