configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcrrepository.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
class HcrRepository(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
    FLAG_READ_ONLY    = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
    FLAG_NON_VOLATILE = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
    FLAG_BOOT_ONLY    = 4
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
    def __init__(self, records, version=1, flags=FLAG_READ_ONLY):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
        self.records = records
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
        self.version = version
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
        self.flags   = flags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
    def count_records(self, category_id, element_id):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
        Return the number of records in the repository with the given
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
        setting ID (category ID - element ID pair).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
        count = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
        for r in self.records:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
            if r.category_id == category_id and r.element_id == element_id:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
                count += 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
        return count
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    def get_duplicate_record_ids(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        Return a list of duplicate record IDs in the repository.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        The list contains tuples of the form (category_id, element_id).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        for r in self.records:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
            count = self.count_records(r.category_id, r.element_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
            record_id = (r.category_id, r.element_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
            if count > 1 and record_id not in result:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
                result.append(record_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        buf = ["HcrRepository(version=%r, flags=%r, records=[" % (self.version, self.flags)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        if len(self.records) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
            buf.append('\n')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
            for record in sorted(self.records):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
                buf.append("    %r,\n" % record)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
        buf.append('])')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        return ''.join(buf)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
        return sorted(self.records) == sorted(other.records) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
            and self.version == other.version \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
            and self.flags == other.flags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
        return not self.__eq__(other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
class HcrRecord(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
    # Record value types used in HCRML
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
    VALTYPE_INT32           = 'int32'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
    VALTYPE_INT16           = 'int16'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
    VALTYPE_INT8            = 'int8'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
    VALTYPE_BOOL            = 'bool'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
    VALTYPE_UINT32          = 'uint32'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
    VALTYPE_UINT16          = 'uint16'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
    VALTYPE_UINT8           = 'uint8'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
    VALTYPE_LIN_ADDR        = 'linaddr'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
    VALTYPE_BIN_DATA        = 'bindata'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
    VALTYPE_TEXT8           = 'text8'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
    VALTYPE_ARRAY_INT32     = 'arrayint32'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
    VALTYPE_ARRAY_UINT32    = 'arrayuint32'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
    VALTYPE_INT64           = 'int64'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
    VALTYPE_UINT64          = 'uint64'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
    FLAG_UNINITIALIZED = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
    FLAG_MODIFIABLE    = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
    FLAG_PERSISTENT    = 4
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
    def __init__(self, type, value, category_id, element_id, flags=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        # Check the value type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        val_types = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        for name, val in self.__class__.__dict__.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
            if name.startswith('VALTYPE_'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
                val_types.append(val)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        if type not in val_types:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
            raise ValueError("Invalid HCRML record type '%s'" % type)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        self.type           = type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
        self.value          = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        self.category_id    = category_id
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        self.element_id     = element_id
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
        self.flags          = flags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        return 'HcrRecord(type=%r, value=%r, category_id=%r, element_id=%r, flags=%r)' \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
            % (self.type, self.value, self.category_id, self.element_id, self.flags)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
    def __lt__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        # Note:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        # The < operator is implemented purely for the sake of sorting records
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        # in unit tests for comparison, the sorting is NOT the one used when
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        # actually writing the records to file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        attrs_to_check = ['type', 'value', 'category_id', 'element_id', 'flags']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        for attr_name in attrs_to_check:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
            x = getattr(self, attr_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
            y = getattr(other, attr_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
            if x < y:       return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
            elif x == y:    continue # Equal, so need to check the next one
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
            else:           return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        attrs_to_check = ['type', 'value', 'category_id', 'element_id', 'flags']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
        for attr_name in attrs_to_check:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
            x = getattr(self, attr_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
            y = getattr(other, attr_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
            if x != y: return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        return not self.__eq__(other)