boost::shared_ptr<HubInstance> DeviceManager::GetParentDevice(boost::shared_ptr<DeviceInstance> device) const { std::string parentLabel = device->GetParentID(); if (parentLabel.empty()) { // no parent specified, but we will try to infer one anyway // TODO So what happens if there is more than one hub in a given device // adapter? Answer: bad things. boost::shared_ptr<HubInstance> parentHub; for (DeviceConstIterator it = devices_.begin(), end = devices_.end(); it != end; ++it) { if (it->second->GetType() == MM::HubDevice && device->GetAdapterModule() == it->second->GetAdapterModule()) { parentHub = boost::static_pointer_cast<HubInstance>(it->second); } } // This returns the last matching hub; not sure why it was coded that // way, and it probably should be an error if there are more than 1. // TODO We should probably throw when parentHub is null. return parentHub; } else { for (DeviceConstIterator it = devices_.begin(), end = devices_.end(); it != end; ++it) { if (it->first == parentLabel && it->second->GetType() == MM::HubDevice && it->second->GetAdapterModule() == device->GetAdapterModule()) { return boost::static_pointer_cast<HubInstance>(it->second); } } // TODO We should probably throw when the parent is missing. return boost::shared_ptr<HubInstance>(); } }
DeviceModuleLockGuard::DeviceModuleLockGuard(boost::shared_ptr<DeviceInstance> device) : g_(device->GetAdapterModule()->GetLock()) {}