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