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