1/*
2 * Copyright (c) 1998-2002 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 *  IOFireWireLibAsyncStreamListener.h
24 *  IOFireWireFamily
25 *
26 *  Created by Arul on Thu Sep 28 2006.
27 *  Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
28 *
29 *	$Log: IOFireWireLibAsyncStreamListener.h,v $
30 *	Revision 1.3  2006/12/13 21:34:23  ayanowit
31 *	For 4222965, replaced all io async method calls with new Leopard API version.
32 *
33 *	Revision 1.2  2006/12/06 00:01:10  arulchan
34 *	Isoch Channel 31 Generic Receiver
35 *
36 *	Revision 1.1  2006/09/28 22:31:31  arulchan
37 *	New Feature rdar::3413505
38 *
39 */
40
41#import "IOFireWireLibIUnknown.h"
42#import "IOFireWireLibPriv.h"
43#import "IOFireWireLibIsoch.h"
44#import "IOFireWireLib.h"
45
46namespace IOFireWireLib {
47
48	class Device ;
49	class AsyncStreamListener: public IOFireWireIUnknown
50	{
51		protected:
52
53		typedef ::IOFWAsyncStreamListenerInterfaceRef			AsyncStreamListenerRef ;
54		typedef ::IOFWAsyncStreamListenerHandler				AsyncStreamListenerHandler ;
55		typedef ::IOFWAsyncStreamListenerSkippedPacketHandler	AsyncStreamSkippedPacketHandler ;
56
57		public:
58			AsyncStreamListener( const IUnknownVTbl&		interface,
59										Device&				userclient,
60										UserObjectHandle	inKernAddrSpaceRef,
61										void*				inBuffer,
62										UInt32				inBufferSize,
63										void*				inCallBack = 0,
64										void*				inRefCon = 0) ;
65
66			virtual ~AsyncStreamListener() ;
67
68		public:
69			const AsyncStreamListenerHandler SetListenerHandler (
70											AsyncStreamListenerRef		self,
71											AsyncStreamListenerHandler	inReceiver ) ;
72
73			const AsyncStreamSkippedPacketHandler	SetSkippedPacketHandler( AsyncStreamListenerRef	self,
74																			 AsyncStreamSkippedPacketHandler	inHandler ) ;
75
76			Boolean NotificationIsOn (
77											AsyncStreamListenerRef		self ) ;
78
79			Boolean TurnOnNotification (
80											AsyncStreamListenerRef		self ) ;
81
82			void TurnOffNotification (
83											AsyncStreamListenerRef		self ) ;
84
85			void ClientCommandIsComplete (
86											AsyncStreamListenerRef		self,
87											FWClientCommandID			commandID ) ;
88
89			void* GetRefCon	(
90											AsyncStreamListenerRef		self ) ;
91
92			void SetFlags (
93											AsyncStreamListenerRef		self,
94											UInt32						flags );
95
96			UInt32 GetFlags (
97											AsyncStreamListenerRef		self ) ;
98
99			UInt32 GetOverrunCounter (
100											AsyncStreamListenerRef		self ) ;
101
102			AsyncStreamListenerHandler	GetListenerHandler(
103											AsyncStreamListenerRef		self ) { return mListener; } ;
104
105			AsyncStreamSkippedPacketHandler GetSkippedPacketHandler(
106											AsyncStreamListenerRef		self ) { return mSkippedPacketHandler;} ;
107
108			static void	Listener( AsyncStreamListenerRef refcon, IOReturn result, void** args, int numArgs) ;
109
110			static void	SkippedPacket( AsyncStreamListenerRef refCon, IOReturn result, FWClientCommandID commandID, UInt32 packetCount) ;
111
112			void*			GetBuffer(
113											AsyncStreamListenerRef		self ) ;
114
115			const UInt32		GetBufferSize(
116											AsyncStreamListenerRef		self ) ;
117
118		protected:
119			Device&						mUserClient ;
120			UserObjectHandle			mKernAsyncStreamListenerRef ;
121
122			UInt32						mChannel ;
123			char*						mBuffer ;
124			Boolean						mNotifyIsOn ;
125			void*						mUserRefCon ;
126			UInt32						mBufferSize ;
127			CFMutableDictionaryRef		mPendingLocks ;
128			UInt32						mFlags;
129
130			AsyncStreamListenerHandler			mListener ;
131			AsyncStreamSkippedPacketHandler		mSkippedPacketHandler ;
132			AsyncStreamListenerRef				mRefInterface ;
133	} ;
134
135	class AsyncStreamListenerCOM: public AsyncStreamListener
136	{
137			typedef ::IOFWAsyncStreamListenerInterface	Interface ;
138
139		public:
140			AsyncStreamListenerCOM( Device&				userclient,
141									UserObjectHandle	inKernAddrSpaceRef,
142									void*				inBuffer,
143									UInt32				inBufferSize,
144									void*				inCallBack,
145									void*				inRefCon ) ;
146
147			virtual ~AsyncStreamListenerCOM() ;
148
149		private:
150			static Interface sInterface ;
151
152		public:
153			static IUnknownVTbl**	Alloc(	Device&				inUserClient,
154											UserObjectHandle	inKernAddrSpaceRef,
155											void*				inBuffer,
156											UInt32				inBufferSize,
157											void*				inCallBack,
158											void*				inRefCon );
159
160			virtual HRESULT			QueryInterface( REFIID iid, void ** ppv ) ;
161
162		protected:
163			static const AsyncStreamListenerHandler SSetListenerHandler (
164											AsyncStreamListenerRef		self,
165											AsyncStreamListenerHandler	inReceiver ) ;
166
167			static const AsyncStreamSkippedPacketHandler	SSetSkippedPacketHandler( AsyncStreamListenerRef	self,
168																		  AsyncStreamSkippedPacketHandler		inHandler ) ;
169
170			static Boolean SNotificationIsOn (
171											AsyncStreamListenerRef		self ) ;
172
173			static Boolean STurnOnNotification (
174											AsyncStreamListenerRef		self ) ;
175
176			static void STurnOffNotification (
177											AsyncStreamListenerRef		self ) ;
178
179			static void SClientCommandIsComplete (
180											AsyncStreamListenerRef		self,
181											FWClientCommandID			commandID,
182											IOReturn					status ) ;
183
184			static void* SGetRefCon	(
185											AsyncStreamListenerRef		self ) ;
186
187			static void SSetFlags (
188											AsyncStreamListenerRef		self,
189											UInt32						flags );
190
191			static UInt32 SGetFlags (
192											AsyncStreamListenerRef		self ) ;
193
194			static UInt32 SGetOverrunCounter (
195											AsyncStreamListenerRef		self ) ;
196
197	};
198}