void DeviceManagerImpl::Shutdown()
{
    // Remove all device descriptors from list while the lock is held.
    // Some descriptors may survive longer due to handles.    
    while(!Devices.IsEmpty())
    {     
        DeviceCreateDesc* devDesc = Devices.GetFirst();
        OVR_ASSERT(!devDesc->pDevice); // Manager shouldn't be dying while Device exists.
        devDesc->Enumerated = false;
        devDesc->RemoveNode();
        devDesc->pNext = devDesc->pPrev = 0;

        if (devDesc->HandleCount == 0)
        {
            delete devDesc;
        }
    }
    Devices.Clear();

    // These must've been cleared by caller.
    OVR_ASSERT(pCreateDesc->pDevice == 0);
    OVR_ASSERT(pCreateDesc->pLock->pManager == 0);

    pProfileManager.Clear();
}
        virtual void Visit(const DeviceCreateDesc& createDesc)
        {
            DeviceCreateDesc* devDesc;
            
            // If found, mark as enumerated and we are done.
            DeviceCreateDesc* descCandidate = 0;

            for(devDesc = pManager->Devices.GetFirst();
                !pManager->Devices.IsNull(devDesc);  devDesc = devDesc->pNext)
            {
                DeviceCreateDesc::MatchResult mr = devDesc->MatchDevice(createDesc, &descCandidate);
                if (mr == DeviceCreateDesc::Match_Found)
                {
                    devDesc->Enumerated = true;
                    return;
                }
            }

            // Update candidate (this may involve writing fields to HMDDevice createDesc).
            if (descCandidate && descCandidate->UpdateMatchedCandidate(createDesc))
            {
                descCandidate->Enumerated = true;
                return;
            }

            // If not found, add new device.
            //  - This stores a new descriptor with
            //    {pDevice = 0, HandleCount = 1, Enumerated = true}
            DeviceCreateDesc* desc = createDesc.Clone();
            desc->pLock = pManager->pCreateDesc->pLock;
            pManager->Devices.PushBack(desc);

            pManager->CallOnDeviceAdded(desc);
        }
Example #3
0
bool DeviceHandle::enumerateNext(const DeviceEnumerationArgs& args)
{
    if (GetType() == Device_None)
        return false;
    
    Ptr<DeviceManagerImpl> managerKeepAlive;
    Lock::Locker           lockScope(pImpl->GetLock());
    
    DeviceCreateDesc* next = pImpl;
    // If manager was destroyed, we get removed from the list.
    if (!pImpl->pNext)
        return false;

    managerKeepAlive = next->GetManagerImpl();
    OVR_ASSERT(managerKeepAlive);
    
    do {
        next = next->pNext;

        if (managerKeepAlive->Devices.IsNull(next))
        {
            pImpl->Release();
            pImpl = 0;
            return false;
        }

    } while(!args.MatchRule(next->Type, next->Enumerated));

    next->AddRef();
    pImpl->Release();
    pImpl = next;

    return true;
}
Ptr<DeviceCreateDesc> DeviceManagerImpl::FindHIDDevice(const HIDDeviceDesc& hidDevDesc)
{
    Lock::Locker deviceLock(GetLock());
    DeviceCreateDesc* devDesc;
    
    for (devDesc = Devices.GetFirst();
        !Devices.IsNull(devDesc);  devDesc = devDesc->pNext)
    {
        if (devDesc->MatchHIDDevice(hidDevDesc))
            return devDesc;
    }
    return NULL;
}
Ptr<DeviceCreateDesc> DeviceManagerImpl::FindDevice(
    const String& path, 
    DeviceType deviceType)
{
    Lock::Locker deviceLock(GetLock());
    DeviceCreateDesc* devDesc;

    for (devDesc = Devices.GetFirst();
        !Devices.IsNull(devDesc);  devDesc = devDesc->pNext)
    {
        if ((deviceType == Device_None || deviceType == devDesc->Type) &&
            devDesc->MatchDevice(path))
            return devDesc;
    }
    return NULL;
}
Ptr<DeviceCreateDesc> DeviceManagerImpl::AddDevice_NeedsLock(
    const DeviceCreateDesc& createDesc)
{
    // If found, mark as enumerated and we are done.
    DeviceCreateDesc* descCandidate = 0;

    for(DeviceCreateDesc* devDesc = Devices.GetFirst();
        !Devices.IsNull(devDesc);  devDesc = devDesc->pNext)
    {
        DeviceCreateDesc::MatchResult mr = devDesc->MatchDevice(createDesc, &descCandidate);
        if (mr == DeviceCreateDesc::Match_Found)
        {
            devDesc->Enumerated = true;
            if (!devDesc->pDevice)
                CallOnDeviceAdded(devDesc);
            return devDesc;
        }
    }

    // Update candidate (this may involve writing fields to HMDDevice createDesc).
    if (descCandidate)
    {
        bool newDevice = false;
        if (descCandidate->UpdateMatchedCandidate(createDesc, &newDevice))
        {
            descCandidate->Enumerated = true;
            if (!descCandidate->pDevice || newDevice)
                CallOnDeviceAdded(descCandidate);
            return descCandidate;
        }
    }

    // If not found, add new device.
    //  - This stores a new descriptor with
    //    {pDevice = 0, HandleCount = 1, Enumerated = true}
    DeviceCreateDesc* desc = createDesc.Clone();
    desc->pLock = pCreateDesc->pLock;
    Devices.PushBack(desc);
    desc->Enumerated = true;

    CallOnDeviceAdded(desc);

    return desc;
}
Ptr<DeviceCreateDesc> DeviceManagerImpl::FindHIDDevice(const HIDDeviceDesc& hidDevDesc, bool created)
{
    Lock::Locker deviceLock(GetLock());
    DeviceCreateDesc* devDesc;
    
    for (devDesc = Devices.GetFirst();
        !Devices.IsNull(devDesc);  devDesc = devDesc->pNext)
    {
        if (created)
        {   // Search for matching device that is created
            if (devDesc->MatchHIDDevice(hidDevDesc) && devDesc->pDevice)
                return devDesc;
        }
        else
        {   // Search for any matching device
            if (devDesc->MatchHIDDevice(hidDevDesc))
                return devDesc;
        }
    }
    return NULL;
}