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