testexecmgmt/ucc/Source/DynamicsConfigurationLibrary/CDynamicsConfigFile.cpp
changeset 0 3da2a79470a7
--- /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 <stdio.h>
+#include <stdlib.h>
+#ifndef WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#endif
+#include <errno.h>
+#include <assert.h>
+
+
+/******************************************************************************************************
+ *
+ * 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();
+}