userlibandfileserver/fileserver/smassstorage/scsiprot.cpp
branchRCL_3
changeset 20 597aaf25e343
parent 0 a41df078684a
--- a/userlibandfileserver/fileserver/smassstorage/scsiprot.cpp	Sat Feb 20 00:10:51 2010 +0200
+++ b/userlibandfileserver/fileserver/smassstorage/scsiprot.cpp	Fri Mar 12 15:50:11 2010 +0200
@@ -1,4 +1,4 @@
-// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of the License "Eclipse Public License v1.0"
@@ -243,10 +243,14 @@
 			HandleInquiry(aData, aLun);
 			break;
 
-		case EModeSense:
-			HandleModeSense(aData, aLun);
+		case EModeSense6:
+			HandleModeSense6(aData, aLun);
 			break;
 
+        case EModeSense10:
+            HandleModeSense10(aData, aLun);
+            break;
+
 		case EStartStopUnit:
 			HandleStartStopUnit(aData, aLun);
 			break;
@@ -1224,15 +1228,13 @@
 
 @return ETrue if successful.
 */
-TBool CScsiProtocol::HandleModeSense(TPtrC8& aData, TUint aLun)
+TBool CScsiProtocol::HandleModeSense6(TPtrC8& aData, TUint aLun)
 	{
-	__FNLOG("CScsiProtocol::HandleModeSense");
+	__FNLOG("CScsiProtocol::HandleModeSense6");
 
 	TInt pageCode = aData[3] & 0x3F;
 	TUint8 pageControl= static_cast<TUint8>(aData[3] >>6);
 
-	// reserve 4 bytes for Length, Media type, Device-specific parameter and Block descriptor length
-
 	if (pageCode != KAllPages || pageControl == KChangeableValues) 
 		{
 		__PRINT(_L("TSenseInfo::EIllegalRequest,TSenseInfo::EInvalidFieldInCdb"));
@@ -1240,9 +1242,10 @@
 		return EFalse;
 		}
 
+	// reserve 4 bytes for Length, Media type, Device-specific parameter and Block descriptor length
 	TPtr8 writeBuf(NULL, 0);
-	iTransport->GetCommandBufPtr(writeBuf, KModeSenseCommandLength);
-	writeBuf.FillZ(KModeSenseCommandLength);
+	iTransport->GetCommandBufPtr(writeBuf, KModeSense6CommandLength);
+	writeBuf.FillZ(KModeSense6CommandLength);
 
 	if (pageControl != KDefaultValues)
 		{
@@ -1279,3 +1282,63 @@
 	}
 
 
+/**
+Command Parser for the MODE SENSE(10) command (0x5A)
+
+@return ETrue if successful.
+*/
+TBool CScsiProtocol::HandleModeSense10(TPtrC8& aData, TUint aLun)
+	{
+	__FNLOG("CScsiProtocol::HandleModeSense10");
+
+	TInt pageCode = aData[3] & 0x3F;
+	TUint8 pageControl= static_cast<TUint8>(aData[3] >>6);
+
+	if (pageCode != KAllPages || pageControl == KChangeableValues) 
+		{
+		__PRINT(_L("TSenseInfo::EIllegalRequest,TSenseInfo::EInvalidFieldInCdb"));
+		iSenseInfo.SetSense(TSenseInfo::EIllegalRequest,TSenseInfo::EInvalidFieldInCdb);
+		return EFalse;
+		}
+
+	// reserve 8 bytes for Length, Media type, Device-specific parameter and Block descriptor length
+	TPtr8 writeBuf(NULL, 0);
+	iTransport->GetCommandBufPtr(writeBuf, KModeSense10CommandLength);
+	writeBuf.FillZ(KModeSense10CommandLength);
+
+	if (pageControl != KDefaultValues)
+		{
+		//check if drive write protected
+		CMassStorageDrive* drive=GetCheckDrive(aLun);
+		if (drive == NULL)
+			{
+			__PRINT(_L("drive == null"));
+			return EFalse;
+			}
+
+		TLocalDriveCapsV4 driveInfo;
+		TInt err = drive->Caps(driveInfo);
+		if (err != KErrNone)
+			{
+			__PRINT(_L("TSenseInfo::ENotReady"));
+			iSenseInfo.SetSense(TSenseInfo::ENotReady, TSenseInfo::EMediaNotPresent);
+			return EFalse ;
+			}
+
+		if (driveInfo.iMediaAtt & KMediaAttWriteProtected)
+			{
+			writeBuf[3] = 1<<7;  // set SWP bit at the Device Specific parameters
+			}
+		}
+
+	writeBuf[1]=6;  //Sending only Mode parameter header
+
+	TPtrC8 writeBuf1 = writeBuf;
+
+	iTransport->SetupWriteData(writeBuf1);
+
+	return (iSenseInfo.SenseOk());
+	}
+
+
+