configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_impl.py
--- /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()