Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}