configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcrrepository.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
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
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
import __init__
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
from cone.public import exceptions,plugin,utils,api
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
class HcrRepository(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
    FLAG_READ_ONLY    = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
    FLAG_NON_VOLATILE = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
    FLAG_BOOT_ONLY    = 4
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
    def __init__(self, records, version=1, flags=FLAG_READ_ONLY):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
        self.records = records
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
        self.version = version
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
        self.flags   = flags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
    def count_records(self, category_id, element_id):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
        Return the number of records in the repository with the given
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
        setting ID (category ID - element ID pair).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
        count = 0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
        for r in self.records:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
            if r.category_id == category_id and r.element_id == element_id:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
                count += 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        return count
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
    def get_duplicate_record_ids(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        Return a list of duplicate record IDs in the repository.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        The list contains tuples of the form (category_id, element_id).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
        result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
        for r in self.records:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
            count = self.count_records(r.category_id, r.element_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
            record_id = (r.category_id, r.element_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
            if count > 1 and record_id not in result:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
                result.append(record_id)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
        buf = ["HcrRepository(version=%r, flags=%r, records=[" % (self.version, self.flags)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
        if len(self.records) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
            buf.append('\n')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
            for record in sorted(self.records):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
                buf.append("    %r,\n" % record)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
        buf.append('])')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
        return ''.join(buf)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
        return sorted(self.records) == sorted(other.records) \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
            and self.version == other.version \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
            and self.flags == other.flags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
        return not self.__eq__(other)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
class HcrRecord(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
    # Record value types used in HCRML
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
    VALTYPE_INT32           = 'int32'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
    VALTYPE_INT16           = 'int16'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
    VALTYPE_INT8            = 'int8'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
    VALTYPE_BOOL            = 'bool'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
    VALTYPE_UINT32          = 'uint32'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
    VALTYPE_UINT16          = 'uint16'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
    VALTYPE_UINT8           = 'uint8'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
    VALTYPE_LIN_ADDR        = 'linaddr'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
    VALTYPE_BIN_DATA        = 'bindata'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
    VALTYPE_TEXT8           = 'text8'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
    VALTYPE_ARRAY_INT32     = 'arrayint32'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
    VALTYPE_ARRAY_UINT32    = 'arrayuint32'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
    VALTYPE_INT64           = 'int64'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
    VALTYPE_UINT64          = 'uint64'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
    FLAG_UNINITIALIZED = 1
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
    FLAG_MODIFIABLE    = 2
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
    FLAG_PERSISTENT    = 4
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
    def __init__(self, type, value, category_id, element_id, flags=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        # Check the value type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        val_types = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        for name, val in self.__class__.__dict__.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
            if name.startswith('VALTYPE_'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
                val_types.append(val)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
        if type not in val_types:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
            raise ValueError("Invalid HCRML record type '%s'" % type)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        self.type           = type
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
        self.value          = value
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
        self.category_id    = category_id
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        self.element_id     = element_id
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
        self.flags          = flags
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
    def __repr__(self):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        return 'HcrRecord(type=%r, value=%r, category_id=%r, element_id=%r, flags=%r)' \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
            % (self.type, self.value, self.category_id, self.element_id, self.flags)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
    def __lt__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        # Note:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        # The < operator is implemented purely for the sake of sorting records
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        # in unit tests for comparison, the sorting is NOT the one used when
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        # actually writing the records to file
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        attrs_to_check = ['type', 'value', 'category_id', 'element_id', 'flags']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        for attr_name in attrs_to_check:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
            x = getattr(self, attr_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
            y = getattr(other, attr_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
            if x < y:       return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
            elif x == y:    continue # Equal, so need to check the next one
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
            else:           return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
    def __eq__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        attrs_to_check = ['type', 'value', 'category_id', 'element_id', 'flags']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
        for attr_name in attrs_to_check:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
            x = getattr(self, attr_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
            y = getattr(other, attr_name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
            if x != y: return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
    def __ne__(self, other):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        return not self.__eq__(other)