UINT32 CDiskObjectComposite::GetNDASMediaType() const { UINT32 iMediaType = NMT_INVALID; // return the first NDAS Media type of unit disk which is not NMT_INVALID const_iterator itr; for ( itr = begin(); itr != end(); ++itr ) { if(::IsEmptyDisk(*itr)) continue; if(!(*itr)->IsUnitDisk()) { CMirDiskObjectPtr mirDisk = boost::dynamic_pointer_cast<CMirDiskObject>(*itr); if(mirDisk) { iMediaType = mirDisk->GetNDASMediaType(); if(NMT_INVALID != iMediaType) return iMediaType; } else { return NMT_INVALID; } } if(0 == (*itr)->GetDiskCount()) // skip empty one continue; CUnitDiskObjectPtr unitDisk = boost::dynamic_pointer_cast<CUnitDiskObject>(*itr); CUnitDiskInfoHandlerPtr unitHandler = unitDisk->GetInfoHandler(); iMediaType = unitHandler->GetNDASMediaType(); if(NMT_INVALID != iMediaType) return iMediaType; } return iMediaType; }
CCommandSet CMirDiskUIHandler::GetCommandSet(CDiskObjectPtr obj) const { ATLASSERT( dynamic_cast<const CMirDiskObject*>(obj.get()) != NULL ); CCommandSet setCommand; BOOL bCanWrite; CMirDiskObjectPtr mirDisk = boost::dynamic_pointer_cast<CMirDiskObject>(obj); bCanWrite = mirDisk->GetAccessMask() & GENERIC_WRITE; setCommand.push_back( CCommand( IDM_TOOL_UNBIND, bCanWrite ) ); if(NMT_MIRROR == mirDisk->GetNDASMediaType()) { // migrate : mirror -> RAID 1 setCommand.push_back( CCommand( IDM_TOOL_MIGRATE, !mirDisk->IsBroken() && mirDisk->HasWriteAccess())); } else { // do not check IsDirty here (cause it takes some time) setCommand.push_back( CCommand( IDM_TOOL_SYNCHRONIZE, /* bCanWrite && */ mirDisk->IsDirty() && !mirDisk->IsBroken() && mirDisk->HasWriteAccess())); } return setCommand; }
BOOL CMirDiskUIHandler::OnMigrate(CDiskObjectPtr obj ) const { CMirDiskObjectPtr mirDisk = boost::dynamic_pointer_cast<CMirDiskObject>(obj); if(NMT_MIRROR != mirDisk->GetNDASMediaType()) return FALSE; UINT32 BindResult; CDiskObjectPtr disk = obj; NDASCOMM_CONNECTION_INFO pConnectionInfo[NUMBER_MIGRATE_DISK]; UINT32 i; WTL::CString strTitle; strTitle.LoadString(IDS_APPLICATION); // Find aggregation root if (NUMBER_MIGRATE_DISK != disk->GetDiskCount()) { WTL::CString strMsg; strMsg.LoadString( IDS_DISKPROPERTYPAGE_MIGRATE_DISK_NOT_EXIST ); MessageBox( ::GetFocus(), strMsg, strTitle, MB_OK | MB_ICONWARNING ); return FALSE; } WTL::CString strConfirmMsg; strConfirmMsg.LoadString( IDS_DISKPROPERTYPAGE_MIGRATE_CONFIRM ); if ( IDYES != MessageBox( ::GetFocus(), strConfirmMsg, strTitle, MB_YESNO | MB_ICONWARNING ) ) { return FALSE; } if ( !disk->CanAccessExclusive() ) { WTL::CString strMsg; strMsg.LoadString( IDS_FAIL_TO_ACCESS_EXCLUSIVELY ); MessageBox( ::GetFocus(), strMsg, strTitle, MB_OK | MB_ICONWARNING ); return FALSE; } CDiskObjectCompositePtr pDiskObjectComposite = boost::dynamic_pointer_cast<CDiskObjectComposite>(disk); CDiskObjectComposite::const_iterator itr; for (itr = pDiskObjectComposite->begin(), i = 0; itr != pDiskObjectComposite->end(); ++itr, ++i) { CUnitDiskObjectPtr unitDisk = boost::dynamic_pointer_cast<CUnitDiskObject>(*itr); ZeroMemory(&pConnectionInfo[i], sizeof(NDASCOMM_CONNECTION_INFO)); pConnectionInfo[i].address_type = NDASCOMM_CONNECTION_INFO_TYPE_ADDR_LPX; pConnectionInfo[i].login_type = NDASCOMM_LOGIN_TYPE_NORMAL; pConnectionInfo[i].UnitNo = unitDisk->GetLocation()->GetUnitDiskLocation()->UnitNumber; pConnectionInfo[i].bWriteAccess = TRUE; pConnectionInfo[i].ui64OEMCode = NULL; pConnectionInfo[i].bSupervisor = FALSE; pConnectionInfo[i].protocol = NDASCOMM_TRANSPORT_LPX; CopyMemory(pConnectionInfo[i].AddressLPX, unitDisk->GetLocation()->GetUnitDiskLocation()->MACAddr, LPXADDR_NODE_LENGTH); } BindResult = NdasOpBind(NUMBER_MIGRATE_DISK, pConnectionInfo, NMT_RAID1); WTL :: CString strMsg; if(NUMBER_MIGRATE_DISK == BindResult) { strMsg.LoadString(IDS_DISKPROPERTYPAGE_MIGRATE_SUCCESS); WTL::CString strTitle; strTitle.LoadString(IDS_APPLICATION); MessageBox( ::GetFocus(), strMsg, strTitle, MB_OK|MB_ICONINFORMATION ); } else { DWORD dwLastError = ::GetLastError(); switch(dwLastError) { case NDASCOMM_ERROR_RW_USER_EXIST: case NDASOP_ERROR_ALREADY_USED: case NDASOP_ERROR_DEVICE_FAIL: case NDASOP_ERROR_NOT_SINGLE_DISK: case NDASOP_ERROR_DEVICE_UNSUPPORTED: case NDASOP_ERROR_NOT_BOUND_DISK: // does not return this error for (itr = pDiskObjectComposite->begin(), i = 0; itr != pDiskObjectComposite->end(); ++itr, ++i) { CUnitDiskObjectPtr unitDisk = boost::dynamic_pointer_cast<CUnitDiskObject>(*itr); if(BindResult == i) strMsg.FormatMessage(IDS_DISKPROPERTYPAGE_MIGRATE_FAIL_AT_FMT, unitDisk->GetTitle()); } break; default: strMsg.LoadString(IDS_DISKPROPERTYPAGE_MIGRATE_FAIL); break; } ShowErrorMessageBox(strMsg); } CNdasHIXChangeNotify HixChangeNotify(pGetNdasHostGuid()); BOOL bResults = HixChangeNotify.Initialize(); if(bResults) { for(i = 0; i < NUMBER_MIGRATE_DISK; i++) { NDAS_UNITDEVICE_ID unitDeviceId; CopyMemory(unitDeviceId.DeviceId.Node, pConnectionInfo[i].AddressLPX, sizeof(unitDeviceId.DeviceId.Node)); unitDeviceId.UnitNo = pConnectionInfo[i].UnitNo; HixChangeNotify.Notify(unitDeviceId); } } return TRUE; }