| # 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) |