usbmgmt/usbmgr/host/functiondrivers/ms/msmm/server/src/subcommands.cpp
changeset 0 c9bc50fca66e
child 15 f92a4f87e424
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msmm/server/src/subcommands.cpp	Tue Feb 02 02:02:59 2010 +0200
@@ -0,0 +1,624 @@
+/*
+* 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 "subcommands.h"
+#include "msmmserver.h"
+#include "msmmengine.h"
+#include "msmmnodebase.h"
+#include "handlerinterface.h"
+#include "msmm_internal_def.h"
+#include <usb/hostms/msmmpolicypluginbase.h>
+#include <usb/hostms/srverr.h>
+
+#include <usb/usblogger.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, "UsbHostMsmmServer");
+#endif
+
+/**
+ *  TRegisterInterface member functions
+ */
+TRegisterInterface::TRegisterInterface(THostMsSubCommandParam aParam):
+TSubCommandBase(aParam),
+iDeviceNode(NULL),
+iInterfaceNode(NULL)
+    {
+    LOG_FUNC
+    }
+
+void TRegisterInterface::DoExecuteL()
+    {
+    LOG_FUNC
+      
+    // Add new interface node into data engine
+    iInterfaceNode = iServer.Engine().AddUsbMsInterfaceL(iEvent.iDeviceId, 
+            iEvent.iInterfaceNumber, iEvent.iInterfaceToken);
+    
+    iDeviceNode = iServer.Engine().SearchDevice(iEvent.iDeviceId);
+    if (!iDeviceNode)
+        {
+        User::Leave(KErrArgument);
+        }
+    
+    TUSBMSDeviceDescription& device = iDeviceNode->iDevice;
+
+    iMsConfig.iInterfaceToken = iEvent.iInterfaceToken;
+    iMsConfig.iInterfaceNumber = iEvent.iInterfaceNumber;        
+    iMsConfig.iVendorId = device.iVendorId;
+    iMsConfig.iProductId = device.iProductId;
+    iMsConfig.iBcdDevice = device.iBcdDevice;
+    iMsConfig.iConfigurationNumber = device.iConfigurationNumber;        
+    iMsConfig.iSerialNumber.Copy(device.iSerialNumber);
+    iMsConfig.iProtocolId = device.iProtocolId;
+    iMsConfig.iTransportId = device.iTransportId;
+    iMsConfig.iRemoteWakeup = device.iRemoteWakeup;
+    iMsConfig.iIsOtgClient = device.iIsOtgClient;
+
+    LOGTEXT2(_L8("\t iMsConfig.iProtocolId %d"), iMsConfig.iProtocolId);
+    LOGTEXT2(_L8("\t iMsConfig.iTransportId %d"), iMsConfig.iTransportId);
+    LOGTEXT2(_L8("\t iMsConfig.iRemoteWakeup %d"), iMsConfig.iRemoteWakeup);
+    LOGTEXT2(_L8("\t iMsConfig.iIsOtgClient %d"), iMsConfig.iIsOtgClient);
+
+    TSuspensionPolicy suspensionPolicy;
+    iServer.PolicyPlugin()->GetSuspensionPolicy(suspensionPolicy);
+    iMsConfig.iOtgSuspendTime = suspensionPolicy.iOtgSuspendTime;
+    iMsConfig.iStatusPollingInterval = suspensionPolicy.iStatusPollingInterval;
+
+    LOGTEXT2(_L8("\t iMsConfig.iStatusPollingInterval %d"), iMsConfig.iStatusPollingInterval);
+    LOGTEXT2(_L8("\t iMsConfig.iOtgSuspendTime %d"), iMsConfig.iOtgSuspendTime);
+
+    iHandler.Start();
+    iInterfaceNode->iUsbMsDevice.Add(iMsConfig, iHandler.Status());
+    }
+
+void TRegisterInterface::HandleError(THostMsErrData& aData, TInt aError)
+    {
+    LOG_FUNC
+    
+    switch (aError)
+        {
+    case KErrNoMemory:
+        aData.iError = EHostMsErrOutOfMemory;
+        break;
+    case KErrAlreadyExists:
+    case KErrArgument:
+        aData.iError = EHostMsErrInvalidParameter;
+        break;
+    default:
+        aData.iError = EHostMsErrGeneral;
+        }
+    aData.iE32Error = aError;
+    if (iDeviceNode)
+        {
+        TUSBMSDeviceDescription& device = iDeviceNode->iDevice;
+        aData.iManufacturerString.Copy(device.iManufacturerString);
+        aData.iProductString.Copy(device.iProductString);
+        aData.iDriveName = 0x0;        
+        }
+    if (iInterfaceNode)
+        {
+        iServer.Engine().RemoveUsbMsNode(iInterfaceNode);
+        iInterfaceNode = NULL;
+        }
+    }
+
+void TRegisterInterface::DoAsyncCmdCompleteL()
+    {
+    LOG_FUNC
+    
+    User::LeaveIfError(iHandler.Status().Int());
+    if(iInterfaceNode)
+        {
+        User::LeaveIfError(
+                iInterfaceNode->iUsbMsDevice.GetNumLun(iMaxLogicalUnit));
+        }
+
+    LOGTEXT2(_L8("\tGetNumLun %d"), iMaxLogicalUnit);
+    
+    iCreator.CreateSubCmdForRetrieveDriveLetterL(iMaxLogicalUnit);
+    }
+
+void TRegisterInterface::DoCancelAsyncCmd()
+    {
+    LOG_FUNC
+
+    if(iInterfaceNode)
+        {
+        iInterfaceNode->iUsbMsDevice.Remove();
+        iServer.Engine().RemoveUsbMsNode(iInterfaceNode);
+        iInterfaceNode = NULL;
+        }
+    }
+
+/**
+ *  TRetrieveDriveLetter member functions
+ */
+
+TRetrieveDriveLetter::TRetrieveDriveLetter(
+        THostMsSubCommandParam& aParameter, TInt aLuNumber):
+TSubCommandBase(aParameter),
+iLuNumber(aLuNumber),
+iDrive(0)
+    {
+    LOG_FUNC
+    }
+
+void TRetrieveDriveLetter::DoExecuteL()
+    {
+    LOG_FUNC
+        
+    TUsbMsDevice* deviceEntry(NULL);
+    deviceEntry = iServer.Engine().SearchDevice(iEvent.iDeviceId);
+    if (!deviceEntry)
+        {
+        User::Leave(KErrArgument);
+        }
+    else
+        {
+        TUSBMSDeviceDescription& device = deviceEntry->iDevice;
+
+        iRequestData.iBcdDevice = device.iBcdDevice;
+        iRequestData.iConfigurationNumber = device.iConfigurationNumber;
+        iRequestData.iInterfaceNumber = iEvent.iInterfaceNumber;
+        iRequestData.iDeviceId = iEvent.iDeviceId;
+        iRequestData.iProductId = device.iProductId;
+        iRequestData.iVendorId = device.iVendorId;
+        iRequestData.iLogicUnitNumber = iLuNumber;
+        iRequestData.iOtgInformation = device.iOtgInformation;
+        iRequestData.iManufacturerString = device.iManufacturerString;
+        iRequestData.iProductString = device.iProductString;
+        iRequestData.iSerialNumber = device.iSerialNumber;
+
+        iHandler.Start();
+        TRequestStatus& status = iHandler.Status();
+        iServer.PolicyPlugin()->RetrieveDriveLetterL(
+                iDrive, iRequestData, status);
+        }
+    }
+
+void TRetrieveDriveLetter::HandleError(THostMsErrData& aData, TInt aError)
+    {
+    LOG_FUNC
+    
+    switch (aError)
+        {
+    case KErrArgument:
+        aData.iError = EHostMsErrInvalidParameter;
+        break;
+    case KErrNotFound:
+        aData.iError = EHostMsErrNoDriveLetter;
+        break;
+    case KErrNoMemory:
+        aData.iError = EHostMsErrOutOfMemory;
+        break;
+    default:
+        aData.iError = EHostMsErrGeneral;
+        }
+    aData.iE32Error = aError;
+    aData.iManufacturerString = iRequestData.iManufacturerString;
+    aData.iProductString = iRequestData.iProductString;
+    aData.iDriveName = iDrive;
+    }
+
+void TRetrieveDriveLetter::DoAsyncCmdCompleteL()
+    {
+    LOG_FUNC
+    
+    User::LeaveIfError(iHandler.Status().Int());
+    
+    iCreator.CreateSubCmdForMountingLogicalUnitL(iDrive, iLuNumber);
+    }
+
+void TRetrieveDriveLetter::DoCancelAsyncCmd()
+    {
+    LOG_FUNC
+    
+    iServer.PolicyPlugin()->CancelRetrieveDriveLetter();
+    }
+
+/**
+ *  TMountLogicalUnit member functions
+ */
+
+TMountLogicalUnit::TMountLogicalUnit(THostMsSubCommandParam& aParameter,
+        TText aDrive, TInt aLuNumber):
+TSubCommandBase(aParameter),
+iDrive(aDrive),
+iLuNumber(aLuNumber)
+    {
+    LOG_FUNC
+    
+    iIsKeyCommand = EFalse;
+    }
+
+void TMountLogicalUnit::DoExecuteL()
+    {
+    LOG_FUNC
+    TInt ret(KErrNone);
+    RFs& fs = iServer.FileServerSession();
+    
+    TInt driveNum;
+    User::LeaveIfError(fs.CharToDrive(iDrive, driveNum));
+    
+    TUsbMsDevice* device = NULL;
+    TUsbMsInterface* interface = NULL;
+    device = iServer.Engine().SearchDevice(iEvent.iDeviceId);
+    if (!device)
+        {
+        User::Leave(KErrArgument);
+        }
+    interface = iServer.Engine().SearchInterface(device, iEvent.iInterfaceNumber);
+    if (!interface)
+        {
+        User::Leave(KErrArgument);
+        }
+    
+    ret = interface->iUsbMsDevice.MountLun(iLuNumber, driveNum);
+    if ((KErrNone != ret) && (KErrAlreadyExists != ret)
+            && (KErrNotReady != ret))
+        {
+        User::Leave (ret);
+        }
+
+    iHandler.Start();
+    iHandler.Complete();
+    }
+
+void TMountLogicalUnit::HandleError(THostMsErrData& aData, TInt aError)
+    {
+    LOG_FUNC
+    
+    switch (aError)
+        {
+    case KErrNoMemory:
+        aData.iError = EHostMsErrOutOfMemory;
+        break;
+    case KErrArgument:
+        aData.iError = EHostMsErrInvalidParameter;
+        break;
+    case KErrCorrupt:
+        {
+        aData.iError = EHostMsErrUnknownFileSystem;
+
+        // Current implementation of USB Mass Storage extension will mount
+        // a logical unit successfully even the logical unit is in an 
+        // unsupported format like NTFS or CDFS. So we have to recode this 
+        // Logical unit down in the our data engine in order to dismount it
+        // in future when the interface which presents this logical unit is
+        // dettached. Reuse DoAsyncCmdCompleteL to do this.
+
+        // Check if the new drive mounted successfully.
+        RFs& fs = iServer.FileServerSession();
+        TInt driveNum;
+        User::LeaveIfError(fs.CharToDrive(iDrive, driveNum));
+        
+        TDriveList drives;
+        User::LeaveIfError(fs.DriveList(drives));
+        
+        if (drives[driveNum])
+            {
+            // Drive name mounted
+            DoAsyncCmdCompleteL();
+            
+            // Restart the handler
+            iHandler.Start();
+            }
+        }
+        break;
+    default:
+        aData.iError = EHostMsErrGeneral;
+        }
+    aData.iE32Error = aError;
+    TUsbMsDevice* deviceNode = iServer.Engine().SearchDevice(iEvent.iDeviceId);
+    if (deviceNode)
+        {
+        aData.iManufacturerString.Copy(deviceNode->iDevice.iManufacturerString);
+        aData.iProductString.Copy(deviceNode->iDevice.iProductString);
+        }
+    aData.iDriveName = iDrive;
+    }
+
+void TMountLogicalUnit::DoAsyncCmdCompleteL()
+    {
+    LOG_FUNC
+   
+    iServer.Engine().AddUsbMsLogicalUnitL(
+            iEvent.iDeviceId, iEvent.iInterfaceNumber, 
+            iLuNumber, iDrive);
+    iCreator.CreateSubCmdForSaveLatestMountInfoL(iDrive, iLuNumber);
+    }
+
+/**
+ *  TSaveLatestMountInfo member functions
+ */
+
+TSaveLatestMountInfo::TSaveLatestMountInfo(
+        THostMsSubCommandParam& aParameter,
+        TText aDrive, TInt aLuNumber):
+TSubCommandBase(aParameter),
+iDrive(aDrive),
+iLuNumber(aLuNumber)
+    {
+    LOG_FUNC
+    
+    iIsKeyCommand = EFalse;
+    }
+
+void TSaveLatestMountInfo::DoExecuteL()
+    {
+    LOG_FUNC
+        
+    TUsbMsDevice* deviceEntry(NULL);
+    deviceEntry = iServer.Engine().SearchDevice(iEvent.iDeviceId);
+    if (!deviceEntry)
+        {
+        User::Leave(KErrArgument);
+        }
+    else
+        {
+        TPolicyRequestData& request = iRecord.iLogicUnit;
+        TUSBMSDeviceDescription& device = deviceEntry->iDevice;
+
+        request.iBcdDevice = device.iBcdDevice;
+        request.iConfigurationNumber = device.iConfigurationNumber;
+        request.iInterfaceNumber = iEvent.iInterfaceNumber;
+        request.iDeviceId = iEvent.iDeviceId;
+        request.iProductId = device.iProductId;
+        request.iVendorId = device.iVendorId;
+        request.iLogicUnitNumber = iLuNumber;
+        request.iOtgInformation = device.iOtgInformation;
+        request.iManufacturerString = device.iManufacturerString;
+        request.iProductString = device.iProductString;
+        request.iSerialNumber = device.iSerialNumber;
+
+        iRecord.iDriveName = iDrive;
+
+        iHandler.Start();
+        TRequestStatus& status = iHandler.Status();
+        
+        iServer.PolicyPlugin()->SaveLatestMountInfoL(iRecord, status);
+        }
+    }
+
+void TSaveLatestMountInfo::DoAsyncCmdCompleteL()
+    {
+    LOG_FUNC    
+    User::LeaveIfError(iHandler.Status().Int());
+    }
+
+void TSaveLatestMountInfo::HandleError(THostMsErrData& aData, TInt aError)
+    {
+    LOG_FUNC
+        
+    switch (aError)
+        {
+    case KErrNoMemory:
+        aData.iError = EHostMsErrOutOfMemory;
+        break;
+    case KErrArgument:
+        aData.iError = EHostMsErrInvalidParameter;
+        break;
+    default:
+        aData.iError = EHostMsErrGeneral;
+        }
+    aData.iE32Error = aError;
+    aData.iManufacturerString = iRecord.iLogicUnit.iManufacturerString;
+    aData.iProductString = iRecord.iLogicUnit.iProductString;
+    aData.iDriveName = iDrive;
+    }
+
+void TSaveLatestMountInfo::DoCancelAsyncCmd()
+    {
+    LOG_FUNC
+    
+    iServer.PolicyPlugin()->CancelSaveLatestMountInfo();
+    }
+
+
+/**
+ *  TDeregisterInterface member functions
+ */
+
+TDeregisterInterface::TDeregisterInterface(
+        THostMsSubCommandParam& aParameter, 
+        TUint8 aInterfaceNumber, TUint32 aInterfaceToken):
+TSubCommandBase(aParameter),
+iInterfaceNumber(aInterfaceNumber),
+iInterfaceToken(aInterfaceToken),
+iDeviceNode(NULL),
+iInterfaceNode(NULL)
+    {
+    LOG_FUNC
+    }
+
+void TDeregisterInterface::DoExecuteL()
+    {
+    LOG_FUNC
+   
+    iDeviceNode = iServer.Engine().SearchDevice(iEvent.iDeviceId);
+    if (!iDeviceNode)
+        {
+        User::Leave(KErrArgument);
+        }
+
+    iInterfaceNode = iServer.Engine().SearchInterface(iDeviceNode, 
+            iInterfaceNumber);
+    if (!iInterfaceNode)
+        {
+        User::Leave(KErrArgument);
+        }
+ 
+    TUSBMSDeviceDescription& device = iDeviceNode->iDevice;
+
+    iMsConfig.iInterfaceToken = iInterfaceToken;
+    iMsConfig.iVendorId = device.iVendorId;
+    iMsConfig.iProductId = device.iVendorId;
+    iMsConfig.iBcdDevice = device.iBcdDevice;
+    iMsConfig.iConfigurationNumber = device.iConfigurationNumber;
+    iMsConfig.iInterfaceNumber = iInterfaceNumber;
+    iMsConfig.iSerialNumber.Copy(device.iSerialNumber);
+    iInterfaceNode->iUsbMsDevice.Remove();
+
+    // Activate the handler.
+    iHandler.Start();
+    // Simulate a async request be completed.
+    iHandler.Complete();
+    }
+
+void TDeregisterInterface::HandleError(THostMsErrData& aData, TInt aError)
+    {
+    LOG_FUNC
+     
+    switch (aError)
+        {
+    case KErrNoMemory:
+        aData.iError = EHostMsErrOutOfMemory;
+        break;
+    case KErrArgument:
+        aData.iError = EHostMsErrInvalidParameter;
+        break;
+    default:
+        aData.iError = EHostMsErrGeneral;
+        }
+    aData.iE32Error = aError;
+    if (iDeviceNode)
+        {
+        aData.iManufacturerString.Copy(iDeviceNode->iDevice.iManufacturerString);
+        aData.iProductString.Copy(iDeviceNode->iDevice.iProductString);
+        }
+    aData.iDriveName = 0;
+    }
+
+/**
+ *  TDismountLogicalUnit member functions
+ */
+
+TDismountLogicalUnit::TDismountLogicalUnit(
+        THostMsSubCommandParam& aParameter,
+        const TUsbMsLogicalUnit& aLogicalUnit):
+TSubCommandBase(aParameter),
+iLogicalUnit(aLogicalUnit)
+    {
+    LOG_FUNC
+    }
+
+void TDismountLogicalUnit::DoExecuteL()
+    {
+    LOG_FUNC
+    RFs& fs = iServer.FileServerSession();
+    TInt driveNum;
+    fs.CharToDrive(iLogicalUnit.iDrive, driveNum);
+
+    TUsbMsInterface* interface(NULL);
+    interface = iLogicalUnit.Parent();
+    if (!interface)
+        {
+        User::Leave(KErrArgument);
+        }
+    User::LeaveIfError(interface->iUsbMsDevice.DismountLun(driveNum));
+    
+    // Activate the handler.
+    iHandler.Start();
+    // Simulate a async request be completed.
+    iHandler.Complete();
+    }
+
+void TDismountLogicalUnit::HandleError(THostMsErrData& aData, TInt aError)
+    {
+    LOG_FUNC
+    
+    switch (aError)
+        {
+    case KErrNoMemory:
+        aData.iError = EHostMsErrOutOfMemory;
+        break;
+    case KErrArgument:
+        aData.iError = EHostMsErrInvalidParameter;
+        break;
+    default:
+        aData.iError = EHostMsErrGeneral;
+        }
+    aData.iE32Error = aError;
+    TUsbMsDevice* deviceNode = iServer.Engine().SearchDevice(iEvent.iDeviceId);
+    if (deviceNode)
+        {
+        aData.iManufacturerString.Copy(deviceNode->iDevice.iManufacturerString);
+        aData.iProductString.Copy(deviceNode->iDevice.iProductString);
+        }
+    aData.iDriveName = iLogicalUnit.iDrive;
+    }
+
+/**
+ *  TRemoveUsbMsDeviceNode member functions
+ */
+
+TRemoveUsbMsDeviceNode::TRemoveUsbMsDeviceNode(
+        THostMsSubCommandParam& aParameter,
+        TMsmmNodeBase* aNodeToBeRemoved):
+TSubCommandBase(aParameter),
+iNodeToBeRemoved(aNodeToBeRemoved)
+    {
+    LOG_FUNC
+    }
+
+void TRemoveUsbMsDeviceNode::DoExecuteL()
+    {
+    LOG_FUNC
+    if(iNodeToBeRemoved)
+        {
+        iServer.Engine().RemoveUsbMsNode(iNodeToBeRemoved);
+        iNodeToBeRemoved = NULL;
+        }
+    else
+        {
+        User::Leave(KErrArgument);
+        }
+    
+    // Activate the handler.
+    iHandler.Start();
+    // Simulate a async request be completed.
+    iHandler.Complete();
+    }
+
+void TRemoveUsbMsDeviceNode::HandleError(THostMsErrData& aData, TInt aError)
+    {
+    LOG_FUNC  
+    switch (aError)
+        {
+    case KErrArgument:
+        aData.iError = EHostMsErrInvalidParameter;
+        break;
+    default:
+        aData.iError = EHostMsErrGeneral;
+        }
+    aData.iE32Error = aError;
+    TUsbMsDevice* deviceNode = iServer.Engine().SearchDevice(iEvent.iDeviceId);
+    if (deviceNode)
+        {
+        aData.iManufacturerString.Copy(deviceNode->iDevice.iManufacturerString);
+        aData.iProductString.Copy(deviceNode->iDevice.iProductString);
+        }
+    aData.iDriveName = 0;
+    }
+
+// End of file