1/*
2    File:       IrEvent.h
3
4    Contains:   Defines and classes for event messages
5
6*/
7
8
9#ifndef __IREVENT_H
10#define __IREVENT_H
11
12#include "IrDATypes.h"
13
14
15// Forward reference
16class TIrStream;
17class TIrClient;
18class TLSAPConn;
19class TIASAttribute;
20class TIrQOS;
21class CBuffer;
22class CList;
23
24// Constants
25
26// names for these events are in IrStream.cpp, change there too.
27// keep replies = requests + 1
28
29enum IrEvents
30{
31    // Non-timer events
32    kIrOutputCompleteEvent = 1,     //  1:  output has completed
33    kIrInputCompleteEvent,          //  2:  input has completed
34
35    // Requests/replies
36    kIrDiscoverRequestEvent,                                    //  3
37    kIrDiscoverReplyEvent       = kIrDiscoverRequestEvent+1,    //  4
38
39    kIrConnectRequestEvent,                                     //  5
40    kIrConnectReplyEvent        = kIrConnectRequestEvent+1,     //  6
41
42    kIrListenRequestEvent,                                      //  7
43    kIrListenReplyEvent         = kIrListenRequestEvent+1,      //  8
44
45    kIrAcceptRequestEvent,                                      //  9
46    kIrAcceptReplyEvent         = kIrAcceptRequestEvent+1,      //  a
47
48    kIrGetDataRequestEvent,                                     //  b
49    kIrGetDataReplyEvent        = kIrGetDataRequestEvent+1,     //  c
50
51    kIrPutDataRequestEvent,                                     //  d
52    kIrPutDataReplyEvent        = kIrPutDataRequestEvent+1,     //  e
53
54    kIrLookupRequestEvent,                                      //  f
55    kIrLookupReplyEvent         = kIrLookupRequestEvent+1,      //  10
56
57    kIrCancelGetRequestEvent,                                   //  11
58    kIrCancelGetReplyEvent      = kIrCancelGetRequestEvent+1,   //  12
59
60    kIrCancelPutRequestEvent,                                   //  13
61    kIrCancelPutReplyEvent      = kIrCancelPutRequestEvent+1,   //  14
62
63    kIrReleaseRequestEvent,                                     //  15
64    kIrReleaseReplyEvent        = kIrReleaseRequestEvent+1,     //  16
65
66    kIrDisconnectRequestEvent,                                  //  17
67    kIrDisconnectReplyEvent     = kIrDisconnectRequestEvent+1,  //  18
68
69
70    // LAP level events
71    kIrLocalBusyEvent,              //  19 - all buffers in recv buffer pool in use
72    kIrLocalBusyClearedEvent,       //  1a - recv buffer available again
73
74    // Timer events - LAP
75    kIrFirstIrLAPTimerEvent,        //  1b
76    kIrMediaBusyTimerExpiredEvent,  //  1c
77    kIrSlotTimerExpiredEvent,       //  1d - discovery slot timer for primary
78    kIrQueryTimerExpiredEvent,      //  1e - discovery query timer for secondary
79    kIrBackoffTimerExpiredEvent,    //  1f - random delay before retrying connect
80    kIrFinalTimerExpiredEvent,      //  20
81    kIrPollTimerExpiredEvent,       //  21
82    kIrWatchdogTimerExpiredEvent,   //  22
83    kIrTurnaroundTimerExpiredEvent, //  23
84    kIrLastIrLAPTimerEvent,         //  24
85
86    // Timer events - LMP/LSAPConn
87    kIrFirstIrLMPTimerEvent,        //  25
88    kIrConnWatchdogExpiredEvent,    //  26
89    kIdleDisconnectEvent,           //  27 .. jdg added for LapConn disconnect
90    kIrLastIrLMPTimerEvent,         //  28
91
92    kIrChangeSpeedCompleteEvent,    //  29 .. jdg added 6/26/2000
93
94    kIrMaxEventNumber = kIrChangeSpeedCompleteEvent     // 29 - for sanity checks
95
96};
97
98
99// Classes
100
101// ***NOTE: All of the Event messages based on TIrEvent can have no more additional (ULong) fields than kMaxSubClassFields
102//#define kMaxSubClassFields 7
103#define kMaxSubClassFields 10   // jdg, append get/puts to conn/listen
104
105// Comment will have one of three chars, '>', '<', or 'X'.  A '>' indicates
106// that parameter is required for request.  A '<' indicates that parameter
107// is valid on reply.  A 'X' indicates that parameter is required for request
108// and is also valid (meaningful) on reply.  In the case of connect/listen
109// requests the 'X' indicates that the parameters is required for connect,
110// but returned for listen.  Sometimes a parameter may still have the values
111// passed in the request, but don't depend on it if it is not marked with an 'X'.
112
113
114class TIrEvent : public OSObject
115{
116    OSDeclareDefaultStructors(TIrEvent);
117
118    public:
119
120    static  IrDAErr     InitEventLists(void);
121    static  void        DeleteEventLists(void);
122
123    static  TIrEvent *  GrabEventBlock(ULong event, ULong size);
124    static  void        ReleaseEventBlock(TIrEvent * eventBlock);
125
126
127	    UByte           fEvent;             // X
128	    UByte           fPendEvent;         // X LSAPConn saves original request here.
129	    UByte           fAllocated;         // debugging
130	    UByte           fPadByte2;
131	    IrDAErr         fResult;            // <
132
133	    TIrStream       *fClient;           // Client who initiated this task
134	    TIrStream       *fDest;             // Sream where this event is posted
135};
136
137
138class TIrLargestEvent : public TIrEvent
139{
140    OSDeclareDefaultStructors(TIrLargestEvent);
141
142    public:
143
144	static TIrLargestEvent * tIrLargestEvent();     // allocate a TIrEvent with room to morph (ugh!)
145    //ULong           fSubClassFields[kMaxSubClassFields];
146    uintptr_t           fSubClassFields[kMaxSubClassFields];	// LP64 test
147};
148
149
150class TIrDiscoverEvent : public TIrEvent
151{
152    OSDeclareDefaultStructors(TIrDiscoverEvent);
153
154    public:
155
156	    ULong           fNumSlots;          // >
157	    ULong           fConflictDevAddr;   // > Set by IrLMP
158	    CList*          fDiscoveredDevices; // >
159	    Boolean         fPassiveDiscovery;  // < Did peer discover me?
160};
161
162class TIrExtDiscoverEvent : public TIrDiscoverEvent
163{
164    OSDeclareDefaultStructors(TIrExtDiscoverEvent);
165
166    public:
167	    void        *   fCallBack;
168	    void        *   fUserData;
169};
170
171// Discover requests and replies
172typedef TIrDiscoverEvent TIrDiscoverRequest;
173typedef TIrDiscoverEvent TIrDiscoverReply;
174
175typedef TIrExtDiscoverEvent TIrExtDiscoverRequest;
176typedef TIrExtDiscoverEvent TIrExtDiscoverReply;
177
178// The LSAP request/reply base class
179class TIrLSAPConnEvent : public TIrEvent
180{
181    OSDeclareDefaultStructors(TIrLSAPConnEvent);
182
183    public:
184
185	    TLSAPConn*      fLSAPConn;          // X Client making the request, set by LSAPConn
186};
187
188// Disconnect, release requests and replies
189typedef TIrLSAPConnEvent TIrDisconnectEvent;
190typedef TIrDisconnectEvent TIrDisconnectRequest;
191typedef TIrDisconnectEvent TIrDisconnectReply;
192
193
194// The connect/listen/accept base class
195class TIrConnectEvent : public TIrLSAPConnEvent
196{
197    OSDeclareDefaultStructors(TIrConnectEvent);
198
199    public:
200
201	    ULong           fDevAddr;           // > Addr of device to connect to (for connect)
202	    UByte           fLSAPId;            // X Addr of LSAP to connect to (for connect)
203	    Boolean         fPassiveConnect;    // < Did my connect become a secondary citizen?
204	    TIrQOS*         fMyQOS;             // > Preferred QOS
205	    TIrQOS*         fPeerQOS;           // > Peer device's QOS
206	    CBuffer*        fData;              // > Connect data to send w/conn or recv w/listen
207};
208
209// Connect/listen/accept requests and replies
210typedef TIrConnectEvent TIrConnLstnRequest;
211typedef TIrConnectEvent TIrConnLstnReply;
212
213
214// The get/put base class
215
216// JDG: append get/put requests on end of a conn/listen so that when lsapconn turns
217// a listen into a get it doesn't smash the original record (ahem).
218
219//class TIrDataXferEvent : public TIrLSAPConnEvent
220class TIrDataXferEvent : public TIrConnectEvent
221{
222    OSDeclareDefaultStructors(TIrDataXferEvent);
223
224    public:
225
226	    //CBuffer*      fData;              // > Buffer to receive data
227	    ULong           fOffset;            // X Offset in buffer to get the data
228	    ULong           fLength;            // X Space available for received data
229	    UByte           fDstLSAPId;         // X Destination LSAP selector id
230	    UByte           fSrcLSAPId;         // X Source LSAP selector id
231	    UByte           fCtrlOpCode;        // X Data frame or control frame indicator
232	    UByte           fCtrlInfo;          // X Control frame results, status
233};
234
235// Put requests and replies
236typedef TIrDataXferEvent TIrPutEvent;
237typedef TIrPutEvent TIrPutRequest;
238typedef TIrPutEvent TIrPutReply;
239
240// Get requests and replies
241typedef TIrDataXferEvent TIrGetEvent;
242typedef TIrGetEvent TIrGetRequest;
243typedef TIrGetEvent TIrGetReply;
244
245// Cancel get requests and replies
246typedef TIrLSAPConnEvent TIrCancelGetEvent;
247typedef TIrCancelGetEvent TIrCancelGetRequest;
248typedef TIrCancelGetEvent TIrCancelGetReply;
249
250// Cancel put requests and replies
251typedef TIrLSAPConnEvent TIrCancelPutEvent;
252typedef TIrCancelPutEvent TIrCancelPutRequest;
253typedef TIrCancelPutEvent TIrCancelPutReply;
254
255
256class TIrLookupEvent : public TIrEvent
257{
258    OSDeclareDefaultStructors(TIrLookupEvent);
259
260    public:
261
262	    UChar*          fClassName;         // > Class name of attr entry being searched for
263	    UChar*          fAttrName;          // > Attr name of attr entry being searched for
264	    TIASAttribute*  fAttribute;         // > Returned in reply
265	    ULong           fPeerLSAPId;            // LSAP of requested Attribute
266};
267
268// Lookup requests and replies
269typedef TIrLookupEvent TIrLookupRequest;
270typedef TIrLookupEvent TIrLookupReply;
271
272
273//----------------------------------------------------------------------------------------------
274//      IrEvent inlines
275//----------------------------------------------------------------------------------------------
276
277inline ULong RequestIdToReplyId(ULong requestId)
278{
279    return (ULong) (requestId + 1);
280}
281
282
283#endif // __IREVENT_H
284