userlibandfileserver/fileserver/shostmassstorage/msproxy/hostusbmsproxy.cpp
changeset 109 b3a1d9898418
parent 102 ef2a444a7410
child 139 95f71bcdcdb7
--- a/userlibandfileserver/fileserver/shostmassstorage/msproxy/hostusbmsproxy.cpp	Mon May 03 13:47:38 2010 +0300
+++ b/userlibandfileserver/fileserver/shostmassstorage/msproxy/hostusbmsproxy.cpp	Fri May 14 17:13:29 2010 +0300
@@ -40,14 +40,19 @@
 TInt CUsbHostMsProxyDrive::InitialiseOffset(TCapsInfo& aCapsInfo)
 	{
 	__MSFNSLOG
-    const TInt KPartitionInfoSize = TMsDataMemMap::KSectorSize;
-	TBuf8<KPartitionInfoSize> partitionInfo;
-	TInt r;
+    RBuf8 partitionInfo;
+    TInt r;
+    TRAP(r, partitionInfo.CreateL(aCapsInfo.iBlockLength));
+    if (r != KErrNone)
+        {
+        return r;
+        }
 
-	r = iUsbHostMsLun.Read(0 , KPartitionInfoSize, (TDes8 &) partitionInfo);
+	r = iUsbHostMsLun.Read(0, aCapsInfo.iBlockLength, partitionInfo);
 	if (r != KErrNone)
         {
 		__PXYPRINT1(_L("!! Reading medium failed with %d !!"), r);
+        partitionInfo.Close();
 		return r;
         }
 	TUint8 *iIntBuf = (TUint8 *) partitionInfo.Ptr();
@@ -104,21 +109,27 @@
             TMBRPartitionEntry& partitionEntry = pe[partitionIndex];
 
 			iMsDataMemMap.InitDataArea(partitionEntry.iFirstSector,
-                                       partitionEntry.iNumSectors);
+                                       partitionEntry.iNumSectors,
+                                       aCapsInfo.iBlockLength);
 			__PXYPRINT2(_L("paritioncount = %d defaultpartition = %d"),
 						partitionCount, partitionIndex);
-			__PXYPRINT2(_L("iFirstSector = x%x iNumSectors = x%x"),
+			__PXYPRINT3(_L("iFirstSector = x%x iNumSectors = x%x iSectorSize = x%x"),                         
 						partitionEntry.iFirstSector,
-						partitionEntry.iNumSectors);
+						partitionEntry.iNumSectors,
+                        aCapsInfo.iBlockLength);
 			}
 		else
 			{
             __PXYPRINT(_L("No partition found"));
-			iMsDataMemMap.InitDataArea(0, aCapsInfo.iNumberOfBlocks);
-			__PXYPRINT2(_L("iFirstSector = x%x iNumSectors = x%x"),
-						0, aCapsInfo.iNumberOfBlocks);
+			iMsDataMemMap.InitDataArea(0, aCapsInfo.iNumberOfBlocks, aCapsInfo.iBlockLength);
+			__PXYPRINT3(_L("iFirstSector = x%x iNumSectors = x%x iSectorSize = x%x"),
+						0, 
+                        aCapsInfo.iNumberOfBlocks,
+                        aCapsInfo.iBlockLength);
 			}
 		}
+
+    partitionInfo.Close();
 	return KErrNone;
 	}
 
@@ -143,7 +154,7 @@
 	TCapsInfo capsInfo;
 	TInt err = iUsbHostMsLun.Caps(capsInfo);
 
-    if (err == KErrNone)
+    if (err == KErrNone && capsInfo.iMediaType == EMediaHardDisk)
         {
         err = InitialiseOffset(capsInfo);
         }
@@ -527,13 +538,12 @@
 TInt CUsbHostMsProxyDrive::Caps(TDes8& anInfo)
 	{
 	__MSFNSLOG
-    __HOSTPRINT(_L("\n>>> HOST Caps"));
+    __HOSTPRINT(_L(">>> HOST Caps"));
 	TLocalDriveCapsV6Buf caps;
     caps.FillZ();
 
     TLocalDriveCapsV6& c = caps();
 
-	c.iType = EMediaHardDisk;
     c.iConnectionBusType = EConnectionBusUsb;
 	c.iDriveAtt = KDriveAttLocal | KDriveAttRemovable | KDriveAttExternal;
 	c.iMediaAtt = KMediaAttFormattable;
@@ -541,26 +551,50 @@
 
 	TCapsInfo capsInfo;
 	TInt r = iUsbHostMsLun.Caps(capsInfo);
+
 	if (KErrNone == r)
 		{
-        c.iBlockSize = capsInfo.iBlockLength;
-        TUint64 size = iMsDataMemMap.DataSize();
-        if (size == 0)
-            {
-            // No valid partitions so specify the size of the disk
-            size = static_cast<TUint64>(capsInfo.iNumberOfBlocks) * capsInfo.iBlockLength;
-            }
-        c.iSize = size;
+        c.iType = capsInfo.iMediaType;
 
-        c.iEraseBlockSize = 0;
-
-        if (capsInfo.iWriteProtect)
+        if (capsInfo.iMediaType == EMediaHardDisk)
             {
-            c.iMediaAtt |= KMediaAttWriteProtected;
+            c.iBlockSize = capsInfo.iBlockLength;
+            TUint64 size = iMsDataMemMap.DataSize();
+    
+            if (size == 0)
+                {
+                // No valid partitions so specify the size of the disk
+                size = static_cast<TUint64>(capsInfo.iNumberOfBlocks) * capsInfo.iBlockLength;
+                }
+            c.iSize = size;
+    
+            c.iEraseBlockSize = 0;
+    
+            if (capsInfo.iWriteProtect)
+                {
+                c.iMediaAtt |= KMediaAttWriteProtected;
+                }
+                
+            static const TInt K512ByteSectorSize = 0x200; // 512
+            if(K512ByteSectorSize != capsInfo.iBlockLength)
+                {
+                // not formattable if sector size is not 512
+                c.iMediaAtt &= ~KMediaAttFormattable;
+                }
+            __HOSTPRINT4(_L("<<< HOST Caps Block[num=0x%x size=0x%x] Media[size=0x%lx WP=0x%x]"),
+                        capsInfo.iNumberOfBlocks, capsInfo.iBlockLength,
+                        caps().iSize, caps().iMediaAtt);
             }
-        __HOSTPRINT4(_L("<<< HOST Caps Block[num=0x%x size=0x%x] Media[size=0x%lx WP=0x%x]"),
-                    capsInfo.iNumberOfBlocks, capsInfo.iBlockLength,
-		            caps().iSize, caps().iMediaAtt);
+        else if (capsInfo.iMediaType == EMediaCdRom)
+            {
+            // not formattable
+            c.iMediaAtt &= ~KMediaAttFormattable;
+            __HOSTPRINT(_L(">>> HOST Caps MediaType = EMediaCdRom"));
+            }
+        else
+            {
+            // do nothing
+            }
 		}
 	else if (KErrNotReady)
         {
@@ -571,6 +605,7 @@
     else
         {
         __HOSTPRINT(_L("<<< HOST Caps Unknown Error"));
+        c.iType = EMediaUnknown;
 		r = KErrUnknown;
         }
 	anInfo = caps.Left(Min(caps.Length(),anInfo.MaxLength()));
@@ -629,7 +664,7 @@
 	{
 	__MSFNSLOG
 
-    const TInt KDefaultMaxBytesPerFormat = 0x100 * TMsDataMemMap::KSectorSize;  // 128K
+    const TInt KDefaultMaxBytesPerFormat = 0x100 * iMsDataMemMap.BlockLength();  // 128K
 
     if (aInfo.i512ByteSectorsFormatted < 0)
         return KErrArgument;
@@ -648,14 +683,14 @@
         iMsDataMemMap.InitDataArea(caps().iSize);
         }
 
-    TInt64 pos = static_cast<TInt64>(aInfo.i512ByteSectorsFormatted) << TMsDataMemMap::KFormatSectorShift;
+    TInt64 pos = static_cast<TInt64>(aInfo.i512ByteSectorsFormatted) << iMsDataMemMap.FormatSectorShift();
     TInt length = aInfo.iMaxBytesPerFormat;
     TInt r = Erase(pos, length);
 
     if (r == KErrNone)
         {
-        length += TMsDataMemMap::KSectorSize - 1;
-        length >>= TMsDataMemMap::KFormatSectorShift;
+        length += iMsDataMemMap.BlockLength() - 1;
+        length >>= iMsDataMemMap.FormatSectorShift();
         aInfo.i512ByteSectorsFormatted += length;
         }