void CMainFrame::OnReplaceUnitDevice(UINT wNotifyCode, int wID, HWND hwndCtl) { CNBDevice *pDevice = m_viewTreeList.GetSelectedDevice(); if(!pDevice) return; if(!pDevice->GetCommandAbility(wID)) return; CNBLogicalDevice *pLogicalDevice = dynamic_cast<CNBLogicalDevice *>(pDevice); if(!pLogicalDevice) return; // find the missing device CNBLogicalDevice *pLogicalDeviceReplace = NULL; CNBUnitDevice *pUnitDeviceReplace = NULL; NBUnitDevicePtrList listUnitDevicesReplace; NBLogicalDevicePtrList::iterator itLogicalDevice; for(UINT32 i = 0; i < pLogicalDevice->DevicesTotal(); i++) { if(!(*pLogicalDevice)[i]) { for(itLogicalDevice = m_listLogicalDevices.begin(); itLogicalDevice != m_listLogicalDevices.end(); ++itLogicalDevice) { pLogicalDeviceReplace = *itLogicalDevice; if(pLogicalDeviceReplace) { if (pLogicalDeviceReplace->IsHDD() && !pLogicalDeviceReplace->IsGroup() && pLogicalDeviceReplace->IsOperatable()) { pUnitDeviceReplace = (*pLogicalDeviceReplace)[0]; if (pUnitDeviceReplace->IsThis( pLogicalDevice->DIB()->UnitDisks[i].MACAddr, pLogicalDevice->DIB()->UnitDisks[i].UnitNumber)) { // ok we found replacable HDD listUnitDevicesReplace.push_back(pUnitDeviceReplace); } } } } } } if(!listUnitDevicesReplace.size()) return; CNBSelectDeviceDlg dlgSelectDevice( IDD_DEVICE_LIST, IDS_REPLACE_UNIT_DEVICE_DLG_CAPTION, IDS_REPLACE_UNIT_DEVICE_DLG_MESSAGE, listUnitDevicesReplace, 0, CheckCapacityForSpare, pLogicalDevice); if(dlgSelectDevice.DoModal() != IDOK) return; // dlgSelectDevice is not selective dialog. get unit device from listUnitDevicesReplace CNBUnitDevice *pUnitDevice = *(listUnitDevicesReplace.begin()); // Bind & Synchronize NDASCOMM_CONNECTION_INFO ci, ci_replace; pLogicalDevice->InitConnectionInfo(&ci, TRUE); // use write access. this function does not support run time replace yet. pUnitDevice->InitConnectionInfo(&ci_replace, TRUE); for(UINT32 i = 0; i < pLogicalDevice->DevicesTotal(); i++) { if (!(*pLogicalDevice)[i]) { break; } } if(pLogicalDevice->DevicesTotal() == i) { // failed to find missing device return; } AutoCursor l_auto_cursor(IDC_WAIT); BOOL bResults = NdasOpReplaceUnitDevice( &ci, &ci_replace, i); l_auto_cursor.Release(); pLogicalDevice->HixChangeNotify(pGetNdasHostGuid()); pUnitDevice->HixChangeNotify(pGetNdasHostGuid()); if(!bResults) { CString strMsg; DWORD dwLastError = ::GetLastError(); strMsg.LoadString(IDS_OPERATION_FAIL); ShowErrorMessageBox(strMsg); return; } OnRefreshStatus(NULL, NULL, NULL); }