memana/analyzetoolclient/commandlineengine/internal/src/CATDataSaver.cpp
changeset 2 6a82cd05fb1e
parent 1 3ff3fecb12fe
equal deleted inserted replaced
1:3ff3fecb12fe 2:6a82cd05fb1e
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Definitions for the class CATDataSaver.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "../inc/catdatasaver.h"
       
    20 
       
    21 #include <xercesc/util/OutOfMemoryException.hpp>
       
    22 
       
    23 #if defined(XERCES_NEW_IOSTREAMS)
       
    24 #include <iostream>
       
    25 #else
       
    26 #include <iostream.h>
       
    27 #endif
       
    28 
       
    29 // -----------------------------------------------------------------------------
       
    30 // CATDataSaver::CATDataSaver
       
    31 // Constructor.
       
    32 // -----------------------------------------------------------------------------
       
    33 CATDataSaver::CATDataSaver( void )
       
    34 {
       
    35 	LOG_FUNC_ENTRY("CATDataSaver::CATDataSaver");
       
    36 	m_iLoggingLevel = DEFAULT_LOGGING_LEVEL;
       
    37 	m_bPrintImmediately = true;
       
    38 	m_bXMLInitOk = false;
       
    39 	m_bUdebBuild = true;
       
    40 
       
    41 	m_iRunNumber = 1;
       
    42 
       
    43 	m_pDomDoc = NULL;
       
    44 	m_pRootElem = NULL;
       
    45 	m_Serializer = NULL;
       
    46 	m_pCurrentLeakElem = NULL;
       
    47 	m_pRunElement = NULL;
       
    48 	m_pMemoryLeaks = NULL;
       
    49 	m_pHandleLeaks = NULL;
       
    50 	m_pCurrentSubTestElem = NULL;
       
    51 	m_pSubtestMemoryLeaks = NULL;
       
    52 }
       
    53 
       
    54 // -----------------------------------------------------------------------------
       
    55 // CATDataSaver::~CATDataSaver
       
    56 // Destructor.
       
    57 // -----------------------------------------------------------------------------
       
    58 CATDataSaver::~CATDataSaver(void)
       
    59 {
       
    60 	LOG_FUNC_ENTRY("CATDataSaver::~CATDataSaver");
       
    61 	if( m_bXMLInitOk )
       
    62 	{
       
    63 		if( m_Serializer )
       
    64 			delete m_Serializer;
       
    65 
       
    66 		m_pDomDoc->release();
       
    67 		xercesc::XMLPlatformUtils::Terminate();
       
    68 	}
       
    69 }
       
    70 
       
    71 // -----------------------------------------------------------------------------
       
    72 // CATDataSaver::SaveLinesToFile
       
    73 // Gets logging level.
       
    74 // -----------------------------------------------------------------------------
       
    75 void CATDataSaver::SaveLinesToFile( const char* pFileName, int iDataToSave )
       
    76 {
       
    77 	LOG_FUNC_ENTRY("CATDataSaver::SaveLinesToFile");
       
    78 
       
    79 	// Nothing to print?
       
    80 	if( m_vLines.empty() )
       
    81 	{
       
    82 		printf( "No output data." );
       
    83 		return;
       
    84 	}
       
    85 	if( iDataToSave != XML_DATA )
       
    86 	{
       
    87 		ofstream out( pFileName );
       
    88 
       
    89 		if( !out.good() )
       
    90 		{
       
    91 			printf( "Can not open file: %s\n", pFileName );
       
    92 			return;
       
    93 		}
       
    94 		switch( iDataToSave )
       
    95 		{
       
    96 			case TEXT_DATA:
       
    97 				for( int i = 0 ; i < (int)m_vLines.size() ; i++ )
       
    98 				{
       
    99 					out << m_vLines[i].c_str();
       
   100 				}
       
   101 			break;
       
   102 		}
       
   103 		out.close();
       
   104 	}
       
   105 	else
       
   106 	{
       
   107 		if( m_bXMLInitOk )
       
   108 		{
       
   109 			xercesc::XMLFormatTarget* myFormTarget = NULL;
       
   110 			try
       
   111 			{
       
   112 				myFormTarget = new xercesc::LocalFileFormatTarget( pFileName );
       
   113 				m_Serializer->writeNode(myFormTarget, *m_pDomDoc);
       
   114 			}
       
   115 			catch(...)
       
   116 			{
       
   117 				printf( "Can not save output file: %s.", pFileName );
       
   118 			}
       
   119 			if( myFormTarget )
       
   120 				delete myFormTarget; //lint !e118
       
   121 		}
       
   122 	}
       
   123 }
       
   124 
       
   125 // -----------------------------------------------------------------------------
       
   126 // CATDataSaver::PrintLinesToScreen
       
   127 // Prints all saved lines to screen.
       
   128 // -----------------------------------------------------------------------------
       
   129 void CATDataSaver::PrintLinesToScreen( void )
       
   130 {
       
   131 	LOG_FUNC_ENTRY("CATDataSaver::PrintLinesToScreen");
       
   132 	// Nothing to print?
       
   133 	if( m_vLines.empty() )
       
   134 	{
       
   135 		printf( "No output data." );
       
   136 		return;
       
   137 	}
       
   138 	for( int i = 0 ; i < (int)m_vLines.size() ; i++ )
       
   139 	{
       
   140 		printf( m_vLines[i].c_str() );	
       
   141 	}
       
   142 }
       
   143 
       
   144 // -----------------------------------------------------------------------------
       
   145 // CATDataSaver::AddLineToFirst
       
   146 // Adds saved line to first in database.
       
   147 // -----------------------------------------------------------------------------
       
   148 void CATDataSaver::AddLineToFirst( void )
       
   149 {
       
   150 	LOG_LOW_FUNC_ENTRY("CATDataSaver::AddLineToFirst");
       
   151 	m_sLine.append( "\n" );
       
   152 	m_vLines.insert( m_vLines.begin(), m_sLine );
       
   153 	m_sLine.clear();
       
   154 }
       
   155 
       
   156 // -----------------------------------------------------------------------------
       
   157 // CATDataSaver::AddLineToLast
       
   158 // Adds saved line to last in database.
       
   159 // -----------------------------------------------------------------------------
       
   160 void CATDataSaver::AddLineToLast()
       
   161 {
       
   162 	LOG_LOW_FUNC_ENTRY("CATDataSaver::AddLineToLast");
       
   163 	m_sLine.append( "\n" );
       
   164 	
       
   165 	string sTempDataLine;
       
   166 
       
   167 	m_vLines.push_back( m_sLine );
       
   168 
       
   169 	SaveXML( m_sCarbideDataLine, ITEM );
       
   170 
       
   171 	if( m_bPrintImmediately )
       
   172 	{
       
   173 		printf( m_sLine.c_str() );
       
   174 	}
       
   175 
       
   176 	m_sCarbideDataLine.clear();
       
   177 	m_sLine.clear();
       
   178 }
       
   179 
       
   180 // -----------------------------------------------------------------------------
       
   181 // CATDataSaver::AddString
       
   182 // Adds string to current line.
       
   183 // -----------------------------------------------------------------------------
       
   184 void CATDataSaver::AddString( const char* pData, bool bSaveCarbideData )
       
   185 {
       
   186 	LOG_LOW_FUNC_ENTRY("CATDataSaver::AddString");
       
   187 	m_sLine.append( pData );
       
   188 
       
   189 	if( bSaveCarbideData )
       
   190 	{
       
   191 		m_sCarbideDataLine.append( pData );
       
   192 		m_sCarbideDataLine.append(";");
       
   193 	}
       
   194 }
       
   195 
       
   196 // -----------------------------------------------------------------------------
       
   197 // CATDataSaver::AddInteger
       
   198 // Converts integer to string and adds it to current line.
       
   199 // -----------------------------------------------------------------------------
       
   200 void CATDataSaver::AddInteger( int iValue, bool bSaveCarbideData )
       
   201 {
       
   202 	LOG_LOW_FUNC_ENTRY("CATDataSaver::AddInteger");
       
   203 	char cTemp[128];
       
   204 	string sValue( itoa( iValue, cTemp, 10 ) );
       
   205 	m_sLine.append( sValue );
       
   206 
       
   207 	if( bSaveCarbideData )
       
   208 	{
       
   209 		m_sCarbideDataLine.append( sValue );
       
   210 		m_sCarbideDataLine.append(";");
       
   211 	}
       
   212 }
       
   213 
       
   214 // -----------------------------------------------------------------------------
       
   215 // CATDataSaver::SetLoggingLevel
       
   216 // Sets logging level.
       
   217 // -----------------------------------------------------------------------------
       
   218 void CATDataSaver::SetLoggingLevel( int iLoggingLevel )
       
   219 {
       
   220 	LOG_FUNC_ENTRY("CATDataSaver::SetLoggingLevel");
       
   221 	// Check that new logging level is valid 
       
   222 	// Acceptable values are between MIN_LOGGING_LEVEL and 
       
   223     // MAX_LOGGING_LEVEL including them
       
   224 	if( iLoggingLevel >= MIN_LOGGING_LEVEL && iLoggingLevel <= MAX_LOGGING_LEVEL )
       
   225 	{
       
   226 		m_iLoggingLevel = iLoggingLevel;
       
   227 	}
       
   228 	else
       
   229 	{
       
   230 		// New logging level value is invalid => set default logging level
       
   231 		m_iLoggingLevel = DEFAULT_LOGGING_LEVEL;
       
   232 	}
       
   233 }
       
   234 
       
   235 // -----------------------------------------------------------------------------
       
   236 // CATDataSaver::GetLoggingLevel
       
   237 // Gets logging level.
       
   238 // -----------------------------------------------------------------------------
       
   239 int CATDataSaver::GetLoggingLevel( void )
       
   240 {
       
   241 	LOG_LOW_FUNC_ENTRY("CATDataSaver::GetLoggingLevel");
       
   242 	return m_iLoggingLevel;
       
   243 }
       
   244 
       
   245 // -----------------------------------------------------------------------------
       
   246 // CATDataSaver::SetPrintFlag
       
   247 // Sets print immediately flag.
       
   248 // -----------------------------------------------------------------------------
       
   249 void CATDataSaver::SetPrintFlag( bool bPrintImmediately )
       
   250 {
       
   251 	LOG_FUNC_ENTRY("CATDataSaver::SetPrintFlag");
       
   252 	m_bPrintImmediately = bPrintImmediately;
       
   253 }
       
   254 
       
   255 // -----------------------------------------------------------------------------
       
   256 // CATDataSaver::SaveCarbideDataHeader
       
   257 // Sets data header for Carbide data.
       
   258 // -----------------------------------------------------------------------------
       
   259 void CATDataSaver::SaveCarbideDataHeader( void )
       
   260 {
       
   261 	LOG_FUNC_ENTRY("CATDataSaver::SaveCarbideDataHeader");
       
   262 	SaveXML( m_sCarbideDataLine, LEAK );
       
   263 	m_sCarbideDataLine.clear();
       
   264 }
       
   265 
       
   266 // -----------------------------------------------------------------------------
       
   267 // CATDataSaver::InitXML
       
   268 // Initializes xerces xml parser.
       
   269 // -----------------------------------------------------------------------------
       
   270 bool CATDataSaver::InitXML( void )
       
   271 {
       
   272 	LOG_FUNC_ENTRY("CATDataSaver::InitXML");
       
   273 	try 
       
   274 	{
       
   275 		xercesc::XMLPlatformUtils::Initialize();
       
   276 	}
       
   277 	catch ( ... )//(const XMLException& toCatch) 
       
   278 	{
       
   279 		// Do your failure processing here
       
   280 		printf("XML initialization failed.\n");
       
   281 		return false;
       
   282 	}
       
   283 	// Error code.
       
   284 	int errorCode = 0;
       
   285 	// getDomIMplementation returns null if source has none.
       
   286 	xercesc::DOMImplementation* impl = xercesc::DOMImplementationRegistry::getDOMImplementation(L"Core");
       
   287 	if (impl != NULL)
       
   288     {
       
   289 		// Create new DOMWriter.
       
   290 		m_Serializer = ((xercesc::DOMImplementationLS*)impl)->createDOMWriter();
       
   291 		// New document.
       
   292         try
       
   293         {
       
   294 			m_pDomDoc = impl->createDocument(
       
   295                         0,                    // Root element namespace URI.
       
   296                         L"results",         // Root element name
       
   297                         0);                   // Document type object (DTD).
       
   298 
       
   299             m_pRootElem = m_pDomDoc->getDocumentElement();
       
   300         }
       
   301         catch (const xercesc::OutOfMemoryException&)
       
   302         {
       
   303             XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl;
       
   304             errorCode = 5;
       
   305         }
       
   306         catch (const xercesc::DOMException& e)
       
   307         {
       
   308             XERCES_STD_QUALIFIER cerr << "DOMException code is:  " << e.code << XERCES_STD_QUALIFIER endl;
       
   309             errorCode = 2;
       
   310         }
       
   311         catch (...)
       
   312         {
       
   313             XERCES_STD_QUALIFIER cerr << "An error occurred creating the document" << XERCES_STD_QUALIFIER endl;
       
   314             errorCode = 3;
       
   315         }
       
   316     }  // (inpl != NULL)
       
   317     else
       
   318     {
       
   319         XERCES_STD_QUALIFIER cerr << "Requested implementation is not supported" << XERCES_STD_QUALIFIER endl;
       
   320         errorCode = 4;
       
   321     }
       
   322 	if( !errorCode )
       
   323 	{
       
   324 		m_bXMLInitOk = true;
       
   325 		return true;
       
   326 	}
       
   327 	else
       
   328 	{
       
   329 		return false;
       
   330 	}
       
   331 }
       
   332 
       
   333 // -----------------------------------------------------------------------------
       
   334 // CATDataSaver::WCharToChar
       
   335 // Converts wchar_t* -> char*.
       
   336 // -----------------------------------------------------------------------------
       
   337 void CATDataSaver::WCharToChar( string& sInput, const WCHAR* Source )
       
   338 {
       
   339 	LOG_LOW_FUNC_ENTRY("CATDataSaver::WCharToChar");
       
   340 	if( !Source )
       
   341 		return;
       
   342     int i = 0;
       
   343 
       
   344     while( Source[i] != '\0' )
       
   345     {
       
   346 		char c = (CHAR)Source[i];
       
   347 		sInput.append( &c, 1 );
       
   348         ++i;
       
   349     }
       
   350 }
       
   351 
       
   352 // -----------------------------------------------------------------------------
       
   353 // CATDataSaver::CharToWChar
       
   354 // Converts char* -> wchar_t*.
       
   355 // -----------------------------------------------------------------------------
       
   356 LPWSTR CATDataSaver::CharToWChar( const char* str )
       
   357 {
       
   358 	LOG_LOW_FUNC_ENTRY("CATDataSaver::CharToWChar");
       
   359     LPWSTR out = NULL;
       
   360     if( str != NULL )
       
   361     {
       
   362         int in_len = (int)strlen( str );
       
   363         int out_len = MultiByteToWideChar(CP_ACP, 0, str, in_len, NULL, 0) + 2;
       
   364         out = new WCHAR[out_len];
       
   365 
       
   366         if (out)
       
   367         {
       
   368             memset(out, 0x00, sizeof(WCHAR)*out_len);
       
   369             MultiByteToWideChar(CP_ACP, 0, str, in_len, out, in_len);
       
   370         }
       
   371     }
       
   372     return out;
       
   373 }
       
   374 
       
   375 // -----------------------------------------------------------------------------
       
   376 // CATDataSaver::SaveXML
       
   377 // Writes data to xml tree.
       
   378 // -----------------------------------------------------------------------------
       
   379 void CATDataSaver::SaveXML( string sInput, int iElementType )
       
   380 {
       
   381 	LOG_FUNC_ENTRY("CATDataSaver::SaveXML");
       
   382 	// Variables ok?
       
   383 	if( sInput.empty() || m_pDomDoc == NULL )
       
   384 	{
       
   385 		return;
       
   386 	}
       
   387 	try
       
   388 	{
       
   389 		switch( iElementType )
       
   390 		{
       
   391 			case RESULT:
       
   392 			{
       
   393 				// Print number of runs
       
   394 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   395 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   396 				m_pRootElem->setAttribute( L"runs", (const LPWSTR)wTemp );
       
   397 
       
   398 				// Print failed runs
       
   399 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   400 				if( wTemp )
       
   401 					delete[] wTemp;
       
   402 				wTemp = CharToWChar( sTemp.c_str() );
       
   403 				m_pRootElem->setAttribute( L"failed", (const LPWSTR)wTemp );
       
   404 				if( wTemp )
       
   405 					delete[] wTemp;
       
   406 			}
       
   407 			break;
       
   408 			case RUN:
       
   409 			{
       
   410 				if( m_pRootElem == NULL )
       
   411 					return;
       
   412 				xercesc::DOMElement* runElem = m_pDomDoc->createElement( L"run" );
       
   413 				m_pRootElem->appendChild( runElem );
       
   414 
       
   415 				// Reset handle leaks.
       
   416 				m_pHandleLeaks = NULL;
       
   417 
       
   418 				// Print start time
       
   419 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   420 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   421 				runElem->setAttribute( L"start_time", (const LPWSTR)wTemp );
       
   422 				runElem->setAttribute( L"end_time", NULL );
       
   423 				if( wTemp )
       
   424 					delete[] wTemp;
       
   425 
       
   426 				// Print build target
       
   427 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   428 				wTemp = CharToWChar( sTemp.c_str() );
       
   429 				runElem->setAttribute( L"build_target", (const LPWSTR)wTemp );
       
   430 				if( wTemp )
       
   431 					delete[] wTemp;
       
   432 
       
   433 				// Print process name
       
   434 				wTemp = CharToWChar( sInput.c_str() );
       
   435 				runElem->setAttribute( L"process_name", (const LPWSTR)wTemp );
       
   436 
       
   437 				m_pRunElement = runElem;
       
   438 
       
   439 				char cTemp[128];
       
   440 				if( wTemp )
       
   441 					delete[] wTemp;
       
   442 				wTemp = CharToWChar( itoa( m_iRunNumber, cTemp, 10 ) );
       
   443 				runElem->setAttribute( L"id", (const LPWSTR)wTemp );
       
   444 				m_iRunNumber++;
       
   445 				if( wTemp )
       
   446 					delete[] wTemp;
       
   447 			}
       
   448 			break;
       
   449 			case LEAK:
       
   450 			{
       
   451 				m_pCurrentLeakElem = m_pDomDoc->createElement( L"leak" );
       
   452 
       
   453 
       
   454 				if( m_pCurrentLeakElem == NULL || m_pRunElement == NULL )
       
   455 					return;
       
   456 
       
   457 				// Sub test?
       
   458 				if( m_pCurrentSubTestElem )
       
   459 					m_pCurrentSubTestElem->appendChild( m_pCurrentLeakElem );
       
   460 				else
       
   461 					m_pRunElement->appendChild( m_pCurrentLeakElem );
       
   462 
       
   463 				// Print leak ID
       
   464 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   465 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   466 				m_pCurrentLeakElem->setAttribute( L"id", (const LPWSTR)wTemp );
       
   467 
       
   468 				// Print leak size
       
   469 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   470 				if( wTemp )
       
   471 					delete[] wTemp;
       
   472 				wTemp = CharToWChar( sTemp.c_str() );
       
   473 				m_pCurrentLeakElem->setAttribute( L"size", (const LPWSTR)wTemp );
       
   474 
       
   475 				// Print leak address
       
   476 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   477 				if( wTemp )
       
   478 					delete[] wTemp;
       
   479 				wTemp = CharToWChar( sTemp.c_str() );
       
   480 				m_pCurrentLeakElem->setAttribute( L"memaddress", (const LPWSTR)wTemp );
       
   481 
       
   482 				// Print leak time
       
   483 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   484 				if( wTemp )
       
   485 					delete[] wTemp;
       
   486 				wTemp = CharToWChar( sTemp.c_str() );
       
   487 				m_pCurrentLeakElem->setAttribute( L"time", (const LPWSTR)wTemp );
       
   488 
       
   489 				// Print leak module
       
   490 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   491 				if( wTemp )
       
   492 					delete[] wTemp;
       
   493 				wTemp = CharToWChar( sTemp.c_str() );
       
   494 				m_pCurrentLeakElem->setAttribute( L"module", (const LPWSTR)wTemp );
       
   495 				if( wTemp )
       
   496 					delete[] wTemp;
       
   497 			}
       
   498 			break;
       
   499 			case ITEM:
       
   500 			{
       
   501 				xercesc::DOMNode* callstackNode = NULL;
       
   502 
       
   503 				xercesc::DOMElement* callstackElem = NULL;
       
   504 
       
   505 				if( m_pCurrentLeakElem  == NULL )
       
   506 					return;
       
   507 
       
   508 				// Print module name
       
   509 				if( !m_pCurrentLeakElem->hasChildNodes() )
       
   510 				{
       
   511 					callstackElem = m_pDomDoc->createElement( L"callstack" );
       
   512 					m_pCurrentLeakElem->appendChild( callstackElem );
       
   513 					callstackNode = callstackElem;
       
   514 				}
       
   515 				else
       
   516 				{
       
   517 					callstackNode = m_pCurrentLeakElem->getFirstChild();
       
   518 				}
       
   519 
       
   520 				// Add callstack item
       
   521 				xercesc::DOMElement* itemElem = m_pDomDoc->createElement( L"item" );
       
   522 				callstackNode->appendChild( itemElem );
       
   523 
       
   524 				// Print memory address name
       
   525 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   526 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   527 
       
   528 				itemElem->setAttribute( L"memaddress", (const LPWSTR)wTemp );
       
   529 
       
   530 				// Print calculated memory address
       
   531 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   532 				if( wTemp )
       
   533 					delete[] wTemp;
       
   534 				wTemp = CharToWChar( sTemp.c_str() );
       
   535 
       
   536 				itemElem->setAttribute( L"calc_addr", (const LPWSTR)wTemp );
       
   537 
       
   538 				// Print module name
       
   539 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   540 				if( wTemp )
       
   541 					delete[] wTemp;
       
   542 				wTemp = CharToWChar( sTemp.c_str() );
       
   543 
       
   544 				itemElem->setAttribute( L"module", (const LPWSTR)wTemp );
       
   545 
       
   546 				// Print function name
       
   547 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   548 				if( wTemp )
       
   549 					delete[] wTemp;
       
   550 				wTemp = CharToWChar( sTemp.c_str() );
       
   551 
       
   552 				itemElem->setAttribute( L"function", (const LPWSTR)wTemp );
       
   553 
       
   554 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   555 
       
   556 				// Print function line from urel build
       
   557 				if( !m_bUdebBuild )
       
   558 				{
       
   559 					if( wTemp )
       
   560 						delete[] wTemp;
       
   561 					wTemp = CharToWChar( sTemp.c_str() );
       
   562 					itemElem->setAttribute( L"function_line", (const LPWSTR)wTemp );
       
   563 					sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   564 				}
       
   565 
       
   566 				// Print file name
       
   567 				if( wTemp )
       
   568 					delete[] wTemp;
       
   569 				// Erase if path found from sTemp.
       
   570 				if ( sTemp.rfind( "/" ) != string::npos )
       
   571 				{
       
   572 					sTemp.erase(0, sTemp.rfind( "/" )+1 );
       
   573 				}
       
   574 				if ( sTemp.rfind( "\\" ) != string::npos )
       
   575 				{
       
   576 					sTemp.erase(0, sTemp.rfind( "\\" )+1 );
       
   577 				}
       
   578 				wTemp = CharToWChar( sTemp.c_str() );
       
   579 
       
   580 				itemElem->setAttribute( L"file", (const LPWSTR)wTemp );
       
   581 
       
   582 				// Print line of file
       
   583 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   584 				if( wTemp )
       
   585 					delete[] wTemp;
       
   586 				wTemp = CharToWChar( sTemp.c_str() );
       
   587 
       
   588 				if( m_bUdebBuild )
       
   589 					itemElem->setAttribute( L"line", (const LPWSTR)wTemp );
       
   590 				if( wTemp )
       
   591 					delete[] wTemp;
       
   592 			}
       
   593 			break;
       
   594 			case RUN_END:
       
   595 			{
       
   596 				if( m_pRunElement == NULL )
       
   597 					return;
       
   598 				const LPWSTR wTemp = CharToWChar( sInput.c_str() );
       
   599 				m_pRunElement->setAttribute( L"end_time", wTemp );
       
   600 				if( wTemp )
       
   601 					delete[] wTemp;
       
   602 			}
       
   603 			break;
       
   604 			case ERROR_IN_RUN:
       
   605 			{
       
   606 				if( m_pRunElement == NULL )
       
   607 					return;
       
   608 				// Add error item
       
   609 				xercesc::DOMElement* errorElem = m_pDomDoc->createElement( L"error" );
       
   610 				m_pRunElement->appendChild( errorElem );
       
   611 
       
   612 				// Print error code
       
   613 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   614 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   615 				errorElem->setAttribute( L"code", (const LPWSTR)wTemp );
       
   616 
       
   617 				// Print error time
       
   618 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   619 				if( wTemp )
       
   620 					delete[] wTemp;
       
   621 				wTemp = CharToWChar( sTemp.c_str() );
       
   622 				errorElem->setAttribute( L"time", (const LPWSTR)wTemp );
       
   623 				if( wTemp )
       
   624 					delete[] wTemp;
       
   625 			}
       
   626 			break;
       
   627 			case MEM_LEAKS:
       
   628 			{
       
   629 				if( m_pRunElement == NULL )
       
   630 					return;
       
   631 				xercesc::DOMElement* memoryLeaksElement = m_pDomDoc->createElement( L"mem_leaks" );
       
   632 				m_pRunElement->appendChild( memoryLeaksElement );
       
   633 				m_pMemoryLeaks = memoryLeaksElement;
       
   634 
       
   635 				// Print number of leaks
       
   636 				LPWSTR wTemp = CharToWChar( sInput.c_str() );
       
   637 				memoryLeaksElement->setAttribute( L"count", (const LPWSTR)wTemp );
       
   638 				if( wTemp )
       
   639 					delete[] wTemp;
       
   640 			}
       
   641 			break;
       
   642 			case MEM_LEAK_MODULE:
       
   643 			{
       
   644 				if( m_pMemoryLeaks == NULL )
       
   645 					return;
       
   646 				xercesc::DOMElement* moduleElement = m_pDomDoc->createElement( L"module" );
       
   647 				m_pMemoryLeaks->appendChild( moduleElement );
       
   648 
       
   649 				// Print module name
       
   650 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   651 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   652 				moduleElement->setAttribute( L"name", (const LPWSTR)wTemp );
       
   653 
       
   654 				if( wTemp )
       
   655 					delete[] wTemp;
       
   656 				// Print number of memory leaks
       
   657 				wTemp = CharToWChar( sInput.c_str() );
       
   658 				moduleElement->setAttribute( L"leaks", (const LPWSTR)wTemp );
       
   659 				if( wTemp )
       
   660 					delete[] wTemp;
       
   661 			}
       
   662 			break;
       
   663 			case HANDLE_LEAKS:
       
   664 			{
       
   665 				if( m_pRunElement == NULL )
       
   666 					return;
       
   667 				if( m_pHandleLeaks )
       
   668 				{
       
   669 					// Update number of leaks
       
   670 					LPWSTR wTemp = CharToWChar( sInput.c_str() );
       
   671 					m_pHandleLeaks->setAttribute( L"count", (const LPWSTR)wTemp );
       
   672 					if( wTemp )
       
   673 						delete[] wTemp;
       
   674 				}
       
   675 				else
       
   676 				{
       
   677 					xercesc::DOMElement* handleLeaksElement = m_pDomDoc->createElement( L"handle_leaks" );
       
   678 					m_pRunElement->appendChild( handleLeaksElement );
       
   679 					m_pHandleLeaks = handleLeaksElement;
       
   680 
       
   681 					// Print number of leaks
       
   682 					LPWSTR wTemp = CharToWChar( sInput.c_str() );
       
   683 					handleLeaksElement->setAttribute( L"count", (const LPWSTR)wTemp );
       
   684 					if( wTemp )
       
   685 						delete[] wTemp;
       
   686 				}
       
   687 			}
       
   688 			break;
       
   689 			case HANDLE_LEAK_MODULE:
       
   690 			{
       
   691 				if( m_pHandleLeaks == NULL )
       
   692 					return;
       
   693 				xercesc::DOMElement* moduleElement = m_pDomDoc->createElement( L"module" );
       
   694 				m_pHandleLeaks->appendChild( moduleElement );
       
   695 
       
   696 				// Print module name
       
   697 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   698 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   699 				moduleElement->setAttribute( L"name", (const LPWSTR)wTemp );
       
   700 				if( wTemp )
       
   701 					delete[] wTemp;
       
   702 
       
   703 				// Print number of memory leaks
       
   704 				wTemp = CharToWChar( sInput.c_str() );
       
   705 				moduleElement->setAttribute( L"leaks", (const LPWSTR)wTemp );
       
   706 				if( wTemp )
       
   707 					delete[] wTemp;
       
   708 			}
       
   709 			break;
       
   710 			case TEST_START:
       
   711 			{
       
   712 				m_pCurrentSubTestElem = m_pDomDoc->createElement( L"subtest" );
       
   713 
       
   714 				if( m_pCurrentSubTestElem == NULL || m_pRunElement == NULL )
       
   715 					return;
       
   716 
       
   717 				m_pRunElement->appendChild( m_pCurrentSubTestElem );
       
   718 
       
   719 				// Print sub test name
       
   720 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   721 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   722 				m_pCurrentSubTestElem->setAttribute( L"name", (const LPWSTR)wTemp );
       
   723 				if( wTemp )
       
   724 				{
       
   725 					delete[] wTemp;
       
   726 					wTemp = NULL;
       
   727 				}
       
   728 
       
   729 				// Print sub test time
       
   730 				sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   731 				wTemp = CharToWChar( sTemp.c_str() );
       
   732 				m_pCurrentSubTestElem->setAttribute( L"start_time", (const LPWSTR)wTemp );
       
   733 				if( wTemp )
       
   734 					delete[] wTemp;
       
   735 				break;
       
   736 			}
       
   737 			case TEST_END:
       
   738 			{
       
   739 				if( m_pCurrentSubTestElem == NULL )
       
   740 					return;
       
   741 				// Print end time
       
   742 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   743 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   744 				m_pCurrentSubTestElem->setAttribute( L"end_time", (const LPWSTR)wTemp );
       
   745 				m_pCurrentSubTestElem = NULL;
       
   746 				if( wTemp )
       
   747 					delete[] wTemp;
       
   748 				break;
       
   749 			}
       
   750 			case SUBTEST_MEM_LEAKS:
       
   751 			{
       
   752 				if( m_pCurrentSubTestElem == NULL )
       
   753 					return;
       
   754 				xercesc::DOMElement* memoryLeaksElement = m_pDomDoc->createElement( L"mem_leaks" );
       
   755 				m_pCurrentSubTestElem->appendChild( memoryLeaksElement );
       
   756 				m_pSubtestMemoryLeaks = memoryLeaksElement;
       
   757 
       
   758 				// Print number of leaks
       
   759 				LPWSTR wTemp = CharToWChar( sInput.c_str() );
       
   760 				memoryLeaksElement->setAttribute( L"count", (const LPWSTR)wTemp );
       
   761 				if( wTemp )
       
   762 					delete[] wTemp;
       
   763 				break;
       
   764 			}
       
   765 			case SUBTEST_MEM_LEAK_MODULE:
       
   766 			{
       
   767 				if( m_pSubtestMemoryLeaks == NULL )
       
   768 					return;
       
   769 				xercesc::DOMElement* moduleElement = m_pDomDoc->createElement( L"module" );
       
   770 				m_pSubtestMemoryLeaks->appendChild( moduleElement );
       
   771 
       
   772 				// Print module name
       
   773 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   774 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   775 				moduleElement->setAttribute( L"name", (const LPWSTR)wTemp );
       
   776 
       
   777 				if( wTemp )
       
   778 					delete[] wTemp;
       
   779 				// Print number of memory leaks
       
   780 				wTemp = CharToWChar( sInput.c_str() );
       
   781 				moduleElement->setAttribute( L"leaks", (const LPWSTR)wTemp );
       
   782 				if( wTemp )
       
   783 					delete[] wTemp;
       
   784 				break;
       
   785 			}
       
   786 			case SUBTEST_HANDLE_LEAKS:
       
   787 			{
       
   788 				if( m_pCurrentSubTestElem == NULL )
       
   789 					return;
       
   790 				xercesc::DOMElement* handleLeaksElement = m_pDomDoc->createElement( L"handle_leaks" );
       
   791 				m_pCurrentSubTestElem->appendChild( handleLeaksElement );
       
   792 
       
   793 				//Print number of handle leaks
       
   794 				string sTemp = GetStringUntilNextGivenChar( sInput, ';' );
       
   795 				LPWSTR wTemp = CharToWChar( sTemp.c_str() );
       
   796 				handleLeaksElement->setAttribute( L"count", (const LPWSTR)wTemp );
       
   797 				if( wTemp )
       
   798 					delete[] wTemp;
       
   799 				break;
       
   800 			}
       
   801 			default:
       
   802 			break;
       
   803 		}
       
   804 	}
       
   805 	catch( ... )
       
   806 	{
       
   807 		printf( "Error when writing data to XML file." );
       
   808 	}
       
   809 }
       
   810 
       
   811 // -----------------------------------------------------------------------------
       
   812 // CATDataSaver::GetStringUntilNextGivenChar
       
   813 // Function returns string from begin of given string until next given char,
       
   814 // characters until given char are removed from sInput string.
       
   815 // -----------------------------------------------------------------------------
       
   816 string CATDataSaver::GetStringUntilNextGivenChar( string& sInput, char cCharacter )
       
   817 {
       
   818 	LOG_LOW_FUNC_ENTRY("CATDataSaver::GetStringUntilNextGivenChar");
       
   819 	string sRet;
       
   820 	size_t iPos = sInput.find( cCharacter );
       
   821 	if( sInput.size() > 1 && iPos != string::npos )
       
   822 	{
       
   823 		sRet = sInput.substr( 0, iPos );
       
   824 		sInput.erase( 0, (iPos + 1) );
       
   825 	}
       
   826 	return sRet;
       
   827 }
       
   828 
       
   829 // -----------------------------------------------------------------------------
       
   830 // CATDataSaver::SetBuild
       
   831 // Function sets build target info.
       
   832 // -----------------------------------------------------------------------------
       
   833 void CATDataSaver::SetBuild( bool bUdebBuild )
       
   834 {
       
   835 	LOG_FUNC_ENTRY("CATDataSaver::SetBuild");
       
   836 	m_bUdebBuild = bUdebBuild;
       
   837 }
       
   838 
       
   839 // -----------------------------------------------------------------------------
       
   840 // CATDataSaver::AddCarbideData
       
   841 // Function adds string to Carbide data.
       
   842 // -----------------------------------------------------------------------------
       
   843 void CATDataSaver::AddCarbideData( const string& sInput )
       
   844 {
       
   845 	LOG_LOW_FUNC_ENTRY("CATDataSaver::AddCarbideData");
       
   846 	m_sCarbideDataLine.append( sInput );
       
   847 	m_sCarbideDataLine.append(";");
       
   848 }
       
   849 
       
   850 // -----------------------------------------------------------------------------
       
   851 // CATDataSaver::IntegerToString
       
   852 // Converts integer to string.
       
   853 // -----------------------------------------------------------------------------
       
   854 string CATDataSaver::IntegerToString( int iValueToConvert )
       
   855 {
       
   856 	LOG_LOW_FUNC_ENTRY("CATDataSaver::IntegerToString");
       
   857 	char cTemp[128];
       
   858 	string sValue( itoa( iValueToConvert, cTemp, 10 ) );
       
   859 	return sValue;
       
   860 }