IOHIDUserDevice.cpp   [plain text]


/*
 * @APPLE_LICENSE_HEADER_START@
 * 
 * Copyright (c) 2008 Apple, Inc.  All Rights Reserved.
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */

#include "IOHIDUserDevice.h"
#include "IOHIDResourceUserClient.h"
#include "IOHIDKeys.h"
#include <IOKit/IOLib.h>

#define super IOHIDDevice

OSDefineMetaClassAndStructors(IOHIDUserDevice, IOHIDDevice)

#pragma mark -
#pragma mark Methods

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// IOHIDUserDevice::withProperties
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IOHIDUserDevice * IOHIDUserDevice::withProperties(OSDictionary * properties)
{
	IOHIDUserDevice * device = new IOHIDUserDevice;
	
	do { 
		if ( !device )
			break;
			
		if ( !device->initWithProperties(properties) )
			break;
        
        return device;
        
	} while ( false );
	
    if ( device )
        device->release();
    
	return NULL;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::initWithProperties
//----------------------------------------------------------------------------------------------------
bool IOHIDUserDevice::initWithProperties(OSDictionary * properties)
{
    if ( !properties )
        return false;
        
    if ( !super::init() )
        return false;
        
    _properties = properties;
    _properties->retain();

    setProperty("HIDDefaultBehavior", kOSBooleanTrue);
    
    return TRUE;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::free
//----------------------------------------------------------------------------------------------------
void IOHIDUserDevice::free()
{
    if ( _properties )
        _properties->release();
        
    super::free();
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::handleStart
//----------------------------------------------------------------------------------------------------
bool IOHIDUserDevice::handleStart( IOService * provider )
{
	if (!super::handleStart(provider))
		return false;
	
    _provider = OSDynamicCast(IOHIDResourceDeviceUserClient, provider);
    if ( !_provider )
        return false;
        
	return true;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::handleStop
//----------------------------------------------------------------------------------------------------
void IOHIDUserDevice::handleStop(  IOService * provider )
{
	super::handleStop(provider);
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newTransportString
//----------------------------------------------------------------------------------------------------
OSString *IOHIDUserDevice::newTransportString() const
{
    OSString * string = OSDynamicCast(OSString, _properties->getObject(kIOHIDTransportKey));
    
    if ( !string ) 
        return NULL;
        
    string->retain();
        
    return string;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newManufacturerString
//----------------------------------------------------------------------------------------------------
OSString *IOHIDUserDevice::newManufacturerString() const
{
    OSString * string = OSDynamicCast(OSString, _properties->getObject(kIOHIDManufacturerKey));
    
    if ( !string ) 
        return NULL;
        
    string->retain();
        
    return string;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newProductString
//----------------------------------------------------------------------------------------------------
OSString *IOHIDUserDevice::newProductString() const
{
    OSString * string = OSDynamicCast(OSString, _properties->getObject(kIOHIDProductKey));
    
    if ( !string ) 
        return NULL;
        
    string->retain();
        
    return string;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newVendorIDNumber
//----------------------------------------------------------------------------------------------------
OSNumber *IOHIDUserDevice::newVendorIDNumber() const
{
    OSNumber * number = OSDynamicCast(OSNumber, _properties->getObject(kIOHIDVendorIDKey));
    
    if ( !number ) 
        return NULL;
        
    number->retain();
        
    return number;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newProductIDNumber
//----------------------------------------------------------------------------------------------------
OSNumber *IOHIDUserDevice::newProductIDNumber() const
{
    OSNumber * number = OSDynamicCast(OSNumber, _properties->getObject(kIOHIDProductIDKey));
    
    if ( !number ) 
        return NULL;
        
    number->retain();
        
    return number;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newVersionNumber
//----------------------------------------------------------------------------------------------------
OSNumber *IOHIDUserDevice::newVersionNumber() const
{
    OSNumber * number = OSDynamicCast(OSNumber, _properties->getObject(kIOHIDVersionNumberKey));
    
    if ( !number ) 
        return NULL;
        
    number->retain();
        
    return number;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newSerialNumberString
//----------------------------------------------------------------------------------------------------
OSString *IOHIDUserDevice::newSerialNumberString() const
{
    OSString * string = OSDynamicCast(OSString, _properties->getObject(kIOHIDSerialNumberKey));
    
    if ( !string ) 
        return NULL;
        
    string->retain();
        
    return string;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newVendorIDSourceNumber
//----------------------------------------------------------------------------------------------------
OSNumber *IOHIDUserDevice::newVendorIDSourceNumber() const
{
    OSNumber * number = OSDynamicCast(OSNumber, _properties->getObject(kIOHIDVendorIDSourceKey));
    
    if ( !number ) 
        return NULL;
        
    number->retain();
        
    return number;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newCountryCodeNumber
//----------------------------------------------------------------------------------------------------
OSNumber *IOHIDUserDevice::newCountryCodeNumber() const
{
    OSNumber * number = OSDynamicCast(OSNumber, _properties->getObject(kIOHIDCountryCodeKey));
    
    if ( !number ) 
        return NULL;
    
    number->retain();
    
    return number;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newReportIntervalNumber
//----------------------------------------------------------------------------------------------------
OSNumber *IOHIDUserDevice::newReportIntervalNumber() const
{
    OSNumber * number = OSDynamicCast(OSNumber, _properties->getObject(kIOHIDReportIntervalKey));
    
    if ( !number ) {
        number = IOHIDDevice::newReportIntervalNumber();
    }
    else {
        number->retain();
    }
        
    return number;
}

//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::newReportDescriptor
//----------------------------------------------------------------------------------------------------
IOReturn IOHIDUserDevice::newReportDescriptor(IOMemoryDescriptor ** descriptor ) const
{
    OSData *                    data;
    
    data = OSDynamicCast(OSData, _properties->getObject(kIOHIDReportDescriptorKey));
    if ( !data )
        return kIOReturnError;
            
	*descriptor = IOBufferMemoryDescriptor::withBytes(data->getBytesNoCopy(), data->getLength(), kIODirectionNone);

	return kIOReturnSuccess;
}


//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::getReport
//----------------------------------------------------------------------------------------------------
IOReturn IOHIDUserDevice::getReport(IOMemoryDescriptor	*report,
									IOHIDReportType		reportType,
									IOOptionBits		options )
{
    return _provider->getReport(report, reportType, options);
}


//----------------------------------------------------------------------------------------------------
// IOHIDUserDevice::setReport
//----------------------------------------------------------------------------------------------------
IOReturn IOHIDUserDevice::setReport(IOMemoryDescriptor	*report,
									IOHIDReportType		reportType,
									IOOptionBits		options)
{
    return _provider->setReport(report, reportType, options);
}