dbgagents/trkagent/toolsstarter/toolsstarterserver/src/toolslaunchmgr.cpp
author ravikurupati
Tue, 02 Mar 2010 10:33:16 +0530
changeset 0 c6b0df440bee
permissions -rw-r--r--
Initial contribution of EPL licensed sources

/*
* 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: 
*
*/
// INCLUDE FILES
#include <e32std.h> 
#include <e32base.h>    
#include "logging.h"
#include "toolsusbportlistener.h"
#include "toolslaunchmgr.h" 

#define SafeDelete(x) { if (x) delete x; x = NULL; }

_LIT(KTRKSERVER, "trkserver.exe");
//_LIT(KTRACESERVER, "traceserver.exe");

_LIT(KCMDLINECONNTYPEUSB, "-usb");
_LIT(KCMDLINECONNTYPEXTI, "-xti");

                   
// LOCAL FUNCTION PROTOTYPES

// LOCAL CONSTANTS



//
// CToolsLaunchMgr::NewL
//
CToolsLaunchMgr* CToolsLaunchMgr::NewL()
{
	CToolsLaunchMgr* self = new(ELeave) CToolsLaunchMgr;
	self->ConstructL();
	return self;
}

//
// CTrkEngine::NewLC
//
CToolsLaunchMgr* CToolsLaunchMgr::NewLC()
{
	CToolsLaunchMgr* self = new(ELeave) CToolsLaunchMgr;
	CleanupStack::PushL(self);
	
	self->ConstructL();
	
	return self;
}


//
// CToolsLaunchMgr::ConstructL
// Constructor
//
void CToolsLaunchMgr::ConstructL() 
{
	iUsbPortListener = new CToolsUsbPortListener(this);	
	TRAPD(err, iUsbPortListener->ListenL());
	if (err != KErrNone)
	    LOG_MSG("Failed to start the USB port listener");
	
	// Adding TRKAPP to the launch list
	CToolsProcess* toolsProcess = CToolsProcess::NewL(KTRKSERVER, KCMDLINECONNTYPEUSB, KCMDLINECONNTYPEXTI);
	iToolsProcessList.Append(toolsProcess);

	// Adding TRACESWITCH app
	// For now, we are disabling the autostart of traceserver from toolsstarter
	// When traceserver connects to the tracecore ost ldd at bootup time, 
	// there is a problem for getting the data from the ldd.
	// Until this problem is fixed, traceswitch needs to be started after the bootup
	// for plug-n-play trace support.
	//_LIT(KNOXTI, "");
	
	//toolsProcess = CToolsProcess::NewL(KTRACESERVER, KCMDLINECONNTYPEUSB, KNOXTI);
	//iToolsProcessList.Append(toolsProcess);
}

//
// CToolsLaunchMgr::CToolsLaunchMgr
// Constructor
//
CToolsLaunchMgr::CToolsLaunchMgr()
			: iUsbPortListener(NULL),
			  iToolsProcessList(1),
			  iToolListenerList(1)
{
	
}

//
// CToolsLaunchMgr::~CToolsLaunchMgr
// Destructor
//
CToolsLaunchMgr::~CToolsLaunchMgr()
{
	SafeDelete(iUsbPortListener);
	iToolsProcessList.ResetAndDestroy();
	iToolsProcessList.Close();
	iToolListenerList.ResetAndDestroy();
	iToolListenerList.Close();
}

//
// CToolsLaunchMgr::Launch
//
void CToolsLaunchMgr::Launch() 
{
    if (iUsbPortListener->IsConnectionAvailable())
	{
		LaunchTools(EUsb);
	}
	else
	{
		LaunchTools(EXti);
	}
}

//
// CToolsLaunchMgr::ConnectionAvailable
//
void CToolsLaunchMgr::ConnectionAvailable() 
{
    
    for (TInt i=0; i<iToolListenerList.Count(); i++)
    {
         iToolListenerList[i]->ConnStatusChanged(EUsbConnected);        
        
    }
    
}

//
// CToolsLaunchMgr::LaunchTools
//
void CToolsLaunchMgr::LaunchTools(TCmdLineConnType aConnType) 
{ 
    // remove this process from our list
	for (TInt i=0; i<iToolsProcessList.Count(); i++)
	{
		TInt err = iToolsProcessList[i]->Start(aConnType);
		
		if (err != KErrNone)
		{
		   LOG_MSG2("Failed to start the process: %d", err);
		}
	}
}

//
// CToolsLaunchMgr::ConnectionAvailable
//
void CToolsLaunchMgr::ConnectionUnAvailable() 
{    
    for (TInt i=0; i<iToolListenerList.Count(); i++)
    {
        iToolListenerList[i]->ConnStatusChanged(EUsbNotConnected);        
       
    }
}

//
// CToolsLaunchMgr::StopTools
//
void CToolsLaunchMgr::StopTools() 
{
	// remove this process from our list
	for (TInt i=0; i<iToolsProcessList.Count(); i++)
	{
		iToolsProcessList[i]->Stop();
	} 
}
//
//  CToolsLaunchMgr::GetUsbConnStatus()
//
//  To Find out the usb connection status  
//
TConnectionStatus CToolsLaunchMgr::GetUsbConnStatus()
{
    return (iUsbPortListener->GetUsbConnStatus());
    
}
//
//  CToolsLaunchMgr::RegisterListener()
//
//  To register the cable connection events  
//

void CToolsLaunchMgr::RegisterListener(MConnStateListener* aListener)
{
    iToolListenerList.Append(aListener);
}

//
//  CToolsLaunchMgr::UnregisterListener()
//
//  To unregister the cable connection events  
//
void CToolsLaunchMgr::UnregisterListener(MConnStateListener* aListener)
{
    for (TInt i=0; i<iToolListenerList.Count(); i++)
    {
        if(iToolListenerList[i] == aListener)
        {
            iToolListenerList.Remove(i);
        }        
       
    }
            
}
//
//  CToolsLaunchMgr::CloseCrashLogger()
//
//  To close the mobile crash logger
//

TInt CToolsLaunchMgr::CloseCrashLogger()
{
    TInt err = KErrNone;
    
    //The old mobile crash file name is "d_exc_mc.exe" and the new one is "mc_useragent.exe"    
    //This is the string that needs to be passed to the RProcess::Open call to get a handle.
    //The complete process name actually includes the UID info as well.
    //Instead of hard coding the process name, its better to just 
    //search for the process and find it that way.      
    //_LIT16(KCrashLoggerName, "mc_useragent.exe[1020e519]0001");
    _LIT16(KOldCrashLoggerName, "d_exc_mc*");
    _LIT16(KCrashLoggerName, "mc_useragent*");
    
    err = TerminateProcess(KOldCrashLoggerName);
    err = TerminateProcess(KCrashLoggerName);

    return err;
}

//
//  CToolsLaunchMgr::TerminateProcess
//
//  Terminates the given process 
//
TInt CToolsLaunchMgr::TerminateProcess(const TDesC& aProcessName)
{
    _LIT16(KCrashLoggerClMsg, "Closing crash logger");
    
    TFindProcess find(aProcessName);
    TFullName name; 
        
    TInt err = find.Next(name);
    if (KErrNone == err)
    {   
        RProcess process;
        err = process.Open(find);
    
        if (KErrNone == err)
        {
            User::InfoPrint(KCrashLoggerClMsg);
            process.Kill(KErrNone);
        }
    }
    return err;
}