usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdc.cpp
changeset 0 c9bc50fca66e
child 15 f92a4f87e424
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdc.cpp	Tue Feb 02 02:02:59 2010 +0200
@@ -0,0 +1,299 @@
+/*
+* Copyright (c) 2008-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 "msfdc.h"
+#include "utils.h"
+#include <d32usbc.h>
+#include <usbhost/internal/fdcpluginobserver.h>
+#include <d32usbdi.h>
+#include <d32usbdescriptors.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, "MsFdc");
+#endif
+/**
+  NewL function of CMsFdc, allocate the memory that needed for instantiating this object.
+ 
+  @param	aObserver   this is a pointer to the Observer object(FDF), MsFdc will get
+                       informations from FDF.
+  @return	A pointer to this CMsFdc object
+ */
+CMsFdc* CMsFdc::NewL(MFdcPluginObserver& aObserver)
+	{
+	LOG_STATIC_FUNC_ENTRY
+
+	CMsFdc* self = new(ELeave) CMsFdc(aObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	} 
+
+/**
+  Destructor of CMsFdc.
+ */
+CMsFdc::~CMsFdc()
+	{
+	LOG_FUNC
+	
+	iMsmmSession.Disconnect();
+	LOGTEXT(_L("Disconnected to MSMM OK"));
+#ifdef __FLOG_ACTIVE
+	CUsbLog::Close();
+#endif
+	}
+/**
+  Constructor of CMsFdc.
+ */
+CMsFdc::CMsFdc(MFdcPluginObserver& aObserver)
+:	CFdcPlugin(aObserver)
+	{
+	}
+/**
+  The Second phase construction of CMsFdc.
+ */
+void CMsFdc::ConstructL()
+	{
+
+#ifdef __FLOG_ACTIVE
+	CUsbLog::Connect();
+#endif
+	LOG_FUNC
+	
+	//Set up the connection with mount manager
+	TInt error = iMsmmSession.Connect();
+	if ( error )
+		{
+		LOGTEXT2(_L("Failed to connect to MSMM %d"),error);
+		User::Leave(error);
+		}
+	else
+		{
+		LOGTEXT(_L("Connected to MSMM OK"));
+		}
+	}
+/**
+  Get called when FDF is trying to load the driver for Mass Storage Device. 
+ 
+  @param	aDevice  	 				Device ID allocated by FDF for the newly inserted device
+  @param	aInterfaces					The interface array that contains interfaces to be claimed by this FDC
+                                       msfdc just claims the first one in this array.	
+  @param	aDeviceDescriptor			The device descriptor of the newly inserted device.
+  @param	aConfigurationDescriptor	The configuration descriptor of the newly inserted device.
+  @return	Any error that occurred or KErrNone
+ */
+TInt CMsFdc::Mfi1NewFunction(TUint aDeviceId,
+		const TArray<TUint>& aInterfaces,
+		const TUsbDeviceDescriptor& aDeviceDescriptor,
+		const TUsbConfigurationDescriptor& aConfigurationDescriptor)
+	{
+	LOG_FUNC // this is the evidence that the message got through.
+	LOGTEXT2(_L8("\t***** Mass Storage FD notified of device (ID %d) attachment!"), aDeviceId);
+	
+
+	// Mass Storage FDC only claims one interface.
+	LOGTEXT2(_L8("\t***** Mass Storage FD interface to request token is %d"), aInterfaces[0]);
+	TUint32 token = Observer().TokenForInterface(aInterfaces[0]);
+	LOGTEXT2(_L8("\t***** Mass Storage FD tokenInterface  %d"), token);
+	if (token == 0)
+		{
+		LOGTEXT(_L8("\t***** Mass Storage FDC device containing this function is removed."));
+		return KErrGeneral;
+		}
+
+	//Get the languages that is supported by this device.
+	TUint defaultlangid = 0;
+	TRAPD(error, GetDefaultLanguageL(aDeviceId, defaultlangid));
+
+	if (error)
+		{
+		LOGTEXT(_L8("\t***** Mass Storage FDC getting language array failed"));
+		return error;
+		}
+	
+	TUSBMSDeviceDescription* data = NULL;
+	TRAP(error, data = new (ELeave) TUSBMSDeviceDescription);
+	if (error)
+		{
+		LOGTEXT(_L8("\t***** Mass Storage FDC Memory allocation Failed"));		
+		return error;
+		}
+
+	//Get Serial number from string descriptor
+	error = Observer().GetSerialNumberStringDescriptor(aDeviceId, defaultlangid, 
+			data->iSerialNumber);
+	
+	if (error)
+		{
+		LOGTEXT(_L8("\t***** Mass Storage FDC getting Serial Number failed"));
+		delete data;
+		return error;
+		}
+	else
+		{
+		LOGTEXT2(_L("\t***** Mass Storage FDC Serial String is %S"), &data->iSerialNumber);
+		}
+	//Get Product string descriptor
+	error = Observer().GetProductStringDescriptor(aDeviceId, defaultlangid, data->iProductString);
+	
+
+	if (error)
+		{
+		LOGTEXT(_L8("\t***** Mass Storage FDC getting Product string failed"));
+		delete data;
+		return error;
+		}
+	else
+		{
+		LOGTEXT2(_L("\t***** Mass Storage FDC Product String is %S"), &data->iProductString);
+		}
+
+	//Get Manufacturer string descriptor
+	error = Observer().GetManufacturerStringDescriptor(aDeviceId, defaultlangid, 
+			data->iManufacturerString);
+	
+	if (error)
+		{
+		LOGTEXT(_L8("\t***** Mass Storage FDC getting Manufacturer string failed"));
+		delete data;
+		return error;
+		}
+	else
+		{
+		LOGTEXT2(_L("\t***** Mass Storage FDC Manufacturer String is %S"), 
+				&data->iManufacturerString);		
+		}	
+	
+	/************************Remote Wakeup Attribute acquiring***********************/
+	TUint8 attr = aConfigurationDescriptor.Attributes();
+
+	/************************Protocol ID & Transport ID******************************/
+	RUsbInterface interface_ep0;
+    TUsbInterfaceDescriptor ifDescriptor;
+    error = interface_ep0.Open(token);
+    if (error)
+    	{
+		LOGTEXT(_L8("\t***** Mass Storage FDC Open interface handle failed"));
+		delete data;
+		return error;
+    	}
+    else
+    	{
+		LOGTEXT(_L8("\t***** Mass Storage FDC Open interface handle OK"));
+    	}
+
+    error = interface_ep0.GetInterfaceDescriptor(ifDescriptor);
+    if (error)
+    	{
+		LOGTEXT(_L8("\t***** Mass Storage FDC get interface descriptor failed"));
+		interface_ep0.Close();
+		delete data;
+		return error;
+    	}
+    else
+    	{
+		LOGTEXT(_L8("\t***** Mass Storage FDC get interface descriptor OK"));
+    	}
+	
+	/*********************************************************************************/
+	
+	//Send informations to Mass Storage Mount Manager
+	
+	data->iConfigurationNumber   = aDeviceDescriptor.NumConfigurations();
+	data->iBcdDevice             = aDeviceDescriptor.DeviceBcd();
+	data->iDeviceId              = aDeviceId;
+	data->iProductId             = aDeviceDescriptor.ProductId();
+	data->iVendorId              = aDeviceDescriptor.VendorId();
+	
+	/*********************************************************************************/
+	data->iProtocolId  = ifDescriptor.InterfaceSubClass();
+	data->iTransportId = ifDescriptor.InterfaceProtocol();
+	
+	data->iRemoteWakeup = attr&0x20;  	// Bit 5 indicates the remote wakeup feature.
+	data->iIsOtgClient = 0;				// Put 0 into iIsOtgclient for now.
+	/*********************************************************************************/
+
+	//This OTG information may need to be changed when OTG descriptor becomes available.
+	data->iOtgInformation        = aDeviceDescriptor.DeviceBcd();
+	
+	error = iMsmmSession.AddFunction(*data, aInterfaces[0], token);
+	
+	interface_ep0.Close();
+	delete data;
+	return error;
+	}
+/**
+  Get called when FDF unload the function controller of the removed device.
+ 
+  @param	aDeviceId	The device ID that indicates that which device's been removed.
+ */
+void CMsFdc::Mfi1DeviceDetached(TUint aDeviceId)
+	{
+	LOG_FUNC // this is the evidence that the message got through.
+	LOGTEXT2(_L8("\t***** Mass Storage FD notified of device (ID %d) detachment!"), aDeviceId);
+	iMsmmSession.RemoveDevice(aDeviceId);
+
+	}
+
+/**
+  Convert the pointer of this CMsFdc object to a pointer to TAny
+ 
+  @param	aUid	A UID that indicate the interface that is needed..
+  @return	this pointer if aUid equals to the interface uid of CMsFdc or otherwise NULL.
+ */
+TAny* CMsFdc::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;
+	}
+/**
+  Get the default language ID that is supported by this Mass Storage device.
+ 
+  @param	aDeviceId		Device ID allocated by FDF
+  @param	aDefaultLangId	The first Language ID that supported by this device.
+  @return	KErrNone is everything is alright or KErrNotFound if the SupportedLanguage of 
+  			the device are unavailable.
+ */
+TInt CMsFdc::GetDefaultLanguageL(TUint aDeviceId, TUint& aDefaultLangId)
+{
+	const RArray<TUint>& languagearray = Observer().GetSupportedLanguagesL(aDeviceId);
+	if (languagearray.Count() <= 0)
+		{
+		return KErrNotFound; 
+		}
+	aDefaultLangId = languagearray[0];
+	return KErrNone;
+}
+
+