mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-28 08:16:09 +03:00
81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
# 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)
|