1 /*=========================================================================
2  *
3  *  Copyright Insight Software Consortium
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *         http://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  *=========================================================================*/
18 
19 
20 /*
21  * This file is the implementation of the ULTransitionTable class, including
22  * the actual event handling as well as the construction of the table itself.
23  */
24 
25 #include "gdcmULTransitionTable.h"
26 #include "gdcmULActionAA.h"
27 #include "gdcmULActionAE.h"
28 #include "gdcmULActionAR.h"
29 #include "gdcmULActionDT.h"
30 
31 namespace gdcm
32 {
33 namespace network
34 {
35 //construct the table
ULTransitionTable()36 ULTransitionTable::ULTransitionTable()
37 {
38 //row 1
39 // A-ASSOCIATE Request (local user)
40   mTable[eAASSOCIATERequestLocalUser].transitions[GetStateIndex(eSta1Idle)] =
41     Transition::MakeNew(eSta4LocalAssocDone, new ULActionAE1());
42 //row 2
43 // Transport Conn. Confirmn (local transport service)
44   mTable[eTransportConnConfirmLocal].transitions[GetStateIndex(eSta4LocalAssocDone)] =
45     Transition::MakeNew(eSta5WaitRemoteAssoc, new ULActionAE2());
46 //row 3
47 // A-ASSOCIATE-AC PDU (received on transport connection)
48   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta2Open)] =
49     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
50   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
51     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
52   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
53     Transition::MakeNew(eSta6TransferReady, new ULActionAE3());
54   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta6TransferReady)] =
55     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
56   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta7WaitRelease)] =
57     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
58   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
59     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
60   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
61     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
62   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
63     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
64   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
65     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
66   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
67     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
68   mTable[eASSOCIATE_ACPDUreceived].transitions[GetStateIndex(eSta13AwaitingClose)] =
69     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA6());
70 
71 //row 4
72 // A-ASSOCIATE-RJ PDU (received on transport connection)
73   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta2Open)] =
74     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
75   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
76     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
77   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
78     Transition::MakeNew(eSta1Idle, new ULActionAE4());
79   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta6TransferReady)] =
80     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
81   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta7WaitRelease)] =
82     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
83   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
84     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
85   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
86     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
87   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
88     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
89   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
90     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
91   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
92     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
93   mTable[eASSOCIATE_RJPDUreceived].transitions[GetStateIndex(eSta13AwaitingClose)] =
94     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA6());
95 //row 5
96 // Transport Connection Indication (local transport service)
97   mTable[eTransportConnIndicLocal].transitions[GetStateIndex(eSta1Idle)] =
98     Transition::MakeNew(eSta2Open, new ULActionAE5());
99 //row 6
100 // A-ASSOCIATE-RQ PDU (received on transport connection)
101   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta2Open)] =
102     Transition::MakeNew(eSta3WaitLocalAssoc | eSta13AwaitingClose, new ULActionAE6());
103   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
104     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
105   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
106     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
107   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta6TransferReady)] =
108     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
109   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta7WaitRelease)] =
110     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
111   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
112     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
113   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
114     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
115   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
116     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
117   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
118     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
119   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
120     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
121   mTable[eAASSOCIATE_RQPDUreceived].transitions[GetStateIndex(eSta13AwaitingClose)] =
122     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA7());
123 //row 7
124 // A-ASSOCIATE response primitive (accept)
125   mTable[eAASSOCIATEresponseAccept].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
126     Transition::MakeNew(eSta7WaitRelease, new ULActionAE7());
127 //row 8
128 // A-ASSOCIATE response primitive (reject)
129   mTable[eAASSOCIATEresponseReject].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
130     Transition::MakeNew(eSta7WaitRelease, new ULActionAE7());
131 //Row 9
132 // P-DATA request primitive
133   mTable[ePDATArequest].transitions[GetStateIndex(eSta6TransferReady)] =
134     Transition::MakeNew(eSta6TransferReady, new ULActionDT1());
135   mTable[ePDATArequest].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
136     Transition::MakeNew(eSta8WaitLocalRelease, new ULActionAR7());
137 //row 10
138 // P-DATA-TF PDU
139   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta2Open)] =
140     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
141   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
142     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
143   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
144     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
145   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta6TransferReady)] =
146     Transition::MakeNew(eSta6TransferReady, new ULActionDT2());
147   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta7WaitRelease)] =
148     Transition::MakeNew(eSta7WaitRelease, new ULActionAR6());
149   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
150     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
151   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
152     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
153   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
154     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
155   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
156     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
157   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
158     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
159   mTable[ePDATATFPDU].transitions[GetStateIndex(eSta13AwaitingClose)] =
160     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA6());
161 //row 11
162 // A-RELEASE Request primitive
163   mTable[eARELEASERequest].transitions[GetStateIndex(eSta6TransferReady)] =
164     Transition::MakeNew(eSta7WaitRelease, new ULActionAR1());
165 //row 12
166 // A-RELEASE-RQ PDU (received on open transport connection)
167   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta2Open)] =
168     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
169   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
170     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
171   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
172     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
173   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta6TransferReady)] =
174     Transition::MakeNew(eSta8WaitLocalRelease, new ULActionAR2());
175   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta7WaitRelease)] =
176     Transition::MakeNew(eSta9ReleaseCollisionRqLocal | eSta10ReleaseCollisionAc, new ULActionAR8());
177   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
178     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
179   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
180     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
181   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
182     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
183   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
184     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
185   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
186     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
187   mTable[eARELEASE_RQPDUReceivedOpen].transitions[GetStateIndex(eSta13AwaitingClose)] =
188     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA6());
189 //row 13
190 // A-RELEASE-RP PDU (received on transport connection)
191   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta2Open)] =
192     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
193   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
194     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
195   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
196     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
197   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta6TransferReady)] =
198     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
199   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta7WaitRelease)] =
200     Transition::MakeNew(eSta1Idle, new ULActionAR3());
201   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
202     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
203   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
204     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
205   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
206     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
207   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
208     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
209   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
210     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
211   mTable[eARELEASE_RPPDUReceived].transitions[GetStateIndex(eSta13AwaitingClose)] =
212     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA6());
213 // Row 14
214 // A-RELEASE Response primitive
215   mTable[eARELEASEResponse].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
216     Transition::MakeNew(eSta13AwaitingClose, new ULActionAR4());
217   mTable[eARELEASEResponse].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
218     Transition::MakeNew(eSta11ReleaseCollisionRq, new ULActionAR9);
219   mTable[eARELEASEResponse].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
220     Transition::MakeNew(eSta13AwaitingClose, new ULActionAR4());
221 // row 15
222 // A-ABORT Request primitive
223   mTable[eAABORTRequest].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
224     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
225   mTable[eAABORTRequest].transitions[GetStateIndex(eSta4LocalAssocDone)] =
226     Transition::MakeNew(eSta1Idle, new ULActionAA2());
227   mTable[eAABORTRequest].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
228     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
229   mTable[eAABORTRequest].transitions[GetStateIndex(eSta6TransferReady)] =
230     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
231   mTable[eAABORTRequest].transitions[GetStateIndex(eSta7WaitRelease)] =
232     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
233   mTable[eAABORTRequest].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
234     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
235   mTable[eAABORTRequest].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
236     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
237   mTable[eAABORTRequest].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
238     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
239   mTable[eAABORTRequest].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
240     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
241   mTable[eAABORTRequest].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
242     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
243 // row 16
244 // A-ABORT PDU (received on open transport connection)
245   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta2Open)] =
246     Transition::MakeNew(eSta1Idle, new ULActionAA2());
247   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
248     Transition::MakeNew(eSta1Idle, new ULActionAA3());
249   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
250     Transition::MakeNew(eSta1Idle, new ULActionAA3());
251   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta6TransferReady)] =
252     Transition::MakeNew(eSta1Idle, new ULActionAA3());
253   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta7WaitRelease)] =
254     Transition::MakeNew(eSta1Idle, new ULActionAA3());
255   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
256     Transition::MakeNew(eSta1Idle, new ULActionAA3());
257   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
258     Transition::MakeNew(eSta1Idle, new ULActionAA3());
259   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
260     Transition::MakeNew(eSta1Idle, new ULActionAA3());
261   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
262     Transition::MakeNew(eSta1Idle, new ULActionAA3());
263   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
264     Transition::MakeNew(eSta1Idle, new ULActionAA3());
265   mTable[eAABORTPDUReceivedOpen].transitions[GetStateIndex(eSta13AwaitingClose)] =
266     Transition::MakeNew(eSta1Idle, new ULActionAA2());
267 //row 17
268 // Transport connection closed indication (local transport service),
269   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta2Open)] =
270     Transition::MakeNew(eSta1Idle, new ULActionAA5());
271   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
272     Transition::MakeNew(eSta1Idle, new ULActionAA4());
273   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta4LocalAssocDone)] =
274     Transition::MakeNew(eSta1Idle, new ULActionAA4());
275   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
276     Transition::MakeNew(eSta1Idle, new ULActionAA4());
277   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta6TransferReady)] =
278     Transition::MakeNew(eSta1Idle, new ULActionAA4());
279   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta7WaitRelease)] =
280     Transition::MakeNew(eSta1Idle, new ULActionAA4());
281   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
282     Transition::MakeNew(eSta1Idle, new ULActionAA4());
283   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
284     Transition::MakeNew(eSta1Idle, new ULActionAA4());
285   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
286     Transition::MakeNew(eSta1Idle, new ULActionAA4());
287   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
288     Transition::MakeNew(eSta1Idle, new ULActionAA4());
289   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
290     Transition::MakeNew(eSta1Idle, new ULActionAA4());
291   mTable[eTransportConnectionClosed].transitions[GetStateIndex(eSta13AwaitingClose)] =
292     Transition::MakeNew(eSta1Idle, new ULActionAA5());
293 //row 18
294 // ARTIM timer expired (Association reject/release timer),
295   mTable[eARTIMTimerExpired].transitions[GetStateIndex(eSta2Open)] =
296     Transition::MakeNew(eSta1Idle, new ULActionAA2());
297   mTable[eARTIMTimerExpired].transitions[GetStateIndex(eSta13AwaitingClose)] =
298     Transition::MakeNew(eSta1Idle, new ULActionAA2());
299 //row 19
300 // Unrecognized or invalid PDU received
301   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta3WaitLocalAssoc)] =
302     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA1());
303   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta13AwaitingClose)] =
304     Transition::MakeNew(eSta1Idle, new ULActionAA8());
305   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta5WaitRemoteAssoc)] =
306     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
307   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta6TransferReady)] =
308     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
309   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta7WaitRelease)] =
310     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
311   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta8WaitLocalRelease)] =
312     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
313   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta9ReleaseCollisionRqLocal)] =
314     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
315   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta10ReleaseCollisionAc)] =
316     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
317   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta11ReleaseCollisionRq)] =
318     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA8());
319   mTable[eUnrecognizedPDUReceived].transitions[GetStateIndex(eSta12ReleaseCollisionAcLocal)] =
320     Transition::MakeNew(eSta13AwaitingClose, new ULActionAA7());
321 }
322 
323 //given the event and the state of the connection, call the appropriate action
HandleEvent(Subject * s,ULEvent & inEvent,ULConnection & inConnection,bool & outWaitingForEvent,EEventID & outRaisedEvent) const324 void ULTransitionTable::HandleEvent(Subject *s, ULEvent& inEvent, ULConnection& inConnection,
325                                     bool& outWaitingForEvent, EEventID& outRaisedEvent) const{
326   //first, find the Event
327   EEventID eventID = inEvent.GetEvent();
328   if (eventID < eEventDoesNotExist)
329     { //make sure that the event exists
330     //have to convert the state ID into an index
331     int stateIndex = GetStateIndex(inConnection.GetState());
332     if (stateIndex >= 0 && stateIndex < cMaxStateID)
333       {
334       if ( mTable[eventID].transitions[stateIndex] )
335         {
336         if (mTable[eventID].transitions[stateIndex]->mAction != nullptr)
337           {
338           gdcmDebugMacro( "Process: Event:" << (int)eventID << ", State:" << stateIndex );
339           inConnection.SetState(mTable[eventID].transitions[stateIndex]->mAction->
340             PerformAction(s,inEvent, inConnection, outWaitingForEvent, outRaisedEvent));
341           }
342         }
343       else
344         {
345         gdcmDebugMacro( "Transition failed (NULL) for event:" << (int)eventID << ", State:" << stateIndex );
346         }
347       }
348     }
349 }
350 
351 } // end namespace network
352 } // end namespace gdcm
353