예제 #1
0
std::list<Device*>& DiskDeviceClass::Refresh()
{
	SP_DEVINFO_DATA enumData;
	enumData.cbSize = sizeof(SP_DEVINFO_DATA);
	CString enumPath = _T("");
	std::map<CString, SP_DEVINFO_DATA> enumDevInfo;

	//remove _devices first
//	std::list<Device*>::iterator removeDev;
//	for ( removeDev = _devices.begin(); removeDev != _devices.end(); ++removeDev )
//	{
//		delete *removeDev;
//		_devices.erase(removeDev);
//	}

	GetDevInfoSet();
	for (int index=0; /*no condition*/; ++index)
	{
		if ( EnumDeviceInterfaceDetails(index, enumPath, &enumData) != ERROR_SUCCESS )
			break; // Enum() will return ERROR_NO_MORE_ITEMS when done.

		enumPath.Replace(_T("\\??"), _T("\\\\."));
		enumPath.Replace(_T("\\\\?"), _T("\\\\."));

		enumDevInfo[enumPath] = enumData;
	} // end for(all Disks in system)
	DestroyDevInfoSet();
/*
	std::list<Device*>::iterator myDev;
	std::list<std::list<Device*>::iterator> removeList;
	std::map<CString, SP_DEVINFO_DATA>::iterator enumDevData;

	// loop through my list of disks
	for ( myDev = _devices.begin(); myDev != _devices.end(); ++myDev )
	{
		enumDevData = enumDevInfo.find((*myDev)->_path.get());
		if ( enumDevData != enumDevInfo.end() )
		{
			// myDev is currently present in the system,
			// take it out of the enum list and check my next dev.
			enumDevInfo.erase(enumDevData);
		}
		else
		{
			// my dev is not present in the system and needs to be removed from my dev list.
			removeList.push_back(myDev);
		}
	}

	// remove my devices that are not in the system
	std::list<Device*>::iterator removeDev;
	while ( removeList.size() > 0 )
	{
		removeDev = removeList.back();
		removeList.pop_back();
		delete *removeDev;
		_devices.erase(removeDev);
	}
*/
	std::list<Device*>::iterator myDev;
	std::map<CString, SP_DEVINFO_DATA>::iterator enumDevData;
	// loop through my list of disks
	for ( myDev = _devices.begin(); myDev != _devices.end(); ++myDev )
	{
		enumDevData = enumDevInfo.find((*myDev)->_path.get());
		if ( enumDevData != enumDevInfo.end() )
		{
			// myDev is currently present in the system,
			// take it out of the enum list and check my next dev.
			enumDevInfo.erase(enumDevData);
		}
	}


	// if there are any devices in the system that are not in my list, create them
//	std::map<CString, SP_DEVINFO_DATA>::iterator enumDevData;
	for ( enumDevData = enumDevInfo.begin(); enumDevData != enumDevInfo.end(); ++enumDevData )
	{
		Device* pDevice = CreateDevice(this, (*enumDevData).second, (*enumDevData).first);
		if ( pDevice && pDevice->IsUsb() )
		{
			pthread_mutex_lock(devicesMutex);// , INFINITE);
			pDevice->_hubIndex.get();
			_devices.push_back(pDevice);
			pthread_mutex_unlock(devicesMutex);
		}
	}

	return _devices;
}