CUnitDiskObjectPtr NdasCreateUnitDiskObject(PNDAS_UNITDEVICE pUnitDeviceId) { BOOL bResult; NDASUSER_DEVICE_INFORMATION deviceInfo; NDAS_DEVICE_ID deviceID; bResult = NdasQueryDeviceInformation( pUnitDeviceId->dwSlotNo, &deviceInfo ); if ( !bResult ) { // ERROR : Fail to get information from the service. return CUnitDiskObjectPtr(); } bResult = ConvertStringIdToRealId( deviceInfo.szDeviceId, &deviceID ); if ( !bResult ) { // ERROR : Invalid device id(problem with service) return CUnitDiskObjectPtr(); } CDeviceInfoPtr device = CDeviceInfoPtr( new CDeviceInfo(deviceInfo.szDeviceName, deviceInfo.szDeviceId, deviceID) ); CUnitDiskObjectPtr diskObject; try { diskObject = CDiskObjectBuilder::CreateDiskObject( device, static_cast<unsigned char>(pUnitDeviceId->dwUnitNo) ); } catch( CNDASException & ) { // ERROR : Fail to connect disk or invalid disk return CUnitDiskObjectPtr(); } return diskObject; }
CUnitDiskObjectPtr FindMirrorDisk(CUnitDiskObjectPtr src, CUnitDiskObjectList disks) { CUnitDiskInfoHandlerPtr handler = src->GetInfoHandler(); ATLASSERT( handler->IsMirrored() ); CUnitDiskObjectList::const_iterator found; found = std::find_if ( disks.begin(), disks.end(), std::bind1st( CDiskLocationEqual(), handler->GetPeerLocation() ) ); if ( found == disks.end() ) { return CUnitDiskObjectPtr(); } return *found; }
CUnitDiskObjectPtr CDiskObjectBuilder::CreateDiskObject(const CDeviceInfoPtr deviceInfo, unsigned _int8 nSlotNumber) { // For now, only management of disks connected by LAN is implemented. CUnitDiskObjectPtr diskObject; // TARGET_DATA targetData; NDASCOMM_UNIT_DEVICE_INFO UnitDeviceInfo; CLanSession session( deviceInfo->GetDeviceID()->Node, nSlotNumber ); session.Connect(); session.GetTargetData( &UnitDeviceInfo ); if ( UnitDeviceInfo.MediaType != MEDIA_TYPE_BLOCK_DEVICE ) { // Types other than HDD is not supported // TODO : Throw exception NDAS_THROW_EXCEPTION( CDiskException, CDiskException::ERROR_UNSUPPORTED_DISK_TYPE ); } CDiskInfoSectorPtr dibv2(new CDIBV2Sector(&UnitDeviceInfo)); CDiskInfoSectorPtr dib(new CDIBSector(&UnitDeviceInfo)); // First get DIB_V2 dibv2->ReadAccept( &session ); if ( dibv2->IsValidSignature() ) { diskObject = CUnitDiskObjectPtr( new CLanUnitDiskObject( deviceInfo, nSlotNumber, new CHDDDiskInfoHandler( dibv2 ) ) ); } else { dib->ReadAccept( &session ); if ( dib->IsValidSignature() && dib->IsValid() ) { diskObject = CUnitDiskObjectPtr( new CLanUnitDiskObject( deviceInfo, nSlotNumber, new CHDDDiskInfoHandler( dib ) ) ); } else { // No DIB information : single disk CDiskInfoSectorPtr newDIB = CDiskInfoSectorPtr( new CDIBV2Sector(&UnitDeviceInfo) ); diskObject = CUnitDiskObjectPtr( new CLanUnitDiskObject( deviceInfo, nSlotNumber, new CHDDDiskInfoHandler( newDIB ) ) ); } } session.Disconnect(); return diskObject; }