obex/obexprotocol/obex/src/OBEXUTIL.CPP
author hgs
Tue, 19 Oct 2010 11:00:12 +0800
changeset 57 f6055a57ae18
parent 0 d0791faffa3f
permissions -rw-r--r--
201041_03

// Copyright (c) 1997-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:
//

/**
 @file
 @internalComponent
*/

#include <e32std.h>
#include <obextransportinfo.h>
#include <obexirtransportinfo.h>
#include <obexbttransportinfo.h>
#include <obexusbtransportinfo.h>
#include "obexcommon.h"
#include "OBEXUTIL.H"
#include "obexfaults.h"


void IrOBEXUtil::Panic(TObexPanicCode aCode)
	{
	User::Panic(KObexPanicCategory, aCode);
	}


void IrOBEXUtil::Fault(TObexFaultCode aCode)
	{
	User::Panic(KObexFaultCategory, aCode);
	}

/**
Converts aResp to an EPOC error number 
*/
TInt IrOBEXUtil::EpocError(TUint8 aResp)
	{
	switch (aResp)
		{
	case ERespContinue:
	case ERespSuccess:
	case ERespCreated:
	case ERespAccepted:
		return (KErrNone);
	case ERespBadRequest:
	case ERespUnauthorized:
	case ERespForbidden:
	case ERespNotAcceptable:
	case ERespMethodNotAllowed:
		return (KErrArgument);
	case ERespNotFound:
		return (KErrNotFound);
	case ERespTimedOut:
		return (KErrTimedOut);
	case ERespConflict:
		return (KErrInUse);
	case ERespNotImplemented:
		return (KErrNotSupported);
	default:
		return (KErrIrObexRespBase - aResp);
		}
	}

/**
Returns a TObexTransportInfo created from the received aObexProtocolInfoPtr and aObexProtocolPolicy
to be used in the transport layer
*/
TObexTransportInfo* IrOBEXUtil::CreateTransportInfoL(TObexProtocolInfo& aObexProtocolInfoPtr, TObexProtocolPolicy& aObexProtocolPolicy)
	{
	TObexTransportInfo* transportInfo = NULL;

	if ( aObexProtocolInfoPtr.iTransport == KObexIrTTPProtocol )
		{
		transportInfo = new(ELeave) TObexIrTransportInfo;
		TObexIrProtocolInfo& irProtocolInfo = static_cast<TObexIrProtocolInfo&>(aObexProtocolInfoPtr);
		static_cast<TObexIrTransportInfo*>(transportInfo)->iAddr  = irProtocolInfo.iAddr;
		static_cast<TObexIrTransportInfo*>(transportInfo)->iClassName = irProtocolInfo.iClassName;
		static_cast<TObexIrTransportInfo*>(transportInfo)->iAttributeName = irProtocolInfo.iAttributeName;		
		}
	else if ( aObexProtocolInfoPtr.iTransport == KObexIrTTPProtocolV2 )
		{
		transportInfo = new(ELeave) TObexIrV2TransportInfo;
		TObexIrProtocolInfo& irProtocolInfo = static_cast<TObexIrProtocolInfo&>(aObexProtocolInfoPtr);
		static_cast<TObexIrV2TransportInfo*>(transportInfo)->iAddr  = irProtocolInfo.iAddr;
		static_cast<TObexIrV2TransportInfo*>(transportInfo)->iClassName = irProtocolInfo.iClassName;
		static_cast<TObexIrV2TransportInfo*>(transportInfo)->iAttributeName = irProtocolInfo.iAttributeName;
		static_cast<TObexIrV2TransportInfo*>(transportInfo)->iDiscoverySlots = irProtocolInfo.iDiscoverySlots;
		static_cast<TObexIrV2TransportInfo*>(transportInfo)->iDiscoveryAttempts = irProtocolInfo.iDiscoveryAttempts;
		}
	else if ( aObexProtocolInfoPtr.iTransport == KObexRfcommProtocol )
		{
		transportInfo = new(ELeave) TObexBtTransportInfo;
		TObexBluetoothProtocolInfo& btProtocolInfo = static_cast<TObexBluetoothProtocolInfo&>(aObexProtocolInfoPtr);
		static_cast<TObexBtTransportInfo*>(transportInfo)->iAddr = btProtocolInfo.iAddr;
		}
#ifdef __WINS__
	else if ( aObexProtocolInfoPtr.iTransport == KObexUsbProtocol || aObexProtocolInfoPtr.iTransport == KObexWin32UsbProtocol )
#else
	else if ( aObexProtocolInfoPtr.iTransport == KObexUsbProtocol)
#endif
		{
		transportInfo = new(ELeave) TObexUsbTransportInfo();
		TObexUsbProtocolInfo& usbTransportInfo = static_cast<TObexUsbProtocolInfo&>(aObexProtocolInfoPtr);
		static_cast<TObexUsbTransportInfo*>(transportInfo)->iInterfaceStringDescriptor = usbTransportInfo.iInterfaceStringDescriptor;			
		}
	else if ( aObexProtocolInfoPtr.iTransport == KObexUsbProtocolV2 )
		{
		transportInfo = new(ELeave) TObexUsbV2TransportInfo();
		TObexUsbProtocolInfoV2& usbV2TransportInfo = static_cast<TObexUsbProtocolInfoV2&>(aObexProtocolInfoPtr);
		static_cast<TObexUsbV2TransportInfo*>(transportInfo)->iInterfaceStringDescriptor = usbV2TransportInfo.iInterfaceStringDescriptor;	
		static_cast<TObexUsbV2TransportInfo*>(transportInfo)->iBandwidthPriority = usbV2TransportInfo.iBandwidthPriority;
		static_cast<TObexUsbV2TransportInfo*>(transportInfo)->iDmaOnOutEndpoint = usbV2TransportInfo.iDmaOnOutEndpoint;
		static_cast<TObexUsbV2TransportInfo*>(transportInfo)->iDmaOnInEndpoint = usbV2TransportInfo.iDmaOnInEndpoint;	
		}
		
	__ASSERT_DEBUG(transportInfo, Fault(EUtilNoTransportInfo));
	transportInfo->iTransportName = aObexProtocolInfoPtr.iTransport;
	transportInfo->iReceiveMtu = aObexProtocolPolicy.ReceiveMtu();
	transportInfo->iTransmitMtu = aObexProtocolPolicy.TransmitMtu();
	transportInfo->iVersion = KObexTransportInfoVersion0;
	return transportInfo;
	}

/**	
Converts aErr to an obex response.

@return aDefault if aErr == KErrNone, else the appriate obex response
*/	
TObexResponse IrOBEXUtil::ObexResponse (TInt aErr, TObexResponse aDefault)
	{ 
	switch (aErr)
		{
		case KErrNone:
			return (aDefault);
		case KErrNotFound:
		case KErrPathNotFound:
		case KErrUnknown:
		case KErrBadName:
			return (ERespNotFound);
		case KErrNotSupported:
			return (ERespNotImplemented);
		case KErrAlreadyExists:
		case KErrInUse:
			return (ERespConflict);
		case KErrAccessDenied:
			return (ERespUnauthorized);
		case KErrLocked:
			return (ERespForbidden);
		case KErrTimedOut:
			return (ERespTimedOut);
		default:
			{ 
			//check if it's one of the Symbian codes which has been set aside for 
			//mapping to an official OBEX code
			//unfortunately these are not continuous and exist in 4 discrete blocks
			
			if (( (aErr <= KErrIrObexRespSuccess ) && (aErr >= KErrIrObexRespPartialContent))
				||( (aErr <=KErrIrObexRespMultipleChoices) && (aErr >= KErrIrObexRespUseProxy))
				||( (aErr<=KErrIrObexRespBadRequest) && (aErr>=KErrIrObexRespHTTPVerNotSupp) )
				||( (aErr <= KErrIrObexRespDatabaseFull) && (aErr >= KErrIrObexRespDatabaseLocked)))
				{
				
				
				TInt err = aErr * -1;
	
				err += KErrIrObexRespBase;

				
					
				return ( static_cast<TObexResponse>(err) );

				}
			//in all other cases the error code isn't understood
			return (ERespInternalError);
			}
		}
	}

//
// End of file