diff -r ef2a444a7410 -r b3a1d9898418 userlibandfileserver/fileserver/shostmassstorage/msproxy/hostusbmsproxy.cpp --- 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 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(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(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(aInfo.i512ByteSectorsFormatted) << TMsDataMemMap::KFormatSectorShift; + TInt64 pos = static_cast(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; }