sysanadatacapture/piprofiler/piprofiler/engine/src/WriterController.cpp
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:52:57 +0200
changeset 1 3ff3fecb12fe
permissions -rw-r--r--
Add initial version of PI Profiler under EPL

/*
* 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 <piprofiler/EngineUIDs.h>
#include <piprofiler/ProfilerTraces.h>

#include "WriterController.h"

const TInt KMaxWriterPluginCount = 10;


CWriterController* CWriterController::NewL(CProfilerSampleStream& aStream)
    {
    CWriterController* self = new( ELeave ) CWriterController(aStream);
    CleanupStack::PushL( self );
    self->ConstructL( );
    CleanupStack::Pop( self );
    return self;
    }

CWriterController::CWriterController(CProfilerSampleStream& aStream) : 
    iStream(aStream)
    {
    }

void CWriterController::ConstructL()
	{
	// initiate writer plugin list

	}


void CWriterController::InitialiseWriterListL()
    {
    // create new writer plugin array
    iPluginArray = new(ELeave) CArrayPtrFlat<CWriterPluginInterface>( KMaxWriterPluginCount );
    
    // create new writer plugin loader
    iPluginLoader = CWriterPluginLoader::NewL();
    iPluginLoader->SetObserver( this );
    iPluginLoader->LoadAsyncL( iPluginArray );

    LOGTEXT(_L(" RWriterController::InitialiseWriterList - exit"));	
    }

CWriterController::~CWriterController()
    {
    LOGTEXT(_L("RWriterController::~RWriterController" ));
    if ( iPluginArray )
        {
        // destroy the plugin instances
        // empty loaded plugins from array
        for(TInt i(0);i<iPluginArray->Count();i++)
            {
            if(iPluginArray->At(i))
                {
                delete iPluginArray->At(i);
                iPluginArray->At(i) = NULL;
                }
            }
        iPluginArray->Reset();
        delete iPluginArray;
        iPluginArray = NULL;
        }
    
    if ( iPluginLoader )
        {
        iPluginLoader->AbortAsyncLoad();
        delete iPluginLoader;
        iPluginLoader = NULL;
        }

    }


void CWriterController::InitialisePluginStream()
	{
	LOGTEXT(_L("RWriterController::InitialisePluginStream - entry"));
	TInt pluginCount(iPluginArray->Count());
	
	if( iPluginArray && pluginCount > 0 )
	    {
		LOGSTRING2("RWriterController::InitialisePluginStream - plugin count %d, searching through", pluginCount);
	  	for(TInt i=0;i<pluginCount;i++)
	  	    {
  			LOGSTRING2("RWriterController::InitialisePluginStream - getting plugin n:o: %d...", i);
	    	CWriterPluginInterface* plugin = iPluginArray->At(i);
	  		LOGSTRING2("RWriterController::InitialisePluginStream - writer found, 0x%x, initializing stream...", plugin->Id());
    		plugin->SetStream(iStream);
	  		LOGTEXT(_L("RSamplerController::InitialisePluginStream - succeeded!"));
	  	    }
	  	}
	LOGTEXT(_L("RSamplerController::InitialisePluginStream - exit"));

	}

CArrayPtrFlat<CWriterPluginInterface>* CWriterController::GetPluginList()
    {
	return iPluginArray;
    }

void CWriterController::HandlePluginLoaded( KWriterPluginLoaderStatus aStatus )
    {
    
    switch(aStatus)
        {
        case 0:
            LOGSTRING2("RWriterController - one plugin loaded, status: %d", aStatus);
            break;
        case 1:
            LOGSTRING2("RWriterController - a plugin load failed: %d", aStatus);
            break;
        case 2:
            LOGSTRING2("RWriterController - plugin loading aborted: %d", aStatus);
            break;
        case 3:
            LOGSTRING2("RWriterController - all plugins loaded: %d", aStatus);
            // set stream after all loaded writer plugins
            InitialisePluginStream();
            break;
        case 4:
            LOGSTRING2("RWriterController - error in loading plugins: %d", aStatus);
            break;
        default:
            break;
        }
    }



TUid CWriterController::GetPluginUID(TInt traceId)
    {
	LOGSTRING2(" RWriterController::GetPluginUID - checking UID for traceId = %d",traceId);	
	// this part has to be changed for each new writer

    if( iPluginArray && iPluginArray->Count() > 0 )
        {
        for(TInt i=0;i<iPluginArray->Count();i++)
            {
            CWriterPluginInterface* plugin = iPluginArray->At(i); 
            if(plugin->Id().iUid == traceId)
                {
                LOGSTRING2(" RWriterController::GetPluginUID - got: 0x%X",plugin->Id());	
                return plugin->Id();
                }
            }
        }	
	return KWriterNoneSelected;

    }

CWriterPluginInterface* CWriterController::GetActiveWriter()
    {
    CWriterPluginInterface* plugin = NULL;
    TInt count(iPluginArray->Count());
    if( iPluginArray && count > 0 )
        {
        for(TInt i=0;i<count;i++)
            {
            plugin = iPluginArray->At(i); 
            if(plugin->GetEnabled())
                {
                return plugin;
                }
            }
        }
    return (CWriterPluginInterface*)0;
    }

TUint32 CWriterController::GetWriterType(TUint32 writerId)
    {
    TUid id;
    
    id = this->GetPluginUID(writerId);
    
    if(id != KWriterNoneSelected)
        return GetPlugin(id)->GetWriterType();
    else
        return 0;
    }

CWriterPluginInterface* CWriterController::GetPlugin(TUid aUid)
    {
    if( iPluginArray && iPluginArray->Count() > 0 )
        {
        for(TInt i=0;i<iPluginArray->Count();i++)
            {
            CWriterPluginInterface* plugin = iPluginArray->At(i); 
            // check if searched uid found
            if(plugin->Id().iUid == aUid.iUid)
                {
                // return pointer to found plugin
                return plugin;
                }
            }
        }
    // return null plugin
	return (CWriterPluginInterface*)0;
    }

TInt CWriterController::StartSelectedPlugin()
	{
	LOGTEXT(_L("RWriterController::StartSelectedPlugin - entry"));
	
    CWriterPluginInterface* plugin = GetActiveWriter();
    
    if(plugin)
        {
        return plugin->Start();
		}
    
	LOGTEXT(_L("RWriterController::StartSelectedPlugin - exit"));
	return KErrNotFound;
	}

void CWriterController::StopSelectedPlugin()
	{
	LOGTEXT(_L("RWriterController::StopSelectedPlugin - entry"));
    
    CWriterPluginInterface* plugin = GetActiveWriter();
    
	if(plugin)
		{
		plugin->Stop();
		}
	LOGTEXT(_L("RWriterController::StopSelectedPlugin - exit"));
	}

/** Set selected plugin active **/
void CWriterController::SetPluginActive(TUid uid, const TWriterPluginValueKeys aKey)
    {
	CWriterPluginInterface* plugin = NULL;
	_LIT(KDummy, "");
	TBuf<1> buf;
	buf.Append(KDummy);

	for(TInt i(0);i<iPluginArray->Count();i++)
	    {
	    plugin = iPluginArray->At(i);
	    if(plugin->Id().iUid == uid.iUid)
	        {
	        plugin->SetValue(aKey, buf);
	        }
	    else
	        {
	        plugin->SetValue(EWriterPluginDisabled, buf);
	        }
	    }
    }

TInt CWriterController::SetPluginSettings(TUid aUid, TDes& aDes)
    {
	LOGSTRING2(" CWriterController::SetPluginSettings, traceId = 0x%X", aUid.iUid);	
	GetPlugin(aUid)->SetValue(EWriterPluginSettings, aDes);
	return KErrNone;
    }

/** Get settings for a specific plugin **/
void CWriterController::GetPluginSettings(TUid uid, TDes& aVal)
    {
	GetPlugin(uid)->GetValue(EWriterPluginSettings, aVal);
    }


// end of file