text: # Copyright 2014 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.
  
  
  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(ContentSettings, self).__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, long):
        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)
  