dbgagents/trkagent/xtidriver/TrkXtiSubscriber.cpp
author ravikurupati
Mon, 22 Mar 2010 11:28:32 +0530 (2010-03-22)
changeset 2 23ed33aed077
parent 0 c6b0df440bee
permissions -rw-r--r--
Updated the readme to reflect the current support.
/*
* Copyright (c) 2007 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 <e32def.h>
#include <e32cmn.h>
#include <arm.h>
#include <kernel.h>
#include <kern_priv.h>
#include <nk_trace.h>

#include "TrkXtiComm.h"

#include "TrkXtiDriver.h"
#include "TrkXtiSubscriber.h"

/**
 * Constructor
 */
DTrkXtiSubscriber::DTrkXtiSubscriber() : 
					iTraceMessageInitialized(FALSE),
					iHeaderBuf(NULL)
{
	LOG_MSG("DTrkXtiSubscriber::DTrkXtiSubscriber()");
}

DTrkXtiSubscriber::~DTrkXtiSubscriber() 
{
	LOG_MSG("DTrkXtiSubscriber::~DTrkXtiSubscriber()");
	// Unsubscribe here
	Unsubscribe(kIntTrkMessageId);
	if (iHeaderBuf)
	{
		delete iHeaderBuf;
		iHeaderBuf = NULL;
	}
	
}

TInt DTrkXtiSubscriber::Create(DTrkXtiChannel* aChannel, DThread* aClient)
{
	LOG_MSG("DTrkXtiSubscriber::Create()");
	
	iChannel = aChannel; //Don't add ref the channel, since channel closes the event handler before it ever gets destroyed.

	TInt err = aClient->Open();
	
	if (err != KErrNone)
	{
		LOG_MSG("DTrkXtiSubscriber::Create() - Thread Opened, error");
		return err;
	}
		
	iClientThread = aClient;

	// subscribe to receive trk messages from TraceCore
	err = Subscribe( kIntTrkMessageId ); //  To do: replace with SOS_MON_TRK_SEND_MESSAGE_REQ 

	if (err != KErrNone)

		return err;
		
	return KErrNone;	

}

void DTrkXtiSubscriber::MessageReceived(TTraceMessage& aMessage)

{ 
	LOG_MSG("DTrkXtiSubscriber::MessageReceived()");

	if (!iTraceMessageInitialized)
	{ 

		iTraceMessage.iHeader = NULL;

		iTraceMessageInitialized = TRUE; 

	}
	
	StoreMessage (aMessage);
	// iTraceMessage.iMessageId = 0x45;  
	LOG_MSG2("iTraceMessage.iHeader->Length() = %d", iTraceMessage.iHeader->Length());
  	LOG_MSG2("aMessage.iHeader->Length() = %d", aMessage.iHeader->Length());
  	LOG_MSG2("aMessage.iData->Length() = %d", aMessage.iData->Length());

	iChannel->DoCompleteRx(*aMessage.iData);

}

TInt DTrkXtiSubscriber::Send(TDesC8& aMessage)
{
	LOG_MSG("DTrkXtiSubscriber::Send()");
	
	if (!iTraceMessageInitialized)
	{
		LOG_MSG("Trace message header not initialized");
		return KErrNotReady;
	}
		
	
	iTraceMessage.iData = &aMessage;
	// Replace this with SOS_MON_TRK_SEND_MESSAGE_RESP when get the new tracecore header
	iTraceMessage.iMessageId = 0x45;
	
	TInt err = KErrNone;
	
	err = iMessageSender->SendMessage(iTraceMessage);
	LOG_MSG2("iMessageSender->SendMessage, error = %d", err);
	LOG_MSG2("iTraceMessage.iHeader->Length() = %d", iTraceMessage.iHeader->Length());
	LOG_MSG2("iTraceMessage.iData->Length() = %d", iTraceMessage.iData->Length());
	
	return err;
}

/**
 * Stores the header from the incoming message
 */
void DTrkXtiSubscriber::StoreMessage( const TTraceMessage& aMessage )
{
    LOG_MSG("DTrkXtiSubscriber::StoreMessage()");
    if (iHeaderBuf == NULL)
    {
        iHeaderBuf = HBuf8::New(aMessage.iHeader->Length( ));
    }
    iHeaderBuf->Copy( *aMessage.iHeader );
    iTraceMessage = aMessage; // Copy message
    iTraceMessage.iHeader = iHeaderBuf; // Assign copy of header
}