--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcrrepository.py Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,137 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import logging
+import __init__
+
+from cone.public import exceptions,plugin,utils,api
+
+class HcrRepository(object):
+ FLAG_READ_ONLY = 1
+ FLAG_NON_VOLATILE = 2
+ FLAG_BOOT_ONLY = 4
+
+ def __init__(self, records, version=1, flags=FLAG_READ_ONLY):
+ self.records = records
+ self.version = version
+ self.flags = flags
+
+ def count_records(self, category_id, element_id):
+ """
+ Return the number of records in the repository with the given
+ setting ID (category ID - element ID pair).
+ """
+ count = 0
+ for r in self.records:
+ if r.category_id == category_id and r.element_id == element_id:
+ count += 1
+ return count
+
+ def get_duplicate_record_ids(self):
+ """
+ Return a list of duplicate record IDs in the repository.
+ The list contains tuples of the form (category_id, element_id).
+ """
+ result = []
+ for r in self.records:
+ count = self.count_records(r.category_id, r.element_id)
+ record_id = (r.category_id, r.element_id)
+ if count > 1 and record_id not in result:
+ result.append(record_id)
+ return result
+
+ def __repr__(self):
+ buf = ["HcrRepository(version=%r, flags=%r, records=[" % (self.version, self.flags)]
+ if len(self.records) > 0:
+ buf.append('\n')
+ for record in sorted(self.records):
+ buf.append(" %r,\n" % record)
+ buf.append('])')
+ return ''.join(buf)
+
+ def __eq__(self, other):
+ return sorted(self.records) == sorted(other.records) \
+ and self.version == other.version \
+ and self.flags == other.flags
+
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
+class HcrRecord(object):
+ # Record value types used in HCRML
+ VALTYPE_INT32 = 'int32'
+ VALTYPE_INT16 = 'int16'
+ VALTYPE_INT8 = 'int8'
+ VALTYPE_BOOL = 'bool'
+ VALTYPE_UINT32 = 'uint32'
+ VALTYPE_UINT16 = 'uint16'
+ VALTYPE_UINT8 = 'uint8'
+ VALTYPE_LIN_ADDR = 'linaddr'
+ VALTYPE_BIN_DATA = 'bindata'
+ VALTYPE_TEXT8 = 'text8'
+ VALTYPE_ARRAY_INT32 = 'arrayint32'
+ VALTYPE_ARRAY_UINT32 = 'arrayuint32'
+ VALTYPE_INT64 = 'int64'
+ VALTYPE_UINT64 = 'uint64'
+
+ FLAG_UNINITIALIZED = 1
+ FLAG_MODIFIABLE = 2
+ FLAG_PERSISTENT = 4
+
+
+ def __init__(self, type, value, category_id, element_id, flags=0):
+ # Check the value type
+ val_types = []
+ for name, val in self.__class__.__dict__.iteritems():
+ if name.startswith('VALTYPE_'):
+ val_types.append(val)
+ if type not in val_types:
+ raise ValueError("Invalid HCRML record type '%s'" % type)
+
+ self.type = type
+ self.value = value
+ self.category_id = category_id
+ self.element_id = element_id
+ self.flags = flags
+
+ def __repr__(self):
+ return 'HcrRecord(type=%r, value=%r, category_id=%r, element_id=%r, flags=%r)' \
+ % (self.type, self.value, self.category_id, self.element_id, self.flags)
+
+ def __lt__(self, other):
+ # Note:
+ # The < operator is implemented purely for the sake of sorting records
+ # in unit tests for comparison, the sorting is NOT the one used when
+ # actually writing the records to file
+ attrs_to_check = ['type', 'value', 'category_id', 'element_id', 'flags']
+ for attr_name in attrs_to_check:
+ x = getattr(self, attr_name)
+ y = getattr(other, attr_name)
+ if x < y: return True
+ elif x == y: continue # Equal, so need to check the next one
+ else: return False
+ return False
+
+ def __eq__(self, other):
+ attrs_to_check = ['type', 'value', 'category_id', 'element_id', 'flags']
+ for attr_name in attrs_to_check:
+ x = getattr(self, attr_name)
+ y = getattr(other, attr_name)
+ if x != y: return False
+ return True
+
+ def __ne__(self, other):
+ return not self.__eq__(other)