Beispiel #1
0
///////////////////////////////////////////////////////////////////////////////
// CLanUnitDiskObject
///////////////////////////////////////////////////////////////////////////////
CLanUnitDiskObject::CLanUnitDiskObject(
				   CDeviceInfoPtr deviceInfo,
				   unsigned _int8 nSlotNumber, 
				   CUnitDiskInfoHandler *pHandler
				   )
: 	m_deviceInfo(deviceInfo),
	m_session( 
		deviceInfo->GetDeviceID()->Node, 
		nSlotNumber
		),
	CUnitDiskObject( 
					deviceInfo->GetName(),
					new CLanDiskLocation(
					deviceInfo->GetDeviceID()->Node, nSlotNumber ), 
					pHandler
					)
{
}
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;
}