memana/analyzetoolclient/commandlineengine/internal/src/cataddr2lineserver.cpp
changeset 2 6a82cd05fb1e
parent 1 3ff3fecb12fe
--- a/memana/analyzetoolclient/commandlineengine/internal/src/cataddr2lineserver.cpp	Thu Feb 11 15:52:57 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,286 +0,0 @@
-/*
-* 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:  Class representing a server that uses addr2line.exe.
-*
-*/
-
-#include "../inc/cataddr2lineserver.h"
-#include "../inc/CATBase.h"
-
-// ----------------------------------------------------------------------------
-// Constructor
-// ----------------------------------------------------------------------------
-CATAddr2lineServer::CATAddr2lineServer()
-{
-	LOG_FUNC_ENTRY("CATAddr2lineServer::CATAddr2lineServer");
-	m_bProcessCreated = false;
-
-	// Pipe handles.
-	m_hChildErroutRd = 0;
-	m_hChildErroutRdDup = 0;
-	m_hChildErroutWr = 0;
-	m_hChildStdinRd = 0;
-	m_hChildStdinWr = 0;
-	m_hChildStdinWrDup = 0;
-	m_hChildStdoutRd = 0;
-	m_hChildStdoutWr = 0;
-	m_hChildStdoutRdDup = 0;
-	
-	m_hSaveErrout = 0;
-	m_hSaveStdin = 0;
-	m_hSaveStdout = 0;
-
-    // Set the bInheritHandle flag so pipe handles are inherited.
-    m_saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
-    m_saAttr.bInheritHandle = TRUE;
-    m_saAttr.lpSecurityDescriptor = NULL;
-
-	// Symbol file.
-	m_sFullPathAndBinaryName = "";
-}
-// ----------------------------------------------------------------------------
-// Destructor
-// ----------------------------------------------------------------------------
-CATAddr2lineServer::~CATAddr2lineServer()
-{
-	LOG_FUNC_ENTRY("CATAddr2lineServer::~CATAddr2lineServer");
-	// Close the pipe handle so the child process stops reading.
-    CloseHandle(m_hChildStdinWrDup);
-    // Close the write end of the pipe
-    CloseHandle(m_hChildStdoutWr);
-    // Close the write end of the error pipe
-	CloseHandle(m_hChildErroutWr);
-}
-bool CATAddr2lineServer::Initialize( const string& sFullPathAndBinaryName )
-{
-    LOG_FUNC_ENTRY("CATAddr2lineServer::Initialize");
-	BOOL fSuccess;
-	m_sFullPathAndBinaryName = sFullPathAndBinaryName;
-
-    // The steps for redirecting child process's STDOUT:
-    //     1. Save current STDOUT, to be restored later.
-    //     2. Create anonymous pipe to be STDOUT for child process.
-    //     3. Set STDOUT of the parent process to be write handle to
-    //        the pipe, so it is inherited by the child process.
-    //     4. Create a noninheritable duplicate of the read handle and
-    //        close the inheritable read handle.
- 
-    // Save the handle to the current STDOUT. 
-    m_hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
-
-    // Create a pipe for the child process's STDOUT.
-    if (! CreatePipe(&m_hChildStdoutRd, &m_hChildStdoutWr, &m_saAttr, 0))
-		return PrintErrorAndExit( "Stdout pipe creation failed\n" );
-
-    // Set a write handle to the pipe to be STDOUT.
-   if (! SetStdHandle(STD_OUTPUT_HANDLE, m_hChildStdoutWr))
-		return PrintErrorAndExit( "Redirecting STDOUT failed\n" );
-
-    // Create noninheritable read handle and close the inheritable read
-    // handle.
-    fSuccess = DuplicateHandle(GetCurrentProcess(), m_hChildStdoutRd,
-        GetCurrentProcess(), &m_hChildStdoutRdDup , 0,
-        FALSE,
-        DUPLICATE_SAME_ACCESS);
-    if( !fSuccess )
-		return PrintErrorAndExit( "DuplicateHandle failed" );
-    CloseHandle(m_hChildStdoutRd);
-
-    // The steps for redirecting child process's STDIN:
-    //     1.  Save current STDIN, to be restored later.
-    //     2.  Create anonymous pipe to be STDIN for child process.
-    //     3.  Set STDIN of the parent to be the read handle to the
-    //         pipe, so it is inherited by the child process.
-    //     4.  Create a noninheritable duplicate of the write handle,
-    //         and close the inheritable write handle.
- 
-    // Save the handle to the current STDIN.
-    m_hSaveStdin = GetStdHandle(STD_INPUT_HANDLE);
-
-    // Create a pipe for the child process's STDIN.
-    if (! CreatePipe(&m_hChildStdinRd, &m_hChildStdinWr, &m_saAttr, 0))
-		return PrintErrorAndExit( "Stdin pipe creation failed\n" );
- 
-    // Set a read handle to the pipe to be STDIN. 
-    if (! SetStdHandle(STD_INPUT_HANDLE, m_hChildStdinRd)) 
-		return PrintErrorAndExit( "Redirecting Stdin failed\n" ); 
- 
-    // Duplicate the write handle to the pipe so it is not inherited. 
-	
-    fSuccess = DuplicateHandle(GetCurrentProcess(), m_hChildStdinWr, 
-        GetCurrentProcess(), &m_hChildStdinWrDup, 0, 
-        FALSE,                  // not inherited 
-        DUPLICATE_SAME_ACCESS); 
-    if (! fSuccess) 
-		return PrintErrorAndExit( "DuplicateHandle failed\n" );
-
-    CloseHandle(m_hChildStdinWr);
- 
-    // The steps for redirecting child process's ERROUT:
-    //     1. Save current STDOUT, to be restored later.
-    //     2. Create anonymous pipe to be STDOUT for child process.
-    //     3. Set STDOUT of the parent process to be write handle to
-    //        the pipe, so it is inherited by the child process.
-    //     4. Create a noninheritable duplicate of the read handle and
-    //        close the inheritable read handle.
- 
-    // Save the handle to the current STDOUT. 
-    m_hSaveErrout = GetStdHandle( STD_ERROR_HANDLE ); 
-
-    // Create a pipe for the child process's ERROUT.
-    if (! CreatePipe(&m_hChildErroutRd, &m_hChildErroutWr, &m_saAttr, 0))
-		return PrintErrorAndExit( "Errout pipe creation failed\n" );
-
-    // Set a write handle to the pipe to be ERROUT.
-   if (! SetStdHandle(STD_ERROR_HANDLE, m_hChildErroutWr))
-		return PrintErrorAndExit( "Redirecting ERROUT failed\n" );
-
-    // Create noninheritable read handle and close the inheritable read
-    // handle.
-   
-    fSuccess = DuplicateHandle(GetCurrentProcess(), m_hChildErroutRd,
-        GetCurrentProcess(), &m_hChildErroutRdDup , 0,
-        FALSE,
-        DUPLICATE_SAME_ACCESS);
-    if( !fSuccess )
-		return PrintErrorAndExit( "DuplicateHandle failed" );
-    
-	CloseHandle(m_hChildErroutRd);
-	CloseHandle(m_hChildErroutRdDup);
-	
-	// Now create the child process. 
-    fSuccess = CreateChildProcess();
-    if (!fSuccess )
-		return PrintErrorAndExit( "Create process failed\n" );
- 
-    // After process creation, restore the saved STDIN and STDOUT.
-	if (! SetStdHandle(STD_INPUT_HANDLE, m_hSaveStdin))
-        return PrintErrorAndExit( "Re-redirecting Stdin failed\n" );
-
-	if (! SetStdHandle(STD_OUTPUT_HANDLE, m_hSaveStdout))
-       return PrintErrorAndExit( "Re-redirecting Stdout failed\n" );
-
-	if (! SetStdHandle(STD_ERROR_HANDLE, m_hSaveErrout))
-       return PrintErrorAndExit( "Re-redirecting Stderrout failed\n" );
-
-	m_bProcessCreated = true;
-    return true;
-}
-BOOL CATAddr2lineServer::CreateChildProcess() 
-{ 
-    LOG_FUNC_ENTRY("CATAddr2lineServer::CreateChildProcess");
-    PROCESS_INFORMATION piProcInfo; 
-    STARTUPINFO siStartInfo;
-    BOOL bFuncRetn = FALSE; 
- 
-    // Set up members of the PROCESS_INFORMATION structure.
-    ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
- 
-	// Set up members of the STARTUPINFO structure.
-    ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
-    siStartInfo.cb = sizeof(STARTUPINFO); 
- 
-	//atool.exe:s path + filename
-	char buffer[MAX_PATH];
-
-	GetModuleFileName( NULL, buffer, MAX_PATH );
-
-	string sCommand( buffer );
-
-	//Remove 'atool.exe'
-	size_t tPos = sCommand.rfind( "\\" );
-	if ( tPos != string::npos )
-		sCommand.resize( sCommand.rfind( "\\" )+1 );
-	else
-		sCommand.clear();
-
-	sCommand.append( "addr2line.exe" );
-
-	//addr2line file exists
-	if( !CATBase::FileExists( sCommand.c_str() ) )
-		return PrintErrorAndExit( "File not found addr2line.exe\n" );
-
-	//Sym file exists
-	if( !CATBase::FileExists( m_sFullPathAndBinaryName.c_str() ) )
-	{
-		string sTemp( "File not found " );
-		sTemp.append( m_sFullPathAndBinaryName );
-		sTemp.append( "\n" );
-		return PrintErrorAndExit( sTemp );
-	}
-
-	sCommand.append(" -f -C -e ");
-	sCommand.append( m_sFullPathAndBinaryName );
-
-	// Create the child process. 
-    bFuncRetn = CreateProcess(NULL,
-		(LPSTR)sCommand.c_str(), // command line
-        NULL,          // process security attributes
-        NULL,          // primary thread security attributes
-        TRUE,          // handles are inherited
-        0,             // creation flags
-        NULL,          // use parent's environment
-        NULL,          // use parent's current directory
-        &siStartInfo,  // STARTUPINFO pointer
-        &piProcInfo);  // receives PROCESS_INFORMATION
-
-    if (bFuncRetn == 0)
-    {
-       //CreateProcess failed
-       return false;
-    }
-    else
-    {
-       CloseHandle(piProcInfo.hProcess);
-       CloseHandle(piProcInfo.hThread);
-       return bFuncRetn;
-    }
-}
-VOID CATAddr2lineServer::WriteToPipe( const string& sAddress ) 
-{ 
-	LOG_LOW_FUNC_ENTRY("CATAddr2lineServer::WriteToPipe");
-    DWORD dwRead, dwWritten;
-    CHAR chBuf[2]; //This is for enter key
-
-    //Write data to a pipe. 
-    dwRead = (DWORD)sAddress.length();
-	WriteFile(m_hChildStdinWrDup, sAddress.c_str(), dwRead, &dwWritten, NULL);
-
-	chBuf[0] = 0x0A; //Enter
-	chBuf[1] = 0; //NULL
-	//Write enter key to a pipe
-	WriteFile(m_hChildStdinWrDup, chBuf, 1, &dwWritten, NULL);
-} 
-string CATAddr2lineServer::ReadFromPipe(VOID) 
-{
-	LOG_LOW_FUNC_ENTRY("CATAddr2lineServer::ReadFromPipe");
-	string s;
-	DWORD dwRead;
-    CHAR chBuf[BUFSIZE];
-    // Read output from the child process, and save data to string.
-    ReadFile( m_hChildStdoutRdDup, chBuf, BUFSIZE, &dwRead, NULL);
-	s.append( chBuf );
-    return s;
-}
-bool CATAddr2lineServer::GetProcessCreatedState( void )
-{
-	LOG_LOW_FUNC_ENTRY("CATAddr2lineServer::GetProcessCreatedState");
-	return m_bProcessCreated;
-}
-bool CATAddr2lineServer::PrintErrorAndExit( const string sInput )
-{
-	LOG_FUNC_ENTRY("CATAddr2lineServer::PrintErrorAndExit");
-	cout << AT_MSG << sInput;
-	return false;
-}