|
|
1.1 root 1: /*
2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
24: *
25: * HISTORY
26: *
27: */
28:
29:
30: #include <IOKit/IOLib.h>
31: #include <libkern/c++/OSContainers.h>
32:
33: #include "IOHIDUserClient.h"
34:
35:
36: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
37:
38: #undef super
39: #define super IOUserClient
40:
41: OSDefineMetaClassAndStructors(IOHIDUserClient, IOUserClient)
42:
43: OSDefineMetaClassAndStructors(IOHIDParamUserClient, IOUserClient)
44:
45: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
46:
47: bool IOHIDUserClient::start( IOService * _owner )
48: {
49: static const IOExternalMethod methodTemplate[] = {
50: /* 0 */ { NULL, NULL, kIOUCScalarIScalarO, 1, 0 },
51: /* 1 */ { NULL, NULL, kIOUCScalarIScalarO, 1, 0 },
52: /* 2 */ { NULL, NULL, kIOUCScalarIScalarO, 1, 0 },
53: /* 3 */ { NULL, NULL, kIOUCStructIStructO, sizeof(struct evioLLEvent), 0 },
54: /* 4 */ { NULL, NULL, kIOUCStructIStructO, sizeof(Point), 0 },
55: /* 5 */ { NULL, NULL, kIOUCScalarIScalarO, 1, 1 }
56: };
57:
58: if( !super::start( _owner ))
59: return( false);
60:
61: owner = (IOHIDSystem *) _owner;
62:
63: bcopy( methodTemplate, externals, sizeof( methodTemplate ));
64:
65: externals[0].object = owner;
66: externals[0].func = (IOMethod) &IOHIDSystem::createShmem;
67:
68: externals[1].object = owner;
69: externals[1].func = (IOMethod) &IOHIDSystem::setEventsEnable;
70:
71: externals[2].object = owner;
72: externals[2].func = (IOMethod) &IOHIDSystem::setCursorEnable;
73:
74: externals[3].object = owner;
75: externals[3].func = (IOMethod) &IOHIDSystem::extPostEvent;
76:
77: externals[4].object = owner;
78: externals[4].func = (IOMethod) &IOHIDSystem::extSetMouseLocation;
79:
80: externals[5].object = owner;
81: externals[5].func = (IOMethod) &IOHIDSystem::extGetButtonEventNum;
82:
83: return( true );
84: }
85:
86: IOReturn IOHIDUserClient::clientClose( void )
87: {
88: owner->evClose();
89: #ifdef DEBUG
90: kprintf("%s: client token invalidated\n", getName());
91: #endif
92:
93: owner->serverConnect = 0;
94: detach( owner);
95:
96: return( kIOReturnSuccess);
97: }
98:
99: IOService * IOHIDUserClient::getService( void )
100: {
101: return( owner );
102: }
103:
104: IOReturn IOHIDUserClient::registerNotificationPort(
105: mach_port_t port,
106: UInt32 type,
107: UInt32 refCon )
108: {
109: if( type != kIOHIDEventNotification)
110: return( kIOReturnUnsupported);
111:
112: owner->setEventPort(port);
113: return( kIOReturnSuccess);
114: }
115:
116: IOReturn IOHIDUserClient::connectClient( IOUserClient * client )
117: {
118: Bounds * bounds;
119: IOGraphicsDevice * graphicsDevice;
120:
121: // yikes
122: if( 0 == (graphicsDevice = OSDynamicCast(IOGraphicsDevice,
123: client->getProvider())) )
124: return( kIOReturnBadArgument );
125:
126: graphicsDevice->getBoundingRect(&bounds);
127:
128: owner->registerScreen(graphicsDevice, bounds);
129:
130: return( kIOReturnSuccess);
131: }
132:
133: IOReturn IOHIDUserClient::clientMemoryForType( UInt32 type,
134: UInt32 * flags, IOMemoryDescriptor ** memory )
135: {
136:
137: if( type != kIOHIDGlobalMemory)
138: return( kIOReturnBadArgument);
139:
140: *flags = 0;
141: owner->globalMemory->retain();
142: *memory = owner->globalMemory;
143:
144: return( kIOReturnSuccess);
145: }
146:
147: IOExternalMethod * IOHIDUserClient::getExternalMethodForIndex( UInt32 index )
148: {
149: if( index < (sizeof( externals) / sizeof( externals[0])))
150: return( externals + index);
151: else
152: return( NULL);
153: }
154:
155: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
156:
157: bool IOHIDParamUserClient::start( IOService * _owner )
158: {
159: static const IOExternalMethod methodTemplate[] = {
160: /* 0 */ { NULL, NULL, kIOUCScalarIScalarO, 1, 0 },
161: /* 1 */ { NULL, NULL, kIOUCScalarIScalarO, 1, 0 },
162: /* 2 */ { NULL, NULL, kIOUCScalarIScalarO, 1, 0 },
163: /* 3 */ { NULL, NULL, kIOUCStructIStructO, sizeof(struct evioLLEvent), 0 },
164: /* 4 */ { NULL, NULL, kIOUCStructIStructO, sizeof(Point), 0 },
165: };
166:
167: if( !super::start( _owner ))
168: return( false);
169:
170: owner = (IOHIDSystem *) _owner;
171:
172: bcopy( methodTemplate, externals, sizeof( methodTemplate ));
173:
174: externals[3].object = owner;
175: externals[3].func = (IOMethod) &IOHIDSystem::extPostEvent;
176:
177: externals[4].object = owner;
178: externals[4].func = (IOMethod) &IOHIDSystem::extSetMouseLocation;
179:
180: return( true );
181: }
182:
183: void IOHIDParamUserClient::free( void )
184: {
185: retain(); retain();
186: owner->paramConnect = 0;
187: detach( owner);
188: super::free();
189: }
190:
191: void IOHIDParamUserClient::release() const
192: {
193: super::release(2);
194: }
195:
196:
197: IOReturn IOHIDParamUserClient::clientClose( void )
198: {
199: return( kIOReturnSuccess);
200: }
201:
202: IOService * IOHIDParamUserClient::getService( void )
203: {
204: return( owner );
205: }
206:
207: IOExternalMethod * IOHIDParamUserClient::getExternalMethodForIndex(
208: UInt32 index )
209: {
210: // get the same library function to work for param & server connects
211: if( (index >= 3)
212: && (index < (sizeof( externals) / sizeof( externals[0]))))
213: return( externals + index);
214: else
215: return( NULL);
216: }
217:
218: IOReturn IOHIDParamUserClient::setProperties( OSObject * properties )
219: {
220: OSDictionary * dict;
221: OSIterator * iter;
222: IOHIDevice * eventSrc;
223: IOReturn err = kIOReturnSuccess;
224: IOReturn ret;
225:
226: dict = OSDynamicCast( OSDictionary, properties );
227: if( dict) {
228: ret = owner->setParamProperties( dict );
229: if( (ret != kIOReturnSuccess) && (ret != kIOReturnBadArgument))
230: err = ret;
231: iter = owner->getOpenProviderIterator();
232:
233: if( iter) {
234: while( (eventSrc = (IOHIDevice *) iter->getNextObject())) {
235: ret = eventSrc->setParamProperties( dict );
236: if( (ret != kIOReturnSuccess) && (ret != kIOReturnBadArgument))
237: err = ret;
238: }
239: iter->release();
240: }
241: } else
242: err = kIOReturnBadArgument;
243:
244: return( err );
245: }
246:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.