usbmgmt/usbmgr/host/fdf/reference/reffdc/src/reffdc.cpp
changeset 0 c9bc50fca66e
child 15 f92a4f87e424
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/host/fdf/reference/reffdc/src/reffdc.cpp	Tue Feb 02 02:02:59 2010 +0200
@@ -0,0 +1,166 @@
+/*
+* Copyright (c) 2007-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 "reffdc.h"
+#include <usb/usblogger.h>
+#include <usbhost/internal/fdcpluginobserver.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, "reffdc   ");
+#endif
+
+CRefFdc* CRefFdc::NewL(MFdcPluginObserver& aObserver)
+	{
+	LOG_LINE
+	LOG_STATIC_FUNC_ENTRY
+
+	CRefFdc* self = new(ELeave) CRefFdc(aObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CRefFdc::~CRefFdc()
+	{
+	LOG_LINE
+	LOG_FUNC
+	}
+
+CRefFdc::CRefFdc(MFdcPluginObserver& aObserver)
+:	CFdcPlugin(aObserver)
+	{
+	}
+
+void CRefFdc::ConstructL()
+	{
+	LOG_FUNC
+	}
+
+TInt CRefFdc::Mfi1NewFunction(TUint aDeviceId,
+		const TArray<TUint>& aInterfaces,
+		const TUsbDeviceDescriptor& aDeviceDescriptor,
+		const TUsbConfigurationDescriptor& aConfigurationDescriptor)
+	{
+	LOG_LINE
+	LOG_FUNC
+	LOGTEXT2(_L8("\t***** Ref FD offered chance to claim one function from device with ID %d"), aDeviceId);
+	(void)aDeviceId;
+
+	TRAPD(err, NewFunctionL(aDeviceId, aInterfaces, aDeviceDescriptor, aConfigurationDescriptor));
+
+	// If any error is returned, RUsbInterface (etc) handles opened from this 
+	// call must be closed.
+	LOGTEXT2(_L8("\terr = %d"), err);
+	return err;
+	}
+
+void CRefFdc::NewFunctionL(TUint aDeviceId,
+		const TArray<TUint>& aInterfaces,
+		const TUsbDeviceDescriptor& /*aDeviceDescriptor*/,
+		const TUsbConfigurationDescriptor& /*aConfigurationDescriptor*/)
+	{
+	LOG_LINE
+	LOG_FUNC
+
+	// We are obliged to claim the first interface because it has 
+	// interface class/subclass(/protocol) settings matching our default_data 
+	// field.
+	// We must take further interfaces until we have claimed a single complete 
+	// function. We must do this regardless of any error that occurs.
+	TUint32 token = Observer().TokenForInterface(aInterfaces[0]);
+	// The token may now be used to open a RUsbInterface handle.
+	(void)token;
+
+	// aDeviceDescriptor is accurate but currently useless. FDCs may not 
+	// 'reject' a device on any basis.
+
+	// aConfigurationDescriptor may be walked to find interface descriptors 
+	// matching interface numbers in aInterfaces.
+
+	// Illustrate how string descriptors may be obtained for 
+	// subsystem-specific purposes.
+	const RArray<TUint>& langIds = Observer().GetSupportedLanguagesL(aDeviceId);
+	const TUint langCount = langIds.Count();
+	LOGTEXT2(_L8("\tdevice supports %d language(s):"), langCount);
+	for ( TUint ii = 0 ; ii < langCount ; ++ii )
+		{
+		LOGTEXT2(_L8("\t\tlang code: 0x%04x"), langIds[ii]);
+		TName string;
+		TInt err = Observer().GetManufacturerStringDescriptor(aDeviceId, langIds[ii], string);
+		if ( !err )
+			{
+			LOGTEXT2(_L("\t\t\tmanufacturer string descriptor = \"%S\""), &string);
+			err = Observer().GetProductStringDescriptor(aDeviceId, langIds[ii], string);
+			if ( !err )
+				{
+				LOGTEXT2(_L("\t\t\tproduct string descriptor = \"%S\""), &string);
+				err = Observer().GetSerialNumberStringDescriptor(aDeviceId, langIds[ii], string);
+				if ( !err )
+					{
+					LOGTEXT2(_L("\t\t\tserial number string descriptor = \"%S\""), &string);
+					}
+				else
+					{
+					LOGTEXT2(_L("\t\t\tGetSerialNumberStringDescriptor returned %d"), err);
+					}
+				}
+			else
+				{
+				LOGTEXT2(_L("\t\t\tGetProductStringDescriptor returned %d"), err);
+				}
+			}
+		else
+			{
+			LOGTEXT2(_L("\t\t\tGetManufacturerStringDescriptor returned %d"), err);
+			}
+		}
+	}
+
+void CRefFdc::Mfi1DeviceDetached(TUint aDeviceId)
+	{
+	LOG_LINE
+	LOG_FUNC
+	LOGTEXT2(_L8("\t***** Ref FD notified of detachment of device with ID %d"), aDeviceId);
+	(void)aDeviceId;
+
+	// Any RUsbInterface (etc) handles opened as a result of any calls to 
+	// MfiNewFunction with this device ID should be closed.
+	}
+
+TAny* CRefFdc::GetInterface(TUid aUid)
+	{
+	LOG_LINE
+	LOG_FUNC;
+	LOGTEXT2(_L8("\taUid = 0x%08x"), aUid);
+
+	TAny* ret = NULL;
+	if ( aUid == TUid::Uid(KFdcInterfaceV1) )
+		{
+		ret = reinterpret_cast<TAny*>(
+			static_cast<MFdcInterfaceV1*>(this)
+			);
+		}
+
+	LOGTEXT2(_L8("\tret = [0x%08x]"), ret);
+	return ret;
+	}