bool IOHIDDeviceShim::handleStart( IOService * provider ) { IOService *device = 0; if (!super::handleStart(provider)) return false; if ((_hiDevice = OSDynamicCast(IOHIDevice, provider))) { if (_hiDevice->getProperty(kIOHIDVirtualHIDevice) == kOSBooleanTrue) return false; device = _hiDevice; do { if ((_device = (IOService *)device->metaCast("IOHIDDevice"))) { break; } if ((_device = (IOService *)device->metaCast("IOUSBDevice")) || (_device = (IOService *)device->metaCast("IOUSBInterface"))) { _transport = kIOHIDTransportUSB; break; } if (_device = (IOService *)device->metaCast("IOADBDevice")) { _transport = kIOHIDTransportADB; break; } if (_device = (IOService *)device->metaCast("ApplePS2Controller")) { _transport = kIOHIDTransportPS2; break; } } while (device = device->getProvider()); } return true; }
IOReturn IOHIDUserClient::connectClient( IOUserClient * client ) { IOGBounds * bounds; IOService * provider; IOGraphicsDevice * graphicsDevice; provider = client->getProvider(); // avoiding OSDynamicCast & dependency on graphics family if( !provider || !provider->metaCast("IOGraphicsDevice")) return( kIOReturnBadArgument ); graphicsDevice = (IOGraphicsDevice *) provider; graphicsDevice->getBoundingRect(&bounds); owner->registerScreen(graphicsDevice, bounds, bounds+1); return( kIOReturnSuccess); }