diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/DynamicsConfigurationLibrary/CDynamicsConfigFile.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecmgmt/ucc/Source/DynamicsConfigurationLibrary/CDynamicsConfigFile.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,411 @@ +/* +* Copyright (c) 2005-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: +* System Includes +* +*/ + + + +#include +#include +#ifndef WIN32 +#include +#else +#include +#endif +#include +#include + + +/****************************************************************************************************** + * + * Local Includes + * + *****************************************************************************************************/ +#include "file_utilities.h" +#include "CDynamicsConfigFile.h" + + +/****************************************************************************************************** + * + * Definition + * + *****************************************************************************************************/ +#define MAXFILENAMESIZE 128 +#define MAXLINEPOSITION 99999 +#define MAXTOKENMATCHES 16 +#define MAXLINESIZE 2048 +#ifdef WIN32 +#define snprintf _snprintf +#endif + +/****************************************************************************************************** + * + * PUBLIC METHOD: Constructors + * + *****************************************************************************************************/ +CDynamicsConfigFile::CDynamicsConfigFile() +{ + iStatus = DCS_INIT; + iReferenceFilename = ""; + iLocalFilename = ""; +} + + +CDynamicsConfigFile::~CDynamicsConfigFile() +{ + assert( iStatus != DCS_ACTIVE_LOCAL_COPY ); +} + + +/****************************************************************************************************** + * + * PUBLIC METHOD: SetReferenceFile + * + *****************************************************************************************************/ +TDCFError CDynamicsConfigFile::SetReferenceFile( string aReferenceFile ) +{ + // check that we don't have an active local copy + if( iStatus == DCS_ACTIVE_LOCAL_COPY ) { + return DCE_INVALID_STATE; + } + + // set the reference file + iReferenceFilename = aReferenceFile; + iStatus = DCS_REFERENCE_FILE_SET; + return DCE_NONE; +} + + +/****************************************************************************************************** + * + * PUBLIC METHOD: CreateLocalCopy + * + *****************************************************************************************************/ +TDCFError CDynamicsConfigFile::CreateLocalCopy( int *aSystemError ) +{ + TFUError ferr; + FILE *fp_dest, *fp_source; + char copy_filename[MAXFILENAMESIZE]; + + // check params + assert( aSystemError != NULL ); + *aSystemError = 0; + + // check the state + if( iStatus != DCS_REFERENCE_FILE_SET ) { + return DCE_INVALID_STATE; + } + + // create a tempfile to hold the local copy + fp_dest = OpenTempfile( (char*)iReferenceFilename.c_str(), copy_filename, MAXFILENAMESIZE, "w", aSystemError ); + if( fp_dest == NULL ) { + return DCE_OPEN_TEMP_ERROR; + } + + // open the source file + fp_source = fopen( (char*)iReferenceFilename.c_str(), "r" ); + if( fp_source == NULL ) { + fclose( fp_dest ); + unlink( copy_filename ); + *aSystemError = errno; + return DCE_OPEN_ERROR; + } + + // copy the files, close them, and look for errors + ferr = CopyFileByPtr( fp_source, fp_dest, aSystemError ); + fflush( fp_source ); + fflush( fp_dest ); + fclose( fp_source ); + fclose( fp_dest ); + if( ferr != FUE_NONE ) { + unlink( copy_filename ); + return (TDCFError)ferr; + } + + // we have been successful - update the state + iLocalFilename = copy_filename; + iStatus = DCS_ACTIVE_LOCAL_COPY; + return DCE_NONE; +} + + +/****************************************************************************************************** + * + * PUBLIC METHOD: RemoveLocalCopy + * + *****************************************************************************************************/ +TDCFError CDynamicsConfigFile::RemoveLocalCopy( int *aSystemError ) +{ + // check params + assert( aSystemError != NULL ); + *aSystemError = 0; + + // check the state + if( iStatus != DCS_ACTIVE_LOCAL_COPY ) { + return DCE_INVALID_STATE; + } + + // remove the local copy + unlink( iLocalFilename.c_str() ); + iStatus = DCS_REFERENCE_FILE_SET; + return DCE_NONE; +} + + +/****************************************************************************************************** + * + * PUBLIC METHOD: SetSingleOption + * + *****************************************************************************************************/ +TDCFError CDynamicsConfigFile::SetSingleOption( string aLabel, string aValue, int *aSystemError ) +{ + TFUError ferr; + int line_numbers[MAXTOKENMATCHES], match_count, insert_line, replace_flag = 1; + + // check params + assert( aSystemError != NULL ); + *aSystemError = 0; + + // check the state + if( iStatus != DCS_ACTIVE_LOCAL_COPY ) { + return DCE_INVALID_STATE; + } + + // get the list of occurences of the label + match_count = MAXTOKENMATCHES; + ferr = FindMatchingLines( (char*)iLocalFilename.c_str(), (char*)aLabel.c_str(), line_numbers, &match_count, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // make sure there is one or zero occurences + if( match_count > 1 ) { + return DCE_MULTIPLE_MATCHES; + } + + // set the line to insert at -- if zero occurences then add at the start of the file and DONT REPLACE + insert_line = line_numbers[0]; + if( match_count == 0 ) { + insert_line = 1; + replace_flag = 0; + } + + // insert the line + ferr = InsertLine( (char*)iLocalFilename.c_str(), insert_line, (char*)aValue.c_str(), aValue.length(), replace_flag, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // done + return DCE_NONE; +} + + +/****************************************************************************************************** + * + * PUBLIC METHOD: AddListOption + * + *****************************************************************************************************/ +TDCFError CDynamicsConfigFile::AddListOption( string aBlockStartTag, string aBlockEndTag, string aLineItem, int *aSystemError ) +{ + TFUError ferr; + int start_block_tag[MAXTOKENMATCHES], end_block_tag[MAXTOKENMATCHES], start_block_count, end_block_count; + + // check params + assert( aSystemError != NULL ); + *aSystemError = 0; + + // check the state + if( iStatus != DCS_ACTIVE_LOCAL_COPY ) { + return DCE_INVALID_STATE; + } + + // count the number of times the block start label appears in the file -- must 1 here + start_block_count = MAXTOKENMATCHES; + ferr = FindMatchingLines( (char*)iLocalFilename.c_str(), (char*)aBlockStartTag.c_str(), start_block_tag, &start_block_count, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // count the number of times the block end label appears in the file -- must 1 here + end_block_count = MAXTOKENMATCHES; + ferr = FindMatchingLines( (char*)iLocalFilename.c_str(), (char*)aBlockEndTag.c_str(), end_block_tag, &end_block_count, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // make sure there is exactly one of each tag + if( start_block_count == 0 ) { + return DCE_START_TAG_NOT_FOUND; + } + if( start_block_count > 1 ) { + return DCE_MULTIPLE_START_TAGS_FOUND; + } + if( end_block_count == 0 ) { + return DCE_END_TAG_NOT_FOUND; + } + if( end_block_count > 1 ) { + return DCE_MULTIPLE_END_TAGS_FOUND; + } + + // ok - insert the line before the end tag + ferr = InsertLine( (char*)iLocalFilename.c_str(), end_block_tag[0], (char*)aLineItem.c_str(), aLineItem.length(), 0, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // done + return DCE_NONE; +} + + +/****************************************************************************************************** + * + * PUBLIC METHOD: RemoveListOption + * + *****************************************************************************************************/ +TDCFError CDynamicsConfigFile::RemoveListOption( string aBlockStartTag, string aBlockEndTag, string aFirstToken, int *aSystemError ) +{ + TFUError ferr; + int start_block_tag[MAXTOKENMATCHES], end_block_tag[MAXTOKENMATCHES], entries[MAXTOKENMATCHES], start_block_count, end_block_count, entry_count; + int i; + + // check params + assert( aSystemError != NULL ); + *aSystemError = 0; + + // check the state + if( iStatus != DCS_ACTIVE_LOCAL_COPY ) { + return DCE_INVALID_STATE; + } + + // count the number of times the block start label appears in the file -- must 1 here + start_block_count = MAXTOKENMATCHES; + ferr = FindMatchingLines( (char*)iLocalFilename.c_str(), (char*)aBlockStartTag.c_str(), start_block_tag, &start_block_count, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // count the number of times the block end label appears in the file -- must 1 here + end_block_count = MAXTOKENMATCHES; + ferr = FindMatchingLines( (char*)iLocalFilename.c_str(), (char*)aBlockEndTag.c_str(), end_block_tag, &end_block_count, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // make sure there is exactly one of each tag + if( start_block_count <= 0 ) { + return DCE_START_TAG_NOT_FOUND; + } else if( end_block_count <= 0 ) { + return DCE_END_TAG_NOT_FOUND; + } else if( start_block_count > 1 ) { + return DCE_MULTIPLE_START_TAGS_FOUND; + } else if( end_block_count > 1 ) { + return DCE_MULTIPLE_END_TAGS_FOUND; + } + assert( (start_block_count == 1) && (end_block_count == 1) ); + + // count the number of lines matching the token + entry_count = MAXTOKENMATCHES; + ferr = FindMatchingLines( (char*)iLocalFilename.c_str(), (char*)aFirstToken.c_str(), entries, &entry_count, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // now look for the first entry that is between the tags + for( i = 0; i < entry_count; i++ ) { + if( (entries[i] >= start_block_tag[0]) && (entries[i] <= end_block_tag[0]) ) + break; + } + + // if no match was found between the tags then exit + if( i == entry_count ) { + return DCE_ENTRY_NOT_FOUND; + } + + // remove the line + ferr = InsertLine( (char*)iLocalFilename.c_str(), entries[i], NULL, 0, 1, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // done + return DCE_NONE; +} + + +/****************************************************************************************************** + * + * PUBLIC METHOD: RemoveListOption + * + *****************************************************************************************************/ +TDCFError CDynamicsConfigFile::RemoveSingleOption( string aLabel, int *aSystemError ) +{ + TFUError ferr; + int line_numbers[MAXTOKENMATCHES], match_count, insert_line; + char nline[MAXLINESIZE]; + + // check params + assert( aSystemError != NULL ); + *aSystemError = 0; + + // check the state + if( iStatus != DCS_ACTIVE_LOCAL_COPY ) { + return DCE_INVALID_STATE; + } + + // get the list of occurences of the label + match_count = MAXTOKENMATCHES; + ferr = FindMatchingLines( (char*)iLocalFilename.c_str(), (char*)aLabel.c_str(), line_numbers, &match_count, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // make sure there is one or zero occurences + if( match_count > 1 ) { + return DCE_MULTIPLE_MATCHES; + } + + // if there is zero then there is nothing to set + if( match_count == 0 ) { + return DCE_NONE; + } + + // otherwise replace the line with the string '# aLabel' + assert( match_count == 1 ); + insert_line = line_numbers[0]; + snprintf( nline, MAXLINESIZE, "# %s", aLabel.c_str() ); + + // insert the line + ferr = InsertLine( (char*)iLocalFilename.c_str(), insert_line, nline, strlen(nline), 1, aSystemError ); + if( ferr != FUE_NONE ) { + return (TDCFError)ferr; + } + + // done + return DCE_NONE; +} + + +/****************************************************************************************************** + * + * PUBLIC METHOD: GetLocalFilename + * + *****************************************************************************************************/ +const char *CDynamicsConfigFile::GetLocalFilename() +{ + return iLocalFilename.c_str(); +}