mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetstorageinfo.cpp
changeset 0 d0791faffa3f
child 12 8b094906a049
child 18 1b39655331a3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetstorageinfo.cpp	Tue Feb 02 01:11:40 2010 +0200
@@ -0,0 +1,337 @@
+// Copyright (c) 2006-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:
+//
+
+#include <mtp/tmtptyperequest.h>
+#include <mtp/mmtpdataproviderframework.h>
+#include <mtp/mmtpobjectmgr.h>
+#include <mtp/cmtptypestorageinfo.h>
+#include <mtp/cmtptypestring.h>
+
+#include "cmtpgetstorageinfo.h"
+#include "cmtpstoragemgr.h"
+#include "mtpdevicedpconst.h"
+#include "mtpdevdppanic.h"
+#include "rmtpdevicedpsingletons.h"
+#include "cmtpdevicedpconfigmgr.h"
+
+// Class constants.
+__FLOG_STMT(_LIT8(KComponent,"GetStorageInfo");)
+
+/**
+Verification data for GetStorageInfo request
+*/
+const TMTPRequestElementInfo KMTPGetStorageInfoPolicy[] = 
+    {
+        {TMTPTypeRequest::ERequestParameter1, EMTPElementTypeStorageId, EMTPElementAttrNone, 0, 0, 0}
+    };
+
+/**
+Two-phase construction method
+@param aPlugin	The data provider plugin
+@param aFramework	The data provider framework
+@param aConnection	The connection from which the request comes
+@return a pointer to the created request processor object
+*/    
+MMTPRequestProcessor* CMTPGetStorageInfo::NewL(
+											MMTPDataProviderFramework& aFramework,
+											MMTPConnection& aConnection)
+	{
+	CMTPGetStorageInfo* self = new (ELeave) CMTPGetStorageInfo(aFramework, aConnection);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+/**
+Destructor
+*/	
+CMTPGetStorageInfo::~CMTPGetStorageInfo()
+	{	
+	delete iStorageInfo;
+	iSingletons.Close();
+	__FLOG_CLOSE;
+	}
+	
+/**
+Standard c++ constructor
+*/	
+CMTPGetStorageInfo::CMTPGetStorageInfo(
+									MMTPDataProviderFramework& aFramework,
+									MMTPConnection& aConnection)
+	:CMTPRequestProcessor(aFramework, aConnection,sizeof(KMTPGetStorageInfoPolicy)/sizeof(TMTPRequestElementInfo), KMTPGetStorageInfoPolicy)
+	{
+	}
+
+/**
+GetStorageInfo request handler
+Build storage info data set and send the data to the initiator
+*/		
+void CMTPGetStorageInfo::ServiceL()
+	{
+	TUint32 storageId = Request().Uint32(TMTPTypeRequest::ERequestParameter1);	
+	
+	if ( iSingletons.StorageMgr().LogicalStorageId(storageId)  )
+	    {
+	    if ( iSingletons.StorageMgr().LogicalStorageOwner(storageId) == iFramework.DataProviderId() )
+	        {
+	        BuildStorageInfoL();
+	        SendDataL(*iStorageInfo);		
+	        }
+	    else
+	        {
+	        SendResponseL(EMTPRespCodeStoreNotAvailable);
+	        }
+	    }
+	else if ( iSingletons.StorageMgr().PhysicalStorageId(storageId) )
+	    {
+	    if ( iSingletons.StorageMgr().PhysicalStorageOwner(storageId) == iFramework.DataProviderId() )
+	        {
+	        BuildStorageInfoL();
+	        SendDataL(*iStorageInfo);		
+	        }
+	    else
+	        {
+	        SendResponseL(EMTPRespCodeStoreNotAvailable);
+	        }
+	    }
+	else
+	    {
+        // Storage Id is not valid
+        SendResponseL(EMTPRespCodeInvalidStorageID);
+        }
+	}
+
+/**
+Second-phase construction
+*/		
+void CMTPGetStorageInfo::ConstructL()
+	{
+	__FLOG_OPEN(KMTPSubsystem, KComponent);
+	iStorageInfo = CMTPTypeStorageInfo::NewL();
+	iSingletons.OpenL();
+	}
+
+/**
+Populate the storage info data set
+*/	
+void CMTPGetStorageInfo::BuildStorageInfoL()
+	{
+	SetupDriveVolumeInfoL();
+    SetStorageTypeL();
+    SetFileSystemTypeL();
+    SetAccessCapabilityL();
+    SetMaxCapacityL();
+    SetFreeSpaceInBytesL();
+    SetFreeSpaceInObjectsL();
+    SetStorageDescriptionL();
+    SetVolumeIdentifierL();		
+	}
+
+/**
+Set the drive volume info in the storage info data set
+*/
+void CMTPGetStorageInfo::SetupDriveVolumeInfoL()
+	{
+	TUint32 storageId = Request().Uint32(TMTPTypeRequest::ERequestParameter1);	
+	TInt driveNo(iFramework.StorageMgr().DriveNumber(storageId));
+	User::LeaveIfError(driveNo);
+	RFs& fs = iFramework.Fs();
+	User::LeaveIfError(fs.Drive(iDriveInfo, driveNo));
+	User::LeaveIfError(fs.Volume(iVolumeInfo, driveNo));
+	}
+	
+/**
+Set the storage type in the storage info data set
+*/
+void CMTPGetStorageInfo::SetStorageTypeL()
+	{
+	TUint16 storageType = EMTPStorageUndefined;
+	switch(iDriveInfo.iType)
+		{
+		case EMediaNotPresent:
+			User::Leave(KErrDisMounted);
+			break;
+		case EMediaUnknown:		
+			break;
+			
+		case EMediaCdRom:
+			storageType = EMTPStorageRemovableROM;			
+			 break;
+		case EMediaRam:
+		case EMediaNANDFlash:
+			storageType = EMTPStorageFixedRAM;
+			break;
+		case EMediaRom:
+			storageType = EMTPStorageFixedROM;
+			break;
+		case EMediaHardDisk:
+		case EMediaFlash:					
+		case EMediaRemote:
+		case EMediaFloppy:
+			storageType = EMTPStorageRemovableRAM;
+			break;
+		default:
+			break;
+		}
+	TMTPTypeUint16 mtpStorageType(storageType);	
+	iStorageInfo->SetL(CMTPTypeStorageInfo::EStorageType, mtpStorageType);
+	}
+
+/**
+Set the file system type in the storage info data set
+*/
+void CMTPGetStorageInfo::SetFileSystemTypeL()
+	{
+	TMTPTypeUint16 mtpFileSystemType(EMTPFileSystemGenericHierarchical);	
+	iStorageInfo->SetL(CMTPTypeStorageInfo::EFileSystemType, mtpFileSystemType);	
+	}
+	
+
+/**
+Set the access capability in the storage info data set
+*/
+void CMTPGetStorageInfo::SetAccessCapabilityL()
+	{
+	TMTPTypeUint16 mtpStorageType;
+	iStorageInfo->GetL(CMTPTypeStorageInfo::EStorageType, mtpStorageType);
+	TUint16 storageType = mtpStorageType.Value();
+	TInt accessCapability = EAccessCapabilityReadWrite;
+	if(storageType == EMTPStorageFixedROM || storageType == EMTPStorageRemovableROM)
+		{
+		accessCapability = EAccessCapabilityReadOnlyWithoutDeletion;
+		}
+	TMTPTypeUint16 mtpAccessCapability(accessCapability);	
+	iStorageInfo->SetL(CMTPTypeStorageInfo::EAccessCapability, mtpAccessCapability);		
+	}
+
+/**
+Set the max capacity in the storage info data set
+*/
+void CMTPGetStorageInfo::SetMaxCapacityL()
+	{
+	TMTPTypeUint64 mtpMaxCapacity(iVolumeInfo.iSize);
+	iStorageInfo->SetL(CMTPTypeStorageInfo::EMaxCapacity, mtpMaxCapacity);
+	}
+		
+/**
+Set the free space of the drive in the storage info data set
+*/
+void CMTPGetStorageInfo::SetFreeSpaceInBytesL()
+	{
+	TMTPTypeUint64 mtpFreeSpace(iVolumeInfo.iFree);
+	iStorageInfo->SetL(CMTPTypeStorageInfo::EFreeSpaceInBytes, mtpFreeSpace);	
+	}
+	
+/**
+Set the free space of in objects in the storage info data set
+*/
+void CMTPGetStorageInfo::SetFreeSpaceInObjectsL()
+	{
+	TMTPTypeUint32 mtpFreeSpaceInObj(0xFFFFFFFF); 	//we don't support this property
+	iStorageInfo->SetL(CMTPTypeStorageInfo::EFreeSpaceInObjects, mtpFreeSpaceInObj);	
+	}
+	
+/**
+Set the storage description (volume name) of the drive in the storage info data set
+*/
+void CMTPGetStorageInfo::SetStorageDescriptionL()
+	{
+	__FLOG(_L8("SetStorageDescriptionL - Entry"));
+    TUint32 storage(Request().Uint32(TMTPTypeRequest::ERequestParameter1));
+    TInt driveNumber = iFramework.StorageMgr().DriveNumber(storage);
+	RBuf volumeName;
+	volumeName.CreateL(KMaxFileName);
+	volumeName.CleanupClosePushL();
+	RMTPDeviceDpSingletons devSingletons;
+	devSingletons.OpenL(iFramework);
+	CleanupClosePushL(devSingletons);
+	TRAPD(resError, devSingletons.ConfigMgr().GetFriendlyVolumeNameL(driveNumber, volumeName));
+	if ((KErrNone == resError) && (0 < volumeName.Length()))
+		{
+		__FLOG(_L8("Using volume name from resource file"));
+		CMTPTypeString* mtpDescription = CMTPTypeString::NewLC(volumeName);
+		iStorageInfo->SetL(CMTPTypeStorageInfo::EStorageDescription, *mtpDescription);
+		CleanupStack::PopAndDestroy(mtpDescription);
+		}
+	else if (0 < iVolumeInfo.iName.Length())
+		{
+		__FLOG(_L8("Using standard volume name"));
+		CMTPTypeString* mtpDescription = CMTPTypeString::NewLC(iVolumeInfo.iName);
+		iStorageInfo->SetL(CMTPTypeStorageInfo::EStorageDescription, *mtpDescription);
+	    CleanupStack::PopAndDestroy(mtpDescription);
+		}
+		
+	CleanupStack::PopAndDestroy(&devSingletons);
+	CleanupStack::PopAndDestroy(&volumeName);
+	__FLOG(_L8("SetStorageDescriptionL - Exit"));
+	}
+	
+/**
+Set the volume identifier of the drive in the storage info data set
+*/
+void CMTPGetStorageInfo::SetVolumeIdentifierL()
+	{
+	// Retrieve the StorageID.
+    TUint32 storage(Request().Uint32(TMTPTypeRequest::ERequestParameter1));
+	
+	// Retrieve the volume info.
+	TVolumeInfo volInfo;
+	iFramework.Fs().Volume(volInfo, iFramework.StorageMgr().DriveNumber(storage));
+	
+	// Construct the suffix string.
+	RBuf16 suffix;
+	CleanupClosePushL(suffix);
+	suffix.CreateMaxL(KMTPMaxStringCharactersLength);
+	suffix.Format(_L("%08X"), volInfo.iUniqueID);
+           
+    if (volInfo.iName.Length() != 0)
+        {
+        // Append the separator and volume label, truncating if necessary.
+        suffix.Append(_L("-"));
+        suffix.Append(volInfo.iName.Left(KMTPMaxStringCharactersLength - suffix.Length()));
+        }
+	
+	// Generate the volume ID string.
+	CMTPTypeString* volId(iFramework.StorageMgr().VolumeIdL(iFramework.DataProviderId(), storage, suffix));
+	CleanupStack::PopAndDestroy(&suffix);
+	CleanupStack::PushL(volId);
+	iStorageInfo->SetL(CMTPTypeStorageInfo::EVolumeIdentifier, *volId);
+	CleanupStack::PopAndDestroy(volId);	
+	}
+
+
+
+
+
+
+
+
+
+
+	
+
+	
+
+
+   	
+
+	
+
+
+
+
+
+