supl/locationomasuplprotocolhandler/protocolhandlerver1/src/epos_comasuplendstate.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:20:18 +0300
branchRCL_3
changeset 19 02ba3f1733c6
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201030 Kit: 201033

/*
* Copyright (c) 2002-2005 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 for handling SUPL_END message.
*
*/



#include <hash.h>

#include "epos_comasuplend.h"
#include "lbs/epos_comasuplposition.h"
#include "lbs/epos_eomasuplposerrors.h"
#include "lbs/epos_comasuplvelocity.h"

#include "epos_comasupltrace.h"
#include "epos_comasuplendstate.h"
#include "epos_omasuplconstants.h"

#include "epos_comasuplasnbase.h"

_LIT(KTraceFileName,"SUPL_OMA_SESSION::EPos_COMASuplEndState.cpp");

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// COMASuplEndState::COMASuplEndState
// C++ constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
COMASuplEndState::COMASuplEndState(COMASuplEnd::TOMASuplStatusCode aStatusCode,COMASuplAsnHandlerBase* aOMASuplAsnHandlerBase):
																	 iOMASuplAsnHandlerBase(aOMASuplAsnHandlerBase)
    {
			iMessageTimeOut = 0; 
			iCurrentState = ESUPL_END;   
			iStatusCode = aStatusCode;
			iSetStatusCode = ETrue;
    }

// -----------------------------------------------------------------------------
// COMASuplEndState::COMASuplEndState
// C++ constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
COMASuplEndState::COMASuplEndState(COMASuplAsnHandlerBase* aOMASuplAsnHandlerBase):iOMASuplAsnHandlerBase(aOMASuplAsnHandlerBase)
    {
			iMessageTimeOut = 0; 
			iCurrentState = ESUPL_END; 
			iSetStatusCode = EFalse;  
    } 
// -----------------------------------------------------------------------------
// COMASuplEndState::~COMASuplEndState
// -----------------------------------------------------------------------------
//
COMASuplEndState::~COMASuplEndState()
    {
    	delete iHSLPAddress;
    	delete iEncodedSuplInit;
    }

// -----------------------------------------------------------------------------
// COMASuplEndState::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void COMASuplEndState::ConstructL(HBufC8* aEncodedSuplInit, HBufC8* aHSLPAddress)
    {
    	COMASuplState::BaseConstructL();
    	iTrace->Trace(_L("COMASuplEndState::ConstructL..."), KTraceFileName, __LINE__); 							

		if(aEncodedSuplInit)    	
		{
	    	TInt len = aEncodedSuplInit->Length();
	    	if(len > 0)
	    	{
	    		iEncodedSuplInit = HBufC8::NewL(len);
	    		*iEncodedSuplInit = *aEncodedSuplInit;
	       	}
			
		}
    
    	if(aHSLPAddress)	
    	{
	    	TInt len = aHSLPAddress->Length();
   	
	    	if(len > 0)
	    	{
			   	iHSLPAddress = HBufC8::NewL(len);
			  	*iHSLPAddress = *aHSLPAddress;
	    	}
    		
    	}

    }

// -----------------------------------------------------------------------------
// COMASuplEndState::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
COMASuplEndState* COMASuplEndState::NewL(COMASuplEnd::TOMASuplStatusCode aStatusCode,COMASuplAsnHandlerBase* aOMASuplAsnHandlerBase,
										 HBufC8* aEncodedSuplInit,
										 HBufC8* aHSLPAddress)
    {
	    COMASuplEndState* self =  new ( ELeave ) COMASuplEndState(aStatusCode,aOMASuplAsnHandlerBase);
	    CleanupStack::PushL( self );
	    self->ConstructL(aEncodedSuplInit, aHSLPAddress);
	    CleanupStack::Pop(self);
	    return self;
    }
// -----------------------------------------------------------------------------
// COMASuplEndState::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
COMASuplEndState* COMASuplEndState::NewL(COMASuplAsnHandlerBase* aOMASuplAsnHandlerBase,HBufC8* aEncodedSuplInit, HBufC8* aHSLPAddress)
    {
	    COMASuplEndState* self =  new ( ELeave ) COMASuplEndState(aOMASuplAsnHandlerBase);
	    CleanupStack::PushL( self );
	    self->ConstructL(aEncodedSuplInit, aHSLPAddress);
	    CleanupStack::Pop(self);
	    return self;
    }
// -----------------------------------------------------------------------------
// COMASuplEndState::GenerateMessage
// Generates SUPL_END message
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt COMASuplEndState::GenerateMessageL() 
	{
		iTrace->Trace(_L("Start of COMASuplEndState::GenerateMessage"), KTraceFileName, __LINE__); 
		if(iEncodedSuplInit)
		{
			iVerPresent = ComputeSuplEndVerL();
			
			if(iVerPresent)
			{
				if(iMsgStateObserver)
				{
					iMsgStateObserver->OperationCompleteL(KErrNone);
					return KErrNone;
				}
			
			}
			else
			{
				iMsgStateObserver->OperationCompleteL(KErrGeneral);
				return KErrGeneral;
			}
		}
		else
		{
			if(iMsgStateObserver)
			{
				iMsgStateObserver->OperationCompleteL(KErrNone);
				return KErrNone;
			}
		}
		
		return KErrNone;		
	}
	
// -----------------------------------------------------------------------------
// COMASuplEndState::EncodeMessageL
// Encodes message ...returns encoded data
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
HBufC8* COMASuplEndState::EncodeMessageL(TOMASuplVersion &aSuplVersion,COMASuplSessionID* aSessionId,
										 TInt &aError)
	{
		iTrace->Trace(_L("Start of COMASuplEndState::Encode_SUPL_END"), KTraceFileName, __LINE__); 					
		
		COMASuplState::EncodeMessageL(aSuplVersion,aSessionId,aError);

		
		COMASuplAsnMessageBase* OMASuplMessageBase = iOMASuplAsnHandlerBase->CreateOMASuplMessageL(COMASuplAsnMessageBase::ESUPL_END);
		CleanupStack::PushL(OMASuplMessageBase);
		COMASuplEnd* OMASuplEnd  =  static_cast<COMASuplEnd*>(OMASuplMessageBase);
		
		iTrace->Trace(_L("**************** SUPL END **********************"), KTraceFileName, __LINE__);
		iTrace->Trace(_L("Created COMASuplEnd"), KTraceFileName, __LINE__); 							
		
		OMASuplEnd->SetMessageBase(aSuplVersion,aSessionId); 
		if(iSetStatusCode)
			{
	 			OMASuplEnd->SetStatusCode(iStatusCode);		
	 			iTrace->Trace(_L("Status Code in SUPL_END :"), KTraceFileName, __LINE__); 											
				TBuf<64> Res;			
				Res.AppendNum(iStatusCode);
				iTrace->Trace(Res, KTraceFileName, __LINE__); 
			}		
			
		if(iEncodedSuplInit)
			{
				OMASuplEnd->SetVer(iRes);
	 		}

		iTrace->Trace(_L("Starting Encoding...SUPL_END"), KTraceFileName, __LINE__); 							
		
		TInt error = KErrNone;
		HBufC8 *encodedBuffer = NULL;		

		TRAPD(err,encodedBuffer = iOMASuplAsnHandlerBase->EncodeL(OMASuplEnd,error));
		
		CleanupStack::PopAndDestroy(OMASuplEnd);
		
		iTrace->Trace(_L("Encoding Done..."), KTraceFileName, __LINE__); 
		
		 if ( error == KErrNone && err == KErrNone )
		 	{
		 			aError = KErrNone;
					return encodedBuffer;
		 	}
		 else
		 	{
		 		iTrace->Trace(_L("Encoding Failed."), KTraceFileName, __LINE__); 
				aError = error;	
		 		delete encodedBuffer;
		 		encodedBuffer = NULL;
		 	}
		 	
 	return NULL;
}

// -----------------------------------------------------------------------------
// COMASuplEndState::StartTimer
// StartTimer...starts the timer ... depending on type of message
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void COMASuplEndState::StartTimer()
	{
		iTrace->Trace(_L("COMASuplEndState::StartTimer...No Use."), KTraceFileName, __LINE__); 							
	}


// -----------------------------------------------------------------------------
// COMASuplEndState::ComputeSuplEndVerL
// Generates SUPL_POS_INIT message
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TBool COMASuplEndState::ComputeSuplEndVerL()
{
	if(!iEncodedSuplInit) //Terminal initiated case
	{
		return ETrue;
	}
	
	if(iEncodedSuplInit && (iEncodedSuplInit->Length()) > 0 &&
	iHSLPAddress && iHSLPAddress->Length() > 0)
	{
		TBuf<64> serverCheck;
	serverCheck.Copy(*iHSLPAddress);
	iTrace->Trace(_L("Server Address for VER : "), KTraceFileName, __LINE__); 
	iTrace->Trace(serverCheck, KTraceFileName, __LINE__); 
	
		TInt blockSize = 64;
	    TChar ipad = 0x36;
	    TChar opad = 0x5c;
	    TBuf8<64> key0;
	    TInt i;

	    CMessageDigest* sha1 = CMessageDigestFactory::NewDigestLC(
	                                CMessageDigest::ESHA1 );

	    // Step 1: Append 0x00 to the key to create a string of size = blocksize
	    key0.SetLength( blockSize );
	    key0.FillZ();
	    
	    if ( iHSLPAddress->Length() != blockSize )
	        {
	        // If key greater than the block size of digest which is 64
	        // then hash the key to get a 20 byte code
	        if ( iHSLPAddress->Length() > blockSize )
	            {
	            TPtrC8 hashedKey = sha1->Hash(*iHSLPAddress );
	            for ( i = 0; i < hashedKey.Length(); i++ )
	                {
	                key0[i] = hashedKey[i];
	                }
	            sha1->Reset();
	            }
	        else if ( iHSLPAddress->Length() < blockSize )
	            {
	            for ( i = 0; i < iHSLPAddress->Length(); i++ )
	                {
	                key0[i] = (*iHSLPAddress)[i];
	                }
	            }
	        }
	    else
	        {
	        for ( i = 0; i < iHSLPAddress->Length(); i++ )
	            {
	            key0[i] = (*iHSLPAddress)[i];
	            }
	        } 
	    
	    
	     // Step 2: XOR the string obtained in Step 1 with ipad
	    for ( TInt i = 0; i < blockSize; i++ )
	        {
	        iRes.Append( key0[i] ^ ipad );
	        }
	        
#ifdef PRINT_MESSAGE
   	    iTrace->Trace(_L("ipad of server address  "), KTraceFileName, __LINE__); 					
	    PrintHex(iRes,__LINE__); 
#endif
	    
	    // Step 3: Append the message to the string resulting from Step 2
	    HBufC8* messageKeyString = 
	            HBufC8::NewLC( iEncodedSuplInit->Size() + iRes.Size() );
	    messageKeyString->Des().Append( iRes );
	    messageKeyString->Des().Append( *iEncodedSuplInit );

	    
	    // Step 4: Generate hash code of the string resulting in Step 3
	    iRes.FillZ();
	    iRes.Zero();
	    TPtrC8 innerHashedMessage = sha1->Hash( messageKeyString->Des() );
	    HBufC8* step4Msg = HBufC8::NewLC(innerHashedMessage.Size());
	    step4Msg->Des().Append(innerHashedMessage);
	    sha1->Reset();
	    // Truncate the hash output to 64 bits
	     
	    
	    // Step 5: XOR the string obtained in Step 1 with opad
	    
        HBufC8* hmacString = HBufC8::NewLC( step4Msg->Size() + blockSize );
	    for ( TInt i = 0; i < blockSize; i++ )
	        {
	        hmacString->Des().Append( key0[i] ^ opad );
	        }
	    
#ifdef PRINT_MESSAGE
   	    iTrace->Trace(_L("xor ofserver address with opad"), KTraceFileName, __LINE__); 					
	    PrintHex(hmacString->Des(),__LINE__); 
#endif
	    
	    // Step 6: Append the string obtained in step 4 to the string 
	    // obtained in Step 5
	    
        hmacString->Des().Append( step4Msg->Des() );
	  
	    
	    // Step 7: Generate hash code of the string resulting from Step 6
	    iRes.FillZ();
	    iRes.Zero();
	    TPtrC8 hmacSha1Code = sha1->Hash( hmacString->Des() );

	    // Truncate hash output to 64 bits
	    iRes.Copy( hmacSha1Code.Ptr(), 8 );

	    CleanupStack::PopAndDestroy( hmacString );
        CleanupStack::PopAndDestroy( step4Msg );
	    CleanupStack::PopAndDestroy( messageKeyString );
	    CleanupStack::PopAndDestroy( sha1 );
	    
#ifdef PRINT_MESSAGE
   		iTrace->Trace(_L("Final ver..."), KTraceFileName, __LINE__); 							
		PrintHex(iRes,__LINE__);
#endif
	    return ETrue;
			
	}
	
	return EFalse;
}


// -----------------------------------------------------------------------------
// COMASuplEndState::ProcessMessage
// process message...
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TInt COMASuplEndState::ProcessMessageL(COMASuplAsnMessageBase* aDecodedMessage)
{

			COMASuplEnd* OMASuplEnd = static_cast <COMASuplEnd *>(aDecodedMessage);
			COMASuplEnd::TOMASuplStatusCode statusCode;
			TInt error = OMASuplEnd->StatusCode(statusCode);
            iStatusCode = statusCode;
			OMASuplEnd->Position(iOMASuplPosition);	
			LogReceivedPosition();
            
			if(error == KErrOMASuplParamNotSet )
			    {
			    //OMASuplEnd->Position(iOMASuplPosition); // Changed by Manish					
			    return KErrNone;
			    }			
			else
			    {
			    return KErrCompletion;  //Error in status code
			    }	
}

// -----------------------------------------------------------------------------
// COMASuplEndState::CancelOperation
// Cancels Operation...Cancels operation
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void COMASuplEndState::CancelOperation() 
	{ 
		 COMASuplState::CancelOperation();	
		 iTrace->Trace(_L("COMASuplEndState::CancelOperation..."), KTraceFileName, __LINE__); 							
	}	
	
// -----------------------------------------------------------------------------
// COMASuplEndState::GetPosition
// Retrive Position
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
COMASuplPosition* COMASuplEndState::GetPosition() const
{
		return iOMASuplPosition;
}

void COMASuplEndState::LogReceivedPosition() const 
	{
#ifdef PRINT_MESSAGE
            if (iOMASuplPosition)            
                {            
  	            TBuf <300> positionLog;
	            positionLog.Copy(_L("-------Position Log in SUPL END------------"));
                TOMASuplUtcTime utcTime;
                TOMASuplPositionEstimate posEstimate;
	            TDateTime lDateTime;
	            TInt  	  zoneCode;
	            TInt      zone;
	        
	            iTrace->Trace(positionLog, KTraceFileName, __LINE__); 
                iOMASuplPosition->GetPosition(utcTime,posEstimate );
                utcTime.GetUtcTime(lDateTime,zoneCode,zone);		
    
	            positionLog.Copy(_L("UTC Time Log : "));
	            positionLog.Append(_L("Year : "));
	            positionLog.AppendNum(lDateTime.Year());
	            positionLog.Append(_L("Month : "));
	            positionLog.AppendNum(lDateTime.Month());
	            positionLog.Append(_L("Day : "));
	            positionLog.AppendNum(lDateTime.Day());	
	            positionLog.Append(_L("Hour : "));
	            positionLog.AppendNum(lDateTime.Hour());	
	            positionLog.Append(_L("Minute : "));
	            positionLog.AppendNum(lDateTime.Minute());	
	            positionLog.Append(_L("Second : "));
	            positionLog.AppendNum(lDateTime.Second());	
	            iTrace->Trace(positionLog, KTraceFileName, __LINE__); 
	            positionLog.Copy(_L("MicroSecond : "));
	            positionLog.AppendNum(lDateTime.MicroSecond());	
	            positionLog.Append(_L("Zone Code : "));
	            positionLog.AppendNum(zoneCode);	
	            positionLog.Append(_L("Zone : "));
	            positionLog.AppendNum(zone);
		
	            iTrace->Trace(positionLog, KTraceFileName, __LINE__); 
	
	            TOMASuplPositionEstimate::TOMASuplLatitudeSign  latSign;
                TInt               latitude;
                TInt               longitude;
                posEstimate.GetPositionEstimate(latSign,latitude,longitude);
                positionLog.Copy(_L("Position Estimate : "));
	            positionLog.Append(_L("latitude Sign : "));
	            positionLog.AppendNum(latSign);
	            positionLog.Append(_L(" Latitude : "));
	            positionLog.AppendNum(latitude);
	            positionLog.Append(_L(" Longitude : "));
	            positionLog.AppendNum(longitude);	
	
	            iTrace->Trace(positionLog, KTraceFileName, __LINE__); 
	
	            TOMASuplUncertainty uncertainty;
	            TInt logError = posEstimate.GetUncertainty(uncertainty);
	            if(!logError)
		            {
		            TInt uncertSemiMajor;
       	            TInt uncertSemiMinor;
       	            TInt orientMajorAxis;
       	            uncertainty.GetUncertainty(uncertSemiMajor,uncertSemiMinor,orientMajorAxis);
       	
       	            positionLog.Copy(_L("Uncertainity Semi Major : "));
		            positionLog.AppendNum(uncertSemiMajor);
		            positionLog.Append(_L(" Uncertainity Semi Minor : "));
		            positionLog.AppendNum(uncertSemiMinor);
		            positionLog.Append(_L(" Orientation Major Axis : "));
		            positionLog.AppendNum(orientMajorAxis);	
		            }
	
	            iTrace->Trace(positionLog, KTraceFileName, __LINE__);
	            // Retrieve Confidence
	            TInt confidence;
	            logError = posEstimate.GetConfidence(confidence);
	            if(!logError)
		            {
		            positionLog.Copy(_L("Confidence in Position : "));	
		            positionLog.AppendNum(confidence);	
	                iTrace->Trace(positionLog, KTraceFileName, __LINE__);
		            }
	
	            TOMASuplAltitudeInfo altitudeInfo;
	            logError = posEstimate.GetAltitudeInfo(altitudeInfo);
	            if(!logError)
		            {
		            TOMASuplAltitudeInfo::TOMASuplAltitudeDirection altDirection;
    	            TInt altitude;
       	            TInt altUncert;
       	            altitudeInfo.GetAltitudeInfo(altDirection,altitude,altUncert);
       	
       	            positionLog.Copy(_L("Altitude Information "));
	                iTrace->Trace(positionLog, KTraceFileName, __LINE__);
       	
       	            positionLog.Copy(_L("Altitude Direction : "));
		            positionLog.AppendNum(altDirection);
		            positionLog.Append(_L(" Altitude : "));
		            positionLog.AppendNum(altitude);
		            positionLog.Append(_L(" Altitude Uncertainity : "));
		            positionLog.AppendNum(altUncert);
		            }
	            iTrace->Trace(positionLog, KTraceFileName, __LINE__);
	
	            COMASuplVelocity* velocity = NULL;
                logError = iOMASuplPosition->GetVelocity(velocity);
                if(!logError)			
    	            {
    	            iTrace->Trace(_L("Velocity Information"), KTraceFileName, __LINE__);
                    if(velocity)
		                {		
		                TBuf<256> msg;
		                TOMASuplVelocityType velocityType = velocity->VelType();
		                COMASuplHorizVelocity* horizVelocity = velocity->Velocity();
		                TUint16 bearing;
		                TUint16 horSpeed;
		                switch(velocityType)	
			                {
				            case  EHorizVelocity:
					            {
					            iTrace->Trace(_L("Velocity Type : EHorizVelocity - Values "), KTraceFileName, __LINE__);
					            horizVelocity->GetHorizVel(bearing,horSpeed);
					
					            msg.Copy(_L("Bearing : "));
					            msg.AppendNum(bearing);
					            msg.Append(_L(" Horizontal Speed : "));
					            msg.AppendNum(horSpeed);
					            iTrace->Trace(msg, KTraceFileName, __LINE__);
					            break;
					            }
				            case EHorizAndVertVelocity:
					            {
					            TUint8 verDirect;
					            TUint8 verSpeed;
					            COMASuplHorizAndVertVelocity* horizVertVel = (COMASuplHorizAndVertVelocity*)horizVelocity;
					            horizVertVel->GetHorizAndVertVel(bearing,horSpeed,verDirect,verSpeed);
					
					            iTrace->Trace(_L("Velocity Type : EHorizVelocity - Values "), KTraceFileName, __LINE__);
										
					            msg.Copy(_L("Bearing : "));
					            msg.AppendNum(bearing);
					            msg.Append(_L(" Horizontal Speed : "));
					            msg.AppendNum(horSpeed);
					            msg.Append(_L(" Vertical Direction : "));
					            msg.AppendNum(verDirect);
					            msg.Append(_L(" Vertical Speed : "));
					            msg.AppendNum(verSpeed);					
					            iTrace->Trace(msg, KTraceFileName, __LINE__);
					
					            break;
					            }
				            case EHorizUncertVelocity: 
					            {
					            TUint8 uncertSpeed;
					            COMASuplHorizUncertVelocity* horizUncertVel = (COMASuplHorizUncertVelocity*)horizVelocity;
	
					            horizUncertVel->GetHorizUncertVel(bearing,horSpeed,uncertSpeed);	
					
					            iTrace->Trace(_L("Velocity Type : EHorizUncertVelocity - Values "), KTraceFileName, __LINE__);
										
					            msg.Copy(_L("Bearing : "));
					            msg.AppendNum(bearing);
					            msg.Append(_L(" Horizontal Speed : "));
					            msg.AppendNum(horSpeed);
					            msg.Append(_L(" Uncertainity Speed : "));
					            msg.AppendNum(uncertSpeed);
							
					            iTrace->Trace(msg, KTraceFileName, __LINE__);
					
					            break;
					            }
				            case EHorizAndVertUncertVelocity:
					            {
					            TUint8  verDirect;
					            TUint8  verSpeed;
					            TUint8  horizUncertSpeed;
					            TUint8  vertUncertSpeed;
										
					            COMASuplHorizAndVertUncertVelocity* horizVertUncertVel = (COMASuplHorizAndVertUncertVelocity*)horizVelocity;

					            horizVertUncertVel->GetHorizVertUncertVel(bearing,horSpeed,verDirect,verSpeed,
																horizUncertSpeed,vertUncertSpeed);
					
					            iTrace->Trace(_L("Velocity Type : EHorizAndVertUncertVelocity - Values "), KTraceFileName, __LINE__);
										
					            msg.Copy(_L("Bearing : "));
					            msg.AppendNum(bearing);
					            msg.Append(_L(" Horizontal Speed : "));
					            msg.AppendNum(horSpeed);
					            msg.Append(_L(" Vertical Direction : "));
					            msg.AppendNum(verDirect);
					            msg.Append(_L(" Vertical Speed : "));
					            msg.AppendNum(verSpeed);					
					            msg.Append(_L(" Horiz Uncertain Speed : "));
					            msg.AppendNum(horizUncertSpeed);
					            msg.Append(_L(" Vertical Uncertain Speed : "));
					            msg.AppendNum(vertUncertSpeed);					
					            iTrace->Trace(msg, KTraceFileName, __LINE__);																					
				                break;																
					            }
			                }
		                }
    	            }
                }
#endif            
		
	}

void COMASuplEndState::PrintHex(const TDesC8& 
#ifdef PRINT_MESSAGE
aBuffer
#endif
,TInt 
#ifdef PRINT_MESSAGE
aLine
#endif
)
	{
#ifdef PRINT_MESSAGE
			TBuf<256> buffer;
			TBuf<2> buff;
			_LIT16(KFormat1,"%02x");
			TInt len = aBuffer.Length();
			for(TInt i = 0 ; i <len; i++)
				{
					buff.Zero();
					buff.Format(KFormat1,aBuffer[i]);
					buffer.Append(buff);	
					buffer.Append(_L(" "));	
				}

				iTrace->Trace(buffer, KTraceFileName, aLine); 											
#endif
	}

COMASuplEnd::TOMASuplStatusCode COMASuplEndState::GetStatusCode()
    {
    return iStatusCode;
    }    
//  End of File