diff -r 000000000000 -r 2e8eeb919028 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()