BOOL DM::DiskMaster::CmdSendTask( BYTE task_code ) { DMT_TRACE("\n SendTask: %d\n", task_code); assert(opened); DM_DETECT_INFO info; DM_CMD_MSG_HEADER hdr; WORD error_code = 0; CMD_SEND_TASK cmd; cmd.param = task_code; memset(&info, 0x00, sizeof(info)); if (SendCommand(cmd)) { DWORD tick = ::GetTickCount(); while (TRUE) { if (sizeof(DM_CMD_MSG_HEADER) == io->Read((void *)&hdr, sizeof(DM_CMD_MSG_HEADER))) { switch (hdr.code) { case kMsgDetectInfo: if (sizeof(DM_DETECT_INFO) == io->Read(&info, sizeof(DM_DETECT_INFO))) { current_task = task_code; ProcessDetectInfo(info, task_code); DMT_TRACE("\n"); DMT_TRACE(" DETECT INFO:\n"); DMT_TRACE(" USB1: %s\n", info.usb1_id.vendor_id); DMT_TRACE(" USB2: %s\n", info.usb2_id.vendor_id); DMT_TRACE(" SATA1: %s\n", info.sata1_id.ModelNumber); DMT_TRACE("\n"); return TRUE; } break; case kMsgDetectError: current_task = kTaskNone; io->Read(&error_code, sizeof(error_code)); DMT_TRACE(" Detect Error: %d\n", error_code); this->Notify(kDetectError, (void *)error_code); return FALSE; default : throw DMException(); } } if ((::GetTickCount() - tick) > DM_RESPONSE_TIMEOUT) { DMT_TRACE("Disk Master not response"); throw DMException(); } } } return FALSE; }
virtual const Module& getModule( const std::string& aClassName, bool forceReload = false ) { if ( this->theModuleMap.find( aClassName ) == this->theModuleMap.end() ) { throw DMException( "Can't find module [" + aClassName + "]." ); } return *this->theModuleMap[ aClassName ]; }
void loadModule( const std::string& aClassname ) { typedef std::set< std::string > StringSet; std::string filename; lt_dlhandle handle( 0 ); { std::string error; for ( StringSet::const_iterator i( this->theSearchPath.begin() ); i != this->theSearchPath.end(); ++i ) { #ifdef LTDL_SHLIB_EXT filename = (*i) + '/' + aClassname + LTDL_SHLIB_EXT; if ( !std::ifstream( filename.c_str() ).is_open() ) { continue; } handle = lt_dlopen( filename.c_str() ); #else filename = (*i) + '/' + aClassname; handle = lt_dlopenext( filename.c_str() ); #endif /* LTDL_SHLIB_EXT */ if ( handle ) { break; } const char* err( lt_dlerror() ); if ( error.empty() ) { error = err ? err: "unknown reasons"; } if ( !err ) { error = "various reasons"; } } if ( !handle ) { if ( error.empty() ) { throw DMException( "Failed to find DM [" + aClassname + "]" ); } else { throw DMException( "Failed to load DM [" + aClassname + "]: " + error ); } } } DynamicModuleDescriptor* desc( reinterpret_cast< DynamicModuleDescriptor* >( lt_dlsym( handle, "__dm_descriptor" ) ) ); if ( !desc ) { throw DMException( "[" + filename + "] is not a valid DM file." ); } if ( aClassname != desc->moduleName ) { throw DMException( "[" + filename + "] is compiled as the module [" + desc->moduleName + "]." ); } this->addClass( new SharedModule( *desc, filename, handle ) ); }
BOOL DM::DiskMaster::WaitForTaskEnd() { DM_LBA bad; ULONGLONG curr_lba = 0; DM_CMD_MSG_HEADER hdr; DWORD tick = ::GetTickCount(); DMT_TRACE("\n Wait for TASK INFO: \n"); while (TRUE) { if (sizeof(DM_CMD_MSG_HEADER) == io->Read(&hdr, sizeof(DM_CMD_MSG_HEADER))) { tick = ::GetTickCount(); switch(hdr.code){ case kMsgTaskInfo: if (sizeof(DM_TASK_INFO) == io->Read(&task_info, sizeof(DM_TASK_INFO))) { memcpy(&curr_lba, &task_info.Lba, sizeof(DM_LBA)); switch (task_info.End_code) { case kEndCodeTaskNotEnd: this->Notify(kTaskInProgress, &task_info); DMT_TRACE(" LBA: %lld %dd:%dh:%dm:%ds\n", curr_lba, task_info.TimeCnt_1d, task_info.TimeCnt_1h, task_info.TimeCnt_1m, task_info.TimeCnt_1s); break; case kEndCodeTaskEnd: // Ïîñëå ïîëó÷åíèÿ ýòîãî ñîîáùåíèÿ ìîæíà ïðîäîëæèòü ïîñûëàòü // áëî÷íûå êîìàíäû â ñîîòâåòñòâèè ñ êîäîì çàäà÷è this->Notify(kTaskComplete, &task_info); task_in_progress = FALSE; DMT_TRACE(" TASK END -- LBA: %lld %dd:%dh:%dm:%ds\n", curr_lba, task_info.TimeCnt_1d, task_info.TimeCnt_1h, task_info.TimeCnt_1m, task_info.TimeCnt_1s); return TRUE; case kEndCodeTaskBreak: // Ïîñëå ïîëó÷åíèÿ ýòîãî ñîîáùåíèÿ ìîæíà ïðîäîëæèòü ïîñûëàòü // áëî÷íûå êîìàíäû â ñîîòâåòñòâèè ñ êîäîì çàäà÷è this->Notify(kTaskBreak, &task_info); task_in_progress = FALSE; DMT_TRACE(" Task BREAK LBA: %lld %dd:%dh:%dm:%ds\n", curr_lba, task_info.TimeCnt_1d, task_info.TimeCnt_1h, task_info.TimeCnt_1m, task_info.TimeCnt_1s); return FALSE; case kEndCodeTaskCrash: case kEndCodeTaskShkPwrEnd: case kEndCodeTaskCrcErrorEnd: // //  äàííîì ìåñòå íàäà óâåäîìèòü âñåõ ïîäïèñ÷èêîâ î çàâåðøåíèè òàñêà, // è ÎÁßÇÀÒÅËÜÍÎ ÄÎ ÓÑÒÀÍÎÂÊÈ current_task = kTaskNone, // ò.ê. ïîäïèñ÷èêè îáÿçàòåëüíî çàõîòÿò óçíàòü êàêîé èìåííî òàñê çàêîí÷èëñÿ. // this->Notify(kTaskError, &task_info); current_task = kTaskNone; task_in_progress = FALSE; DMT_TRACE(" Task ERROR: %d\n", task_info.End_code); return FALSE; default: return FALSE; } } break; case kMsgBadLba: io->Read(&bad, sizeof(DM_LBA)); memcpy(&last_bad, &bad, sizeof(DM_LBA)); DMT_TRACE(" BAD: %lld\n", last_bad); this->Notify(kBadBlock, &last_bad); break; default: DMException(); } } if ((::GetTickCount() - tick) > (DWORD)DM_RESPONSE_TIMEOUT) throw DMException(); } return TRUE; }