configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_impl.py
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_impl.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,148 @@
+#
+# 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 os
+import sys
+import logging
+
+from cone.public import exceptions, plugin, utils, api
+import crml_writer, crml_comparator
+from crml_model import *
+
+class CrmlImpl(plugin.ImplBase):
+    IMPL_TYPE_ID = 'crml'
+    
+    RFS_RECORDS_LIST_VARNAME = 'crml_cenrep_rfs_records_list'
+    RFS_TXT_GENERATED_VARNAME = 'crml_cenrep_rfs_txt_generated'
+
+    def __init__(self, resource_ref, configuration, repository):
+        plugin.ImplBase.__init__(self, resource_ref, configuration)
+        self.resource_ref = resource_ref
+        self.configuration = configuration
+        self.logger = logging.getLogger('cone.crml(%s)' % self.resource_ref)
+        self.repository = repository
+        
+    def generate(self, context=None):
+        # Quick fix 
+        if context:
+            self.generation_context = context
+        file_path = self._get_cenrep_txt_file_path()
+        self.logger.debug("Generating file '%s'..." % file_path)
+        
+        # Generate CenRep text data and write it to the output file
+        writer = crml_writer.CrmlTxtWriter(self.configuration, self.logger)
+        data = writer.get_cenrep_txt_data(self.repository).encode('UTF-16')
+        self._write_to_file(file_path, data)
+        
+        
+        # Collect the record for cenrep_rfs.txt generation in post_generate()
+        if self.generation_context is not None:
+            rfs_record = writer.get_cenrep_rfs_record(self.repository)
+            if rfs_record:
+                # Add the record to the dictionary
+                data_dict = self.generation_context.impl_data_dict
+                VARNAME = self.RFS_RECORDS_LIST_VARNAME
+                if VARNAME not in data_dict:
+                    data_dict[VARNAME] = []
+                data_dict[VARNAME].append(rfs_record)
+    
+    def post_generate(self, context=None):
+        # Quick fix 
+        if context:
+            self.generation_context = context
+        if self._is_cenrep_rfs_txt_to_be_generated():
+            # Generate CenRep RFS text file if not already generated
+            data_dict = self.generation_context.impl_data_dict
+            if self.RFS_TXT_GENERATED_VARNAME not in data_dict:
+                rfs_records = data_dict.get(self.RFS_RECORDS_LIST_VARNAME, [])
+                
+                file_path = self._get_cenrep_rfs_txt_file_path()
+                writer = crml_writer.CrmlTxtWriter(self.configuration, self.logger)
+                data = writer.get_cenrep_rfs_txt_data(rfs_records).encode('UTF-16')
+                self._write_to_file(file_path, data)
+            
+                data_dict[self.RFS_TXT_GENERATED_VARNAME] = True
+
+    def list_output_files(self):
+        """
+        Return a list of output files as an array. 
+        """
+        files = [self._get_cenrep_txt_file_path()]
+        if self._is_cenrep_rfs_txt_to_be_generated():
+            files.append(self._get_cenrep_rfs_txt_file_path())
+        return files
+
+    def get_refs(self):
+        if self.repository is None:
+            return []
+        else:
+            return self.repository.get_refs()
+    
+    def get_flat_comparison_id(self):
+        return crml_comparator.CrmlComparator.get_flat_comparison_id(self.repository)
+    
+    def get_flat_comparison_extra_data(self):
+        return crml_comparator.CrmlComparator.get_flat_comparison_extra_data(self.repository)
+    
+    @classmethod
+    def get_flat_comparison_impl_type_id(cls):
+        return 'crml'
+    
+    def flat_compare(self, other):
+        comparator = crml_comparator.CrmlComparator(self.resource_ref, self.repository)
+        return comparator.flat_compare(other.resource_ref, other.repository)
+    
+    def _get_cenrep_txt_file_path(self):
+        """
+        Return the full path to the CenRep text file generated by this implementation
+        """
+        uid = self.repository.uid_value
+        if uid.startswith('0x'):    uid = uid[2:]
+        return os.path.normpath(os.path.join(self.output, uid + '.txt'))
+    
+    def _get_cenrep_rfs_txt_file_path(self):
+        """
+        Return the full path to the CenRep RFS text file
+        """
+        # cenrep_rfs.txt goes to a different place than the rest of
+        # the CenRep files, so temporarily override plugin_output
+        # for that purpose
+        orig_pluginoutput = self.plugin_output
+        self.plugin_output = 'private/100059C9'
+        rfs_txt_path = os.path.normpath(os.path.join(self.output, 'cenrep_rfs.txt'))
+        self.plugin_output = orig_pluginoutput
+        return rfs_txt_path
+    
+    def _is_cenrep_rfs_txt_to_be_generated(self):
+        """
+        Return whether the CenRep RFS text file is to be generated.
+        """
+        if self.generation_context is None:
+            return False
+        
+        targets = self.generation_context.tags.get('target', [])
+        return 'core' in targets or 'rofs2' in targets
+    
+    def _write_to_file(self, file_path, data):
+        # Create directories for the file if necessary
+        file_dir = os.path.dirname(file_path)
+        if file_dir != '' and not os.path.exists(file_dir):
+            os.makedirs(file_dir)
+        
+        # Write data
+        f = open(file_path, "wb")
+        try:        f.write(data)
+        finally:    f.close()