536 @return system wide error code |
536 @return system wide error code |
537 */ |
537 */ |
538 TInt CUsbHostMsProxyDrive::Caps(TDes8& anInfo) |
538 TInt CUsbHostMsProxyDrive::Caps(TDes8& anInfo) |
539 { |
539 { |
540 __MSFNSLOG |
540 __MSFNSLOG |
541 __HOSTPRINT(_L("\n>>> HOST Caps")); |
541 __HOSTPRINT(_L(">>> HOST Caps")); |
542 TLocalDriveCapsV6Buf caps; |
542 TLocalDriveCapsV6Buf caps; |
543 caps.FillZ(); |
543 caps.FillZ(); |
544 |
544 |
545 TLocalDriveCapsV6& c = caps(); |
545 TLocalDriveCapsV6& c = caps(); |
546 |
546 |
547 c.iType = EMediaHardDisk; |
|
548 c.iConnectionBusType = EConnectionBusUsb; |
547 c.iConnectionBusType = EConnectionBusUsb; |
549 c.iDriveAtt = KDriveAttLocal | KDriveAttRemovable | KDriveAttExternal; |
548 c.iDriveAtt = KDriveAttLocal | KDriveAttRemovable | KDriveAttExternal; |
550 c.iMediaAtt = KMediaAttFormattable; |
549 c.iMediaAtt = KMediaAttFormattable; |
551 c.iFileSystemId = KDriveFileSysFAT; |
550 c.iFileSystemId = KDriveFileSysFAT; |
552 |
551 |
553 TCapsInfo capsInfo; |
552 TCapsInfo capsInfo; |
554 TInt r = iUsbHostMsLun.Caps(capsInfo); |
553 TInt r = iUsbHostMsLun.Caps(capsInfo); |
|
554 |
555 if (KErrNone == r) |
555 if (KErrNone == r) |
556 { |
556 { |
557 c.iBlockSize = capsInfo.iBlockLength; |
557 c.iType = capsInfo.iMediaType; |
558 TUint64 size = iMsDataMemMap.DataSize(); |
558 |
559 if (size == 0) |
559 if (capsInfo.iMediaType == EMediaHardDisk) |
560 { |
560 { |
561 // No valid partitions so specify the size of the disk |
561 c.iBlockSize = capsInfo.iBlockLength; |
562 size = static_cast<TUint64>(capsInfo.iNumberOfBlocks) * capsInfo.iBlockLength; |
562 TUint64 size = iMsDataMemMap.DataSize(); |
|
563 |
|
564 if (size == 0) |
|
565 { |
|
566 // No valid partitions so specify the size of the disk |
|
567 size = static_cast<TUint64>(capsInfo.iNumberOfBlocks) * capsInfo.iBlockLength; |
|
568 } |
|
569 c.iSize = size; |
|
570 |
|
571 c.iEraseBlockSize = 0; |
|
572 |
|
573 if (capsInfo.iWriteProtect) |
|
574 { |
|
575 c.iMediaAtt |= KMediaAttWriteProtected; |
|
576 } |
|
577 |
|
578 static const TInt K512ByteSectorSize = 0x200; // 512 |
|
579 if(K512ByteSectorSize != capsInfo.iBlockLength) |
|
580 { |
|
581 // not formattable if sector size is not 512 |
|
582 c.iMediaAtt &= ~KMediaAttFormattable; |
|
583 } |
|
584 __HOSTPRINT4(_L("<<< HOST Caps Block[num=0x%x size=0x%x] Media[size=0x%lx WP=0x%x]"), |
|
585 capsInfo.iNumberOfBlocks, capsInfo.iBlockLength, |
|
586 caps().iSize, caps().iMediaAtt); |
563 } |
587 } |
564 c.iSize = size; |
588 else if (capsInfo.iMediaType == EMediaCdRom) |
565 |
|
566 c.iEraseBlockSize = 0; |
|
567 |
|
568 if (capsInfo.iWriteProtect) |
|
569 { |
589 { |
570 c.iMediaAtt |= KMediaAttWriteProtected; |
590 // not formattable |
|
591 c.iMediaAtt &= ~KMediaAttFormattable; |
|
592 __HOSTPRINT(_L(">>> HOST Caps MediaType = EMediaCdRom")); |
571 } |
593 } |
572 |
594 else |
573 static const TInt K512ByteSectorSize = 0x200; // 512 |
595 { |
574 if(K512ByteSectorSize != capsInfo.iBlockLength) |
596 // do nothing |
575 { |
597 } |
576 c.iMediaAtt &= ~KMediaAttFormattable; |
|
577 } |
|
578 __HOSTPRINT4(_L("<<< HOST Caps Block[num=0x%x size=0x%x] Media[size=0x%lx WP=0x%x]"), |
|
579 capsInfo.iNumberOfBlocks, capsInfo.iBlockLength, |
|
580 caps().iSize, caps().iMediaAtt); |
|
581 } |
598 } |
582 else if (KErrNotReady) |
599 else if (KErrNotReady) |
583 { |
600 { |
584 __HOSTPRINT(_L("<<< HOST Caps Media Not Present")); |
601 __HOSTPRINT(_L("<<< HOST Caps Media Not Present")); |
585 c.iType = EMediaNotPresent; |
602 c.iType = EMediaNotPresent; |