File: content_settings.py

package info (click to toggle)
thunderbird 1%3A143.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 4,703,968 kB
  • sloc: cpp: 7,770,492; javascript: 5,943,842; ansic: 3,918,754; python: 1,418,263; xml: 653,354; asm: 474,045; java: 183,079; sh: 111,238; makefile: 20,410; perl: 14,359; objc: 13,059; yacc: 4,583; pascal: 3,405; lex: 1,720; ruby: 999; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 69; csh: 10
file content (80 lines) | stat: -rw-r--r-- 2,364 bytes parent folder | download | duplicates (14)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


class ContentSettings(dict):

  """A dict interface to interact with device content settings.

  System properties are key/value pairs as exposed by adb shell content.
  """

  def __init__(self, table, device):
    super().__init__()
    self._table = table
    self._device = device

  @staticmethod
  def _GetTypeBinding(value):
    if isinstance(value, bool):
      return 'b'
    if isinstance(value, float):
      return 'f'
    if isinstance(value, int):
      return 'i'
    if isinstance(value, int):
      return 'l'
    if isinstance(value, str):
      return 's'
    raise ValueError('Unsupported type %s' % type(value))

  def iteritems(self):
    # Example row:
    # 'Row: 0 _id=13, name=logging_id2, value=-1fccbaa546705b05'
    for row in self._device.RunShellCommand(
        'content query --uri content://%s' % self._table, as_root=True):
      fields = row.split(', ')
      key = None
      value = None
      for field in fields:
        k, _, v = field.partition('=')
        if k == 'name':
          key = v
        elif k == 'value':
          value = v
      if not key:
        continue
      if not value:
        value = ''
      yield key, value

  def __getitem__(self, key):
    return self._device.RunShellCommand(
        'content query --uri content://%s --where "name=\'%s\'" '
        '--projection value' % (self._table, key), as_root=True).strip()

  def __setitem__(self, key, value):
    if key in self:
      self._device.RunShellCommand(
          'content update --uri content://%s '
          '--bind value:%s:%s --where "name=\'%s\'"' % (
              self._table,
              self._GetTypeBinding(value), value, key),
          as_root=True)
    else:
      self._device.RunShellCommand(
          'content insert --uri content://%s '
          '--bind name:%s:%s --bind value:%s:%s' % (
              self._table,
              self._GetTypeBinding(key), key,
              self._GetTypeBinding(value), value),
          as_root=True)

  def __delitem__(self, key):
    self._device.RunShellCommand(
        'content delete --uri content://%s '
        '--bind name:%s:%s' % (
            self._table,
            self._GetTypeBinding(key), key),
        as_root=True)