1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2005-2016. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20
21%%
22%%----------------------------------------------------------------------
23%% Purpose: Utility functions for creating the megaco types
24%%----------------------------------------------------------------------
25
26-module(megaco_test_msg_prev3b_lib).
27
28%% ----
29
30-compile({no_auto_import,[error/1]}).
31
32%% ----
33
34-include_lib("megaco/include/megaco_message_prev3b.hrl").
35-include_lib("megaco/include/megaco.hrl").
36
37%% ----
38
39-export([chk_MegacoMessage/2,
40	 cre_MegacoMessage/1, cre_MegacoMessage/2,
41	 cre_AuthenticationHeader/3,
42	 cre_Message/3,
43	 cre_ErrorDescriptor/1, cre_ErrorDescriptor/2,
44	 cre_ErrorCode/1,
45	 cre_ErrorText/1,
46	 cre_ContextID/1,
47	 cre_Transaction/1,
48	 cre_TransactionId/1,
49	 cre_TransactionRequest/2,
50	 cre_TransactionPending/1,
51	 cre_TransactionReply/2, cre_TransactionReply/3,
52	 cre_TransactionAck/1, cre_TransactionAck/2,
53	 cre_ActionRequest/2, cre_ActionRequest/3, cre_ActionRequest/4,
54	 cre_ActionReply/2, cre_ActionReply/3, cre_ActionReply/4,
55	 cre_ContextRequest/0, cre_ContextRequest/1, cre_ContextRequest/2,
56	 cre_ContextRequest/3, cre_ContextRequest/4, cre_ContextRequest/5,
57	 cre_ContextAttrAuditRequest/0, cre_ContextAttrAuditRequest/3,
58	 cre_ContextAttrAuditRequest/4, cre_ContextAttrAuditRequest/5,
59	 cre_CommandRequest/1, cre_CommandRequest/2, cre_CommandRequest/3,
60	 cre_Command/2,
61	 cre_CommandReply/2,
62	 cre_TopologyRequest/3, cre_TopologyRequest/4,
63	 cre_AmmRequest/2,
64	 cre_AmmDescriptor/1,
65	 cre_AmmsReply/1, cre_AmmsReply/2,
66	 cre_SubtractRequest/1, cre_SubtractRequest/2,
67	 cre_AuditRequest/2,
68	 cre_AuditReply/1,
69	 cre_AuditResult/2,
70	 cre_AuditReturnParameter/1,
71	 cre_AuditDescriptor/0, cre_AuditDescriptor/1, cre_AuditDescriptor/2,
72	 cre_IndAuditParameter/1,
73	 cre_IndAudMediaDescriptor/0, cre_IndAudMediaDescriptor/1,
74	 cre_IndAudMediaDescriptor/2,
75	 cre_IndAudStreamDescriptor/2,
76	 cre_IndAudStreamParms/0, cre_IndAudStreamParms/1,
77	 cre_IndAudStreamParms/3, cre_IndAudStreamParms/4,
78	 cre_IndAudLocalControlDescriptor/0,
79	 cre_IndAudLocalControlDescriptor/4,
80	 cre_IndAudPropertyParm/1,
81	 cre_IndAudLocalRemoteDescriptor/1,
82	 cre_IndAudLocalRemoteDescriptor/2,
83	 cre_IndAudPropertyGroup/1,
84	 cre_IndAudTerminationStateDescriptor/1,
85	 cre_IndAudTerminationStateDescriptor/3,
86	 cre_IndAudEventsDescriptor/1, cre_IndAudEventsDescriptor/2,
87	 cre_IndAudEventsDescriptor/3,
88	 cre_IndAudEventBufferDescriptor/1,
89	 cre_IndAudEventBufferDescriptor/2,
90	 cre_IndAudSignalsDescriptor/1,
91	 cre_IndAudSeqSigList/1,
92	 cre_IndAudSeqSigList/2,
93	 cre_IndAudSignal/1, cre_IndAudSignal/2,
94	 cre_IndAudDigitMapDescriptor/0, cre_IndAudDigitMapDescriptor/1,
95	 cre_IndAudStatisticsDescriptor/1,
96	 cre_IndAudPackagesDescriptor/2,
97	 cre_NotifyRequest/2, cre_NotifyRequest/3,
98	 cre_NotifyReply/1, cre_NotifyReply/2,
99	 cre_ObservedEventsDescriptor/2,
100	 cre_ObservedEvent/2, cre_ObservedEvent/3, cre_ObservedEvent/4,
101	 cre_EventName/1,
102	 cre_EventParameter/2, cre_EventParameter/4,
103	 cre_ServiceChangeRequest/2,
104	 cre_ServiceChangeReply/2,
105	 cre_ServiceChangeResult/1,
106	 %% cre_WildcardField/1,
107	 cre_TerminationAudit/1,
108	 cre_TerminationID/2,
109	 cre_TerminationIDList/1,
110	 cre_MediaDescriptor/0, cre_MediaDescriptor/1, cre_MediaDescriptor/2,
111	 cre_StreamDescriptor/2,
112	 cre_StreamParms/0, cre_StreamParms/1, cre_StreamParms/2,
113	 cre_StreamParms/3, cre_StreamParms/4,
114	 cre_LocalControlDescriptor/1, cre_LocalControlDescriptor/2,
115	 cre_LocalControlDescriptor/4,
116	 cre_StreamMode/1,
117	 cre_PropertyParm/2, cre_PropertyParm/4,
118	 cre_Name/1,
119	 cre_PkgdName/1,
120	 cre_PkgdName/2,
121	 cre_Relation/1,
122	 cre_LocalRemoteDescriptor/1,
123	 cre_PropertyGroup/1,
124	 cre_TerminationStateDescriptor/1,
125	 cre_TerminationStateDescriptor/2,
126	 cre_TerminationStateDescriptor/3,
127	 cre_EventBufferControl/1,
128	 cre_ServiceState/1,
129	 cre_MuxDescriptor/2, %% cre_MuxDescriptor/3,
130	 cre_MuxType/1,
131	 cre_StreamID/1,
132	 cre_EventsDescriptor/0, cre_EventsDescriptor/2,
133	 cre_RequestedEvent/1,
134	 cre_RequestedEvent/2, cre_RequestedEvent/3, cre_RequestedEvent/4,
135	 cre_RequestedActions/0,
136	 cre_RequestedActions/1, cre_RequestedActions/4,
137	 cre_EventDM/1,
138	 cre_SecondEventsDescriptor/1, cre_SecondEventsDescriptor/2,
139	 cre_SecondRequestedEvent/2, cre_SecondRequestedEvent/3,
140	 cre_SecondRequestedEvent/4,
141	 cre_SecondRequestedActions/0, cre_SecondRequestedActions/1,
142	 cre_SecondRequestedActions/2, cre_SecondRequestedActions/3,
143	 cre_EventBufferDescriptor/1,
144	 cre_EventSpec/2,
145	 cre_EventSpec/3,
146	 cre_SignalsDescriptor/1,
147	 cre_SignalRequest/1,
148	 cre_SeqSigList/2,
149	 cre_Signal/1, cre_Signal/2, cre_Signal/7, cre_Signal/9,
150	 cre_SignalDirection/1,
151	 cre_SignalType/1,
152	 cre_SignalName/1,
153	 cre_NotifyCompletion/1,
154	 cre_SigParameter/2, cre_SigParameter/4,
155	 cre_RequestID/1,
156	 cre_ModemDescriptor/2, %% cre_ModemDescriptor/3,
157	 cre_ModemType/1,
158	 cre_DigitMapDescriptor/0, cre_DigitMapDescriptor/1,
159	 cre_DigitMapDescriptor/2,
160	 cre_DigitMapName/1,
161	 cre_DigitMapValue/1, cre_DigitMapValue/4, cre_DigitMapValue/5,
162	 cre_ServiceChangeParm/2, cre_ServiceChangeParm/4,
163	 cre_ServiceChangeParm/9, cre_ServiceChangeParm/10,
164	 cre_ServiceChangeAddress/2,
165	 cre_ServiceChangeResParm/0, cre_ServiceChangeResParm/2,
166	 cre_ServiceChangeResParm/5,
167	 cre_ServiceChangeMethod/1,
168	 cre_ServiceChangeProfile/1, cre_ServiceChangeProfile/2,
169	 cre_PackagesDescriptor/1,
170	 cre_PackagesItem/2,
171	 cre_StatisticsDescriptor/1,
172	 cre_StatisticsParameter/1, cre_StatisticsParameter/2,
173%% 	 cre_NonStandardData/2,
174%% 	 cre_NonStandardIdentifier/1,
175%% 	 cre_H221NonStandard/4,
176	 cre_TimeNotation/2,
177	 cre_Value/1,
178	 cre_BOOLEAN/1
179	]).
180
181
182%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
183
184cre_MegacoMessage(M) when is_record(M, 'Message') ->
185    #'MegacoMessage'{mess = M}.
186
187cre_MegacoMessage(AH, M)
188  when is_record(AH, 'AuthenticationHeader') andalso
189       is_record(M, 'Message') ->
190    #'MegacoMessage'{authHeader = AH,
191		     mess       = M}.
192
193cre_AuthenticationHeader(SPI, SN, AD) ->
194    #'AuthenticationHeader'{secParmIndex = SPI,
195			    seqNum       = SN,
196			    ad           = AD}.
197
198cre_Message(V, Mid, ED) when is_record(ED, 'ErrorDescriptor') ->
199    Body = {errorDescriptor, ED},
200    #'Message'{version     = V,
201	       mId         = Mid,
202	       messageBody = Body};
203cre_Message(V, Mid, Transactions) when is_list(Transactions) ->
204    Body = {transactions, Transactions},
205    #'Message'{version     = V,
206	       mId         = Mid,
207	       messageBody = Body};
208cre_Message(V, Mid, {transactions, T} = Body) when is_list(T) ->
209    #'Message'{version     = V,
210	       mId         = Mid,
211	       messageBody = Body};
212cre_Message(V, Mid, {errorDescriptor, ED} = Body)
213  when is_record(ED, 'ErrorDescriptor') ->
214    #'Message'{version     = V,
215	       mId         = Mid,
216	       messageBody = Body}.
217
218
219cre_ErrorDescriptor(EC) when is_integer(EC) ->
220    #'ErrorDescriptor'{errorCode = EC}.
221
222cre_ErrorDescriptor(EC, ET) when is_integer(EC) andalso is_list(ET) ->
223    #'ErrorDescriptor'{errorCode = EC, errorText = ET}.
224
225cre_ErrorCode(C) when is_integer(C) andalso (0 =< C) andalso (C =< 65535) ->
226    C;
227cre_ErrorCode(C) ->
228    exit({invalid_ErrorCode, C}).
229
230cre_ErrorText(T) when is_list(T) ->
231    T.
232
233cre_ContextID(Val) when (0 =< Val) andalso (Val =< 4294967295) ->
234    Val;
235cre_ContextID(Val) ->
236    exit({invalid_ContextID, Val}).
237
238cre_Transaction(TR) when is_record(TR, 'TransactionRequest') ->
239    {transactionRequest, TR};
240cre_Transaction(TP) when is_record(TP, 'TransactionPending') ->
241    {transactionPending, TP};
242cre_Transaction(TR) when is_record(TR, 'TransactionReply') ->
243    {transactionReply, TR};
244cre_Transaction(TRA) when is_list(TRA) ->
245    {transactionResponseAck, TRA}.
246
247cre_TransactionId(Val) when 0 =< Val, Val =< 4294967295 ->
248    Val;
249cre_TransactionId(Val) ->
250    exit({invalid_TransactionId, Val}).
251
252cre_TransactionRequest(TransID, ARs) when is_integer(TransID) andalso is_list(ARs) ->
253    #'TransactionRequest'{transactionId = TransID,
254			  actions       = ARs}.
255
256cre_TransactionPending(TransID) when is_integer(TransID) ->
257    #'TransactionPending'{transactionId = TransID}.
258
259cre_TransactionReply(TransID, ED)
260  when is_integer(TransID) andalso is_record(ED, 'ErrorDescriptor') ->
261    Res = {transactionError, ED},
262    #'TransactionReply'{transactionId     = TransID,
263			transactionResult = Res};
264cre_TransactionReply(TransID, ARs)
265  when is_integer(TransID) andalso is_list(ARs) ->
266    Res = {actionReplies, ARs},
267    #'TransactionReply'{transactionId     = TransID,
268			transactionResult = Res}.
269
270cre_TransactionReply(TransID, IAR, ED)
271  when is_integer(TransID) and
272       ((IAR == 'NULL') or (IAR == asn1_NOVALUE)) and
273       is_record(ED, 'ErrorDescriptor') ->
274    Res = {transactionError, ED},
275    #'TransactionReply'{transactionId     = TransID,
276			transactionResult = Res};
277cre_TransactionReply(TransID, IAR, ARs)
278  when is_integer(TransID) and
279       ((IAR == 'NULL') or (IAR == asn1_NOVALUE)) and
280       is_list(ARs) ->
281    Res = {actionReplies, ARs},
282    #'TransactionReply'{transactionId     = TransID,
283			transactionResult = Res}.
284
285cre_TransactionAck(FirstAck) ->
286    #'TransactionAck'{firstAck = FirstAck}.
287
288cre_TransactionAck(FirstAck, FirstAck) ->
289    #'TransactionAck'{firstAck = FirstAck};
290cre_TransactionAck(FirstAck, LastAck) ->
291    #'TransactionAck'{firstAck = FirstAck,
292		      lastAck  = LastAck}.
293
294cre_ActionRequest(CtxID, CmdReqs)
295  when is_integer(CtxID) and is_list(CmdReqs) ->
296    #'ActionRequest'{contextId       = CtxID,
297		     commandRequests = CmdReqs}.
298
299cre_ActionRequest(CtxID, CtxReq, CmdReqs)
300  when is_integer(CtxID) and
301       is_record(CtxReq, 'ContextRequest') and
302       is_list(CmdReqs) ->
303    #'ActionRequest'{contextId       = CtxID,
304		     contextRequest  = CtxReq,
305		     commandRequests = CmdReqs};
306cre_ActionRequest(CtxID, CAAR, CmdReqs)
307  when is_integer(CtxID) and
308       is_record(CAAR, 'ContextAttrAuditRequest') and
309       is_list(CmdReqs) ->
310    #'ActionRequest'{contextId           = CtxID,
311		     contextAttrAuditReq = CAAR,
312		     commandRequests     = CmdReqs}.
313
314cre_ActionRequest(CtxID, CtxReq, CAAR, CmdReqs)
315  when is_integer(CtxID) and
316       (is_record(CtxReq, 'ContextRequest') or
317	(CtxReq == asn1_NOVALUE)) and
318       (is_record(CAAR, 'ContextAttrAuditRequest') or
319	(CAAR == asn1_NOVALUE)) and
320       is_list(CmdReqs) ->
321    #'ActionRequest'{contextId           = CtxID,
322		     contextRequest      = CtxReq,
323		     contextAttrAuditReq = CAAR,
324		     commandRequests     = CmdReqs}.
325
326cre_ActionReply(CtxID, CmdReps)
327  when is_integer(CtxID) andalso
328       is_list(CmdReps) ->
329    #'ActionReply'{contextId    = CtxID,
330		   commandReply = CmdReps}.
331
332cre_ActionReply(CtxID, ED, CmdReps)
333  when is_integer(CtxID) andalso
334       is_record(ED, 'ErrorDescriptor') andalso
335       is_list(CmdReps) ->
336    #'ActionReply'{contextId       = CtxID,
337		   errorDescriptor = ED,
338		   commandReply    = CmdReps};
339cre_ActionReply(CtxID, CtxReq, CmdReps)
340  when is_integer(CtxID) andalso
341       is_record(CtxReq, 'ContextRequest') andalso
342       is_list(CmdReps) ->
343    #'ActionReply'{contextId    = CtxID,
344		   contextReply = CtxReq,
345		   commandReply = CmdReps}.
346
347cre_ActionReply(CtxID, ED, CtxReq, CmdReps)
348  when is_integer(CtxID) andalso
349       (is_record(ED, 'ErrorDescriptor') orelse (ED =:= asn1_NOVALUE)) andalso
350       (is_record(CtxReq, 'ContextRequest') orelse (CtxReq =:= asn1_NOVALUE)) andalso
351       is_list(CmdReps) ->
352    #'ActionReply'{contextId       = CtxID,
353		   errorDescriptor = ED,
354		   contextReply    = CtxReq,
355		   commandReply    = CmdReps}.
356
357cre_ContextRequest() ->
358    strip_ContextRequest(#'ContextRequest'{}).
359
360cre_ContextRequest(Prio) when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) ->
361    strip_ContextRequest(#'ContextRequest'{priority = Prio});
362cre_ContextRequest(Em) when (Em =:= true) orelse (Em =:= false) orelse (Em =:= asn1_NOVALUE) ->
363    strip_ContextRequest(#'ContextRequest'{emergency = Em});
364cre_ContextRequest(Top) when is_list(Top) ->
365    strip_ContextRequest(#'ContextRequest'{topologyReq = Top}).
366
367cre_ContextRequest(Prio, Em)
368  when (is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) and
369       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) ->
370    CR = #'ContextRequest'{priority  = Prio,
371			   emergency = Em},
372    strip_ContextRequest(CR);
373cre_ContextRequest(Prio, Top)
374  when is_integer(Prio) andalso (0 =< Prio) andalso (Prio =< 15) andalso is_list(Top) ->
375    CR = #'ContextRequest'{priority    = Prio,
376			   topologyReq = Top},
377    strip_ContextRequest(CR).
378
379cre_ContextRequest(Prio, Em, Top)
380  when (is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) and
381       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and
382       (is_list(Top) or (Top == asn1_NOVALUE)) ->
383    CR = #'ContextRequest'{priority    = Prio,
384			   emergency   = Em,
385			   topologyReq = Top},
386    strip_ContextRequest(CR).
387
388cre_ContextRequest(Prio, Em, Top, Ieps)
389  when (is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) and
390       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and
391       (is_list(Top) or (Top == asn1_NOVALUE)) and
392       ((Ieps == true) or (Ieps == false)) ->
393    CR = #'ContextRequest'{priority       = Prio,
394			   emergency      = Em,
395			   topologyReq    = Top,
396			   iepscallind    = Ieps},
397    strip_ContextRequest(CR);
398cre_ContextRequest(Prio, Em, Top, Ctx)
399  when ((is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) or
400	(Prio == asn1_NOVALUE)) and
401       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and
402       (is_list(Top) or (Top == asn1_NOVALUE)) and
403       (is_list(Ctx)) ->
404    CR = #'ContextRequest'{priority    = Prio,
405			   emergency   = Em,
406			   topologyReq = Top,
407			   contextProp = Ctx},
408    strip_ContextRequest(CR).
409
410cre_ContextRequest(Prio, Em, Top, Ieps, Ctx)
411  when ((is_integer(Prio) and (0 =< Prio) and (Prio =< 15)) or
412	(Prio == asn1_NOVALUE)) and
413       ((Em == true) or (Em == false) or (Em == asn1_NOVALUE)) and
414       (is_list(Top) or (Top == asn1_NOVALUE)) and
415       ((Ieps == true) or (Ieps == false) or (Ieps == asn1_NOVALUE)) and
416       (is_list(Ctx) or (Ctx == asn1_NOVALUE)) ->
417    CR = #'ContextRequest'{priority    = Prio,
418			   emergency   = Em,
419			   topologyReq = Top,
420			   iepscallind = Ieps,
421			   contextProp = Ctx},
422    strip_ContextRequest(CR).
423
424strip_ContextRequest(#'ContextRequest'{priority    = asn1_NOVALUE,
425				       emergency   = asn1_NOVALUE,
426				       topologyReq = asn1_NOVALUE,
427				       iepscallind = asn1_NOVALUE,
428				       contextProp = asn1_NOVALUE}) ->
429    asn1_NOVALUE;
430strip_ContextRequest(#'ContextRequest'{priority    = asn1_NOVALUE,
431				       emergency   = asn1_NOVALUE,
432				       topologyReq = Top,
433				       iepscallind = Ieps,
434				       contextProp = Prop} = CR) ->
435    case (((Top  == [])    or (Top  == asn1_NOVALUE)) and
436	  ((Ieps == false) or (Ieps == asn1_NOVALUE)) and
437	  ((Prop == [])    or (Prop == asn1_NOVALUE))) of
438	true ->
439	    asn1_NOVALUE;
440	false ->
441	    CR
442    end;
443strip_ContextRequest(CR) ->
444    CR.
445
446cre_ContextAttrAuditRequest() ->
447    strip_ContextAttrAuditRequest(#'ContextAttrAuditRequest'{}).
448
449cre_ContextAttrAuditRequest(Top, Em, Prio)
450  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
451       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
452       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) ->
453    CAAR = #'ContextAttrAuditRequest'{topology  = Top,
454				      emergency = Em,
455				      priority  = Prio},
456    strip_ContextAttrAuditRequest(CAAR).
457
458cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps)
459  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
460       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
461       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and
462       ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) ->
463    CAAR = #'ContextAttrAuditRequest'{topology    = Top,
464				      emergency   = Em,
465				      priority    = Prio,
466				      iepscallind = Ieps},
467    strip_ContextAttrAuditRequest(CAAR).
468
469cre_ContextAttrAuditRequest(Top, Em, Prio, Ieps, Ctx)
470  when ((Top  == 'NULL') or (Top  == asn1_NOVALUE)) and
471       ((Em   == 'NULL') or (Em   == asn1_NOVALUE)) and
472       ((Prio == 'NULL') or (Prio == asn1_NOVALUE)) and
473       ((Ieps == 'NULL') or (Ieps == asn1_NOVALUE)) and
474       (is_list(Ctx)     or (Ctx == asn1_NOVALUE)) ->
475    CAAR = #'ContextAttrAuditRequest'{topology       = Top,
476				      emergency      = Em,
477				      priority       = Prio,
478				      iepscallind    = Ieps,
479				      contextPropAud = Ctx},
480    strip_ContextAttrAuditRequest(CAAR).
481
482strip_ContextAttrAuditRequest(
483  #'ContextAttrAuditRequest'{topology       = asn1_NOVALUE,
484			     emergency      = asn1_NOVALUE,
485			     priority       = asn1_NOVALUE,
486			     iepscallind    = asn1_NOVALUE,
487			     contextPropAud = asn1_NOVALUE}) ->
488    asn1_NOVALUE;
489strip_ContextAttrAuditRequest(
490  #'ContextAttrAuditRequest'{topology       = asn1_NOVALUE,
491			     emergency      = asn1_NOVALUE,
492			     priority       = asn1_NOVALUE,
493			     iepscallind    = asn1_NOVALUE,
494			     contextPropAud = []}) ->
495    asn1_NOVALUE;
496strip_ContextAttrAuditRequest(CAAR) ->
497    CAAR.
498
499cre_CommandRequest(Cmd) ->
500    #'CommandRequest'{command = Cmd}.
501
502cre_CommandRequest(Cmd, Opt)
503  when ((Opt == 'NULL') or (Opt == asn1_NOVALUE)) ->
504    #'CommandRequest'{command  = Cmd,
505		      optional = Opt}.
506
507cre_CommandRequest(Cmd, Opt, WR)
508  when ((Opt == 'NULL') or (Opt == asn1_NOVALUE)) and
509       ((WR  == 'NULL') or (WR  == asn1_NOVALUE)) ->
510    #'CommandRequest'{command        = Cmd,
511		      optional       = Opt,
512		      wildcardReturn = WR}.
513
514cre_Command(addReq = Tag, Req)
515  when is_record(Req, 'AmmRequest') ->
516    {Tag, Req};
517cre_Command(moveReq = Tag, Req)
518  when is_record(Req, 'AmmRequest') ->
519    {Tag, Req};
520cre_Command(modReq = Tag, Req)
521  when is_record(Req, 'AmmRequest') ->
522    {Tag, Req};
523cre_Command(subtractReq = Tag, Req)
524  when is_record(Req, 'SubtractRequest') ->
525    {Tag, Req};
526cre_Command(auditCapRequest = Tag, Req)
527  when is_record(Req, 'AuditRequest') ->
528    {Tag, Req};
529cre_Command(auditValueRequest = Tag, Req)
530  when is_record(Req, 'AuditRequest') ->
531    {Tag, Req};
532cre_Command(notifyReq = Tag, Req)
533  when is_record(Req, 'NotifyRequest') ->
534    {Tag, Req};
535cre_Command(serviceChangeReq = Tag, Req)
536  when is_record(Req, 'ServiceChangeRequest') ->
537    {Tag, Req}.
538
539cre_CommandReply(addReply = Tag, Rep)
540  when is_record(Rep, 'AmmsReply') ->
541    {Tag, Rep};
542cre_CommandReply(moveReply = Tag, Rep)
543  when is_record(Rep, 'AmmsReply') ->
544    {Tag, Rep};
545cre_CommandReply(modReply = Tag, Rep)
546  when is_record(Rep, 'AmmsReply') ->
547    {Tag, Rep};
548cre_CommandReply(subtractReply = Tag, Rep)
549  when is_record(Rep, 'AmmsReply') ->
550    {Tag, Rep};
551cre_CommandReply(auditCapReply = Tag, Rep)
552  when is_tuple(Rep) ->
553    {Tag, Rep};
554cre_CommandReply(auditValueReply = Tag, Rep)
555  when is_tuple(Rep) ->
556    {Tag, Rep};
557cre_CommandReply(notifyReply = Tag, Rep)
558  when is_record(Rep, 'NotifyReply') ->
559    {Tag, Rep};
560cre_CommandReply(serviceChangeReply = Tag, Rep)
561  when is_record(Rep, 'ServiceChangeReply') ->
562    {Tag, Rep}.
563
564cre_TopologyRequest(From, To, Dir)
565  when (is_record(From, 'TerminationID') or
566	is_record(From, megaco_term_id)) and
567       (is_record(To, 'TerminationID') or
568	is_record(To, megaco_term_id)) and
569       ((Dir == bothway) or (Dir == isolate) or (Dir == oneway)) ->
570    #'TopologyRequest'{terminationFrom   = From,
571		       terminationTo     = To,
572		       topologyDirection = Dir}.
573
574cre_TopologyRequest(From, To, Dir, SID)
575  when (is_record(From, 'TerminationID') or
576	is_record(From, megaco_term_id)) and
577       (is_record(To, 'TerminationID') or
578	is_record(To, megaco_term_id)) and
579       ((Dir == bothway) or (Dir == isolate) or (Dir == oneway)) and
580       (is_integer(SID) or (SID == asn1_NOVALUE)) ->
581    #'TopologyRequest'{terminationFrom   = From,
582		       terminationTo     = To,
583		       topologyDirection = Dir,
584		       streamID          = SID}.
585
586cre_AmmRequest(TermIDs, Descs) ->
587    d("cre_AmmRequest -> entry with"
588      "~n   TermIDs: ~p"
589      "~n   Descs:   ~p", [TermIDs, Descs]),
590    case is_TerminationIDList(TermIDs) andalso
591	is_AmmRequest_descriptors(Descs) of
592	true ->
593	    #'AmmRequest'{terminationID = TermIDs,
594			  descriptors   = Descs};
595	false ->
596	    error({invalid_AmmRequest, {TermIDs, Descs}})
597    end.
598
599cre_AmmDescriptor(D) when is_record(D, 'MediaDescriptor') ->
600    {mediaDescriptor, D};
601cre_AmmDescriptor(D) when is_record(D, 'ModemDescriptor') ->
602    {modemDescriptor, D};
603cre_AmmDescriptor(D) when is_record(D, 'MuxDescriptor') ->
604    {muxDescriptor, D};
605cre_AmmDescriptor(D) when is_record(D, 'EventsDescriptor') ->
606    {eventsDescriptor, D};
607cre_AmmDescriptor(D) when is_record(D, 'DigitMapDescriptor') ->
608    {digitMapDescriptor, D};
609cre_AmmDescriptor(D) when is_record(D, 'AuditDescriptor') ->
610    {auditDescriptor, D};
611cre_AmmDescriptor(D) when is_list(D) ->
612    case is_EventBufferDescriptor(D) of
613	true ->
614	    {eventBufferDescriptor, D};
615	false ->
616	    case is_SignalsDescriptor(D) of
617		true ->
618		    {signalsDescriptor, D};
619		false ->
620		    case is_StatisticsDescriptor(D) of
621			true ->
622			    {statisticsDescriptor, D};
623			false ->
624			    error({invalid_AmmDescriptor, D})
625		    end
626	    end
627    end.
628
629cre_AmmsReply(TermIDs) when is_list(TermIDs) ->
630    #'AmmsReply'{terminationID = TermIDs}.
631
632cre_AmmsReply(TermIDs, TAs) when is_list(TermIDs) andalso is_list(TAs) ->
633    #'AmmsReply'{terminationID    = TermIDs,
634		 terminationAudit = TAs}.
635
636cre_SubtractRequest(TermIDs) when is_list(TermIDs) ->
637    #'SubtractRequest'{terminationID = TermIDs}.
638
639cre_SubtractRequest(TermIDs, Audit)
640  when is_list(TermIDs) andalso is_record(Audit, 'AuditDescriptor') ->
641    #'SubtractRequest'{terminationID   = TermIDs,
642		       auditDescriptor = Audit}.
643
644cre_AuditRequest(TermID, Audit)
645  when is_record(TermID, megaco_term_id) andalso is_record(Audit, 'AuditDescriptor') ->
646    #'AuditRequest'{terminationID   = TermID,
647		    auditDescriptor = Audit}.
648
649cre_AuditReply(TermIDs) when is_list(TermIDs) ->
650    {contextAuditResult, TermIDs};
651cre_AuditReply(ED) when is_record(ED, 'ErrorDescriptor') ->
652    {error, ED};
653cre_AuditReply(Audit) when is_record(Audit, 'AuditResult') ->
654    {auditResult, Audit}.
655
656cre_AuditResult(TermID, TAs)
657  when is_record(TermID, megaco_term_id) andalso is_list(TAs) ->
658    #'AuditResult'{terminationID          = TermID,
659		   terminationAuditResult = TAs}.
660
661cre_TerminationAudit(D) ->
662    true = is_TerminationAudit(D),
663    D.
664
665cre_AuditReturnParameter(D) when is_record(D, 'ErrorDescriptor') ->
666    {errorDescriptor, D};
667cre_AuditReturnParameter(D) when is_record(D, 'MediaDescriptor') ->
668    {mediaDescriptor, D};
669cre_AuditReturnParameter(D) when is_record(D, 'ModemDescriptor') ->
670    {modemDescriptor, D};
671cre_AuditReturnParameter(D) when is_record(D, 'MuxDescriptor') ->
672    {muxDescriptor, D};
673cre_AuditReturnParameter(D) when is_record(D, 'EventsDescriptor') ->
674    {eventsDescriptor, D};
675cre_AuditReturnParameter([H|_] = D) when is_record(H, 'EventSpec') ->
676    {eventBufferDescriptor, D};
677cre_AuditReturnParameter(D) when is_record(D, 'DigitMapDescriptor') ->
678    {digitMapDescriptor, D};
679cre_AuditReturnParameter(D) when is_record(D, 'ObservedEventsDescriptor') ->
680    {observedEventsDescriptor, D};
681cre_AuditReturnParameter([H|_] = D) when is_record(H, 'StatisticsParameter') ->
682    {statisticsDescriptor, D};
683cre_AuditReturnParameter([H|_] = D) when is_record(H, 'PackagesItem') ->
684    {packagesDescriptor, D};
685cre_AuditReturnParameter(D) when is_record(D, 'AuditDescriptor') ->
686    {emptyDescriptors, D};
687cre_AuditReturnParameter([H|_] = D) when is_tuple(H) ->
688    {signalsDescriptor, D}.
689
690cre_AuditDescriptor() ->
691    #'AuditDescriptor'{}.
692
693cre_AuditDescriptor([H|_] = AT) when is_atom(H) ->
694    #'AuditDescriptor'{auditToken = AT};
695cre_AuditDescriptor(APT) ->
696    #'AuditDescriptor'{auditPropertyToken = APT}.
697
698cre_AuditDescriptor(AT, APT) ->
699    #'AuditDescriptor'{auditToken         = AT,
700		       auditPropertyToken = APT}.
701
702cre_IndAuditParameter(D) when is_record(D, 'IndAudMediaDescriptor') ->
703    {indAudMediaDescriptor, D};
704cre_IndAuditParameter(D) when is_record(D, 'IndAudEventsDescriptor') ->
705    {indAudEventsDescriptor, D};
706cre_IndAuditParameter(D) when is_record(D, 'IndAudEventBufferDescriptor') ->
707    {indAudEventBufferDescriptor, D};
708cre_IndAuditParameter({signal, _} = D) ->
709    {indAudSignalsDescriptor, D};
710cre_IndAuditParameter({seqSigList, _} = D) ->
711    {indAudSignalsDescriptor, D};
712cre_IndAuditParameter(D) when is_record(D, 'IndAudDigitMapDescriptor') ->
713    {indAudDigitMapDescriptor, D};
714cre_IndAuditParameter(D) when is_record(D, 'IndAudStatisticsDescriptor') ->
715    {indAudStatisticsDescriptor, D};
716cre_IndAuditParameter(D) when is_record(D, 'IndAudPackagesDescriptor') ->
717    {indAudPackagesDescriptor, D}.
718
719cre_IndAudMediaDescriptor() ->
720    #'IndAudMediaDescriptor'{}.
721
722cre_IndAudMediaDescriptor(TSD)
723  when is_record(TSD, 'IndAudTerminationStateDescriptor') ->
724    #'IndAudMediaDescriptor'{termStateDescr = TSD};
725cre_IndAudMediaDescriptor(Parms) when is_record(Parms, 'IndAudStreamParms') ->
726    Streams = {oneStream, Parms},
727    #'IndAudMediaDescriptor'{streams = Streams};
728cre_IndAudMediaDescriptor(Descs) when is_list(Descs) ->
729    Streams = {multiStream, Descs},
730    #'IndAudMediaDescriptor'{streams = Streams}.
731
732cre_IndAudMediaDescriptor(TSD, Parms)
733  when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso
734       is_record(Parms, 'IndAudStreamParms') ->
735    Streams = {oneStream, Parms},
736    #'IndAudMediaDescriptor'{termStateDescr = TSD,
737			     streams        = Streams};
738cre_IndAudMediaDescriptor(TSD, Descs)
739  when is_record(TSD, 'IndAudTerminationStateDescriptor') andalso is_list(Descs) ->
740    Streams = {multiStream, Descs},
741    #'IndAudMediaDescriptor'{termStateDescr = TSD,
742			     streams        = Streams}.
743
744cre_IndAudStreamDescriptor(SID, Parms)
745  when is_integer(SID) andalso is_record(Parms, 'IndAudStreamParms') ->
746    #'IndAudStreamDescriptor'{streamID    = SID,
747			      streamParms = Parms}.
748
749cre_IndAudStreamParms() ->
750    #'IndAudStreamParms'{}.
751
752cre_IndAudStreamParms(LCD) when is_record(LCD, 'IndAudLocalControlDescriptor') ->
753    #'IndAudStreamParms'{localControlDescriptor = LCD};
754cre_IndAudStreamParms(SD) when is_record(SD, 'IndAudStatisticsDescriptor') ->
755    #'IndAudStreamParms'{statisticsDescriptor = SD}.
756
757cre_IndAudStreamParms(LC, L, R)
758  when is_record(LC, 'IndAudLocalControlDescriptor') andalso
759       is_record(L,  'IndAudLocalRemoteDescriptor') andalso
760       is_record(R,  'IndAudLocalRemoteDescriptor') ->
761    #'IndAudStreamParms'{localControlDescriptor = LC,
762			 localDescriptor        = L,
763			 remoteDescriptor       = R}.
764
765cre_IndAudStreamParms(LC, L, R, S)
766  when is_record(LC, 'IndAudLocalControlDescriptor') andalso
767       is_record(L,  'IndAudLocalRemoteDescriptor') andalso
768       is_record(R,  'IndAudLocalRemoteDescriptor') andalso
769       is_record(S,  'IndAudStatisticsDescriptor') ->
770    #'IndAudStreamParms'{localControlDescriptor = LC,
771			 localDescriptor        = L,
772			 remoteDescriptor       = R,
773			 statisticsDescriptor   = S}.
774
775cre_IndAudLocalControlDescriptor() ->
776    #'IndAudLocalControlDescriptor'{}.
777
778cre_IndAudLocalControlDescriptor(SM, RV, RG, PP)
779  when ((SM == 'NULL') or (SM == asn1_NOVALUE)) and
780       ((RV == 'NULL') or (RV == asn1_NOVALUE)) and
781       ((RG == 'NULL') or (RG == asn1_NOVALUE)) and
782       (is_list(PP) or (PP == asn1_NOVALUE)) ->
783    #'IndAudLocalControlDescriptor'{streamMode    = SM,
784				    reserveValue  = RV,
785				    reserveGroup  = RG,
786				    propertyParms = PP}.
787
788cre_IndAudPropertyParm(PkgdName) when is_list(PkgdName) ->
789    #'IndAudPropertyParm'{name = PkgdName}.
790
791cre_IndAudLocalRemoteDescriptor(Grps)
792  when is_list(Grps) ->
793    #'IndAudLocalRemoteDescriptor'{propGrps = Grps}.
794
795cre_IndAudLocalRemoteDescriptor(GrpID, Grps)
796  when is_integer(GrpID) andalso (0 =< GrpID) andalso (GrpID =< 65535) andalso is_list(Grps) ->
797    #'IndAudLocalRemoteDescriptor'{propGroupID = GrpID,
798				   propGrps    = Grps}.
799
800cre_IndAudPropertyGroup([]) ->
801    [];
802cre_IndAudPropertyGroup([H|_] = PG)
803  when is_record(H, 'IndAudPropertyParm') ->
804    PG.
805
806cre_IndAudTerminationStateDescriptor([] = PP) ->
807    #'IndAudTerminationStateDescriptor'{propertyParms = PP};
808cre_IndAudTerminationStateDescriptor([H|_] = PP)
809  when is_record(H, 'IndAudPropertyParm') ->
810    #'IndAudTerminationStateDescriptor'{propertyParms = PP}.
811
812cre_IndAudTerminationStateDescriptor([] = PP, EBC, SS)
813  when ((EBC == 'NULL') or (EBC == asn1_NOVALUE)) and
814       ((SS  == 'NULL') or (SS  == asn1_NOVALUE)) ->
815    #'IndAudTerminationStateDescriptor'{propertyParms      = PP,
816					eventBufferControl = EBC,
817					serviceState       = SS};
818cre_IndAudTerminationStateDescriptor([H|_] = PP, EBC, SS)
819  when is_record(H, 'IndAudPropertyParm') and
820       ((EBC == 'NULL') or (EBC == asn1_NOVALUE)) and
821       ((SS  == 'NULL') or (SS  == asn1_NOVALUE)) ->
822    #'IndAudTerminationStateDescriptor'{propertyParms      = PP,
823					eventBufferControl = EBC,
824					serviceState       = SS}.
825
826cre_IndAudEventsDescriptor(PkgdName)
827  when is_list(PkgdName) ->
828    #'IndAudEventsDescriptor'{pkgdName = PkgdName}.
829
830cre_IndAudEventsDescriptor(RID, PkgdName)
831  when is_integer(RID) andalso is_list(PkgdName) ->
832    #'IndAudEventsDescriptor'{requestID = RID, pkgdName = PkgdName};
833cre_IndAudEventsDescriptor(PkgdName, SID)
834  when is_list(PkgdName) andalso is_integer(SID) ->
835    #'IndAudEventsDescriptor'{pkgdName = PkgdName, streamID = SID}.
836
837cre_IndAudEventsDescriptor(RID, PkgdName, SID)
838  when is_integer(RID) andalso is_list(PkgdName) andalso is_integer(SID)  ->
839    #'IndAudEventsDescriptor'{requestID = RID,
840			      pkgdName  = PkgdName,
841			      streamID  = SID}.
842
843cre_IndAudEventBufferDescriptor(EventName) when is_list(EventName) ->
844    #'IndAudEventBufferDescriptor'{eventName = EventName}.
845
846cre_IndAudEventBufferDescriptor(EventName, SID)
847  when is_list(EventName) andalso is_integer(SID)  ->
848    #'IndAudEventBufferDescriptor'{eventName = EventName, streamID = SID}.
849
850cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSignal') ->
851    {signal, S};
852cre_IndAudSignalsDescriptor(S) when is_record(S, 'IndAudSeqSigList') ->
853    {seqSigList, S}.
854
855cre_IndAudSeqSigList(ID) when is_integer(ID) andalso (0=< ID) andalso (ID =< 65535) ->
856    #'IndAudSeqSigList'{id = ID}.
857
858cre_IndAudSeqSigList(ID, S)
859  when is_integer(ID) andalso
860       (0=< ID) andalso
861       (ID =< 65535) andalso
862       is_record(S, 'IndAudSignal') ->
863    #'IndAudSeqSigList'{id = ID, signalList = S}.
864
865cre_IndAudSignal(SigName)
866  when is_list(SigName) ->
867    #'IndAudSignal'{signalName = SigName}.
868
869cre_IndAudSignal(SigName, SID)
870  when is_list(SigName) andalso is_integer(SID) ->
871    #'IndAudSignal'{signalName = SigName, streamID = SID}.
872
873cre_IndAudDigitMapDescriptor() ->
874    #'IndAudDigitMapDescriptor'{}.
875
876cre_IndAudDigitMapDescriptor(DMN) when is_list(DMN) ->
877    #'IndAudDigitMapDescriptor'{digitMapName = DMN}.
878
879cre_IndAudStatisticsDescriptor(StatName) when is_list(StatName) ->
880    #'IndAudStatisticsDescriptor'{statName = StatName}.
881
882cre_IndAudPackagesDescriptor(N, V)
883  when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) ->
884    #'IndAudPackagesDescriptor'{packageName    = N,
885				packageVersion = V}.
886
887cre_NotifyRequest(TermIDs, D)
888  when is_list(TermIDs) andalso is_record(D, 'ObservedEventsDescriptor') ->
889    #'NotifyRequest'{terminationID            = TermIDs,
890		     observedEventsDescriptor = D}.
891
892cre_NotifyRequest(TermIDs, D, ED)
893  when is_list(TermIDs) andalso
894       is_record(D, 'ObservedEventsDescriptor') andalso
895       is_record(ED, 'ErrorDescriptor') ->
896    #'NotifyRequest'{terminationID            = TermIDs,
897		     observedEventsDescriptor = D,
898		     errorDescriptor          = ED}.
899
900cre_NotifyReply(TermIDs) when is_list(TermIDs) ->
901    #'NotifyReply'{terminationID = TermIDs}.
902
903cre_NotifyReply(TermIDs, ED)
904  when is_list(TermIDs) andalso
905       is_record(ED, 'ErrorDescriptor') ->
906    #'NotifyReply'{terminationID   = TermIDs,
907		   errorDescriptor = ED}.
908
909cre_ObservedEventsDescriptor(RID, [H|_] = L)
910  when is_integer(RID) andalso is_record(H, 'ObservedEvent') ->
911    #'ObservedEventsDescriptor'{requestId        = RID,
912				observedEventLst = L}.
913
914cre_ObservedEvent(EN, EPL) when is_list(EN) andalso is_list(EPL) ->
915    #'ObservedEvent'{eventName    = EN,
916		     eventParList = EPL};
917cre_ObservedEvent(EN, TN) when is_list(EN) andalso is_record(TN, 'TimeNotation') ->
918    #'ObservedEvent'{eventName    = EN,
919		     timeNotation = TN}.
920
921cre_ObservedEvent(EN, SID, EPL)
922  when is_list(EN) andalso is_integer(SID) andalso is_list(EPL) ->
923    #'ObservedEvent'{eventName    = EN,
924		     streamID     = SID,
925		     eventParList = EPL};
926cre_ObservedEvent(EN, EPL, TN)
927  when is_list(EN) andalso
928       is_list(EPL) andalso
929       is_record(TN, 'TimeNotation') ->
930    #'ObservedEvent'{eventName    = EN,
931		     eventParList = EPL,
932		     timeNotation = TN}.
933
934cre_ObservedEvent(EN, SID, EPL, TN)
935  when is_list(EN) andalso
936       is_integer(SID) andalso
937       is_list(EPL) andalso
938       is_record(TN, 'TimeNotation') ->
939    #'ObservedEvent'{eventName    = EN,
940		     streamID     = SID,
941		     eventParList = EPL,
942		     timeNotation = TN}.
943
944cre_EventName(N) when is_list(N) ->
945    N.
946
947cre_EventParameter(N, V) when is_list(N) andalso is_list(V) ->
948    #'EventParameter'{eventParameterName = N,
949		      value              = V}.
950
951cre_EventParameter(N, V, relation = Tag, R)
952  when is_list(N) andalso is_list(V) andalso is_atom(R) ->
953    EI = {Tag, R},
954    #'EventParameter'{eventParameterName = N,
955		      value              = V,
956		      extraInfo          = EI};
957cre_EventParameter(N, V, range = Tag, B)
958  when is_list(N) andalso is_list(V) andalso is_atom(B) ->
959    EI = {Tag, B},
960    #'EventParameter'{eventParameterName = N,
961		      value              = V,
962		      extraInfo          = EI};
963cre_EventParameter(N, V, sublist = Tag, B)
964  when is_list(N) andalso is_list(V) andalso is_atom(B) ->
965    EI = {Tag, B},
966    #'EventParameter'{eventParameterName = N,
967		      value              = V,
968		      extraInfo          = EI}.
969
970cre_ServiceChangeRequest(TermIDs, SCP)
971  when is_list(TermIDs) andalso
972       is_record(SCP, 'ServiceChangeParm') ->
973    #'ServiceChangeRequest'{terminationID      = TermIDs,
974			    serviceChangeParms = SCP}.
975
976cre_ServiceChangeReply(TermIDs, {Tag, R} = SCR)
977  when is_list(TermIDs) andalso is_atom(Tag) andalso is_tuple(R) ->
978    #'ServiceChangeReply'{terminationID       = TermIDs,
979			  serviceChangeResult = SCR}.
980
981cre_ServiceChangeResult(ED) when is_record(ED, 'ErrorDescriptor') ->
982    {errorDescriptor, ED};
983cre_ServiceChangeResult(SCRP) when is_record(SCRP, 'ServiceChangeResParm') ->
984    {serviceChangeResParms, SCRP}.
985
986%% cre_WildcardField(L) when list(L), length(L) == 1 -> L.
987
988cre_TerminationID(W, ID)
989  when is_list(W) andalso is_list(ID) andalso (1 =< length(ID)) andalso (length(ID) =< 8) ->
990    #'TerminationID'{wildcard = W,
991		     id       = ID}.
992
993cre_TerminationIDList(L) when is_list(L) ->
994    L.
995
996cre_MediaDescriptor() ->
997    #'MediaDescriptor'{}.
998
999cre_MediaDescriptor(TSD) when is_record(TSD, 'TerminationStateDescriptor') ->
1000    #'MediaDescriptor'{termStateDescr = TSD};
1001cre_MediaDescriptor(SP) when is_record(SP, 'StreamParms') ->
1002    Streams = {oneStream, SP},
1003    #'MediaDescriptor'{streams = Streams};
1004cre_MediaDescriptor([H|_] = SDs) when is_record(H, 'StreamDescriptor') ->
1005    Streams = {multiStream, SDs},
1006    #'MediaDescriptor'{streams = Streams}.
1007
1008cre_MediaDescriptor(TSD, SP)
1009  when is_record(TSD, 'TerminationStateDescriptor') andalso
1010       is_record(SP, 'StreamParms') ->
1011    Streams = {oneStream, SP},
1012    #'MediaDescriptor'{termStateDescr = TSD,
1013		       streams        = Streams};
1014cre_MediaDescriptor(TSD, [H|_] = SDs)
1015  when is_record(TSD, 'TerminationStateDescriptor') andalso
1016       is_record(H, 'StreamDescriptor') ->
1017    Streams = {multiStream, SDs},
1018    #'MediaDescriptor'{termStateDescr = TSD,
1019		       streams        = Streams}.
1020
1021cre_StreamDescriptor(SID, SP) when is_integer(SID) andalso is_record(SP, 'StreamParms') ->
1022    #'StreamDescriptor'{streamID    = SID,
1023			streamParms = SP}.
1024
1025cre_StreamParms() ->
1026    #'StreamParms'{}.
1027
1028cre_StreamParms(LCD) when is_record(LCD, 'LocalControlDescriptor') ->
1029    #'StreamParms'{localControlDescriptor = LCD};
1030cre_StreamParms(LD) when is_record(LD, 'LocalRemoteDescriptor') ->
1031    #'StreamParms'{localDescriptor = LD};
1032cre_StreamParms(SD) when is_list(SD) ->
1033    #'StreamParms'{statisticsDescriptor = SD}.
1034
1035cre_StreamParms(LCD, LD)
1036  when (is_record(LCD, 'LocalControlDescriptor') or (LCD == asn1_NOVALUE)) and
1037       (is_record(LD,  'LocalRemoteDescriptor')  or (LD  == asn1_NOVALUE)) ->
1038    #'StreamParms'{localControlDescriptor = LCD,
1039		   localDescriptor        = LD}.
1040
1041cre_StreamParms(LCD, LD, RD)
1042  when (is_record(LCD, 'LocalControlDescriptor') or (LCD == asn1_NOVALUE)) and
1043       (is_record(LD,  'LocalRemoteDescriptor')  or (LD  == asn1_NOVALUE)) and
1044       (is_record(RD,  'LocalRemoteDescriptor')  or (RD  == asn1_NOVALUE)) ->
1045    #'StreamParms'{localControlDescriptor = LCD,
1046		   localDescriptor        = LD,
1047		   remoteDescriptor       = RD};
1048cre_StreamParms(LCD, LD, SD)
1049  when (is_record(LCD, 'LocalControlDescriptor') or (LCD == asn1_NOVALUE)) and
1050       (is_record(LD,  'LocalRemoteDescriptor')  or (LD  == asn1_NOVALUE)) and
1051       (is_list(SD) or (SD == asn1_NOVALUE)) ->
1052    #'StreamParms'{localControlDescriptor = LCD,
1053		   localDescriptor        = LD,
1054		   statisticsDescriptor   = SD}.
1055
1056cre_StreamParms(LCD, LD, RD, SD)
1057  when (is_record(LCD, 'LocalControlDescriptor') or (LCD == asn1_NOVALUE)) and
1058       (is_record(LD,  'LocalRemoteDescriptor')  or (LD  == asn1_NOVALUE)) and
1059       (is_record(RD,  'LocalRemoteDescriptor')  or (RD  == asn1_NOVALUE)) and
1060       (is_list(SD) or (SD == asn1_NOVALUE)) ->
1061    #'StreamParms'{localControlDescriptor = LCD,
1062		   localDescriptor        = LD,
1063		   remoteDescriptor       = RD,
1064		   statisticsDescriptor   = SD}.
1065
1066cre_LocalControlDescriptor(SM) when is_atom(SM) ->
1067    #'LocalControlDescriptor'{streamMode = SM, propertyParms = []};
1068cre_LocalControlDescriptor([H|_] = PP) when is_record(H, 'PropertyParm') ->
1069    #'LocalControlDescriptor'{propertyParms = PP}.
1070
1071cre_LocalControlDescriptor(SM, [H|_] = PP)
1072  when is_atom(SM) andalso is_record(H, 'PropertyParm') ->
1073    #'LocalControlDescriptor'{streamMode    = SM,
1074			      propertyParms = PP}.
1075
1076cre_LocalControlDescriptor(SM, RV, RG, [H|_] = PP)
1077  when is_atom(SM) and
1078     ((RV == true) or (RV == false) or (RV == asn1_NOVALUE)) and
1079     ((RG == true) or (RG == false) or (RG == asn1_NOVALUE)) and
1080     is_record(H, 'PropertyParm') ->
1081    #'LocalControlDescriptor'{streamMode    = SM,
1082			      reserveValue  = RV,
1083			      reserveGroup  = RG,
1084			      propertyParms = PP}.
1085
1086cre_StreamMode(sendOnly = M) ->
1087    M;
1088cre_StreamMode(recvOnly = M) ->
1089    M;
1090cre_StreamMode(sendRecv = M) ->
1091    M;
1092cre_StreamMode(inactive = M) ->
1093    M;
1094cre_StreamMode(loopBack = M) ->
1095    M.
1096
1097cre_PropertyParm(N, [H|_] = V) when is_list(N) andalso is_list(H) ->
1098    #'PropertyParm'{name = N, value = V}.
1099
1100cre_PropertyParm(N, [H|_] = V, relation = Tag, R)
1101  when is_list(N) andalso is_list(H) andalso is_atom(R) ->
1102    EI = {Tag, R},
1103    #'PropertyParm'{name = N, value = V, extraInfo = EI};
1104cre_PropertyParm(N, [H|_] = V, range = Tag, B)
1105  when is_list(N) andalso is_list(H) andalso is_atom(B) ->
1106    EI = {Tag, B},
1107    #'PropertyParm'{name = N, value = V, extraInfo = EI};
1108cre_PropertyParm(N, [H|_] = V, sublist = Tag, B)
1109  when is_list(N) andalso is_list(H) andalso is_atom(B) ->
1110    EI = {Tag, B},
1111    #'PropertyParm'{name = N, value = V, extraInfo = EI}.
1112
1113
1114cre_Name(N) when is_list(N) and (length(N) == 2) ->
1115    N.
1116
1117cre_PkgdName(N) when is_list(N) ->
1118    case string:tokens(N, [$\\]) of
1119	[_PkgName, _ItemID] ->
1120	    N;
1121	_ ->
1122	    error({invalid_PkgdName, N})
1123    end.
1124cre_PkgdName(root, root) ->
1125    "*/*";
1126cre_PkgdName(PackageName, root)
1127  when is_list(PackageName) and (length(PackageName) =< 64) ->
1128    PackageName ++ "/*";
1129cre_PkgdName(PackageName, ItemID)
1130  when ((is_list(PackageName) and (length(PackageName) =< 64)) and
1131	(is_list(ItemID)      and (length(ItemID) =< 64))) ->
1132    PackageName ++ "/" ++ ItemID;
1133cre_PkgdName(PackageName, ItemID) ->
1134    error({invalid_PkgdName, {PackageName, ItemID}}).
1135
1136cre_Relation(greaterThan = R) ->
1137    R;
1138cre_Relation(smallerThan = R) ->
1139    R;
1140cre_Relation(unequalTo = R) ->
1141    R.
1142
1143cre_LocalRemoteDescriptor([H|_] = PGs) when is_list(H) ->
1144    #'LocalRemoteDescriptor'{propGrps = PGs}.
1145
1146cre_PropertyGroup([H|_] = PG) when is_record(H, 'PropertyParm') ->
1147    PG.
1148
1149cre_TerminationStateDescriptor([H|_] = PPs) when is_record(H, 'PropertyParm') ->
1150    #'TerminationStateDescriptor'{propertyParms = PPs}.
1151
1152cre_TerminationStateDescriptor([H|_] = PPs, off = EBC)
1153  when is_record(H, 'PropertyParm') ->
1154    #'TerminationStateDescriptor'{propertyParms      = PPs,
1155				  eventBufferControl = EBC};
1156cre_TerminationStateDescriptor([H|_] = PPs, lockStep = EBC)
1157  when is_record(H, 'PropertyParm') ->
1158    #'TerminationStateDescriptor'{propertyParms      = PPs,
1159				  eventBufferControl = EBC};
1160cre_TerminationStateDescriptor([H|_] = PPs, test = SS)
1161  when is_record(H, 'PropertyParm') ->
1162    #'TerminationStateDescriptor'{propertyParms = PPs,
1163				  serviceState  = SS};
1164cre_TerminationStateDescriptor([H|_] = PPs, outOfSvc = SS)
1165  when is_record(H, 'PropertyParm') ->
1166    #'TerminationStateDescriptor'{propertyParms = PPs,
1167				  serviceState  = SS};
1168cre_TerminationStateDescriptor([H|_] = PPs, inSvc = SS)
1169  when is_record(H, 'PropertyParm') ->
1170    #'TerminationStateDescriptor'{propertyParms = PPs,
1171				  serviceState  = SS}.
1172
1173cre_TerminationStateDescriptor([H|_] = PPs, EMC, SS)
1174  when is_record(H, 'PropertyParm') andalso
1175       ((EMC =:= off)  orelse (EMC =:= lockStep)) andalso
1176       ((SS  =:= test) orelse (SS  =:= outOfSvc) orelse (SS =:= inSvc)) ->
1177    #'TerminationStateDescriptor'{propertyParms      = PPs,
1178				  eventBufferControl = EMC,
1179				  serviceState       = SS}.
1180
1181cre_EventBufferControl(off = EBC) ->
1182    EBC;
1183cre_EventBufferControl(lockStep = EBC) ->
1184    EBC.
1185
1186cre_ServiceState(test = SS) ->
1187    SS;
1188cre_ServiceState(outOfSvc = SS) ->
1189    SS;
1190cre_ServiceState(inSvc = SS) ->
1191    SS.
1192
1193cre_MuxDescriptor(MT, [H|_] = TL)
1194  when is_atom(MT) andalso is_record(H, 'TerminationID') ->
1195    #'MuxDescriptor'{muxType = MT, termList = TL}.
1196
1197%% cre_MuxDescriptor(MT, [H|_] = TL, NSD)
1198%%   when atom(MT), record(H, 'TerminationID'), record(NSD, 'NonStandardData') ->
1199%%     #'MuxDescriptor'{muxType = MT, termList = TL, nonStandardData = NSD}.
1200
1201cre_MuxType(h221 = MT) ->
1202    MT;
1203cre_MuxType(h223 = MT) ->
1204    MT;
1205cre_MuxType(h226 = MT) ->
1206    MT;
1207cre_MuxType(v76 = MT) ->
1208    MT;
1209cre_MuxType(nx64k = MT) ->
1210    MT.
1211
1212cre_StreamID(Val) when 0 =< Val, Val =< 65535 ->
1213    Val;
1214cre_StreamID(Val) ->
1215    exit({invalid_ContextID, Val}).
1216
1217%% RequestID must be present if eventList is non empty
1218cre_EventsDescriptor() ->
1219    #'EventsDescriptor'{eventList = []}.
1220
1221cre_EventsDescriptor(RID, [H|_] = EL)
1222  when is_integer(RID) andalso is_record(H, 'RequestedEvent') ->
1223    #'EventsDescriptor'{requestID = RID, eventList = EL}.
1224
1225cre_RequestedEvent(N) ->
1226    #'RequestedEvent'{pkgdName = N}.
1227
1228cre_RequestedEvent(N, [H|_] = EPL)
1229  when is_list(N) andalso
1230       is_record(H, 'EventParameter') ->
1231    #'RequestedEvent'{pkgdName  = N,
1232		      evParList = EPL};
1233cre_RequestedEvent(N, EA)
1234  when is_list(N) andalso
1235       is_record(EA, 'RequestedActions')->
1236    #'RequestedEvent'{pkgdName    = N,
1237		      eventAction = EA}.
1238
1239
1240cre_RequestedEvent(N, SID, [H|_] = EPL)
1241  when is_list(N) andalso
1242       is_integer(SID) andalso
1243       is_record(H, 'EventParameter') ->
1244    #'RequestedEvent'{pkgdName  = N,
1245		      streamID  = SID,
1246		      evParList = EPL};
1247cre_RequestedEvent(N, EA, [H|_] = EPL)
1248  when is_list(N) andalso
1249       is_record(EA, 'RequestedActions') andalso
1250       is_record(H, 'EventParameter') ->
1251    #'RequestedEvent'{pkgdName     = N,
1252		      eventAction  = EA,
1253		      evParList    = EPL}.
1254
1255cre_RequestedEvent(N, SID, EA, [H|_] = EPL)
1256  when is_list(N) andalso
1257       is_integer(SID) andalso
1258       is_record(EA, 'RequestedActions') andalso
1259       is_record(H, 'EventParameter') ->
1260    #'RequestedEvent'{pkgdName     = N,
1261		      streamID     = SID,
1262		      eventAction  = EA,
1263		      evParList    = EPL}.
1264
1265cre_RequestedActions() ->
1266    #'RequestedActions'{}.
1267
1268cre_RequestedActions(KA)
1269  when (KA == true) or (KA == true) or (KA == asn1_NOVALUE) ->
1270    #'RequestedActions'{keepActive = KA};
1271cre_RequestedActions(SE)
1272  when is_record(SE, 'SecondEventsDescriptor') or (SE == asn1_NOVALUE) ->
1273    #'RequestedActions'{secondEvent = SE};
1274cre_RequestedActions(SD)
1275  when is_list(SD) or (SD == asn1_NOVALUE) ->
1276    #'RequestedActions'{signalsDescriptor = SD};
1277cre_RequestedActions({Tag, _} = EDM)
1278  when is_atom(Tag) or (EDM == asn1_NOVALUE) ->
1279    #'RequestedActions'{eventDM = EDM}.
1280
1281cre_RequestedActions(KA, {Tag, _} = EDM, SE, SD)
1282  when ((KA == true) or (KA == true) or (KA == asn1_NOVALUE)) and
1283       (is_atom(Tag) or (EDM == asn1_NOVALUE)) and
1284       (is_record(SE, 'SecondEventsDescriptor') or (SE == asn1_NOVALUE)) and
1285       (is_list(SD) or (SD == asn1_NOVALUE)) ->
1286    #'RequestedActions'{keepActive        = KA,
1287			eventDM           = EDM,
1288			secondEvent       = SE,
1289			signalsDescriptor = SD}.
1290
1291cre_EventDM(N) when is_list(N) ->
1292    {digitMapName, N};
1293cre_EventDM(V) when is_record(V, 'DigitMapValue') ->
1294    {digitMapValue, V}.
1295
1296cre_SecondEventsDescriptor([H|_] = EL)
1297  when is_record(H, 'SecondRequestedEvent') ->
1298    #'SecondEventsDescriptor'{eventList = EL}.
1299
1300cre_SecondEventsDescriptor(RID, [H|_] = EL)
1301  when is_integer(RID) andalso is_record(H, 'SecondRequestedEvent') ->
1302    #'SecondEventsDescriptor'{requestID = RID, eventList = EL}.
1303
1304cre_SecondRequestedEvent(N, [H|_] = EPL)
1305  when is_list(N) andalso
1306       is_record(H, 'EventParameter') ->
1307    #'SecondRequestedEvent'{pkgdName  = N,
1308			    evParList = EPL}.
1309
1310cre_SecondRequestedEvent(N, SID, [H|_] = EPL)
1311  when is_list(N) andalso
1312       is_integer(SID) andalso
1313       is_record(H, 'EventParameter') ->
1314    #'SecondRequestedEvent'{pkgdName  = N,
1315			    streamID  = SID,
1316			    evParList = EPL};
1317cre_SecondRequestedEvent(N, EA, [H|_] = EPL)
1318  when is_list(N) andalso
1319       is_record(EA, 'SecondRequestedActions') andalso
1320       is_record(H, 'EventParameter') ->
1321    #'SecondRequestedEvent'{pkgdName     = N,
1322			    eventAction  = EA,
1323			    evParList    = EPL}.
1324
1325cre_SecondRequestedEvent(N, SID, EA, [H|_] = EPL)
1326  when is_list(N) andalso
1327       is_integer(SID) andalso
1328       is_record(EA, 'SecondRequestedActions') andalso
1329       is_record(H, 'EventParameter') ->
1330    #'SecondRequestedEvent'{pkgdName     = N,
1331			    streamID     = SID,
1332			    eventAction  = EA,
1333			    evParList    = EPL}.
1334
1335cre_SecondRequestedActions() ->
1336    #'SecondRequestedActions'{}.
1337
1338cre_SecondRequestedActions(KA)
1339  when ((KA =:= true) orelse (KA =:= false) orelse (KA =:= asn1_NOVALUE)) ->
1340    #'SecondRequestedActions'{keepActive = KA};
1341cre_SecondRequestedActions(SD) when is_list(SD) ->
1342    #'SecondRequestedActions'{signalsDescriptor = SD};
1343cre_SecondRequestedActions({Tag, _} = EDM) when is_atom(Tag) ->
1344    #'SecondRequestedActions'{eventDM = EDM}.
1345
1346cre_SecondRequestedActions(KA, SD)
1347  when ((KA =:= true) orelse (KA =:= false) orelse (KA =:= asn1_NOVALUE)) andalso
1348       is_list(SD) ->
1349    #'SecondRequestedActions'{keepActive = KA, signalsDescriptor = SD};
1350cre_SecondRequestedActions(KA, {Tag, _} = EDM)
1351  when ((KA =:= true) orelse (KA =:= false) orelse (KA =:= asn1_NOVALUE)) andalso
1352       is_atom(Tag) ->
1353    #'SecondRequestedActions'{keepActive = KA, eventDM = EDM}.
1354
1355cre_SecondRequestedActions(KA, {Tag, _} = EDM, SD)
1356  when ((KA =:= true) orelse (KA =:= false) orelse (KA =:= asn1_NOVALUE)) andalso
1357       is_atom(Tag) andalso
1358       is_list(SD) ->
1359    #'SecondRequestedActions'{keepActive        = KA,
1360			      eventDM           = EDM,
1361			      signalsDescriptor = SD}.
1362
1363cre_EventBufferDescriptor([H|_] = D) when is_record(H, 'EventSpec') ->
1364    D.
1365
1366cre_EventSpec(N, [H|_] = EPL)
1367  when is_list(N) andalso is_record(H, 'EventParameter') ->
1368    #'EventSpec'{eventName = N, eventParList = EPL}.
1369
1370cre_EventSpec(N, SID, [H|_] = EPL)
1371  when is_list(N) andalso is_integer(SID) andalso is_record(H, 'EventParameter') ->
1372    #'EventSpec'{eventName = N, streamID = SID, eventParList = EPL}.
1373
1374cre_SignalsDescriptor(D) ->
1375    case is_SignalsDescriptor(D) of
1376	true ->
1377	    D;
1378	false ->
1379	    error({invalid_SignalsDescriptor, D})
1380    end.
1381
1382cre_SignalRequest(S) when is_record(S, 'Signal') ->
1383    {signal, S};
1384cre_SignalRequest(S) when is_record(S, 'SeqSigList') ->
1385    {seqSigList, S}.
1386
1387cre_SeqSigList(ID, [H|_] = SL)
1388  when is_integer(ID) andalso (0 =< ID) andalso (ID =< 65535) andalso is_record(H, 'Signal') ->
1389    #'SeqSigList'{id = ID, signalList = SL}.
1390
1391cre_Signal(N) when is_list(N) ->
1392    #'Signal'{signalName = N}.
1393
1394cre_Signal(N, SPL) when is_list(N) andalso is_list(SPL) ->
1395    #'Signal'{signalName = N,
1396	      sigParList = SPL}.
1397
1398cre_Signal(N, SID, ST, Dur, NC, KA, SPL)
1399  when is_list(N) and
1400       (is_integer(SID) or (SID == asn1_NOVALUE)) and
1401       ((ST == brief) or (ST == onOff) or (ST == timeOut) or
1402	(ST == asn1_NOVALUE)) and
1403       ((is_integer(Dur) and (0 =< Dur) and (Dur =< 65535)) or
1404	(Dur == asn1_NOVALUE)) and
1405       (is_list(NC) or (NC == asn1_NOVALUE)) and
1406       ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1407       is_list(SPL) ->
1408    #'Signal'{signalName       = N,
1409	      streamID         = SID,
1410	      sigType          = ST,
1411	      duration         = Dur,
1412	      notifyCompletion = NC,
1413	      keepActive       = KA,
1414	      sigParList       = SPL}.
1415
1416cre_Signal(N, SID, ST, Dur, NC, KA, SPL, Dir, RID)
1417  when is_list(N) and
1418       (is_integer(SID) or (SID == asn1_NOVALUE)) and
1419       ((ST == brief) or (ST == onOff) or (ST == timeOut) or
1420	(ST == asn1_NOVALUE)) and
1421       ((is_integer(Dur) and (0 =< Dur) and (Dur =< 65535)) or
1422	(Dur == asn1_NOVALUE)) and
1423       (is_list(NC) or (NC == asn1_NOVALUE)) and
1424       ((KA == true) or (KA == false) or (KA == asn1_NOVALUE)) and
1425       is_list(SPL) and
1426       ((Dir == internal) or (Dir == external) or (Dir == both) or
1427	(Dir == asn1_NOVALUE)) and
1428       (is_integer(RID) or (RID == asn1_NOVALUE)) ->
1429    #'Signal'{signalName       = N,
1430	      streamID         = SID,
1431	      sigType          = ST,
1432	      duration         = Dur,
1433	      notifyCompletion = NC,
1434	      keepActive       = KA,
1435	      sigParList       = SPL,
1436	      direction        = Dir,
1437	      requestID        = RID}.
1438
1439cre_SignalType(brief = ST) ->
1440    ST;
1441cre_SignalType(onOff = ST) ->
1442    ST;
1443cre_SignalType(timeOut = ST) ->
1444    ST.
1445
1446cre_SignalDirection(internal = SD) ->
1447    SD;
1448cre_SignalDirection(external = SD) ->
1449    SD;
1450cre_SignalDirection(both = SD) ->
1451    SD.
1452
1453cre_SignalName(N) ->
1454    cre_PkgdName(N).
1455
1456cre_NotifyCompletion(L) when is_list(L) ->
1457    Vals = [onTimeOut, onInterruptByEvent,
1458	    onInterruptByNewSignalDescr, otherReason],
1459    F = fun(E) -> case lists:member(E, Vals) of
1460		      true ->
1461			  ok;
1462		      false ->
1463			  exit({invalid_NotifyCompletion, E})
1464		  end
1465	end,
1466    lists:foreach(F, L),
1467    L.
1468
1469cre_SigParameter(N, V) when is_list(N) andalso is_list(V) ->
1470    #'SigParameter'{sigParameterName = N, value = V}.
1471
1472cre_SigParameter(N, V, relation = Tag, R)
1473  when is_list(N) and is_list(V) and is_atom(R) ->
1474    EI = {Tag, R},
1475    #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI};
1476cre_SigParameter(N, V, range = Tag, B)
1477  when is_list(N) and is_list(V) and is_atom(B) ->
1478    EI = {Tag, B},
1479    #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI};
1480cre_SigParameter(N, V, sublist = Tag, B)
1481  when is_list(N) and is_list(V) and is_atom(B) ->
1482    EI = {Tag, B},
1483    #'SigParameter'{sigParameterName = N, value = V, extraInfo = EI}.
1484
1485cre_RequestID(Val) when 0 =< Val, Val =< 4294967295 ->
1486    Val;
1487cre_RequestID(Val) ->
1488    exit({invalid_RequestID, Val}).
1489
1490cre_ModemDescriptor(MTL, MPL) when is_list(MTL) andalso is_list(MPL) ->
1491    #'ModemDescriptor'{mtl = MTL, mpl = MPL}.
1492
1493%% cre_ModemDescriptor(MTL, MPL, NSD)
1494%%   when list(MTL), list(MPL), record(NSD, 'NonStandardData') ->
1495%%     #'ModemDescriptor'{mtl = MTL, mpl = MPL}.
1496
1497cre_ModemType(v18 = MT) ->
1498    MT;
1499cre_ModemType(v22 = MT) ->
1500    MT;
1501cre_ModemType(v22bis = MT) ->
1502    MT;
1503cre_ModemType(v32 = MT) ->
1504    MT;
1505cre_ModemType(v32bis = MT) ->
1506    MT;
1507cre_ModemType(v34 = MT) ->
1508    MT;
1509cre_ModemType(v90 = MT) ->
1510    MT;
1511cre_ModemType(v91 = MT) ->
1512    MT;
1513cre_ModemType(synchISDN = MT) ->
1514    MT.
1515
1516cre_DigitMapDescriptor() ->
1517    #'DigitMapDescriptor'{}.
1518
1519cre_DigitMapDescriptor(N) when is_list(N) ->
1520    #'DigitMapDescriptor'{digitMapName = N};
1521cre_DigitMapDescriptor(V) when is_record(V, 'DigitMapValue') ->
1522    #'DigitMapDescriptor'{digitMapValue = V}.
1523
1524cre_DigitMapDescriptor(N, V) when is_list(N) andalso is_record(V, 'DigitMapValue') ->
1525    #'DigitMapDescriptor'{digitMapName = N, digitMapValue = V}.
1526
1527cre_DigitMapName(N) ->
1528    cre_Name(N).
1529
1530cre_DigitMapValue(DMB) when is_list(DMB) ->
1531    #'DigitMapValue'{digitMapBody = DMB}.
1532
1533cre_DigitMapValue(Start, Short, Long, DMB) ->
1534    cre_DigitMapValue(Start, Short, Long, DMB, asn1_NOVALUE).
1535
1536cre_DigitMapValue(Start, Short, Long, DMB, Dur)
1537  when ((is_integer(Start) and (0 =< Start) and (Start =< 99)) or
1538	(Start == asn1_NOVALUE)) and
1539       ((is_integer(Short) and (0 =< Short) and (Short =< 99)) or
1540	(Short == asn1_NOVALUE)) and
1541       ((is_integer(Long) and (0 =< Long) and (Long =< 99)) or
1542	(Long == asn1_NOVALUE)) and
1543       is_list(DMB) and
1544       ((is_integer(Dur) and (0 =< Dur) and (Dur =< 99)) or
1545	(Dur == asn1_NOVALUE)) ->
1546    #'DigitMapValue'{startTimer    = Start,
1547		     shortTimer    = Short,
1548		     longTimer     = Long,
1549		     digitMapBody  = DMB,
1550		     durationTimer = Dur}.
1551
1552cre_ServiceChangeParm(M, R) when is_atom(M) andalso is_list(R) ->
1553    #'ServiceChangeParm'{serviceChangeMethod = M,
1554			 serviceChangeReason = R}.
1555
1556cre_ServiceChangeParm(M, Addr, Prof, Reason) ->
1557    cre_ServiceChangeParm(M, Addr, asn1_NOVALUE, Prof, Reason, asn1_NOVALUE,
1558			  asn1_NOVALUE, asn1_NOVALUE,
1559			  asn1_NOVALUE, asn1_NOVALUE).
1560
1561%% Addr = asn1_NOVALUE | {AddrTag, AddrVal}
1562cre_ServiceChangeParm(M, Addr, Ver, Prof, R, D, Mid, TS, I) ->
1563    cre_ServiceChangeParm(M, Addr, Ver, Prof, R, D, Mid, TS, I, asn1_NOVALUE).
1564
1565cre_ServiceChangeParm(M, Addr, Ver, Prof, R, D, Mid, TS, I, IF)
1566  when is_atom(M) and
1567       ((is_integer(Ver) and (0 =< Ver) and (Ver =< 99)) or
1568	(Ver == asn1_NOVALUE)) and
1569       (is_record(Prof, 'ServiceChangeProfile') or (Prof == asn1_NOVALUE)) and
1570       is_list(R) and
1571       ((is_integer(D) and (0 =< D) and (D =< 4294967295)) or
1572	(D == asn1_NOVALUE)) and
1573       (is_record(TS, 'TimeNotation') or (TS == asn1_NOVALUE)) and
1574       (is_record(I, 'AuditDescriptor') or (I == asn1_NOVALUE)) and
1575       ((IF == 'NULL') or (IF == asn1_NOVALUE)) ->
1576    F = fun(A) ->
1577		(A == asn1_NOVALUE) orelse
1578				      (is_tuple(A)
1579				       andalso is_atom(element(1, A)))
1580	end,
1581    case (F(Addr) andalso F(Mid)) of
1582	true ->
1583	    #'ServiceChangeParm'{serviceChangeMethod         = M,
1584				 serviceChangeAddress        = Addr,
1585				 serviceChangeVersion        = Ver,
1586				 serviceChangeProfile        = Prof,
1587				 serviceChangeReason         = R,
1588				 serviceChangeDelay          = D,
1589				 serviceChangeMgcId          = Mid,
1590				 timeStamp                   = TS,
1591				 serviceChangeInfo           = I,
1592				 serviceChangeIncompleteFlag = IF};
1593	_ ->
1594	    exit({invalid_ServiceChangeParm_args, {Addr, Mid}})
1595    end.
1596
1597cre_ServiceChangeAddress(portNumber = Tag, P)
1598  when is_integer(P) andalso (0 =< P) andalso (P =< 65535) ->
1599    {Tag, P};
1600cre_ServiceChangeAddress(ip4Address = Tag, A) when is_record(A, 'IP4Address') ->
1601    {Tag, A};
1602cre_ServiceChangeAddress(ip6Address = Tag, A) when is_record(A, 'IP6Address') ->
1603    {Tag, A};
1604cre_ServiceChangeAddress(domainName = Tag, N) when is_record(N, 'DomainName') ->
1605    {Tag, N};
1606cre_ServiceChangeAddress(deviceName = Tag, N) when is_list(N) ->
1607    {Tag, N};
1608cre_ServiceChangeAddress(mtpAddress = Tag, A) when is_list(A) ->
1609    {Tag, A}.
1610
1611cre_ServiceChangeResParm() ->
1612    #'ServiceChangeResParm'{}.
1613cre_ServiceChangeResParm(Addr, Prof) ->
1614    cre_ServiceChangeResParm(asn1_NOVALUE, Addr, asn1_NOVALUE,
1615			     Prof, asn1_NOVALUE).
1616cre_ServiceChangeResParm(Mid, Addr, Ver, Prof, TS)
1617  when ((is_integer(Ver) and (0 =< Ver) andalso (Ver =< 99)) orelse
1618	(Ver =:= asn1_NOVALUE)) andalso
1619       (is_record(Prof, 'ServiceChangeProfile') orelse (Prof =:= asn1_NOVALUE)) andalso
1620       (is_record(TS, 'TimeNotation') orelse (TS =:= asn1_NOVALUE)) ->
1621    F = fun(A) ->
1622		(A =:= asn1_NOVALUE) orelse
1623				      (is_tuple(A)
1624				       andalso is_atom(element(1, A)))
1625	end,
1626    case (F(Addr) andalso F(Mid)) of
1627	true ->
1628	    #'ServiceChangeResParm'{serviceChangeMgcId   = Mid,
1629				    serviceChangeAddress = Addr,
1630				    serviceChangeVersion = Ver,
1631				    serviceChangeProfile = Prof,
1632				    timeStamp            = TS};
1633	_ ->
1634	    exit({invalid_ServiceChangeResParm_args, {Addr, Mid}})
1635    end.
1636
1637cre_ServiceChangeMethod(failover = M) ->
1638    M;
1639cre_ServiceChangeMethod(forced = M) ->
1640    M;
1641cre_ServiceChangeMethod(graceful = M) ->
1642    M;
1643cre_ServiceChangeMethod(restart = M) ->
1644    M;
1645cre_ServiceChangeMethod(disconnected = M) ->
1646    M;
1647cre_ServiceChangeMethod(handOff = M) ->
1648    M.
1649
1650%% The version field is added to make it look more like ABNF
1651cre_ServiceChangeProfile(N) ->
1652    cre_ServiceChangeProfile(N, 1).
1653
1654cre_ServiceChangeProfile(N, V)
1655  when is_list(N) andalso is_integer(V) andalso (0 =< V) andalso (V =< 99) ->
1656    #'ServiceChangeProfile'{profileName = N, version = V}.
1657
1658cre_PackagesDescriptor([H|_] = D) when is_record(H, 'PackagesItem') ->
1659    D.
1660
1661cre_PackagesItem(N, Ver)
1662  when is_list(N) andalso is_integer(Ver) andalso (0 =< Ver) andalso (Ver =< 99) ->
1663    #'PackagesItem'{packageName    = N,
1664		    packageVersion = Ver}.
1665
1666cre_StatisticsDescriptor(D) ->
1667    true = is_StatisticsDescriptor(D),
1668    D.
1669
1670cre_StatisticsParameter(N) when is_list(N) ->
1671    #'StatisticsParameter'{statName = N}.
1672
1673cre_StatisticsParameter(N, V) when is_list(N) andalso is_list(V) ->
1674    #'StatisticsParameter'{statName = N, statValue = V}.
1675
1676%% cre_NonStandardData({Tag, _} = Id, Data) when atom(Tag), list(Data) ->
1677%%     #'NonStandardData'{nonStandardIdentifier = Id, data = Data}.
1678
1679%% cre_NonStandardIdentifier(H221) when record(H221, 'H221NonStandard') ->
1680%%     {h221NonStandard, H221};
1681%% cre_NonStandardIdentifier(Obj) when tuple(Obj) ->
1682%%     {object, Obj};
1683%% cre_NonStandardIdentifier(Exp) when list(Exp), length(Exp) == 8 ->
1684%%     {experimental, Exp}.
1685
1686%% cre_H221NonStandard(CC1, CC2, Ext, MC)
1687%%   when (is_integer(CC1) and (0 =< CC1) and (CC1 =< 255)) and
1688%%        (is_integer(CC2) and (0 =< CC2) and (CC2 =< 255)) and
1689%%        (is_integer(Ext) and (0 =< Ext) and (Ext =< 255)) and
1690%%        (is_integer(MC)  and (0 =< MC)  and (MC =< 255)) ->
1691%%     #'H221NonStandard'{t35CountryCode1  = CC1,
1692%% 		       t35CountryCode2  = CC2,
1693%% 		       t35Extension     = Ext,
1694%% 		       manufacturerCode = MC}.
1695
1696cre_TimeNotation(D, T)
1697  when is_list(D) andalso (length(D) =:= 8) andalso is_list(T) andalso (length(T) =:= 8) ->
1698    #'TimeNotation'{date = D, time = T}.
1699
1700cre_Value([H|_] = V) when is_list(H) ->
1701    V.
1702
1703cre_BOOLEAN(true = B) ->
1704    B;
1705cre_BOOLEAN(false = B) ->
1706    B.
1707
1708
1709%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1710
1711%% -- MegacoMessage --
1712
1713is_MegacoMessage(#'MegacoMessage'{authHeader = Auth,
1714				  mess       = Mess}) ->
1715    d("is_MegacoMessage -> entry"),
1716    is_opt_AuthenticationHeader(Auth) andalso is_Message(Mess);
1717is_MegacoMessage(_) ->
1718    false.
1719
1720
1721chk_MegacoMessage(M, M) ->
1722    d("chk_MegacoMessage -> entry (1)"),
1723    chk_type(fun is_MegacoMessage/1, 'MegacoMessage', M);
1724chk_MegacoMessage(#'MegacoMessage'{authHeader = Auth1,
1725				   mess       = Mess1},
1726		  #'MegacoMessage'{authHeader = Auth2,
1727				   mess       = Mess2}) ->
1728    d("chk_MegacoMessage -> entry (2)"),
1729    chk_opt_AuthenticationHeader(Auth1,Auth2),
1730    chk_Message(Mess1,Mess2),
1731    ok;
1732chk_MegacoMessage(M1, M2) ->
1733    wrong_type('MegacoMessage', M1, M2).
1734
1735
1736%% -- AuthenticationHeader --
1737
1738is_opt_AuthenticationHeader(AH) ->
1739    is_OPTIONAL(fun is_AuthenticationHeader/1, AH).
1740
1741is_AuthenticationHeader(#'AuthenticationHeader'{secParmIndex = SPI,
1742						seqNum       = SN,
1743						ad           = AD}) ->
1744    is_SecurityParmIndex(SPI) andalso
1745	is_SequenceNum(SN) andalso
1746	is_AuthData(AD);
1747is_AuthenticationHeader(_) ->
1748    false.
1749
1750%% This stuff is not really used, so make it simple...
1751chk_opt_AuthenticationHeader(A1, A2) ->
1752    chk_OPTIONAL('AuthenticationHeader', A1, A2,
1753		 fun is_AuthenticationHeader/1,
1754		 fun chk_AuthenticationHeader/2).
1755
1756chk_AuthenticationHeader(A, A) ->
1757    chk_type(fun is_AuthenticationHeader/1, 'AuthenticationHeader', A);
1758chk_AuthenticationHeader(A1, A2) ->
1759    case (is_AuthenticationHeader(A1) andalso is_AuthenticationHeader(A2)) of
1760	true ->
1761	    not_equal('AuthenticationHeader', A1, A2);
1762	false ->
1763	    wrong_type('AuthenticationHeader', A1, A2)
1764    end.
1765
1766
1767%% -- SecurityParmIndex --
1768
1769is_SecurityParmIndex(V) -> is_OCTET_STRING(V, {exact, 4}).
1770
1771
1772%% -- SequenceNum --
1773
1774is_SequenceNum(V) -> is_OCTET_STRING(V, {exact, 4}).
1775
1776
1777%% -- AuthData --
1778
1779is_AuthData(V) -> is_OCTET_STRING(V, {range, 12, 32}).
1780
1781
1782%% -- Message --
1783
1784is_Message(#'Message'{version     = V,
1785		      mId         = MID,
1786		      messageBody = Body}) ->
1787    d("is_Message -> entry"),
1788    is_INTEGER(V, {range, 0, 99}) andalso
1789	is_MId(MID) andalso
1790	is_Message_messageBody(Body);
1791is_Message(_) ->
1792    false.
1793
1794chk_Message(M, M) ->
1795    d("chk_Message -> entry (1)"),
1796    chk_type(fun is_Message/1, 'Message', M);
1797chk_Message(#'Message'{version     = V1,
1798		       mId         = MID1,
1799		       messageBody = Body1},
1800	    #'Message'{version     = V2,
1801		       mId         = MID2,
1802		       messageBody = Body2}) ->
1803    d("chk_Message -> entry with"
1804      "~n   V1:    ~p"
1805      "~n   MID1:  ~p"
1806      "~n   Body1: ~p"
1807      "~n   V2:    ~p"
1808      "~n   MID2:  ~p"
1809      "~n   Body2: ~p",
1810     [V1, MID1, Body1, V2, MID2, Body2]),
1811    validate(fun() -> chk_INTEGER(V1, V2, {range, 0, 99}) end, 'Message'),
1812    validate(fun() -> chk_MId(MID1, MID2) end, 'Message'),
1813    chk_Message_messageBody(Body1, Body2),
1814    ok;
1815chk_Message(M1, M2) ->
1816    wrong_type('Message', M1, M2).
1817
1818
1819is_Message_messageBody({Tag, Val}) ->
1820    d("is_Message_messageBody -> entry"),
1821    is_Message_messageBody_tag(Tag) andalso
1822	is_Message_messageBody_val(Tag, Val);
1823is_Message_messageBody(_) ->
1824    false.
1825
1826is_Message_messageBody_tag(Tag) ->
1827    Tags = [messageError, transactions],
1828    lists:member(Tag, Tags).
1829
1830is_Message_messageBody_val(messageError, Val) ->
1831    is_ErrorDescriptor(Val);
1832is_Message_messageBody_val(transactions, Val) ->
1833    is_Message_messageBody_transactions(Val).
1834
1835is_Message_messageBody_transactions([]) ->
1836    d("is_Message_messageBody_transactions -> entry when done"),
1837    true;
1838is_Message_messageBody_transactions([H|T]) ->
1839    d("is_Message_messageBody_transactions -> entry"),
1840    is_Transaction(H) andalso is_Message_messageBody_transactions(T);
1841is_Message_messageBody_transactions(_) ->
1842    false.
1843
1844chk_Message_messageBody(B, B) ->
1845    d("chk_Message_messageBody -> entry (1)"),
1846    chk_type(fun is_Message_messageBody/1, 'Message_messageBody', B);
1847chk_Message_messageBody({Tag, Val1} = B1, {Tag, Val2} = B2) ->
1848    d("chk_Message_messageBody -> entry (2)"),
1849    case (is_Message_messageBody_tag(Tag) andalso
1850	  is_Message_messageBody_val(Tag, Val1) andalso
1851	  is_Message_messageBody_val(Tag, Val2)) of
1852	true ->
1853	    chk_Message_messageBody_val(Tag, Val1, Val2);
1854	false ->
1855	    wrong_type('Message_messageBody', B1, B2)
1856    end;
1857chk_Message_messageBody({Tag1, Val1} = B1, {Tag2, Val2} = B2) ->
1858    d("chk_Message_messageBody -> entry (3)"),
1859    case ((is_Message_messageBody_tag(Tag1) andalso
1860	   is_Message_messageBody_val(Tag1, Val1)) andalso
1861	  (is_Message_messageBody_tag(Tag2) andalso
1862	   is_Message_messageBody_val(Tag2, Val2))) of
1863	true ->
1864	    not_equal('Message_messageBody', B1, B2);
1865	false ->
1866	    wrong_type('Message_messageBody', B1, B2)
1867    end;
1868chk_Message_messageBody(B1, B2) ->
1869    wrong_type('Message_messageBody', B1, B2).
1870
1871chk_Message_messageBody_val(messageError, Val1, Val2) ->
1872    validate(fun() -> chk_ErrorDescriptor(Val1, Val2) end,
1873	     'Message_messageBody');
1874chk_Message_messageBody_val(transactions, Val1, Val2) ->
1875    chk_Message_messageBody_transactions(lists:sort(Val1),
1876					 lists:sort(Val2)).
1877
1878chk_Message_messageBody_transactions([], []) ->
1879    d("chk_Message_messageBody_transactions -> entry - ok (1)"),
1880    ok;
1881chk_Message_messageBody_transactions([] = T1, T2) ->
1882    d("chk_Message_messageBody_transactions -> entry - not-equal (2)"),
1883    not_equal('Message_messageBody_transactions', T1, T2);
1884chk_Message_messageBody_transactions(T1, [] = T2) ->
1885    d("chk_Message_messageBody_transactions -> entry - not-equal (3)"),
1886    not_equal('Message_messageBody_transactions', T1, T2);
1887chk_Message_messageBody_transactions([H|T1], [H|T2]) ->
1888    d("chk_Message_messageBody_transactions -> entry (4)"),
1889    case is_Transaction(H) of
1890	true ->
1891	    chk_Message_messageBody_transactions(T1, T2);
1892	false ->
1893	    wrong_type('Message_messageBody_transactions_val', H)
1894    end;
1895chk_Message_messageBody_transactions([H1|T1], [H2|T2]) ->
1896    d("chk_Message_messageBody_transactions -> entry (5)"),
1897    validate(fun() -> chk_Transaction(H1, H2) end,
1898	     'Message_messageBody_transactions_val'),
1899    chk_Message_messageBody_transactions(T1, T2);
1900chk_Message_messageBody_transactions(T1, T2) ->
1901    d("chk_Message_messageBody_transactions -> entry - wrong-type (6)"),
1902    wrong_type('Message_messageBody_transactions', T1, T2).
1903
1904
1905%% -- MId --
1906
1907is_opt_MId(M) ->
1908    is_OPTIONAL(fun is_MId/1, M).
1909
1910is_MId({Tag, Val}) ->
1911    is_MId_tag(Tag) andalso is_MId_val(Tag, Val);
1912is_MId(_) ->
1913    false.
1914
1915is_MId_tag(Tag) ->
1916    Tags = [ip4Address, ip6Address, domainName, deviceName, mtpAddress],
1917    lists:member(Tag, Tags).
1918
1919is_MId_val(ip4Address, Val) -> is_IP4Address(Val);
1920is_MId_val(ip6Address, Val) -> is_IP6Address(Val);
1921is_MId_val(domainName, Val) -> is_DomainName(Val);
1922is_MId_val(deviceName, Val) -> is_PathName(Val);
1923is_MId_val(mtpAddress, Val) -> is_OCTET_STRING(Val, {range, 2, 4}).
1924
1925chk_opt_MId(M1, M2) ->
1926    chk_OPTIONAL('MId', M1, M2, fun is_MId/1, fun chk_MId/2).
1927
1928chk_MId(M, M) ->
1929    chk_type(fun is_MId/1, 'MId', M);
1930chk_MId({Tag, Val1} = M1, {Tag, Val2} = M2) ->
1931    case (is_MId_tag(Tag) andalso
1932	  is_MId_val(Tag, Val1) andalso
1933	  is_MId_val(Tag, Val2)) of
1934	true ->
1935	    chk_MId_val(Tag, Val1, Val2);
1936	false ->
1937	    wrong_type('MId', M1, M2)
1938    end;
1939chk_MId({Tag1, Val1} = M1, {Tag2, Val2} = M2) ->
1940    case ((is_MId_tag(Tag1) andalso
1941	   is_MId_val(Tag1, Val1)) andalso
1942	  (is_MId_tag(Tag2) andalso
1943	   is_MId_val(Tag2, Val2))) of
1944	true ->
1945	    not_equal('MId', M1, M2);
1946	false ->
1947	    wrong_type('MId', M1, M2)
1948    end;
1949chk_MId(M1, M2) ->
1950    wrong_type('MId', M1, M2).
1951
1952chk_MId_val(ip4Address, M1, M2) -> chk_IP4Address(M1, M2);
1953chk_MId_val(ip6Address, M1, M2) -> chk_IP6Address(M1, M2);
1954chk_MId_val(domainName, M1, M2) -> chk_DomainName(M1, M2);
1955chk_MId_val(deviceName, M1, M2) -> chk_PathName(M1,   M2);
1956chk_MId_val(mtpAddress, M1, M2) -> chk_OCTET_STRING(M1, M2, {range, 2, 4}).
1957
1958
1959%% -- DomainName --
1960
1961is_DomainName(#'DomainName'{name = N, portNumber = PN}) ->
1962    is_IA5String(N) andalso is_opt_INTEGER(PN, {range, 0, 65535});
1963is_DomainName(_) ->
1964    false.
1965
1966chk_DomainName(N, N) ->
1967    ok;
1968chk_DomainName(N1, N2) ->
1969    not_equal('DomainName', N1, N2).
1970
1971
1972%% -- IP4Address --
1973
1974is_IP4Address(#'IP4Address'{address = A, portNumber = PN}) ->
1975    is_OCTET_STRING(A, {exact, 4}) andalso
1976	is_opt_INTEGER(PN, {range, 0, 65535});
1977is_IP4Address(_) ->
1978    false.
1979
1980chk_IP4Address(A, A) ->
1981    ok;
1982chk_IP4Address(A1, A2) ->
1983    not_equal('IP4Address', A1, A2).
1984
1985
1986%% -- IP6Address --
1987
1988is_IP6Address(#'IP6Address'{address = A, portNumber = PN}) ->
1989    is_OCTET_STRING(A, {exact, 16}) andalso
1990	is_opt_INTEGER(PN, {range, 0, 65535});
1991is_IP6Address(_) ->
1992    false.
1993
1994chk_IP6Address(A, A) ->
1995    ok;
1996chk_IP6Address(A1, A2) ->
1997    not_equal('IP6Address', A1, A2).
1998
1999
2000%% -- PathName --
2001
2002is_PathName(N) -> is_IA5String(N, {range, 1, 64}).
2003
2004chk_PathName(N, N) ->
2005    ok;
2006chk_PathName(N1, N2) ->
2007    not_equal('PathName', N1, N2).
2008
2009
2010%% -- Transaction --
2011
2012is_Transaction({Tag, Val}) ->
2013    d("is_Transaction -> entry"),
2014    is_Transaction_tag(Tag) andalso is_Transaction_val(Tag, Val);
2015is_Transaction(_) ->
2016    false.
2017
2018is_Transaction_tag(Tag) ->
2019    Tags = [transactionRequest,
2020	    transactionPending,
2021	    transactionReply,
2022	    transactionResponseAck],
2023    lists:member(Tag, Tags).
2024
2025is_Transaction_val(transactionRequest, V)     -> is_TransactionRequest(V);
2026is_Transaction_val(transactionPending, V)     -> is_TransactionPending(V);
2027is_Transaction_val(transactionReply, V)       -> is_TransactionReply(V);
2028is_Transaction_val(transactionResponseAck, V) -> is_TransactionResponseAck(V).
2029
2030
2031chk_Transaction({Tag, Val} = Trans, Trans) ->
2032    d("chk_Transaction -> entry (1)"),
2033    case (is_Transaction_tag(Tag) andalso is_Transaction_val(Tag, Val)) of
2034	true ->
2035	    ok;
2036	false ->
2037	    wrong_type('Transaction', Trans, Trans)
2038    end;
2039chk_Transaction({Tag, Val1} = Trans1, {Tag, Val2} = Trans2) ->
2040    d("chk_Transaction -> entry (2)"),
2041    case (is_Transaction_tag(Tag) and
2042	  is_Transaction_val(Tag, Val1) and
2043	  is_Transaction_val(Tag, Val2)) of
2044	true ->
2045	    chk_Transaction_val(Tag, Val1, Val2);
2046	false ->
2047	    wrong_type('Transaction', Trans1, Trans2)
2048    end;
2049chk_Transaction({Tag1, Val1} = Trans1, {Tag2, Val2} = Trans2) ->
2050    d("chk_Transaction -> entry (3)"),
2051    case ((is_Transaction_tag(Tag1) andalso
2052	   is_Transaction_val(Tag1, Val1)) andalso
2053	  (is_Transaction_tag(Tag2) andalso
2054	   is_Transaction_val(Tag2, Val2))) of
2055	true ->
2056	    not_equal('Transaction', Trans1, Trans2);
2057	false ->
2058	    wrong_type('Transaction', Trans1, Trans2)
2059    end;
2060chk_Transaction(Trans1, Trans2) ->
2061    d("chk_Transaction -> entry - wrong-type - (4)"),
2062    wrong_type('Transaction', Trans1, Trans2).
2063
2064chk_Transaction_val(transactionRequest, T1, T2) ->
2065    chk_TransactionRequest(T1, T2);
2066chk_Transaction_val(transactionPending, T1, T2) ->
2067    chk_TransactionPending(T1, T2);
2068chk_Transaction_val(transactionReply, T1, T2) ->
2069    chk_TransactionReply(T1,T2);
2070chk_Transaction_val(transactionResponseAck, T1, T2) ->
2071    chk_TransactionResponseAck(T1, T2).
2072
2073
2074%% -- TransactionId --
2075
2076is_opt_TransactionId(TID) ->
2077    is_OPTIONAL(fun is_TransactionId/1, TID).
2078
2079is_TransactionId(TID) ->
2080    d("is_TransactionId -> entry"),
2081    is_INTEGER(TID, {range, 0, 4294967295}).
2082
2083chk_opt_TransactionId(TID1, TID2) ->
2084    chk_OPTIONAL('TransactionId', TID1, TID2,
2085		 fun is_TransactionId/1, fun chk_TransactionId/2).
2086
2087chk_TransactionId(TID, TID) ->
2088    chk_type(fun is_TransactionId/1, 'TransactionId', TID);
2089chk_TransactionId(TID1, TID2) ->
2090    case (is_TransactionId(TID1) andalso is_TransactionId(TID2)) of
2091	true ->
2092	    not_equal('TransactionId', TID1, TID2);
2093	false ->
2094	    wrong_type('TransactionId', TID1, TID2)
2095    end.
2096
2097
2098%% -- TransactionRequest --
2099
2100is_TransactionRequest(#'TransactionRequest'{transactionId = TID,
2101					    actions       = Acts}) ->
2102    d("is_TransactionRequest -> entry"),
2103    is_TransactionId(TID) andalso is_TransactionRequest_actions(Acts);
2104is_TransactionRequest(_) ->
2105    false.
2106
2107chk_TransactionRequest(T, T) ->
2108    chk_type(fun is_TransactionRequest/1, 'TransactionRequest', T);
2109chk_TransactionRequest(#'TransactionRequest'{transactionId = TID1,
2110					     actions       = Acts1},
2111		       #'TransactionRequest'{transactionId = TID2,
2112					     actions       = Acts2}) ->
2113    validate(fun() -> chk_TransactionId(TID1, TID2) end, 'TransactionRequest'),
2114    chk_TransactionRequest_actions(lists:sort(Acts1),
2115				   lists:sort(Acts2)),
2116    ok;
2117chk_TransactionRequest(T1, T2) ->
2118    wrong_type('TransactionRequest', T1, T2).
2119
2120is_TransactionRequest_actions([]) ->
2121    d("is_TransactionRequest_actions -> entry when done"),
2122    true;
2123is_TransactionRequest_actions([H|T]) ->
2124    d("is_TransactionRequest_actions -> entry"),
2125    is_ActionRequest(H) andalso is_TransactionRequest_actions(T);
2126is_TransactionRequest_actions(_) ->
2127    false.
2128
2129chk_TransactionRequest_actions([], []) ->
2130    ok;
2131chk_TransactionRequest_actions([] = Acts1, Acts2) ->
2132    not_equal('TransactionRequest_actions', Acts1, Acts2);
2133chk_TransactionRequest_actions(Acts1, [] = Acts2) ->
2134    not_equal('TransactionRequest_actions', Acts1, Acts2);
2135chk_TransactionRequest_actions([H|T1], [H|T2]) ->
2136    case is_ActionRequest(H) of
2137	true ->
2138	    chk_TransactionRequest_actions(T1, T2);
2139	false ->
2140	    wrong_type('TransactionRequest_actions_val', H)
2141    end;
2142chk_TransactionRequest_actions([H1|T1], [H2|T2]) ->
2143    validate(fun() -> chk_ActionRequest(H1, H2) end,
2144	     'TransactionRequest_actions_val'),
2145    chk_TransactionRequest_actions(T1, T2);
2146chk_TransactionRequest_actions(Acts1, Acts2) ->
2147    wrong_type('TransactionRequest_actions', Acts1, Acts2).
2148
2149
2150%% -- TransactionPending --
2151
2152is_TransactionPending(#'TransactionPending'{transactionId = TID}) ->
2153    d("is_TransactionPending -> entry"),
2154    is_TransactionId(TID);
2155is_TransactionPending(_) ->
2156    false.
2157
2158chk_TransactionPending(T, T) ->
2159    chk_type(fun is_TransactionPending/1, 'TransactionPending', T);
2160chk_TransactionPending(#'TransactionPending'{transactionId = TID1},
2161		       #'TransactionPending'{transactionId = TID2}) ->
2162    validate(fun() -> chk_TransactionId(TID1, TID2) end, 'TransactionPending'),
2163    ok;
2164chk_TransactionPending(T1, T2) ->
2165    wrong_type('TransactionPending', T1, T2).
2166
2167
2168%% -- TransactionReply --
2169
2170is_TransactionReply(#'TransactionReply'{transactionId     = TID,
2171					immAckRequired    = IAR,
2172					transactionResult = TR}) ->
2173    d("is_TransactionReply -> entry"),
2174    is_TransactionId(TID) andalso
2175	is_opt_NULL(IAR) andalso
2176	is_TransactionReply_transactionResult(TR);
2177is_TransactionReply(_) ->
2178    false.
2179
2180chk_TransactionReply(T, T) ->
2181    chk_type(fun is_TransactionReply/1, 'TransactionReply', T);
2182chk_TransactionReply(#'TransactionReply'{transactionId     = TID1,
2183					 immAckRequired    = IAR1,
2184					 transactionResult = TR1},
2185		     #'TransactionReply'{transactionId     = TID2,
2186					 immAckRequired    = IAR2,
2187					 transactionResult = TR2}) ->
2188    validate(fun() -> chk_TransactionId(TID1, TID2) end, 'TransactionReply'),
2189    validate(fun() -> chk_opt_NULL(IAR1, IAR2) end, 'TransactionReply'),
2190    chk_TransactionReply_transactionResult(TR1, TR2),
2191    ok;
2192chk_TransactionReply(T1, T2) ->
2193    wrong_type('TransactionReply', T1, T2).
2194
2195is_TransactionReply_transactionResult({Tag, Val}) ->
2196    d("is_TransactionReply_transactionResult -> entry"),
2197    is_TransactionReply_transactionResult_tag(Tag) andalso
2198	is_TransactionReply_transactionResult_val(Tag, Val);
2199is_TransactionReply_transactionResult(_) ->
2200    false.
2201
2202is_TransactionReply_transactionResult_tag(T) ->
2203    lists:member(T, [transactionError, actionReplies]).
2204
2205is_TransactionReply_transactionResult_val(transactionError, V) ->
2206    is_ErrorDescriptor(V);
2207is_TransactionReply_transactionResult_val(actionReplies, V) ->
2208    is_TransactionReply_actionReplies(V).
2209
2210chk_TransactionReply_transactionResult(Res, Res) ->
2211    chk_type(fun is_TransactionReply_transactionResult/1,
2212	     'TransactionReply_transactionResult', Res);
2213chk_TransactionReply_transactionResult({Tag, Val1} = Res1,
2214				       {Tag, Val2} = Res2) ->
2215    case (is_TransactionReply_transactionResult_tag(Tag) and
2216	  is_TransactionReply_transactionResult_val(Tag, Val1) and
2217	  is_TransactionReply_transactionResult_val(Tag, Val2)) of
2218	true ->
2219	    chk_TransactionReply_transactionResult_val(Tag, Val1, Val2);
2220	false ->
2221	    wrong_type('TransactionReply_transactionResult', Res1, Res2)
2222    end;
2223chk_TransactionReply_transactionResult({Tag1, Val1} = Res1,
2224				       {Tag2, Val2} = Res2) ->
2225    case ((is_TransactionReply_transactionResult_tag(Tag1) and
2226	   is_TransactionReply_transactionResult_val(Tag1, Val1)) and
2227	  (is_TransactionReply_transactionResult_tag(Tag2) and
2228	   is_TransactionReply_transactionResult_val(Tag2, Val2))) of
2229	true ->
2230	    not_equal('TransactionReply_transactionResult', Res1, Res2);
2231	false ->
2232	    wrong_type('TransactionReply_transactionResult', Res1, Res2)
2233    end;
2234chk_TransactionReply_transactionResult(Res1, Res2) ->
2235    wrong_type('TransactionReply_transactionResult', Res1, Res2).
2236
2237chk_TransactionReply_transactionResult_val(transactionError, E1, E2) ->
2238    validate(fun() -> chk_ErrorDescriptor(E1, E2) end,
2239	     'TransactionReply_transactionResult');
2240chk_TransactionReply_transactionResult_val(actionReplies, R1, R2) ->
2241    validate(fun() ->
2242		     chk_TransactionReply_actionReplies(lists:sort(R1),
2243							lists:sort(R2))
2244	     end,
2245	     'TransactionReply_transactionResult').
2246
2247is_TransactionReply_actionReplies([]) ->
2248    d("is_TransactionReply_actionReplies -> entry when done"),
2249    true;
2250is_TransactionReply_actionReplies([H|T]) ->
2251    d("is_TransactionReply_actionReplies -> entry"),
2252    is_ActionReply(H) andalso is_TransactionReply_actionReplies(T);
2253is_TransactionReply_actionReplies(_) ->
2254    false.
2255
2256chk_TransactionReply_actionReplies([], []) ->
2257    ok;
2258chk_TransactionReply_actionReplies([] = AR1, AR2) ->
2259    not_equal('TransactionReply_actionReplies', AR1, AR2);
2260chk_TransactionReply_actionReplies(AR1, [] = AR2) ->
2261    not_equal('TransactionReply_actionReplies', AR1, AR2);
2262chk_TransactionReply_actionReplies([H|T1], [H|T2]) ->
2263    case is_ActionReply(H) of
2264	true ->
2265	    chk_TransactionReply_actionReplies(T1, T2);
2266	false ->
2267	    wrong_type('TransactionReply_actionReplies_val', H)
2268    end;
2269chk_TransactionReply_actionReplies([H1|T1], [H2|T2]) ->
2270    validate(fun() -> chk_ActionReply(H1, H2) end,
2271	     'TransactionReply_actionReplies_val'),
2272    chk_TransactionReply_actionReplies(T1, T2);
2273chk_TransactionReply_actionReplies(AR1, AR2) ->
2274    wrong_type('TransactionReply_actionReplies', AR1, AR2).
2275
2276
2277%% -- TransactionResponseAck --
2278
2279is_TransactionResponseAck([]) ->
2280    d("is_TransactionResponseAck -> entry when done"),
2281    true;
2282is_TransactionResponseAck([H|T]) ->
2283    d("is_TransactionResponseAck -> entry"),
2284    is_TransactionAck(H) andalso is_TransactionResponseAck(T);
2285is_TransactionResponseAck(_) ->
2286    false.
2287
2288chk_TransactionResponseAck([], []) ->
2289    ok;
2290chk_TransactionResponseAck([] = AR1, AR2) ->
2291    not_equal('TransactionResponseAck', AR1, AR2);
2292chk_TransactionResponseAck(AR1, [] = AR2) ->
2293    not_equal('TransactionResponseAck', AR1, AR2);
2294chk_TransactionResponseAck([H|T1], [H|T2]) ->
2295    case is_TransactionAck(H) of
2296	true ->
2297	    chk_TransactionResponseAck(T1, T2);
2298	false ->
2299	    wrong_type('TransactionResponseAck_val', H)
2300    end;
2301chk_TransactionResponseAck([H1|T1], [H2|T2]) ->
2302    validate(fun() -> chk_TransactionAck(H1, H2) end,
2303	     'TransactionResponseAck'),
2304    chk_TransactionResponseAck(T1, T2);
2305chk_TransactionResponseAck(AR1, AR2) ->
2306    wrong_type('TransactionResponseAck', AR1, AR2).
2307
2308
2309%% -- TransactionAck --
2310
2311is_TransactionAck(#'TransactionAck'{firstAck = F,
2312				    lastAck  = L}) ->
2313    d("is_TransactionAck -> entry"),
2314    is_TransactionId(F) andalso is_opt_TransactionId(L);
2315is_TransactionAck(_) ->
2316    false.
2317
2318chk_TransactionAck(T, T) ->
2319    chk_type(fun is_TransactionAck/1, 'TransactionAck', T);
2320chk_TransactionAck(#'TransactionAck'{firstAck = F1,
2321				     lastAck  = L1},
2322		   #'TransactionAck'{firstAck = F2,
2323				     lastAck  = L2}) ->
2324    validate(fun() -> chk_TransactionId(F1, F2) end, 'TransactionAck'),
2325    validate(fun() -> chk_opt_TransactionId(L1, L2) end, 'TransactionAck'),
2326    ok;
2327chk_TransactionAck(T1, T2) ->
2328    wrong_type('TransactionAck', T1, T2).
2329
2330
2331%% -- ErrorDescriptor --
2332
2333is_opt_ErrorDescriptor(V) ->
2334    is_OPTIONAL(fun is_ErrorDescriptor/1, V).
2335
2336is_ErrorDescriptor(#'ErrorDescriptor'{errorCode = Code,
2337				      errorText = Text}) ->
2338    d("is_ErrorDescriptor -> entry"),
2339    is_ErrorCode(Code) andalso is_opt_ErrorText(Text);
2340is_ErrorDescriptor(_) ->
2341    false.
2342
2343chk_opt_ErrorDescriptor(E1, E2) ->
2344    chk_OPTIONAL('ErrorDescriptor', E1, E2,
2345		 fun is_ErrorDescriptor/1, fun chk_ErrorDescriptor/2).
2346
2347chk_ErrorDescriptor(E, E) ->
2348    chk_type(fun is_ErrorDescriptor/1, 'ErrorDescriptor', E);
2349chk_ErrorDescriptor(#'ErrorDescriptor'{errorCode = Code1,
2350                                       errorText = Text1},
2351                    #'ErrorDescriptor'{errorCode = Code2,
2352                                       errorText = Text2}) ->
2353    chk_ErrorCode(Code1, Code2),
2354    chk_opt_ErrorText(Text1, Text2),
2355    ok;
2356chk_ErrorDescriptor(E1, E2) ->
2357    wrong_type('ErrorDescriptor', E1, E2).
2358
2359
2360%% -- ErrorCode --
2361
2362is_ErrorCode(C) -> is_INTEGER(C, {range, 0, 65535}).
2363
2364chk_ErrorCode(C, C) ->
2365    case is_ErrorCode(C) of
2366	true ->
2367	    ok;
2368	false ->
2369	    wrong_type(errorCode, C, C)
2370    end;
2371chk_ErrorCode(C1, C2) ->
2372    case (is_ErrorCode(C1) andalso is_ErrorCode(C2)) of
2373	true ->
2374	    not_equal(errorCode, C1, C2);
2375	false ->
2376	    wrong_type(errorCode, C1, C2)
2377    end.
2378
2379
2380%% -- ErrorText --
2381
2382is_opt_ErrorText(V) ->
2383    is_OPTIONAL(fun is_ErrorText/1, V).
2384
2385is_ErrorText(V) -> is_IA5String(V).
2386
2387chk_opt_ErrorText(T1, T2) ->
2388    chk_OPTIONAL('ErrorText', T1, T2, fun is_ErrorText/1, fun chk_ErrorText/2).
2389
2390chk_ErrorText(T, T) ->
2391    chk_type(fun is_ErrorText/1, 'ErrorText', T);
2392chk_ErrorText(T1, T2) ->
2393    case (is_ErrorText(T1) andalso is_ErrorText(T2)) of
2394	true ->
2395	    case {to_lower(T1), to_lower(T2)} of
2396		{T, T} ->
2397		    ok;
2398		_ ->
2399		    not_equal('ErrorText', T1, T2)
2400	    end;
2401	false ->
2402	    wrong_type('ErrorText', T1, T2)
2403    end.
2404
2405
2406%% -- ContextID --
2407
2408is_ContextID(Id) -> is_INTEGER(Id, {range, 0, 4294967295}).
2409
2410chk_ContextID(Id, Id) ->
2411    chk_type(fun is_ContextID/1, 'ContextID', Id);
2412chk_ContextID(Id1, Id2) ->
2413    case (is_ContextID(Id1) andalso is_ContextID(Id2)) of
2414	true ->
2415	    not_equal('ContextID', Id1, Id2);
2416	false ->
2417	    wrong_type('ContextID', Id1, Id2)
2418    end.
2419
2420
2421%% -- ActionRequest --
2422
2423is_ActionRequest(#'ActionRequest'{contextId           = Id,
2424				  contextRequest      = CtxReq,
2425				  contextAttrAuditReq = AuditReq,
2426				  commandRequests     = CmdReqs}) ->
2427    d("is_ActionRequest -> entry"),
2428    is_ContextID(Id) andalso
2429	is_opt_ContextRequest(CtxReq) andalso
2430	is_opt_ContextAttrAuditRequest(AuditReq) andalso
2431	is_ActionRequest_commandRequests(CmdReqs);
2432is_ActionRequest(_) ->
2433    false.
2434
2435chk_ActionRequest(A, A) ->
2436    chk_type(fun is_ActionRequest/1, 'ActionRequest', A);
2437chk_ActionRequest(#'ActionRequest'{contextId           = Id1,
2438                                   contextRequest      = Req1,
2439                                   contextAttrAuditReq = AuditReq1,
2440                                   commandRequests     = CmdReqs1},
2441                  #'ActionRequest'{contextId           = Id2,
2442                                   contextRequest      = Req2,
2443                                   contextAttrAuditReq = AuditReq2,
2444                                   commandRequests     = CmdReqs2}) ->
2445    validate(fun() -> chk_ContextID(Id1, Id2) end, 'ActionRequest'),
2446    validate(fun() -> chk_opt_ContextRequest(Req1, Req2) end, 'ActionRequest'),
2447    validate(fun() ->
2448		     chk_opt_ContextAttrAuditRequest(AuditReq1, AuditReq2)
2449	     end,
2450	     'ActionRequest'),
2451    chk_ActionRequest_commandRequests(CmdReqs1, CmdReqs2),
2452    ok.
2453
2454
2455is_ActionRequest_commandRequests([]) ->
2456    d("is_ActionRequest_commandRequests -> entry when done"),
2457    true;
2458is_ActionRequest_commandRequests([H|T]) ->
2459    d("is_ActionRequest_commandRequests -> entry"),
2460    is_CommandRequest(H) andalso is_ActionRequest_commandRequests(T);
2461is_ActionRequest_commandRequests(_) ->
2462    false.
2463
2464chk_ActionRequest_commandRequests([], []) ->
2465    ok;
2466chk_ActionRequest_commandRequests([] = CmdReqs1, CmdReqs2) ->
2467    not_equal('ActionRequest_commandRequests', CmdReqs1, CmdReqs2);
2468chk_ActionRequest_commandRequests(CmdReqs1, [] = CmdReqs2) ->
2469    not_equal('ActionRequest_commandRequests', CmdReqs1, CmdReqs2);
2470chk_ActionRequest_commandRequests([H|T1], [H|T2]) ->
2471    case is_CommandRequest(H) of
2472	true ->
2473	    chk_ActionRequest_commandRequests(T1, T2);
2474	false ->
2475	    wrong_type('ActionRequest_commandRequest_val', H)
2476    end;
2477chk_ActionRequest_commandRequests([H1|T1], [H2|T2]) ->
2478    validate(fun() -> chk_CommandRequest(H1, H2) end,
2479	     'ActionRequest_commandRequests_val'),
2480    chk_ActionRequest_commandRequests(T1, T2);
2481chk_ActionRequest_commandRequests(R1, R2) ->
2482    wrong_type('ActionRequest_commandRequests', R1, R2).
2483
2484
2485%% -- ActionReply --
2486
2487is_ActionReply(#'ActionReply'{contextId       = Id,
2488			      errorDescriptor = ED,
2489			      contextReply    = CtxRep,
2490			      commandReply    = CmdRep}) ->
2491    d("is_ActionReply -> entry"),
2492    is_ContextID(Id) andalso
2493	is_opt_ErrorDescriptor(ED) andalso
2494	is_opt_ContextRequest(CtxRep) andalso
2495	is_ActionReply_commandReply(CmdRep);
2496is_ActionReply(_) ->
2497    false.
2498
2499is_ActionReply_commandReply([]) ->
2500    d("is_ActionReply_commandReply -> entry when done"),
2501    true;
2502is_ActionReply_commandReply([H|T]) ->
2503    d("is_ActionReply_commandReply -> entry"),
2504    is_CommandReply(H) andalso is_ActionReply_commandReply(T);
2505is_ActionReply_commandReply(_) ->
2506    false.
2507
2508chk_ActionReply(A, A) ->
2509    chk_type(fun is_ActionReply/1, 'ActionReply', A);
2510chk_ActionReply(#'ActionReply'{contextId       = Id1,
2511			       errorDescriptor = ED1,
2512			       contextReply    = CtxRep1,
2513			       commandReply    = CmdRep1},
2514		#'ActionReply'{contextId       = Id2,
2515			       errorDescriptor = ED2,
2516			       contextReply    = CtxRep2,
2517			       commandReply    = CmdRep2}) ->
2518    chk_ContextID(Id1, Id2),
2519    chk_opt_ErrorDescriptor(ED1, ED2),
2520    chk_opt_ContextRequest(CtxRep1, CtxRep2),
2521    chk_ActionReply_commandReply(CmdRep1, CmdRep2).
2522
2523chk_ActionReply_commandReply([], []) ->
2524    ok;
2525chk_ActionReply_commandReply([] = Reps1, Reps2) ->
2526    not_equal('ActionReply_commandReply', Reps1, Reps2);
2527chk_ActionReply_commandReply(Reps1, [] = Reps2) ->
2528    not_equal('ActionReply_commandReply', Reps1, Reps2);
2529chk_ActionReply_commandReply([H|T1], [H|T2]) ->
2530    case is_CommandReply(H) of
2531	true ->
2532	    chk_ActionReply_commandReply(T1, T2);
2533	false ->
2534	    wrong_type('ActionReply_commandReply_val', H)
2535    end;
2536chk_ActionReply_commandReply([H1|T1], [H2|T2]) ->
2537    validate(fun() -> chk_CommandReply(H1, H2) end,
2538	     'ActionReply_commandReply_val'),
2539    chk_ActionReply_commandReply(T1, T2);
2540chk_ActionReply_commandReply(R1, R2) ->
2541    wrong_type('ActionReply_commandReply', R1, R2).
2542
2543
2544%% -- ContextRequest --
2545
2546is_opt_ContextRequest(V) ->
2547    is_OPTIONAL(fun is_ContextRequest/1, V).
2548
2549is_ContextRequest(#'ContextRequest'{priority    = Prio,
2550				    emergency   = Em,
2551				    topologyReq = TopReq,
2552				    iepscallind = Ieps,
2553				    contextProp = Ctx}) ->
2554    d("is_ContextRequest -> entry"),
2555    is_ContextRequest_priority(Prio) andalso
2556    is_ContextRequest_emergency(Em) andalso
2557    is_ContextRequest_topologyReq(TopReq) andalso
2558    is_ContextRequest_iepscallind(Ieps) andalso
2559    is_ContextRequest_contextProp(Ctx);
2560is_ContextRequest(_) ->
2561    false.
2562
2563is_ContextRequest_priority(asn1_NOVALUE) ->
2564    true;
2565is_ContextRequest_priority(V) ->
2566    is_INTEGER(V, {range, 1, 15}).
2567
2568is_ContextRequest_emergency(asn1_NOVALUE) ->
2569    true;
2570is_ContextRequest_emergency(V) ->
2571    is_BOOLEAN(V).
2572
2573is_ContextRequest_topologyReq(asn1_NOVALUE) ->
2574    true;
2575is_ContextRequest_topologyReq([]) ->
2576    true;
2577is_ContextRequest_topologyReq([H|T]) ->
2578    is_TopologyRequest(H) andalso is_ContextRequest_topologyReq(T);
2579is_ContextRequest_topologyReq(_) ->
2580    false.
2581
2582is_ContextRequest_iepscallind(asn1_NOVALUE) ->
2583    true;
2584is_ContextRequest_iepscallind(V) ->
2585    is_BOOLEAN(V).
2586
2587is_ContextRequest_contextProp(asn1_NOVALUE) ->
2588    true;
2589is_ContextRequest_contextProp([]) ->
2590    true;
2591is_ContextRequest_contextProp([H|T]) ->
2592    is_PropertyParm(H) andalso is_ContextRequest_contextProp(T);
2593is_ContextRequest_contextProp(_) ->
2594    false.
2595
2596chk_opt_ContextRequest(R1, R2) ->
2597    chk_OPTIONAL('ContextRequest', R1, R2,
2598		 fun is_ContextRequest/1, fun chk_ContextRequest/2).
2599
2600chk_ContextRequest(R, R) ->
2601    chk_type(fun is_ContextRequest/1, 'ContextRequest', R);
2602chk_ContextRequest(#'ContextRequest'{priority    = Prio1,
2603				     emergency   = Em1,
2604				     topologyReq = TopReq1,
2605				     iepscallind = Ieps1,
2606				     contextProp = Ctx1},
2607		   #'ContextRequest'{priority    = Prio2,
2608				     emergency   = Em2,
2609				     topologyReq = TopReq2,
2610				     iepscallind = Ieps2,
2611				     contextProp = Ctx2}) ->
2612    chk_ContextRequest_priority(Prio1, Prio2),
2613    chk_ContextRequest_emergency(Em1, Em2),
2614    chk_ContextRequest_topologyReq(TopReq1, TopReq2),
2615    chk_ContextRequest_iepscallind(Ieps1, Ieps2),
2616    chk_ContextRequest_contextProp(Ctx1, Ctx2),
2617    ok;
2618chk_ContextRequest(R1, R2) ->
2619    wrong_type('ContextRequest', R1, R2).
2620
2621
2622chk_ContextRequest_priority(asn1_NOVALUE,asn1_NOVALUE) ->
2623    ok;
2624chk_ContextRequest_priority(P, P) ->
2625    chk_type(fun is_ContextRequest_priority/1, 'ContextRequest_priority', P);
2626chk_ContextRequest_priority(P1, P2) ->
2627    case (is_ContextRequest_priority(P1) andalso
2628	  is_ContextRequest_priority(P2)) of
2629	true ->
2630	    not_equal('ContextRequest_priority', P1, P2);
2631	false ->
2632	    wrong_type(contextRequest_priority, P1, P2)
2633    end.
2634
2635
2636chk_ContextRequest_emergency(asn1_NOVALUE, asn1_NOVALUE) ->
2637    ok;
2638chk_ContextRequest_emergency(E, E) ->
2639    chk_type(fun is_ContextRequest_emergency/1, 'ContextRequest_emergency', E);
2640chk_ContextRequest_emergency(E1, E2) ->
2641    case (is_ContextRequest_emergency(E1) andalso
2642	  is_ContextRequest_emergency(E2)) of
2643	true ->
2644	    not_equal('ContextRequest_emergency', E1, E2);
2645	false ->
2646	    wrong_type('ContextRequest_emergency', E1, E2)
2647    end.
2648
2649chk_ContextRequest_topologyReq(asn1_NOVALUE, asn1_NOVALUE) ->
2650    ok;
2651chk_ContextRequest_topologyReq([], []) ->
2652    ok;
2653chk_ContextRequest_topologyReq([] = T1, T2) ->
2654    not_equal('ContextRequest_topologyReq', T1, T2);
2655chk_ContextRequest_topologyReq(T1, [] = T2) ->
2656    not_equal('ContextRequest_topologyReq', T1, T2);
2657chk_ContextRequest_topologyReq([H|T1], [H|T2]) ->
2658    case is_TopologyRequest(H) of
2659	true ->
2660	    chk_ContextRequest_topologyReq(T1, T2);
2661	false ->
2662	    wrong_type('ContextRequest_topologyReq_val', H)
2663    end;
2664chk_ContextRequest_topologyReq([H1|T1], [H2|T2]) ->
2665    validate(fun() -> chk_TopologyRequest(H1, H2) end,
2666	     'ContextRequest_topologyReq_val'),
2667    chk_ContextRequest_topologyReq(T1, T2);
2668chk_ContextRequest_topologyReq(T1, T2) ->
2669    wrong_type('ContextRequest_topologyReq', T1, T2).
2670
2671
2672chk_ContextRequest_iepscallind(asn1_NOVALUE, asn1_NOVALUE) ->
2673    ok;
2674chk_ContextRequest_iepscallind(E, E) ->
2675    chk_type(fun is_ContextRequest_iepscallind/1,
2676	     'ContextRequest_iepscallind', E);
2677chk_ContextRequest_iepscallind(E1, E2) ->
2678    case (is_ContextRequest_iepscallind(E1) andalso
2679	  is_ContextRequest_iepscallind(E2)) of
2680	true ->
2681	    case (((E1 == false)        and (E2 == asn1_NOVALUE)) or
2682		  ((E1 == asn1_NOVALUE) and (E2 == false))) of
2683		true ->
2684		    ok;
2685		false ->
2686		    not_equal('ContextRequest_iepscallind', E1, E2)
2687	    end;
2688
2689	false ->
2690	    wrong_type('ContextRequest_iepscallind', E1, E2)
2691    end.
2692
2693chk_ContextRequest_contextProp(asn1_NOVALUE, asn1_NOVALUE) ->
2694    ok;
2695chk_ContextRequest_contextProp([], []) ->
2696    ok;
2697chk_ContextRequest_contextProp([] = T1, T2) ->
2698    not_equal('ContextRequest_contextProp', T1, T2);
2699chk_ContextRequest_contextProp(T1, [] = T2) ->
2700    not_equal('ContextRequest_contextProp', T1, T2);
2701chk_ContextRequest_contextProp([H|T1], [H|T2]) ->
2702    case is_PropertyParm(H) of
2703	true ->
2704	    chk_ContextRequest_contextProp(T1, T2);
2705	false ->
2706	    wrong_type('ContextRequest_contextProp_val', H)
2707    end;
2708chk_ContextRequest_contextProp([H1|T1], [H2|T2]) ->
2709    validate(fun() -> chk_PropertyParm(H1, H2) end,
2710	     'ContextRequest_contextProp_val'),
2711    chk_ContextRequest_contextProp(T1, T2);
2712chk_ContextRequest_contextProp(T1, T2) ->
2713    wrong_type('ContextRequest_contextProp', T1, T2).
2714
2715
2716%% -- ContextAttrAuditRequest --
2717
2718is_opt_ContextAttrAuditRequest(asn1_NOVALUE) ->
2719    true;
2720is_opt_ContextAttrAuditRequest(V) ->
2721    is_ContextAttrAuditRequest(V).
2722
2723is_ContextAttrAuditRequest(#'ContextAttrAuditRequest'{topology       = T,
2724						      emergency      = E,
2725						      priority       = P,
2726						      iepscallind    = I,
2727						      contextPropAud = A}) ->
2728    d("is_ContextAttrAuditRequest -> entry"),
2729    is_opt_NULL(T) andalso
2730	is_opt_NULL(E) andalso
2731	is_opt_NULL(P) andalso
2732	is_opt_NULL(I) andalso
2733	is_ContextAttrAuditRequest_contextPropAud(A);
2734is_ContextAttrAuditRequest(_) ->
2735    false.
2736
2737is_ContextAttrAuditRequest_contextPropAud(asn1_NOVALUE) ->
2738    true;
2739is_ContextAttrAuditRequest_contextPropAud([]) ->
2740    true;
2741is_ContextAttrAuditRequest_contextPropAud([H|T]) ->
2742    d("is_ContextAttrAuditRequest_contextPropAud -> entry"),
2743    is_IndAudPropertyParm(H) andalso
2744	is_ContextAttrAuditRequest_contextPropAud(T).
2745
2746chk_opt_ContextAttrAuditRequest(asn1_NOVALUE, asn1_NOVALUE) ->
2747    ok;
2748chk_opt_ContextAttrAuditRequest(R1, R2) ->
2749    chk_ContextAttrAuditRequest(R1, R2).
2750
2751chk_ContextAttrAuditRequest(R, R) ->
2752    chk_type(fun is_ContextAttrAuditRequest/1, 'ContextAttrAuditRequest', R);
2753chk_ContextAttrAuditRequest(#'ContextAttrAuditRequest'{topology       = T1,
2754						       emergency      = E1,
2755						       priority       = P1,
2756						       iepscallind    = I1,
2757						       contextPropAud = A1},
2758			    #'ContextAttrAuditRequest'{topology       = T2,
2759						       emergency      = E2,
2760						       priority       = P2,
2761						       iepscallind    = I2,
2762						       contextPropAud = A2}) ->
2763    validate(fun() -> chk_opt_NULL(T1, T2) end,
2764	     'ContextAttrAuditRequest_topology'),
2765    validate(fun() -> chk_opt_NULL(E1, E2) end,
2766	     'ContextAttrAuditRequest_emergency'),
2767    validate(fun() -> chk_opt_NULL(P1, P2) end,
2768	     'ContextAttrAuditRequest_priority'),
2769    validate(fun() -> chk_opt_NULL(I1, I2) end,
2770	     'ContextAttrAuditRequest_iepscallind'),
2771    chk_ContextAttrAuditRequest_contextPropAud(lists:sort(A1),
2772					       lists:sort(A2)),
2773    ok.
2774
2775chk_ContextAttrAuditRequest_contextPropAud(A, A) ->
2776    chk_type(fun is_ContextAttrAuditRequest_contextPropAud/1,
2777	     'ContextAttrAuditRequest_contextPropAud', A);
2778chk_ContextAttrAuditRequest_contextPropAud([], []) ->
2779    ok;
2780chk_ContextAttrAuditRequest_contextPropAud([] = T1, T2) ->
2781    not_equal('ContextAttrAuditRequest_contextPropAud', T1, T2);
2782chk_ContextAttrAuditRequest_contextPropAud(T1, [] = T2) ->
2783    not_equal('ContextAttrAuditRequest_contextPropAud', T1, T2);
2784chk_ContextAttrAuditRequest_contextPropAud([H|T1], [H|T2]) ->
2785    case is_IndAudPropertyParm(H) of
2786	true ->
2787	    chk_ContextAttrAuditRequest_contextPropAud(T1, T2);
2788	false ->
2789	    wrong_type('ContextAttrAuditRequest_contextPropAud_val', H)
2790    end;
2791chk_ContextAttrAuditRequest_contextPropAud([H1|T1], [H2|T2]) ->
2792    validate(fun() -> chk_PropertyParm(H1, H2) end,
2793	     'ContextAttrAuditRequest_contextPropAud_val'),
2794    chk_ContextAttrAuditRequest_contextPropAud(T1, T2);
2795chk_ContextAttrAuditRequest_contextPropAud(T1, T2) ->
2796    wrong_type('ContextAttrAuditRequest_contextPropAud', T1, T2).
2797
2798
2799%% -- CommandRequest --
2800
2801is_CommandRequest(#'CommandRequest'{command        = Cmd,
2802				    optional       = Opt,
2803				    wildcardReturn = WR}) ->
2804    d("is_CommandRequest -> entry"),
2805    is_Command(Cmd) andalso is_opt_NULL(Opt) andalso is_opt_NULL(WR);
2806is_CommandRequest(_) ->
2807    false.
2808
2809chk_CommandRequest(C, C) ->
2810    chk_type(fun is_CommandRequest/1, 'CommandRequest', C);
2811chk_CommandRequest(#'CommandRequest'{command        = Cmd1,
2812				     optional       = Opt1,
2813				     wildcardReturn = WR1},
2814		   #'CommandRequest'{command        = Cmd2,
2815				     optional       = Opt2,
2816				     wildcardReturn = WR2}) ->
2817    validate(fun() -> chk_Command(Cmd1, Cmd2) end, 'CommandRequest'),
2818    validate(fun() -> chk_opt_NULL(Opt1, Opt2) end, 'CommandRequest'),
2819    validate(fun() -> chk_opt_NULL(WR1, WR2) end, 'CommandRequest'),
2820    ok;
2821chk_CommandRequest(R1, R2) ->
2822    wrong_type('CommandRequest', R1, R2).
2823
2824
2825%% -- Command --
2826
2827is_Command({Tag, Val}) ->
2828    d("is_Command -> entry"),
2829    is_Command_tag(Tag) andalso is_Command_val(Tag, Val);
2830is_Command(_) ->
2831    false.
2832
2833is_Command_tag(Tag) ->
2834    Tags = [addReq, moveReq, modReq, subtractReq, auditCapRequest,
2835	    auditValueRequest, notifyReq, serviceChangeReq],
2836    lists:member(Tag, Tags).
2837
2838is_Command_val(addReq,  V)           -> is_AmmRequest(V);
2839is_Command_val(moveReq, V)           -> is_AmmRequest(V);
2840is_Command_val(modReq,  V)           -> is_AmmRequest(V);
2841is_Command_val(subtractReq, V)       -> is_SubtractRequest(V);
2842is_Command_val(auditCapRequest, V)   -> is_AuditRequest(V);
2843is_Command_val(auditValueRequest, V) -> is_AuditRequest(V);
2844is_Command_val(notifyReq, V)         -> is_NotifyRequest(V);
2845is_Command_val(serviceChangeReq, V)  -> is_ServiceChangeRequest(V).
2846
2847chk_Command(Cmd, Cmd) ->
2848    chk_type(fun is_Command/1, 'Command', Cmd);
2849chk_Command({Tag, Val1} = Cmd1, {Tag, Val2} = Cmd2) ->
2850    case (is_Command_tag(Tag) andalso
2851	  is_Command_val(Tag, Val1) andalso
2852	  is_Command_val(Tag, Val2)) of
2853	true ->
2854	    chk_Command_val(Tag, Val1, Val2);
2855	false ->
2856	    wrong_type('Command', Cmd1, Cmd2)
2857    end;
2858chk_Command({Tag1, Val1} = Cmd1, {Tag2, Val2} = Cmd2) ->
2859    case ((is_Command_tag(Tag1) andalso is_Command_val(Tag1, Val1)) andalso
2860	  (is_Command_tag(Tag2) andalso is_Command_val(Tag2, Val2))) of
2861	true ->
2862	    not_equal('Command', Cmd1, Cmd2);
2863	false ->
2864	    wrong_type('Command', Cmd1, Cmd2)
2865    end;
2866chk_Command(Cmd1, Cmd2) ->
2867    wrong_type('Command', Cmd1, Cmd2).
2868
2869
2870chk_Command_val(addReq, R1, R2) ->
2871    validate(fun() -> chk_AmmRequest(R1, R2) end, 'Command_addReq');
2872chk_Command_val(moveReq, R1, R2) ->
2873    validate(fun() -> chk_AmmRequest(R1, R2) end, 'Command_moveReq');
2874chk_Command_val(modReq, R1, R2) ->
2875    validate(fun() -> chk_AmmRequest(R1, R2) end, 'Command_modReq');
2876chk_Command_val(subtractReq, R1, R2) ->
2877    validate(fun() -> chk_SubtractRequest(R1, R2) end, 'Command_subtractReq');
2878chk_Command_val(auditCapRequest, R1, R2) ->
2879    validate(fun() -> chk_AuditRequest(R1, R2) end, 'Command_auditCapRequest');
2880chk_Command_val(auditValueRequest, R1, R2) ->
2881    validate(fun() -> chk_AuditRequest(R1, R2) end,
2882	     'Command_auditValueRequest');
2883chk_Command_val(notifyReq, R1, R2) ->
2884    validate(fun() -> chk_NotifyRequest(R1, R2) end, 'Command_notifyReq');
2885chk_Command_val(serviceChangeReq, R1, R2) ->
2886    validate(fun() -> chk_ServiceChangeRequest(R1, R2) end,
2887	     'Command_serviceChangeReq').
2888
2889
2890%% -- CommandReply --
2891
2892is_CommandReply({Tag, Val}) ->
2893    d("is_CommandReply -> entry"),
2894    is_CommandReply_tag(Tag) andalso is_CommandReply_val(Tag, Val);
2895is_CommandReply(_) ->
2896    false.
2897
2898is_CommandReply_tag(Tag) ->
2899    Tags = [addReply, moveReply, modReply, subtractReply,
2900	    auditCapReply, auditValueReply, notifyReply, serviceChangeReply],
2901    lists:member(Tag, Tags).
2902
2903is_CommandReply_val(addReply, V)           -> is_AmmsReply(V);
2904is_CommandReply_val(moveReply, V)          -> is_AmmsReply(V);
2905is_CommandReply_val(modReply, V)           -> is_AmmsReply(V);
2906is_CommandReply_val(subtractReply, V)      -> is_AmmsReply(V);
2907is_CommandReply_val(auditCapReply, V)      -> is_AuditReply(V);
2908is_CommandReply_val(auditValueReply, V)    -> is_AuditReply(V);
2909is_CommandReply_val(notifyReply, V)        -> is_NotifyReply(V);
2910is_CommandReply_val(serviceChangeReply, V) -> is_ServiceChangeReply(V).
2911
2912chk_CommandReply({Tag, Val} = Cmd, Cmd) ->
2913    case (is_CommandReply_tag(Tag) andalso is_CommandReply_val(Tag, Val)) of
2914	true ->
2915	    ok;
2916	false ->
2917	    wrong_type('CommandReply', Cmd)
2918    end;
2919chk_CommandReply({Tag, Val1} = Cmd1, {Tag, Val2} = Cmd2) ->
2920    case (is_CommandReply_tag(Tag) andalso
2921	  is_CommandReply_val(Tag, Val1) andalso
2922	  is_CommandReply_val(Tag, Val2)) of
2923	true ->
2924	    chk_CommandReply_val(Tag, Val1, Val2);
2925	false ->
2926	    wrong_type('CommandReply', Cmd1, Cmd2)
2927    end;
2928chk_CommandReply({Tag1, Val1} = Cmd1, {Tag2, Val2} = Cmd2) ->
2929    case ((is_CommandReply_tag(Tag1) andalso
2930	   is_CommandReply_val(Tag1, Val1)) andalso
2931	  (is_CommandReply_tag(Tag2) andalso
2932	   is_CommandReply_val(Tag2, Val2))) of
2933	true ->
2934	    not_equal('CommandReply', Cmd1, Cmd2);
2935	false ->
2936	    wrong_type('CommandReply', Cmd1, Cmd2)
2937    end;
2938chk_CommandReply(Cmd1, Cmd2) ->
2939    wrong_type('CommandReply', Cmd1, Cmd2).
2940
2941chk_CommandReply_val(addReply, V1, V2) ->
2942    validate(fun() -> chk_AmmsReply(V1, V2) end, 'CommandReply_addReply');
2943chk_CommandReply_val(moveReply, V1, V2) ->
2944    validate(fun() -> chk_AmmsReply(V1, V2) end, 'CommandReply_moveReply');
2945chk_CommandReply_val(modReply, V1, V2) ->
2946    validate(fun() -> chk_AmmsReply(V1, V2) end, 'CommandReply_modReply');
2947chk_CommandReply_val(subtractReply, V1, V2) ->
2948    validate(fun() -> chk_AmmsReply(V1, V2) end, 'CommandReply_subtractReply');
2949chk_CommandReply_val(auditCapReply, V1, V2) ->
2950    validate(fun() -> chk_AuditReply(V1, V2) end,
2951	     'CommandReply_auditCapReply');
2952chk_CommandReply_val(auditValueReply, V1, V2) ->
2953    validate(fun() -> chk_AuditReply(V1, V2) end,
2954	     'CommandReply_auditValueReply');
2955chk_CommandReply_val(notifyReply, V1, V2) ->
2956    validate(fun() -> chk_NotifyReply(V1, V2) end, 'CommandReply_notifyReply');
2957chk_CommandReply_val(serviceChangeReply, V1, V2) ->
2958    validate(fun() -> chk_ServiceChangeReply(V1, V2) end,
2959	     'CommandReply_serviceChangeReply').
2960
2961
2962%% -- TopologyRequest --
2963
2964is_TopologyRequest(#'TopologyRequest'{terminationFrom   = F,
2965				      terminationTo     = T,
2966				      topologyDirection = D,
2967				      streamID          = S}) ->
2968    d("is_TopologyRequest -> entry"),
2969    is_TerminationID(F) andalso
2970	is_TerminationID(T) andalso
2971	is_TopologyRequest_topologyDirection(D) andalso
2972	is_opt_StreamID(S);
2973is_TopologyRequest(_) ->
2974    false.
2975
2976is_TopologyRequest_topologyDirection(D) ->
2977    lists:member(D, [bothway, isolate, oneway]).
2978
2979
2980chk_TopologyRequest(T, T) when is_record(T,'TopologyRequest') ->
2981    ok;
2982chk_TopologyRequest(#'TopologyRequest'{terminationFrom   = F1,
2983                                       terminationTo     = T1,
2984                                       topologyDirection = D1,
2985				       streamID          = S1},
2986                    #'TopologyRequest'{terminationFrom   = F2,
2987                                       terminationTo     = T2,
2988                                       topologyDirection = D2,
2989				       streamID          = S2}) ->
2990    validate(fun() -> chk_TerminationID(F1, F2) end,
2991	     'TopologyRequest_terminationFrom'),
2992    validate(fun() -> chk_TerminationID(T1, T2) end,
2993	     'TopologyRequest_terminationTo'),
2994    chk_TopologyRequest_topologyDirection(D1,D2),
2995    validate(fun() -> chk_StreamID(S1, S2) end, 'TopologyRequest_streamID'),
2996    ok.
2997
2998chk_TopologyRequest_topologyDirection(D, D) ->
2999    case is_TopologyRequest_topologyDirection(D) of
3000	true ->
3001	    ok;
3002	false ->
3003	    wrong_type('TopologyRequest_topologyDirection', D)
3004    end;
3005chk_TopologyRequest_topologyDirection(D1, D2) ->
3006    case (is_TopologyRequest_topologyDirection(D1) andalso
3007	  is_TopologyRequest_topologyDirection(D1)) of
3008	true ->
3009	    not_equal('TopologyRequest_topologyDirection', D1, D2);
3010	false ->
3011	    wrong_type('TopologyRequest_topologyDirection', D1, D2)
3012    end.
3013
3014
3015%% -- AmmRequest --
3016
3017is_AmmRequest(#'AmmRequest'{terminationID = Tids,
3018			    descriptors   = Descs}) ->
3019    d("is_AmmRequest -> entry with"
3020      "~n   Tids:  ~p", [Tids]),
3021    is_TerminationIDList(Tids) andalso is_AmmRequest_descriptors(Descs);
3022is_AmmRequest(_) ->
3023    false.
3024
3025is_AmmRequest_descriptors(Descs) ->
3026    d("is_AmmRequest_descriptors -> entry"),
3027    is_AmmRequest_descriptors(Descs, []).
3028
3029is_AmmRequest_descriptors([], _) ->
3030    true;
3031is_AmmRequest_descriptors([{Tag, _} = Desc|Descs], FoundDescs) ->
3032    d("is_AmmRequest_descriptors -> entry with"
3033      "~n   Tag:        ~p"
3034      "~n   FoundDescs: ~p", [Tag, FoundDescs]),
3035    case lists:member(Tag, FoundDescs) of
3036	true ->
3037	    atmost_once('AmmRequest_descriptors', Tag);
3038	false ->
3039	    case is_AmmDescriptor(Desc) of
3040		true ->
3041		    is_AmmRequest_descriptors(Descs, [Tag|FoundDescs]);
3042		false ->
3043		    wrong_type('AmmRequest_descriptors', Desc)
3044	    end
3045    end;
3046is_AmmRequest_descriptors(Descs, _) ->
3047    d("is_AmmRequest_descriptors -> entry with WRONG TYPE"
3048      "~n   Descs: ~p", [Descs]),
3049    wrong_type('AmmRequest_descriptors', Descs).
3050
3051
3052chk_AmmRequest(R, R) when is_record(R, 'AmmRequest') ->
3053    d("chk_AmmRequest -> entry when equal"),
3054    chk_type(fun is_AmmRequest/1, 'AmmRequest', R);
3055chk_AmmRequest(#'AmmRequest'{terminationID = Tids1,
3056			     descriptors   = Descs1},
3057	       #'AmmRequest'{terminationID = Tids2,
3058			     descriptors   = Descs2}) ->
3059    d("chk_AmmRequest -> entry with not equal"
3060      "~n   Tids1:  ~p"
3061      "~n   Tids2:  ~p", [Tids1, Tids2]),
3062    validate(
3063      fun() -> chk_TerminationIDList(Tids1, Tids2) end,
3064      'AmmRequest'),
3065    validate(
3066      fun() -> chk_AmmRequest_descriptors(Descs1, Descs2) end,
3067      'AmmRequest'),
3068    ok.
3069
3070
3071chk_AmmRequest_descriptors([], []) ->
3072    d("chk_AmmRequest_descriptors -> done when OK"),
3073    ok;
3074chk_AmmRequest_descriptors([] = Descs1, Descs2) ->
3075    d("chk_AmmRequest_descriptors -> done when NOT EQUAL:"
3076      "~n   Descs1: ~p"
3077      "~n   Descs1: ~p", [Descs1, Descs2]),
3078    not_equal('AmmRequest_descriptors', Descs1, Descs2);
3079chk_AmmRequest_descriptors(Descs1, [] = Descs2) ->
3080    d("chk_AmmRequest_descriptors -> done when NOT EQUAL:"
3081      "~n   Descs1: ~p"
3082      "~n   Descs1: ~p", [Descs1, Descs2]),
3083    not_equal('AmmRequest_descriptors', Descs1, Descs2);
3084chk_AmmRequest_descriptors([H|T1], [H|T2]) ->
3085    d("chk_AmmRequest_descriptors -> entry when equal"),
3086    case is_AmmDescriptor(H) of
3087	true ->
3088	    chk_AmmRequest_descriptors(T1, T2);
3089	false ->
3090	    wrong_type('AmmRequest_descriptors_val', H)
3091    end;
3092chk_AmmRequest_descriptors([H1|T1], [H2|T2]) ->
3093    d("chk_AmmRequest_descriptors -> entry when not equal"),
3094    validate(fun() -> chk_AmmDescriptor(H1, H2) end,
3095	     'AmmRequest_descriptors_val'),
3096    chk_AmmRequest_descriptors(T1, T2);
3097chk_AmmRequest_descriptors(Descs1, Descs2) ->
3098    d("chk_AmmRequest_descriptors -> done when WRONG TYPE:"
3099      "~n   Descs1: ~p"
3100      "~n   Descs1: ~p", [Descs1, Descs2]),
3101    wrong_type('AmmRequest_descriptors', Descs1, Descs2).
3102
3103
3104%% -- AmmDescriptor --
3105
3106is_AmmDescriptor({Tag, Val}) ->
3107    d("is_AmmDescriptor -> entry with"
3108      "~n   Tag: ~p"
3109      "~n   Val: ~p",[Tag, Val]),
3110    is_AmmDescriptor_tag(Tag) andalso is_AmmDescriptor_val(Tag, Val);
3111is_AmmDescriptor(_) ->
3112    false.
3113
3114is_AmmDescriptor_tag(Tag) ->
3115    Tags = [mediaDescriptor, modemDescriptor, muxDescriptor, eventsDescriptor,
3116	    eventBufferDescriptor, signalsDescriptor, digitMapDescriptor,
3117	    auditDescriptor, statisticsDescriptor],
3118    lists:member(Tag, Tags).
3119
3120is_AmmDescriptor_val(mediaDescriptor, D) ->
3121    is_MediaDescriptor(D);
3122is_AmmDescriptor_val(modemDescriptor, D) ->
3123    is_ModemDescriptor(D);
3124is_AmmDescriptor_val(muxDescriptor, D) ->
3125    is_MuxDescriptor(D);
3126is_AmmDescriptor_val(eventsDescriptor, D) ->
3127    is_EventsDescriptor(D);
3128is_AmmDescriptor_val(eventBufferDescriptor, D) ->
3129    is_EventBufferDescriptor(D);
3130is_AmmDescriptor_val(signalsDescriptor, D) ->
3131    is_SignalsDescriptor(D);
3132is_AmmDescriptor_val(digitMapDescriptor, D) ->
3133    is_DigitMapDescriptor(D);
3134is_AmmDescriptor_val(auditDescriptor, D) ->
3135    is_AuditDescriptor(D);
3136is_AmmDescriptor_val(statisticsDescriptor, D) ->
3137    is_StatisticsDescriptor(D).
3138
3139chk_AmmDescriptor(D, D) ->
3140    chk_type(fun is_AmmDescriptor_tag/1, 'AmmDescriptor', D);
3141chk_AmmDescriptor({Tag, Val1} = Cmd1, {Tag, Val2} = Cmd2) ->
3142    case (is_AmmDescriptor_tag(Tag) andalso
3143	  is_AmmDescriptor_val(Tag, Val1) andalso
3144	  is_AmmDescriptor_val(Tag, Val2)) of
3145	true ->
3146	    chk_AmmDescriptor_val(Tag, Val1, Val2);
3147	false ->
3148	    wrong_type('AmmDescriptor', Cmd1, Cmd2)
3149    end;
3150chk_AmmDescriptor({Tag1, Val1} = Cmd1, {Tag2, Val2} = Cmd2) ->
3151    case ((is_AmmDescriptor_tag(Tag1) andalso
3152	   is_AmmDescriptor_val(Tag1, Val1)) andalso
3153	  (is_AmmDescriptor_tag(Tag2) andalso
3154	   is_AmmDescriptor_val(Tag2, Val2))) of
3155	true ->
3156	    not_equal('AmmDescriptor', Cmd1, Cmd2);
3157	false ->
3158	    wrong_type('AmmDescriptor', Cmd1, Cmd2)
3159    end;
3160chk_AmmDescriptor(Cmd1, Cmd2) ->
3161    wrong_type('AmmDescriptor', Cmd1, Cmd2).
3162
3163chk_AmmDescriptor_val(mediaDescriptor, D1, D2) ->
3164    validate(fun() -> chk_MediaDescriptor(D1, D2) end, 'AmmDescriptor');
3165chk_AmmDescriptor_val(modemDescriptor, D1, D2) ->
3166    validate(fun() -> chk_ModemDescriptor(D1, D2) end, 'AmmDescriptor');
3167chk_AmmDescriptor_val(muxDescriptor, D1, D2) ->
3168    validate(fun() -> chk_MuxDescriptor(D1, D2) end, 'AmmDescriptor');
3169chk_AmmDescriptor_val(eventsDescriptor, D1, D2) ->
3170    validate(fun() -> chk_EventsDescriptor(D1, D2) end, 'AmmDescriptor');
3171chk_AmmDescriptor_val(eventBufferDescriptor, D1, D2) ->
3172    validate(fun() -> chk_EventBufferDescriptor(D1, D2) end, 'AmmDescriptor');
3173chk_AmmDescriptor_val(signalsDescriptor, D1, D2) ->
3174    validate(fun() -> chk_SignalsDescriptor(D1, D2) end, 'AmmDescriptor');
3175chk_AmmDescriptor_val(digitMapDescriptor, D1, D2) ->
3176    validate(fun() -> chk_DigitMapDescriptor(D1, D2) end, 'AmmDescriptor');
3177chk_AmmDescriptor_val(auditDescriptor, D1, D2) ->
3178    validate(fun() -> chk_AuditDescriptor(D1, D2) end, 'AmmDescriptor').
3179
3180
3181%% -- AmmsReply --
3182
3183is_AmmsReply(#'AmmsReply'{terminationID    = Tids,
3184			  terminationAudit = TA}) ->
3185    is_TerminationIDList(Tids) andalso is_opt_TerminationAudit(TA);
3186is_AmmsReply(_) ->
3187    false.
3188
3189chk_AmmsReply(R, R) ->
3190    is_AmmsReply(R);
3191chk_AmmsReply(#'AmmsReply'{terminationID    = TID1,
3192			   terminationAudit = TA1},
3193	      #'AmmsReply'{terminationID    = TID2,
3194			   terminationAudit = TA2}) ->
3195    validate(fun() -> chk_TerminationIDList(TID1, TID2) end, 'AmmsReply'),
3196    validate(fun() -> chk_opt_TerminationAudit(TA1, TA2) end, 'AmmsReply'),
3197    ok;
3198chk_AmmsReply(R1, R2) ->
3199    wrong_type('AmmsReply', R1, R2).
3200
3201
3202%% -- SubtractRequest --
3203
3204is_SubtractRequest(#'SubtractRequest'{terminationID   = Tids,
3205				      auditDescriptor = AD}) ->
3206    is_TerminationIDList(Tids) andalso is_opt_AuditDescriptor(AD);
3207is_SubtractRequest(_) ->
3208    false.
3209
3210chk_SubtractRequest(R, R) ->
3211    chk_type(fun is_SubtractRequest/1, 'SubtractRequest', R);
3212chk_SubtractRequest(#'SubtractRequest'{terminationID   = Tids1,
3213				       auditDescriptor = AD1},
3214		    #'SubtractRequest'{terminationID   = Tids2,
3215				       auditDescriptor = AD2}) ->
3216    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end,
3217	     'SubtractRequest'),
3218    validate(fun() -> chk_opt_AuditDescriptor(AD1, AD2) end,
3219	     'SubtractRequest'),
3220    ok;
3221chk_SubtractRequest(SR1, SR2) ->
3222    wrong_type('SubtractRequest', SR1, SR2).
3223
3224
3225%% -- AuditRequest --
3226
3227is_AuditRequest(#'AuditRequest'{terminationID   = Tid,
3228				auditDescriptor = AD}) ->
3229    is_TerminationID(Tid) andalso is_AuditDescriptor(AD);
3230is_AuditRequest(_) ->
3231    false.
3232
3233chk_AuditRequest(R, R) ->
3234    chk_type(fun is_AuditRequest/1, 'AuditRequest', R);
3235chk_AuditRequest(#'AuditRequest'{terminationID   = Tids1,
3236				 auditDescriptor = AD1},
3237		 #'AuditRequest'{terminationID   = Tids2,
3238				 auditDescriptor = AD2}) ->
3239    validate(fun() -> chk_TerminationID(Tids1, Tids2) end,
3240	     'AuditRequest'),
3241    validate(fun() -> chk_AuditDescriptor(AD1, AD2) end,
3242	     'AuditRequest'),
3243    ok;
3244chk_AuditRequest(AR1, AR2) ->
3245    wrong_type('AuditRequest', AR1, AR2).
3246
3247
3248%% -- AuditReply --
3249
3250is_AuditReply({Tag, Val}) ->
3251    is_AuditReply_tag(Tag) andalso is_AuditReply_val(Tag, Val);
3252is_AuditReply(_) ->
3253    false.
3254
3255is_AuditReply_tag(Tag) ->
3256    Tags = [contextAuditResult, error, auditResult],
3257    lists:member(Tag, Tags).
3258
3259is_AuditReply_val(contextAuditResult, Val) ->
3260    is_TerminationIDList(Val);
3261is_AuditReply_val(error, Val) ->
3262    is_ErrorDescriptor(Val);
3263is_AuditReply_val(auditResult, Val) ->
3264    is_AuditResult(Val).
3265
3266chk_AuditReply(R, R) ->
3267    chk_type(fun is_AuditReply/1, 'AuditReply', R);
3268chk_AuditReply({Tag, Val1} = R1, {Tag, Val2} = R2) ->
3269    case (is_AuditReply_tag(Tag) andalso
3270	  is_AuditReply_val(Tag, Val1)andalso
3271	  is_AuditReply_val(Tag, Val2)) of
3272	true ->
3273	    chk_AuditReply_val(Tag, Val1, Val2);
3274	false ->
3275	    wrong_type('AuditReply', R1, R2)
3276    end;
3277chk_AuditReply({Tag1, Val1} = R1, {Tag2, Val2} = R2) ->
3278    case ((is_AuditReply_tag(Tag1) andalso
3279	   is_AuditReply_val(Tag1, Val1)) andalso
3280	  (is_AuditReply_tag(Tag2) andalso
3281	   is_AuditReply_val(Tag2, Val2))) of
3282	true ->
3283	    not_equal('AuditReply', R1, R2);
3284	false ->
3285	    wrong_type('AuditReply', R1, R2)
3286    end;
3287chk_AuditReply(AR1, AR2) ->
3288    wrong_type('AuditReply', AR1, AR2).
3289
3290chk_AuditReply_val(contextAuditResult, Val1, Val2) ->
3291    chk_TerminationIDList(Val1, Val2);
3292chk_AuditReply_val(error, Val1, Val2) ->
3293    chk_ErrorDescriptor(Val1, Val2);
3294chk_AuditReply_val(auditResult, Val1, Val2) ->
3295    chk_AuditResult(Val1, Val2).
3296
3297
3298%% -- AuditResult --
3299
3300is_AuditResult(#'AuditResult'{terminationID          = TID,
3301			      terminationAuditResult = TAR}) ->
3302    is_TerminationID(TID) andalso is_TerminationAudit(TAR);
3303is_AuditResult(_) ->
3304    false.
3305
3306chk_AuditResult(R, R) ->
3307    chk_type(fun is_AuditResult/1, 'AuditResult', R);
3308chk_AuditResult(#'AuditResult'{terminationID          = TID1,
3309			       terminationAuditResult = TAR1},
3310		#'AuditResult'{terminationID          = TID2,
3311			       terminationAuditResult = TAR2}) ->
3312    validate(fun() -> chk_TerminationID(TID1, TID2) end, 'AuditResult'),
3313    validate(fun() -> chk_TerminationAudit(TAR1, TAR2) end, 'AuditResult'),
3314    ok;
3315chk_AuditResult(AR1, AR2) ->
3316    wrong_type('AuditResult', AR1, AR2).
3317
3318
3319%% -- TerminationAudit --
3320
3321is_opt_TerminationAudit(TA) ->
3322    is_OPTIONAL(fun is_TerminationAudit/1, TA).
3323
3324is_TerminationAudit([]) ->
3325    true;
3326is_TerminationAudit([H|T]) ->
3327    is_AuditReturnParameter(H) andalso is_TerminationAudit(T);
3328is_TerminationAudit(_) ->
3329    false.
3330
3331chk_opt_TerminationAudit(TA1, TA2) ->
3332    chk_OPTIONAL('TerminationAudit', TA1, TA2,
3333		 fun is_TerminationAudit/1, fun chk_TerminationAudit/2).
3334
3335chk_TerminationAudit([], []) ->
3336    ok;
3337chk_TerminationAudit([] = TA1, TA2) ->
3338    not_equal('TerminationAudit', TA1, TA2);
3339chk_TerminationAudit(TA1, [] = TA2) ->
3340    not_equal('TerminationAudit', TA1, TA2);
3341chk_TerminationAudit([H|T1], [H|T2]) ->
3342    case is_AuditReturnParameter(H) of
3343	true ->
3344	    chk_TerminationAudit(T1, T2);
3345	false ->
3346	    wrong_type('TerminationAudit', H)
3347    end;
3348chk_TerminationAudit([H1|_], [H2|_]) ->
3349    chk_AuditReturnParameter(H1, H2),
3350    not_equal('TerminationAudit_val', H1, H2);
3351chk_TerminationAudit(TA1, TA2) ->
3352    not_equal('TerminationAudit', TA1, TA2).
3353
3354
3355%% -- AuditReturnParameter --
3356
3357is_AuditReturnParameter({Tag, Val}) ->
3358    is_AuditReturnParameter_tag(Tag) andalso
3359	is_AuditReturnParameter_val(Tag, Val);
3360is_AuditReturnParameter(_) ->
3361    false.
3362
3363is_AuditReturnParameter_tag(Tag) ->
3364    Tags = [errorDescriptor,
3365	    mediaDescriptor,
3366	    modemDescriptor,
3367	    muxDescriptor,
3368	    eventsDescriptor,
3369	    eventBufferDescriptor,
3370	    signalsDescriptor,
3371	    digitMapDescriptor,
3372	    observedEventsDescriptor,
3373	    statisticsDescriptor,
3374	    packagesDescriptor,
3375	    emptyDescriptors],
3376    lists:member(Tag, Tags).
3377
3378is_AuditReturnParameter_val(errorDescriptor, V) ->
3379    is_ErrorDescriptor(V);
3380is_AuditReturnParameter_val(mediaDescriptor, V) ->
3381    is_MediaDescriptor(V);
3382is_AuditReturnParameter_val(modemDescriptor, V) ->
3383    is_ModemDescriptor(V);
3384is_AuditReturnParameter_val(muxDescriptor, V) ->
3385    is_MuxDescriptor(V);
3386is_AuditReturnParameter_val(eventsDescriptor, V) ->
3387    is_EventsDescriptor(V);
3388is_AuditReturnParameter_val(eventBufferDescriptor, V) ->
3389    is_EventBufferDescriptor(V);
3390is_AuditReturnParameter_val(signalsDescriptor, V) ->
3391    is_SignalsDescriptor(V);
3392is_AuditReturnParameter_val(digitMapDescriptor, V) ->
3393    is_DigitMapDescriptor(V);
3394is_AuditReturnParameter_val(observedEventsDescriptor, V) ->
3395    is_ObservedEventsDescriptor(V);
3396is_AuditReturnParameter_val(statisticsDescriptor, V) ->
3397    is_StatisticsDescriptor(V);
3398is_AuditReturnParameter_val(packagesDescriptor, V) ->
3399    is_PackagesDescriptor(V);
3400is_AuditReturnParameter_val(emptyDescriptors, V) ->
3401    is_AuditDescriptor(V).
3402
3403chk_AuditReturnParameter(ARP, ARP) ->
3404    chk_type(fun is_AuditReturnParameter/1, 'AuditReturnParameter', ARP);
3405chk_AuditReturnParameter({Tag, Val1} = ARP1, {Tag, Val2} = ARP2) ->
3406    case (is_AuditReturnParameter_tag(Tag) andalso
3407	  is_AuditReturnParameter_val(Tag, Val1) andalso
3408	  is_AuditReturnParameter_val(Tag, Val2)) of
3409	true ->
3410	    chk_AuditReturnParameter_val(Tag, Val1, Val2);
3411	false ->
3412	    wrong_type('AuditReturnParameter', ARP1, ARP2)
3413    end;
3414chk_AuditReturnParameter({Tag1, Val1} = ARP1, {Tag2, Val2} = ARP2) ->
3415    case ((is_AuditReturnParameter_tag(Tag1) andalso
3416	   is_AuditReturnParameter_val(Tag1, Val1)) andalso
3417	  (is_AuditReturnParameter_tag(Tag2) andalso
3418	   is_AuditReturnParameter_val(Tag2, Val2))) of
3419	true ->
3420	    not_equal('AuditReturnParameter', ARP1, ARP2);
3421	false ->
3422	    wrong_type('AuditReturnParameter', ARP1, ARP2)
3423    end;
3424chk_AuditReturnParameter(ARP1, ARP2) ->
3425    wrong_type('AuditReturnParameter', ARP1, ARP2).
3426
3427chk_AuditReturnParameter_val(errorDescriptor, V1, V2) ->
3428    validate(fun() -> chk_ErrorDescriptor(V1, V2) end,
3429	     'AuditReturnParameter');
3430chk_AuditReturnParameter_val(mediaDescriptor, V1, V2) ->
3431    validate(fun() -> chk_MediaDescriptor(V1, V2) end,
3432	     'AuditReturnParameter');
3433chk_AuditReturnParameter_val(modemDescriptor, V1, V2) ->
3434    validate(fun() -> chk_ModemDescriptor(V1, V2) end,
3435	     'AuditReturnParameter');
3436chk_AuditReturnParameter_val(muxDescriptor, V1, V2) ->
3437    validate(fun() -> chk_MuxDescriptor(V1, V2) end,
3438	     'AuditReturnParameter');
3439chk_AuditReturnParameter_val(eventsDescriptor, V1, V2) ->
3440    validate(fun() -> chk_EventsDescriptor(V1, V2) end,
3441	     'AuditReturnParameter');
3442chk_AuditReturnParameter_val(eventBufferDescriptor, V1, V2) ->
3443    validate(fun() -> chk_EventBufferDescriptor(V1, V2) end,
3444	     'AuditReturnParameter');
3445chk_AuditReturnParameter_val(signalsDescriptor, V1, V2) ->
3446    validate(fun() -> chk_SignalsDescriptor(V1, V2) end,
3447	     'AuditReturnParameter');
3448chk_AuditReturnParameter_val(digitMapDescriptor, V1, V2) ->
3449    validate(fun() -> chk_DigitMapDescriptor(V1, V2) end,
3450	     'AuditReturnParameter');
3451chk_AuditReturnParameter_val(observedEventsDescriptor, V1, V2) ->
3452    validate(fun() -> chk_ObservedEventsDescriptor(V1, V2) end,
3453	     'AuditReturnParameter');
3454chk_AuditReturnParameter_val(statisticsDescriptor, V1, V2) ->
3455    validate(fun() -> chk_StatisticsDescriptor(V1, V2) end,
3456	     'AuditReturnParameter');
3457chk_AuditReturnParameter_val(packagesDescriptor, V1, V2) ->
3458    validate(fun() -> chk_PackagesDescriptor(V1, V2) end,
3459	     'AuditReturnParameter');
3460chk_AuditReturnParameter_val(emptyDescriptors, V1, V2) ->
3461    validate(fun() -> chk_AuditDescriptor(V1, V2) end,
3462	     'AuditReturnParameter').
3463
3464
3465%% -- AuditDescriptor --
3466
3467is_opt_AuditDescriptor(asn1_NOVALUE) ->
3468    true;
3469is_opt_AuditDescriptor(V) ->
3470    is_AuditDescriptor(V).
3471
3472is_AuditDescriptor(#'AuditDescriptor'{auditToken         = AT,
3473				      auditPropertyToken = APT}) ->
3474    is_AuditDescriptor_auditToken(AT) andalso
3475	is_AuditDescriptor_auditPropertyToken(APT);
3476is_AuditDescriptor(_) ->
3477    false.
3478
3479is_AuditDescriptor_auditToken(asn1_NOVALUE) ->
3480    true;
3481is_AuditDescriptor_auditToken([]) ->
3482    true;
3483is_AuditDescriptor_auditToken([H|T]) ->
3484    is_AuditDescriptor_auditToken_val(H) andalso
3485	is_AuditDescriptor_auditToken(T);
3486is_AuditDescriptor_auditToken(_) ->
3487    false.
3488
3489is_AuditDescriptor_auditToken_val(V) ->
3490    Toks = [muxToken, modemToken, mediaToken, eventsToken, signalsToken,
3491	    digitMapToken, statsToken, observedEventsToken,
3492	    packagesToken, eventBufferToken],
3493    lists:member(V, Toks).
3494
3495is_AuditDescriptor_auditPropertyToken(asn1_NOVALUE) ->
3496    true;
3497is_AuditDescriptor_auditPropertyToken([]) ->
3498    true;
3499is_AuditDescriptor_auditPropertyToken([H|T]) ->
3500    is_IndAuditParameter(H) andalso is_AuditDescriptor_auditPropertyToken(T);
3501is_AuditDescriptor_auditPropertyToken(_) ->
3502    false.
3503
3504chk_opt_AuditDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
3505    ok;
3506chk_opt_AuditDescriptor(AD1, AD2) ->
3507    chk_AuditDescriptor(AD1, AD2).
3508
3509chk_AuditDescriptor(AD, AD) ->
3510    chk_type(fun is_AuditDescriptor/1, 'AuditDescriptor', AD);
3511chk_AuditDescriptor(#'AuditDescriptor'{auditToken         = AT1,
3512				       auditPropertyToken = APT1},
3513		    #'AuditDescriptor'{auditToken         = AT2,
3514				       auditPropertyToken = APT2}) ->
3515    chk_AuditDescriptor_auditToken(AT1, AT2),
3516    chk_AuditDescriptor_auditPropertyToken(APT1, APT2),
3517    ok;
3518chk_AuditDescriptor(AD1, AD2) ->
3519    wrong_type('AuditDescriptor', AD1, AD2).
3520
3521chk_AuditDescriptor_auditToken(asn1_NOVALUE, asn1_NOVALUE) ->
3522    ok;
3523chk_AuditDescriptor_auditToken([], []) ->
3524    ok;
3525chk_AuditDescriptor_auditToken([] = AT1, AT2) ->
3526    not_equal('AuditDescriptor_auditToken', AT1, AT2);
3527chk_AuditDescriptor_auditToken(AT1, [] = AT2) ->
3528    not_equal('AuditDescriptor_auditToken', AT1, AT2);
3529chk_AuditDescriptor_auditToken([H|T1], [H|T2]) ->
3530    case is_AuditDescriptor_auditToken_val(H) of
3531	true ->
3532	    chk_AuditDescriptor_auditToken(T1, T2);
3533	false ->
3534	    wrong_type('AuditDescriptor_auditToken_val', H)
3535    end;
3536chk_AuditDescriptor_auditToken([H1|_T1], [H2|_T2]) ->
3537    case (is_AuditDescriptor_auditToken_val(H1) andalso
3538	  is_AuditDescriptor_auditToken_val(H2)) of
3539	true ->
3540	    not_equal('AuditDescriptor_auditToken_val', H1, H2);
3541	false ->
3542	    wrong_type('AuditDescriptor_auditToken_val', H1, H2)
3543    end;
3544chk_AuditDescriptor_auditToken(AT1, AT2) ->
3545    wrong_type('AuditDescriptor_auditToken', AT1, AT2).
3546
3547chk_AuditDescriptor_auditPropertyToken(asn1_NOVALUE, asn1_NOVALUE) ->
3548    ok;
3549chk_AuditDescriptor_auditPropertyToken([], []) ->
3550    ok;
3551chk_AuditDescriptor_auditPropertyToken([] = AT1, AT2) ->
3552    not_equal('AuditDescriptor_auditPropertyToken', AT1, AT2);
3553chk_AuditDescriptor_auditPropertyToken(AT1, [] = AT2) ->
3554    not_equal('AuditDescriptor_auditPropertyToken', AT1, AT2);
3555chk_AuditDescriptor_auditPropertyToken([H|T1], [H|T2]) ->
3556    case is_IndAuditParameter(H) of
3557	true ->
3558	    chk_AuditDescriptor_auditPropertyToken(T1, T2);
3559	false ->
3560	    wrong_type('AuditDescriptor_auditPropertyToken_val', H)
3561    end;
3562chk_AuditDescriptor_auditPropertyToken([H1|_], [H2|_]) ->
3563    chk_IndAuditParameter(H1, H2),
3564    not_equal('AuditDescriptor_auditPropertyToken_val', H1, H2);
3565chk_AuditDescriptor_auditPropertyToken(AT1, AT2) ->
3566    wrong_type('AuditDescriptor_auditPropertyToken', AT1, AT2).
3567
3568
3569%% -- IndAuditParameter --
3570
3571is_IndAuditParameter({Tag, Val}) ->
3572    is_IndAuditParameter_tag(Tag) andalso is_IndAuditParameter_val(Tag, Val);
3573is_IndAuditParameter(_) ->
3574    false.
3575
3576is_IndAuditParameter_tag(Tag) ->
3577    Tags = [indAudMediaDescriptor,
3578	    indAudEventsDescriptor,
3579	    indAudEventBufferDescriptor,
3580	    indAudSignalsDescriptor,
3581	    indAudDigitMapDescriptor,
3582	    indAudStatisticsDescriptor,
3583	    indAudPackagesDescriptor],
3584    lists:member(Tag, Tags).
3585
3586is_IndAuditParameter_val(indAudMediaDescriptor, Val) ->
3587    is_IndAudMediaDescriptor(Val);
3588is_IndAuditParameter_val(indAudEventsDescriptor, Val) ->
3589    is_IndAudEventsDescriptor(Val);
3590is_IndAuditParameter_val(indAudEventBufferDescriptor, Val) ->
3591    is_IndAudEventBufferDescriptor(Val);
3592is_IndAuditParameter_val(indAudSignalsDescriptor, Val) ->
3593    is_IndAudSignalsDescriptor(Val);
3594is_IndAuditParameter_val(indAudDigitMapDescriptor, Val) ->
3595    is_IndAudDigitMapDescriptor(Val);
3596is_IndAuditParameter_val(indAudStatisticsDescriptor, Val) ->
3597    is_IndAudStatisticsDescriptor(Val);
3598is_IndAuditParameter_val(indAudPackagesDescriptor, Val) ->
3599    is_IndAudPackagesDescriptor(Val).
3600
3601chk_IndAuditParameter(IAP, IAP) ->
3602    chk_type(fun is_IndAuditParameter/1, 'IndAuditParameter', IAP);
3603chk_IndAuditParameter({Tag, Val1} = IAP1, {Tag, Val2} = IAP2) ->
3604    case (is_IndAuditParameter_tag(Tag) andalso
3605	  is_IndAuditParameter_val(Tag, Val1) andalso
3606	  is_IndAuditParameter_val(Tag, Val2)) of
3607	true ->
3608	    chk_IndAuditParameter_val(Tag, Val1, Val2);
3609	false ->
3610	    wrong_type('IndAuditParameter', IAP1, IAP2)
3611    end;
3612chk_IndAuditParameter({Tag1, Val1} = IAP1, {Tag2, Val2} = IAP2) ->
3613    case ((is_IndAuditParameter_tag(Tag1) andalso
3614	   is_IndAuditParameter_val(Tag1, Val1)) andalso
3615	  (is_IndAuditParameter_tag(Tag2) andalso
3616	   is_IndAuditParameter_val(Tag2, Val2))) of
3617	true ->
3618	    not_equal('IndAuditParameter', IAP1, IAP2);
3619	false ->
3620	    wrong_type('IndAuditParameter', IAP1, IAP2)
3621    end;
3622chk_IndAuditParameter(IAP1, IAP2) ->
3623    wrong_type('IndAuditParameter', IAP1, IAP2).
3624
3625chk_IndAuditParameter_val(indAudMediaDescriptor, Val1, Val2) ->
3626    validate(fun() -> chk_IndAudMediaDescriptor(Val1, Val2) end,
3627	     'IndAuditParameter');
3628chk_IndAuditParameter_val(indAudEventsDescriptor, Val1, Val2) ->
3629    validate(fun() -> chk_IndAudEventsDescriptor(Val1, Val2) end,
3630	     'IndAuditParameter');
3631chk_IndAuditParameter_val(indAudEventBufferDescriptor, Val1, Val2) ->
3632    validate(fun() -> chk_IndAudEventBufferDescriptor(Val1, Val2) end,
3633	     'IndAuditParameter');
3634chk_IndAuditParameter_val(indAudSignalsDescriptor, Val1, Val2) ->
3635    validate(fun() -> chk_IndAudSignalsDescriptor(Val1, Val2) end,
3636	     'IndAuditParameter');
3637chk_IndAuditParameter_val(indAudDigitMapDescriptor, Val1, Val2) ->
3638    validate(fun() -> chk_IndAudDigitMapDescriptor(Val1, Val2) end,
3639	     'IndAuditParameter');
3640chk_IndAuditParameter_val(indAudStatisticsDescriptor, Val1, Val2) ->
3641    validate(fun() -> chk_IndAudStatisticsDescriptor(Val1, Val2) end,
3642	     'IndAuditParameter');
3643chk_IndAuditParameter_val(indAudPackagesDescriptor, Val1, Val2) ->
3644    validate(fun() -> chk_IndAudPackagesDescriptor(Val1, Val2) end,
3645	     'IndAuditParameter').
3646
3647
3648%% -- IndAudMediaDescriptor --
3649
3650is_IndAudMediaDescriptor(#'IndAudMediaDescriptor'{termStateDescr = TSD,
3651						  streams        = S}) ->
3652    is_opt_IndAudTerminationStateDescriptor(TSD) andalso
3653	is_IndAudMediaDescriptor_streams(S);
3654is_IndAudMediaDescriptor(_) ->
3655    false.
3656
3657is_IndAudMediaDescriptor_streams(asn1_NOVALUE) ->
3658    true;
3659is_IndAudMediaDescriptor_streams({Tag, Val}) ->
3660    is_IndAudMediaDescriptor_streams_tag(Tag) andalso
3661	is_IndAudMediaDescriptor_streams_val(Tag, Val);
3662is_IndAudMediaDescriptor_streams(_) ->
3663    false.
3664
3665is_IndAudMediaDescriptor_streams_tag(Tag) ->
3666    Tags = [oneStream, multiStream],
3667    lists:member(Tag, Tags).
3668
3669is_IndAudMediaDescriptor_streams_val(oneStream, Val) ->
3670    is_IndAudStreamParms(Val);
3671is_IndAudMediaDescriptor_streams_val(multiStream, Val) ->
3672    is_IndAudMediaDescriptor_multiStream(Val).
3673
3674is_IndAudMediaDescriptor_multiStream([]) ->
3675    true;
3676is_IndAudMediaDescriptor_multiStream([H|T]) ->
3677    is_IndAudStreamDescriptor(H) andalso
3678	is_IndAudMediaDescriptor_multiStream(T);
3679is_IndAudMediaDescriptor_multiStream(_) ->
3680    false.
3681
3682chk_IndAudMediaDescriptor(IAMD, IAMD) ->
3683    chk_type(fun is_IndAudMediaDescriptor/1, 'IndAudMediaDescriptor', IAMD);
3684chk_IndAudMediaDescriptor(#'IndAudMediaDescriptor'{termStateDescr = TSD1,
3685						   streams        = S1},
3686			  #'IndAudMediaDescriptor'{termStateDescr = TSD2,
3687						   streams        = S2}) ->
3688    validate(fun() -> chk_opt_IndAudTerminationStateDescriptor(TSD1, TSD2) end,
3689	     'IndAudMediaDescriptor'),
3690    validate(fun() -> chk_IndAudMediaDescriptor_streams(S1, S2) end,
3691	     'IndAudMediaDescriptor'),
3692    ok;
3693chk_IndAudMediaDescriptor(IAMD1, IAMD2) ->
3694    wrong_type('IndAudMediaDescriptor', IAMD1, IAMD2).
3695
3696chk_IndAudMediaDescriptor_streams(asn1_NOVALUE, asn1_NOVALUE) ->
3697    ok;
3698chk_IndAudMediaDescriptor_streams({Tag, Val1} = S1,
3699					     {Tag, Val2} = S2) ->
3700    case (is_IndAudMediaDescriptor_streams_tag(Tag) andalso
3701	  is_IndAudMediaDescriptor_streams_val(Tag, Val1) andalso
3702	  is_IndAudMediaDescriptor_streams_val(Tag, Val2)) of
3703	true ->
3704	    chk_IndAudMediaDescriptor_streams_val(Tag, Val1, Val2);
3705	false ->
3706	    wrong_type('IndAudMediaDescriptor_streams', S1, S2)
3707    end;
3708chk_IndAudMediaDescriptor_streams({Tag1, Val1} = S1,
3709					     {Tag2, Val2} = S2) ->
3710    case ((is_IndAudMediaDescriptor_streams_tag(Tag1) andalso
3711	   is_IndAudMediaDescriptor_streams_val(Tag1, Val1)) andalso
3712	  (is_IndAudMediaDescriptor_streams_tag(Tag2) andalso
3713	   is_IndAudMediaDescriptor_streams_val(Tag2, Val2))) of
3714	true ->
3715	    not_equal('IndAudMediaDescriptor_streams', S1, S2);
3716	false ->
3717	    wrong_type('IndAudMediaDescriptor_streams', S1, S2)
3718    end;
3719chk_IndAudMediaDescriptor_streams(S1, S2) ->
3720    wrong_type('IndAudMediaDescriptor_streams', S1, S2).
3721
3722chk_IndAudMediaDescriptor_streams_val(oneStream, Val1, Val2) ->
3723    validate(fun() -> chk_IndAudStreamParms(Val1, Val2) end,
3724	     'IndAudMediaDescriptor_streams');
3725chk_IndAudMediaDescriptor_streams_val(multiStream, Val1, Val2) ->
3726    validate(fun() -> chk_IndAudMediaDescriptor_multiStream(Val1, Val2) end,
3727	     'IndAudMediaDescriptor_streams').
3728
3729chk_IndAudMediaDescriptor_multiStream([], []) ->
3730    ok;
3731chk_IndAudMediaDescriptor_multiStream([] = MS1, MS2) ->
3732    not_equal('IndAudMediaDescriptor_multiStream', MS1, MS2);
3733chk_IndAudMediaDescriptor_multiStream(MS1, [] = MS2) ->
3734    not_equal('IndAudMediaDescriptor_multiStream', MS1, MS2);
3735chk_IndAudMediaDescriptor_multiStream([H|T1], [H|T2]) ->
3736    case is_IndAudStreamDescriptor(H) of
3737	true ->
3738	    chk_IndAudMediaDescriptor_multiStream(T1, T2);
3739	false ->
3740	    wrong_type('IndAudMediaDescriptor_multiStream_val', H)
3741    end;
3742chk_IndAudMediaDescriptor_multiStream([H1|T1], [H2|T2]) ->
3743    validate(fun() -> chk_IndAudStreamDescriptor(H1, H2) end,
3744	     'IndAudMediaDescriptor_multiStream_val'),
3745    chk_IndAudMediaDescriptor_multiStream(T1, T2);
3746chk_IndAudMediaDescriptor_multiStream(MS1, MS2) ->
3747    wrong_type('IndAudMediaDescriptor_multiStream', MS1, MS2).
3748
3749
3750%% -- IndAudStreamDescriptor --
3751
3752is_IndAudStreamDescriptor(#'IndAudStreamDescriptor'{streamID    = SID,
3753						    streamParms = Parms}) ->
3754    is_StreamID(SID) andalso is_IndAudStreamParms(Parms);
3755is_IndAudStreamDescriptor(_) ->
3756    false.
3757
3758chk_IndAudStreamDescriptor(D, D) ->
3759    chk_type(fun is_IndAudStreamDescriptor/1, 'IndAudStreamDescriptor', D);
3760chk_IndAudStreamDescriptor(#'IndAudStreamDescriptor'{streamID    = SID1,
3761						     streamParms = Parms1},
3762			   #'IndAudStreamDescriptor'{streamID    = SID2,
3763						     streamParms = Parms2}) ->
3764    validate(fun() -> chk_StreamID(SID1, SID2) end, 'IndAudStreamDescriptor'),
3765    validate(fun() -> chk_IndAudStreamParms(Parms1, Parms2) end,
3766	     'IndAudStreamDescriptor'),
3767    ok;
3768chk_IndAudStreamDescriptor(D1, D2) ->
3769    wrong_type('IndAudStreamDescriptor', D1, D2).
3770
3771
3772%% -- IndAudStreamParms --
3773
3774is_IndAudStreamParms(#'IndAudStreamParms'{localControlDescriptor = LCD,
3775					  localDescriptor        = LD,
3776					  remoteDescriptor       = RD}) ->
3777    is_opt_IndAudLocalControlDescriptor(LCD) andalso
3778	is_opt_IndAudLocalRemoteDescriptor(LD) andalso
3779	is_opt_IndAudLocalRemoteDescriptor(RD);
3780is_IndAudStreamParms(_) ->
3781    false.
3782
3783chk_IndAudStreamParms(#'IndAudStreamParms'{localControlDescriptor = LCD1,
3784					   localDescriptor        = LD1,
3785					   remoteDescriptor       = RD1},
3786		      #'IndAudStreamParms'{localControlDescriptor = LCD2,
3787					   localDescriptor        = LD2,
3788					   remoteDescriptor       = RD2}) ->
3789    validate(fun() -> chk_opt_IndAudLocalControlDescriptor(LCD1, LCD2) end,
3790	     'IndAudStreamParms'),
3791    validate(fun() -> chk_opt_IndAudLocalRemoteDescriptor(LD1, LD2) end,
3792	     'IndAudStreamParms'),
3793    validate(fun() -> chk_opt_IndAudLocalRemoteDescriptor(RD1, RD2) end,
3794	     'IndAudStreamParms'),
3795    ok;
3796chk_IndAudStreamParms(D1, D2) ->
3797    wrong_type('IndAudStreamParms', D1, D2).
3798
3799
3800%% -- IndAudLocalControlDescriptor --
3801
3802is_opt_IndAudLocalControlDescriptor(asn1_NOVALUE) ->
3803    true;
3804is_opt_IndAudLocalControlDescriptor(D) ->
3805    is_IndAudLocalControlDescriptor(D).
3806
3807is_IndAudLocalControlDescriptor(
3808  #'IndAudLocalControlDescriptor'{streamMode    = SM,
3809				  reserveValue  = RV,
3810				  reserveGroup  = RG,
3811				  propertyParms = PPs}) ->
3812    is_opt_NULL(SM) andalso is_opt_NULL(RV) andalso is_opt_NULL(RG) andalso
3813	is_IndAudLocalControlDescriptor_propertyParms(PPs);
3814is_IndAudLocalControlDescriptor(_) ->
3815    false.
3816
3817is_IndAudLocalControlDescriptor_propertyParms(asn1_NOVALUE) ->
3818    true;
3819is_IndAudLocalControlDescriptor_propertyParms([]) ->
3820    true;
3821is_IndAudLocalControlDescriptor_propertyParms([H|T]) ->
3822    is_IndAudPropertyParm(H) andalso
3823	is_IndAudLocalControlDescriptor_propertyParms(T);
3824is_IndAudLocalControlDescriptor_propertyParms(_) ->
3825    false.
3826
3827chk_opt_IndAudLocalControlDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
3828    ok;
3829chk_opt_IndAudLocalControlDescriptor(
3830  #'IndAudLocalControlDescriptor'{streamMode    = SM1,
3831				  reserveValue  = RV1,
3832				  reserveGroup  = RG1,
3833				  propertyParms = PPs1},
3834  #'IndAudLocalControlDescriptor'{streamMode    = SM2,
3835				  reserveValue  = RV2,
3836				  reserveGroup  = RG2,
3837				  propertyParms = PPs2}) ->
3838    chk_opt_NULL(SM1, SM2),
3839    chk_opt_NULL(RV1, RV2),
3840    chk_opt_NULL(RG1, RG2),
3841    chk_IndAudLocalControlDescriptor_propertyParms(PPs1, PPs2),
3842    ok;
3843chk_opt_IndAudLocalControlDescriptor(D1, D2) ->
3844    wrong_type('IndAudLocalControlDescriptor', D1, D2).
3845
3846chk_IndAudLocalControlDescriptor_propertyParms(asn1_NOVALUE, asn1_NOVALUE) ->
3847    ok;
3848chk_IndAudLocalControlDescriptor_propertyParms([], []) ->
3849    ok;
3850chk_IndAudLocalControlDescriptor_propertyParms([] = PPs1, PPs2) ->
3851    not_equal('IndAudLocalControlDescriptor_propertyParms', PPs1, PPs2);
3852chk_IndAudLocalControlDescriptor_propertyParms(PPs1, [] = PPs2) ->
3853    not_equal('IndAudLocalControlDescriptor_propertyParms', PPs1, PPs2);
3854chk_IndAudLocalControlDescriptor_propertyParms([H|T1], [H|T2]) ->
3855    case is_IndAudPropertyParm(H) of
3856	true ->
3857	    chk_IndAudLocalControlDescriptor_propertyParms(T1, T2);
3858	false ->
3859	    wrong_type('IndAudLocalControlDescriptor_propertyParms_val', H)
3860    end;
3861chk_IndAudLocalControlDescriptor_propertyParms([H1|T1], [H2|T2]) ->
3862    validate(fun() -> chk_IndAudPropertyParm(H1, H2) end,
3863	     'IndAudLocalControlDescriptor_propertyParms_val'),
3864    chk_IndAudLocalControlDescriptor_propertyParms(T1, T2);
3865chk_IndAudLocalControlDescriptor_propertyParms(PPs1, PPs2) ->
3866    wrong_type('IndAudLocalControlDescriptor_propertyParms', PPs1, PPs2).
3867
3868
3869%% -- IndAudPropertyParm --
3870
3871is_IndAudPropertyParm(#'IndAudPropertyParm'{name = Name}) ->
3872    d("is_IndAudPropertyParm -> entry"),
3873    is_PkgdName(Name);
3874is_IndAudPropertyParm(_) ->
3875    false.
3876
3877chk_IndAudPropertyParm(#'IndAudPropertyParm'{name = Name1},
3878		       #'IndAudPropertyParm'{name = Name2}) ->
3879    chk_PkgdName(Name1, Name2),
3880    ok;
3881chk_IndAudPropertyParm(P1, P2) ->
3882    wrong_type('IndAudPropertyParm', P1, P2).
3883
3884
3885%% -- IndAudLocalRemoteDescriptor --
3886
3887is_opt_IndAudLocalRemoteDescriptor(asn1_NOVALUE) ->
3888    true;
3889is_opt_IndAudLocalRemoteDescriptor(D) ->
3890    is_IndAudLocalRemoteDescriptor(D).
3891
3892is_IndAudLocalRemoteDescriptor(
3893  #'IndAudLocalRemoteDescriptor'{propGroupID = ID,
3894				 propGrps    = Grps}) ->
3895    is_IndAudLocalRemoteDescriptor_propGroupID(ID) andalso
3896	is_IndAudPropertyGroup(Grps);
3897is_IndAudLocalRemoteDescriptor(_) ->
3898    false.
3899
3900is_IndAudLocalRemoteDescriptor_propGroupID(asn1_NOVALUE) ->
3901    true;
3902is_IndAudLocalRemoteDescriptor_propGroupID(V) ->
3903    is_INTEGER(V, {range, 0, 65535}).
3904
3905chk_opt_IndAudLocalRemoteDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
3906    ok;
3907chk_opt_IndAudLocalRemoteDescriptor(D1, D2) ->
3908    chk_IndAudLocalRemoteDescriptor(D1, D2).
3909
3910chk_IndAudLocalRemoteDescriptor(D, D) ->
3911    chk_type(fun is_IndAudLocalRemoteDescriptor/1,
3912	     'IndAudLocalRemoteDescriptor', D);
3913chk_IndAudLocalRemoteDescriptor(
3914  #'IndAudLocalRemoteDescriptor'{propGroupID = ID1,
3915				 propGrps    = Grps1},
3916  #'IndAudLocalRemoteDescriptor'{propGroupID = ID2,
3917				 propGrps    = Grps2}) ->
3918    chk_IndAudLocalRemoteDescriptor_propGroupID(ID1, ID2),
3919    chk_IndAudPropertyGroup(Grps1, Grps2),
3920    ok;
3921chk_IndAudLocalRemoteDescriptor(D1, D2) ->
3922    wrong_type('IndAudLocalRemoteDescriptor', D1, D2).
3923
3924chk_IndAudLocalRemoteDescriptor_propGroupID(ID, ID) ->
3925    chk_type(fun is_IndAudLocalRemoteDescriptor_propGroupID/1,
3926	     'IndAudLocalRemoteDescriptor_propGroupID', ID);
3927chk_IndAudLocalRemoteDescriptor_propGroupID(ID1, ID2) ->
3928    case (is_IndAudLocalRemoteDescriptor_propGroupID(ID1) andalso
3929	  is_IndAudLocalRemoteDescriptor_propGroupID(ID2)) of
3930	true ->
3931	    not_equal('IndAudLocalRemoteDescriptor_propGroupID', ID1, ID2);
3932	false ->
3933	    wrong_type('IndAudLocalRemoteDescriptor_propGroupID', ID1, ID2)
3934    end.
3935
3936
3937%% -- IndAudPropertyGroup --
3938
3939is_IndAudPropertyGroup([]) ->
3940    true;
3941is_IndAudPropertyGroup([H|T]) ->
3942    is_IndAudPropertyParm(H) andalso is_IndAudPropertyGroup(T);
3943is_IndAudPropertyGroup(_) ->
3944    false.
3945
3946chk_IndAudPropertyGroup([], []) ->
3947    ok;
3948chk_IndAudPropertyGroup([] = PG1, PG2) ->
3949    not_equal('IndAudPropertyGroup', PG1, PG2);
3950chk_IndAudPropertyGroup(PG1, [] = PG2) ->
3951    not_equal('IndAudPropertyGroup', PG1, PG2);
3952chk_IndAudPropertyGroup([H|T1], [H|T2]) ->
3953    case is_IndAudPropertyParm(H) of
3954	true ->
3955	    chk_IndAudPropertyGroup(T1, T2);
3956	false ->
3957	    wrong_type('IndAudPropertyGroup_val', H)
3958    end;
3959chk_IndAudPropertyGroup([H1|T1], [H2|T2]) ->
3960    validate(fun() -> chk_IndAudPropertyParm(H1, H2) end,
3961	     'IndAudPropertyGroup_val'),
3962    chk_IndAudPropertyGroup(T1, T2);
3963chk_IndAudPropertyGroup(P1, P2) ->
3964    wrong_type('IndAudPropertyGroup', P1, P2).
3965
3966
3967%% -- IndAudTerminationStateDescriptor --
3968
3969is_opt_IndAudTerminationStateDescriptor(asn1_NOVALUE) ->
3970    true;
3971is_opt_IndAudTerminationStateDescriptor(D) ->
3972    is_IndAudTerminationStateDescriptor(D).
3973
3974is_IndAudTerminationStateDescriptor(
3975  #'IndAudTerminationStateDescriptor'{propertyParms      = Parms,
3976				      eventBufferControl = EBC,
3977				      serviceState       = SS}) ->
3978    is_IndAudTerminationStateDescriptor_propertyParms(Parms) andalso
3979	is_opt_NULL(EBC) andalso is_opt_NULL(SS);
3980is_IndAudTerminationStateDescriptor(_) ->
3981    false.
3982
3983is_IndAudTerminationStateDescriptor_propertyParms([]) ->
3984    true;
3985is_IndAudTerminationStateDescriptor_propertyParms([H|T]) ->
3986    is_IndAudPropertyParm(H) andalso
3987	is_IndAudTerminationStateDescriptor_propertyParms(T);
3988is_IndAudTerminationStateDescriptor_propertyParms(_) ->
3989    false.
3990
3991chk_opt_IndAudTerminationStateDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
3992    ok;
3993chk_opt_IndAudTerminationStateDescriptor(D1, D2) ->
3994    chk_IndAudTerminationStateDescriptor(D1, D2).
3995
3996chk_IndAudTerminationStateDescriptor(
3997  #'IndAudTerminationStateDescriptor'{propertyParms      = Parms1,
3998				      eventBufferControl = EBC1,
3999				      serviceState       = SS1},
4000  #'IndAudTerminationStateDescriptor'{propertyParms      = Parms2,
4001				      eventBufferControl = EBC2,
4002				      serviceState       = SS2}) ->
4003    chk_IndAudTerminationStateDescriptor_propertyParms(Parms1, Parms2),
4004    validate(fun() -> chk_opt_NULL(EBC1, EBC2) end,
4005	     'IndAudTerminationStateDescriptor'),
4006    validate(fun() -> chk_opt_NULL(SS1, SS2) end,
4007	     'IndAudTerminationStateDescriptor'),
4008    ok;
4009chk_IndAudTerminationStateDescriptor(D1, D2) ->
4010    wrong_type('IndAudTerminationStateDescriptor', D1, D2).
4011
4012chk_IndAudTerminationStateDescriptor_propertyParms([], []) ->
4013    ok;
4014chk_IndAudTerminationStateDescriptor_propertyParms([] = PP1, PP2) ->
4015    not_equal('IndAudTerminationStateDescriptor_propertyParms', PP1, PP2);
4016chk_IndAudTerminationStateDescriptor_propertyParms(PP1, [] = PP2) ->
4017    not_equal('IndAudTerminationStateDescriptor_propertyParms', PP1, PP2);
4018chk_IndAudTerminationStateDescriptor_propertyParms([H|T1], [H|T2]) ->
4019    case is_IndAudPropertyParm(H) of
4020	true ->
4021	    chk_IndAudTerminationStateDescriptor_propertyParms(T1, T2);
4022	false ->
4023	    wrong_type('IndAudTerminationStateDescriptor_propertyParms', H)
4024    end;
4025chk_IndAudTerminationStateDescriptor_propertyParms([H1|T1], [H2|T2]) ->
4026    validate(fun() -> chk_IndAudPropertyParm(H1, H2) end,
4027	     'IndAudTerminationStateDescriptor_propertyParms'),
4028    chk_IndAudTerminationStateDescriptor_propertyParms(T1, T2);
4029chk_IndAudTerminationStateDescriptor_propertyParms(PP1, PP2) ->
4030    wrong_type('IndAudTerminationStateDescriptor_propertyParms', PP1, PP2).
4031
4032
4033%% -- IndAudEventsDescriptor --
4034
4035is_IndAudEventsDescriptor(#'IndAudEventsDescriptor'{requestID = RID,
4036						    pkgdName  = Name,
4037						    streamID  = SID}) ->
4038    is_opt_RequestID(RID) andalso
4039	is_PkgdName(Name) andalso
4040	is_opt_StreamID(SID);
4041is_IndAudEventsDescriptor(_) ->
4042    false.
4043
4044chk_IndAudEventsDescriptor(#'IndAudEventsDescriptor'{requestID = RID1,
4045						     pkgdName  = Name1,
4046						     streamID  = SID1},
4047			   #'IndAudEventsDescriptor'{requestID = RID2,
4048						     pkgdName  = Name2,
4049						     streamID  = SID2}) ->
4050    chk_opt_RequestID(RID1, RID2),
4051    chk_PkgdName(Name1, Name2),
4052    chk_opt_StreamID(SID1, SID2),
4053    ok;
4054chk_IndAudEventsDescriptor(D1, D2) ->
4055    wrong_type('IndAudEventsDescriptor', D1, D2).
4056
4057
4058%% -- IndAudEventBufferDescriptor --
4059
4060is_IndAudEventBufferDescriptor(
4061  #'IndAudEventBufferDescriptor'{eventName = Name,
4062				 streamID  = SID}) ->
4063    is_PkgdName(Name) andalso is_opt_StreamID(SID);
4064is_IndAudEventBufferDescriptor(_) ->
4065    false.
4066
4067chk_IndAudEventBufferDescriptor(
4068  #'IndAudEventBufferDescriptor'{eventName = Name1,
4069				 streamID  = SID1},
4070  #'IndAudEventBufferDescriptor'{eventName = Name2,
4071				 streamID  = SID2}) ->
4072    chk_PkgdName(Name1, Name2),
4073    chk_opt_StreamID(SID1, SID2),
4074    ok;
4075chk_IndAudEventBufferDescriptor(D1, D2) ->
4076    wrong_type('IndAudEventBufferDescriptor', D1, D2).
4077
4078
4079%% -- IndAudSignalsDescriptor --
4080
4081is_IndAudSignalsDescriptor({Tag, Val}) ->
4082    is_IndAudSignalsDescriptor_tag(Tag) andalso
4083	is_IndAudSignalsDescriptor_val(Tag, Val);
4084is_IndAudSignalsDescriptor(_) ->
4085    false.
4086
4087is_IndAudSignalsDescriptor_tag(Tag) ->
4088    Tags = [signal, seqSigList],
4089    lists:member(Tag, Tags).
4090
4091is_IndAudSignalsDescriptor_val(signal, Val) ->
4092    is_IndAudSignal(Val);
4093is_IndAudSignalsDescriptor_val(seqSigList, Val) ->
4094    is_IndAudSeqSigList(Val).
4095
4096chk_IndAudSignalsDescriptor(D, D) ->
4097    chk_type(fun is_IndAudSignalsDescriptor/1, 'IndAudSignalsDescriptor', D);
4098chk_IndAudSignalsDescriptor({Tag, Val1} = D1, {Tag, Val2} = D2) ->
4099    case (is_IndAudSignalsDescriptor_tag(Tag) andalso
4100	  is_IndAudSignalsDescriptor_val(Tag, Val1) andalso
4101	  is_IndAudSignalsDescriptor_val(Tag, Val2)) of
4102	true ->
4103	    chk_IndAudSignalsDescriptor_val(Tag, Val1, Val2);
4104	false ->
4105	    wrong_type('IndAudSignalsDescriptor', D1, D2)
4106    end;
4107chk_IndAudSignalsDescriptor({Tag1, Val1} = D1, {Tag2, Val2} = D2) ->
4108    case ((is_IndAudSignalsDescriptor_tag(Tag1) andalso
4109	   is_IndAudSignalsDescriptor_val(Tag1, Val1)) andalso
4110	  (is_IndAudSignalsDescriptor_tag(Tag2) andalso
4111	   is_IndAudSignalsDescriptor_val(Tag2, Val2))) of
4112	true ->
4113	    not_equal('IndAudSignalsDescriptor', D1, D2);
4114	false ->
4115	    wrong_type('IndAudSignalsDescriptor', D1, D2)
4116    end;
4117chk_IndAudSignalsDescriptor(D1, D2) ->
4118    wrong_type('IndAudSignalsDescriptor', D1, D2).
4119
4120chk_IndAudSignalsDescriptor_val(signal, Val1, Val2) ->
4121    chk_IndAudSignal(Val1, Val2);
4122chk_IndAudSignalsDescriptor_val(seqSigList, Val1, Val2) ->
4123    chk_IndAudSeqSigList(Val1, Val2).
4124
4125
4126%% -- IndAudSeqSigList --
4127
4128is_IndAudSeqSigList(#'IndAudSeqSigList'{id         = ID,
4129					signalList = SL}) ->
4130    is_IndAudSeqSigList_id(ID) andalso is_opt_IndAudSignal(SL);
4131is_IndAudSeqSigList(_) ->
4132    false.
4133
4134is_IndAudSeqSigList_id(ID) -> is_INTEGER(ID, {range, 0, 65535}).
4135
4136chk_IndAudSeqSigList(L, L) ->
4137    chk_type(fun is_IndAudSeqSigList/1, 'IndAudSeqSigList', L);
4138chk_IndAudSeqSigList(#'IndAudSeqSigList'{id         = ID1,
4139					 signalList = SL1},
4140		     #'IndAudSeqSigList'{id         = ID2,
4141					 signalList = SL2}) ->
4142    chk_IndAudSeqSigList_id(ID1, ID2),
4143    chk_opt_IndAudSignal(SL1, SL2),
4144    ok;
4145chk_IndAudSeqSigList(L1, L2) ->
4146    wrong_type('IndAudSeqSigList', L1, L2).
4147
4148chk_IndAudSeqSigList_id(ID, ID) ->
4149    chk_type(fun is_IndAudSeqSigList_id/1, 'IndAudSeqSigList_id', ID);
4150chk_IndAudSeqSigList_id(ID1, ID2) ->
4151    case (is_IndAudSeqSigList_id(ID1) andalso
4152	  is_IndAudSeqSigList_id(ID2)) of
4153	true ->
4154	    not_equal('IndAudSeqSigList_id', ID1, ID2);
4155	false ->
4156	    wrong_type('IndAudSeqSigList_id', ID1, ID2)
4157    end.
4158
4159
4160%% -- IndAudSignal --
4161
4162is_opt_IndAudSignal(asn1_NOVALUE) ->
4163    true;
4164is_opt_IndAudSignal(V) ->
4165    is_IndAudSignal(V).
4166
4167is_IndAudSignal(#'IndAudSignal'{signalName = Name,
4168				streamID   = SID}) ->
4169    is_PkgdName(Name) andalso is_opt_StreamID(SID);
4170is_IndAudSignal(_) ->
4171    false.
4172
4173chk_opt_IndAudSignal(asn1_NOVALUE, asn1_NOVALUE) ->
4174    ok;
4175chk_opt_IndAudSignal(S1, S2) ->
4176    chk_IndAudSignal(S1, S2).
4177
4178chk_IndAudSignal(S, S) ->
4179    chk_type(fun is_IndAudSignal/1, 'IndAudSignal', S);
4180chk_IndAudSignal(#'IndAudSignal'{signalName = Name1,
4181				 streamID   = SID1},
4182		 #'IndAudSignal'{signalName = Name2,
4183				 streamID   = SID2}) ->
4184    chk_PkgdName(Name1, Name2),
4185    chk_opt_StreamID(SID1, SID2),
4186    ok;
4187chk_IndAudSignal(S1, S2) ->
4188    wrong_type('IndAudSignal', S1, S2).
4189
4190
4191%% -- IndAudDigitMapDescriptor --
4192
4193is_IndAudDigitMapDescriptor(
4194  #'IndAudDigitMapDescriptor'{digitMapName = Name}) ->
4195    is_opt_DigitMapName(Name);
4196is_IndAudDigitMapDescriptor(_) ->
4197    false.
4198
4199chk_IndAudDigitMapDescriptor(D, D) ->
4200    chk_type(fun is_IndAudDigitMapDescriptor/1, 'IndAudDigitMapDescriptor', D);
4201chk_IndAudDigitMapDescriptor(
4202  #'IndAudDigitMapDescriptor'{digitMapName = Name1},
4203  #'IndAudDigitMapDescriptor'{digitMapName = Name2}) ->
4204    validate(fun() -> chk_opt_DigitMapName(Name1, Name2) end,
4205	     'IndAudDigitMapDescriptor'),
4206    ok;
4207chk_IndAudDigitMapDescriptor(D1, D2) ->
4208    wrong_type('IndAudDigitMapDescriptor', D1, D2).
4209
4210
4211%% -- IndAudStatisticsDescriptor --
4212
4213is_IndAudStatisticsDescriptor(
4214  #'IndAudStatisticsDescriptor'{statName = Name}) ->
4215    is_PkgdName(Name);
4216is_IndAudStatisticsDescriptor(_) ->
4217    false.
4218
4219chk_IndAudStatisticsDescriptor(D, D) ->
4220    chk_type(fun is_IndAudStatisticsDescriptor/1,
4221	     'IndAudStatisticsDescriptor', D);
4222chk_IndAudStatisticsDescriptor(
4223  #'IndAudStatisticsDescriptor'{statName = Name1},
4224  #'IndAudStatisticsDescriptor'{statName = Name2}) ->
4225    validate(fun() -> chk_PkgdName(Name1, Name2) end,
4226	     'IndAudStatisticsDescriptor'),
4227    ok;
4228chk_IndAudStatisticsDescriptor(D1, D2) ->
4229    wrong_type('IndAudStatisticsDescriptor', D1, D2).
4230
4231
4232%% -- IndAudPackagesDescriptor --
4233
4234is_IndAudPackagesDescriptor(
4235  #'IndAudPackagesDescriptor'{packageName    = Name,
4236			      packageVersion = Ver}) ->
4237    is_Name(Name) andalso is_IndAudPackagesDescriptor_packageVersion(Ver);
4238is_IndAudPackagesDescriptor(_) ->
4239    false.
4240
4241is_IndAudPackagesDescriptor_packageVersion(V) ->
4242     is_INTEGER(V, {range, 0, 99}).
4243
4244chk_IndAudPackagesDescriptor(
4245  #'IndAudPackagesDescriptor'{packageName    = Name1,
4246			      packageVersion = Ver1},
4247  #'IndAudPackagesDescriptor'{packageName    = Name2,
4248			      packageVersion = Ver2}) ->
4249    validate(fun() -> chk_Name(Name1, Name2) end, 'IndAudPackagesDescriptor'),
4250    chk_IndAudPackagesDescriptor_packageVersion(Ver1, Ver2),
4251    ok;
4252chk_IndAudPackagesDescriptor(D1, D2) ->
4253    wrong_type('IndAudPackagesDescriptor', D1, D2).
4254
4255chk_IndAudPackagesDescriptor_packageVersion(V, V) ->
4256    chk_type(fun is_IndAudPackagesDescriptor_packageVersion/1,
4257	     'IndAudPackagesDescriptor_packageVersion', V);
4258chk_IndAudPackagesDescriptor_packageVersion(V1, V2) ->
4259    case (is_IndAudPackagesDescriptor_packageVersion(V1) andalso
4260	  is_IndAudPackagesDescriptor_packageVersion(V2)) of
4261	true ->
4262	    not_equal('IndAudPackagesDescriptor_packageVersion', V1, V2);
4263	false ->
4264	    wrong_type('IndAudPackagesDescriptor_packageVersion', V1, V2)
4265    end.
4266
4267
4268%% -- NotifyRequest --
4269
4270is_NotifyRequest(#'NotifyRequest'{terminationID            = Tids,
4271				  observedEventsDescriptor = OED,
4272				  errorDescriptor          = ED}) ->
4273    is_TerminationIDList(Tids) andalso
4274	is_ObservedEventsDescriptor(OED) andalso
4275	is_opt_ErrorDescriptor(ED);
4276is_NotifyRequest(_) ->
4277    false.
4278
4279chk_NotifyRequest(#'NotifyRequest'{terminationID            = Tids1,
4280				   observedEventsDescriptor = OED1,
4281				   errorDescriptor          = ED1},
4282		  #'NotifyRequest'{terminationID            = Tids2,
4283				   observedEventsDescriptor = OED2,
4284				   errorDescriptor          = ED2}) ->
4285    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end,
4286	     'NotifyRequest'),
4287    validate(fun() -> chk_ObservedEventsDescriptor(OED1, OED2) end,
4288	     'NotifyRequest'),
4289    validate(fun() -> chk_opt_ErrorDescriptor(ED1, ED2) end,
4290	     'NotifyRequest'),
4291    ok;
4292chk_NotifyRequest(NR1, NR2) ->
4293    wrong_type('NotifyRequest', NR1, NR2).
4294
4295
4296%% -- NotifyReply --
4297
4298is_NotifyReply(#'NotifyReply'{terminationID   = Tids,
4299			      errorDescriptor = ED}) ->
4300    is_TerminationIDList(Tids) andalso is_opt_ErrorDescriptor(ED);
4301is_NotifyReply(_) ->
4302    false.
4303
4304chk_NotifyReply(#'NotifyReply'{terminationID   = Tids1,
4305			       errorDescriptor = ED1},
4306		#'NotifyReply'{terminationID   = Tids2,
4307			       errorDescriptor = ED2}) ->
4308    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end, 'NotifyReply'),
4309    validate(fun() -> chk_opt_ErrorDescriptor(ED1, ED2) end, 'NotifyReply'),
4310    ok;
4311chk_NotifyReply(NR1, NR2) ->
4312    wrong_type('NotifyReply', NR1, NR2).
4313
4314
4315%% -- ObservedEventsDescriptor --
4316
4317is_ObservedEventsDescriptor(
4318  #'ObservedEventsDescriptor'{requestId        = RID,
4319			      observedEventLst = OEL}) ->
4320    is_RequestID(RID) andalso
4321	is_ObservedEventsDescriptor_observedEventLst(OEL);
4322is_ObservedEventsDescriptor(_) ->
4323    false.
4324
4325is_ObservedEventsDescriptor_observedEventLst([]) ->
4326    true;
4327is_ObservedEventsDescriptor_observedEventLst([H|T]) ->
4328    is_ObservedEvent(H) andalso
4329	is_ObservedEventsDescriptor_observedEventLst(T);
4330is_ObservedEventsDescriptor_observedEventLst(_) ->
4331    false.
4332
4333chk_ObservedEventsDescriptor(
4334  #'ObservedEventsDescriptor'{requestId        = RID1,
4335			      observedEventLst = OEL1},
4336  #'ObservedEventsDescriptor'{requestId        = RID2,
4337			      observedEventLst = OEL2}) ->
4338    validate(fun() -> chk_RequestID(RID1, RID2) end,
4339	     'ObservedEventsDescriptor'),
4340    validate(
4341      fun() ->
4342	      chk_ObservedEventsDescriptor_observedEventLst(OEL1, OEL2)
4343      end,
4344      'ObservedEventsDescriptor'),
4345    ok;
4346chk_ObservedEventsDescriptor(D1, D2) ->
4347    wrong_type('ObservedEventsDescriptor', D1, D2).
4348
4349chk_ObservedEventsDescriptor_observedEventLst([], []) ->
4350    ok;
4351chk_ObservedEventsDescriptor_observedEventLst([] = L1, L2) ->
4352    not_equal('ObservedEventsDescriptor_observedEventLst', L1, L2);
4353chk_ObservedEventsDescriptor_observedEventLst(L1, [] = L2) ->
4354    not_equal('ObservedEventsDescriptor_observedEventLst', L1, L2);
4355chk_ObservedEventsDescriptor_observedEventLst([H|T1], [H|T2]) ->
4356    case is_ObservedEvent(H) of
4357	true ->
4358	    chk_ObservedEventsDescriptor_observedEventLst(T1, T2);
4359	false ->
4360	    wrong_type('ObservedEventsDescriptor_observedEventLst_val', H)
4361    end;
4362chk_ObservedEventsDescriptor_observedEventLst([H1|T1], [H2|T2]) ->
4363    validate(fun() -> chk_ObservedEvent(H1, H2) end,
4364	     'ObservedEventsDescriptor_observedEventLst_val'),
4365    chk_ObservedEventsDescriptor_observedEventLst(T1, T2);
4366chk_ObservedEventsDescriptor_observedEventLst(L1, L2) ->
4367    wrong_type('ObservedEventsDescriptor_observedEventLst', L1, L2).
4368
4369
4370%% -- ObservedEvent --
4371
4372is_ObservedEvent(#'ObservedEvent'{eventName    = Name,
4373				  streamID     = SID,
4374				  eventParList = EPL,
4375				  timeNotation = TN}) ->
4376    is_EventName(Name) andalso
4377	is_opt_StreamID(SID) andalso
4378	is_ObservedEvent_eventParList(EPL) andalso
4379	is_opt_TimeNotation(TN);
4380is_ObservedEvent(_) ->
4381    false.
4382
4383is_ObservedEvent_eventParList([]) ->
4384    true;
4385is_ObservedEvent_eventParList([H|T]) ->
4386    is_EventParameter(H) andalso is_ObservedEvent_eventParList(T);
4387is_ObservedEvent_eventParList(_) ->
4388    false.
4389
4390chk_ObservedEvent(E, E) ->
4391    chk_type(fun is_ObservedEvent/1, 'ObservedEvent', E);
4392chk_ObservedEvent(#'ObservedEvent'{eventName    = Name1,
4393				   streamID     = SID1,
4394				   eventParList = EPL1,
4395				   timeNotation = TN1},
4396		  #'ObservedEvent'{eventName    = Name2,
4397				   streamID     = SID2,
4398				   eventParList = EPL2,
4399				   timeNotation = TN2}) ->
4400    validate(fun() -> chk_EventName(Name1, Name2) end, 'ObservedEvent'),
4401    validate(fun() -> chk_opt_StreamID(SID1, SID2) end, 'ObservedEvent'),
4402    chk_ObservedEvent_eventParList(EPL1, EPL2),
4403    validate(fun() -> chk_opt_TimeNotation(TN1, TN2) end, 'ObservedEvent'),
4404    ok;
4405chk_ObservedEvent(E1, E2) ->
4406    wrong_type('ObservedEvent', E1, E2).
4407
4408chk_ObservedEvent_eventParList([], []) ->
4409    ok;
4410chk_ObservedEvent_eventParList([] = EPL1, EPL2) ->
4411    not_equal('ObservedEvent_eventParList', EPL1, EPL2);
4412chk_ObservedEvent_eventParList(EPL1, [] = EPL2) ->
4413    not_equal('ObservedEvent_eventParList', EPL1, EPL2);
4414chk_ObservedEvent_eventParList([H|T1], [H|T2]) ->
4415    case is_EventParameter(H) of
4416	true ->
4417	    chk_ObservedEvent_eventParList(T1, T2);
4418	false ->
4419	    wrong_type('ObservedEvent_eventParList_val', H)
4420    end;
4421chk_ObservedEvent_eventParList([H1|T1], [H2|T2]) ->
4422    validate(fun() -> chk_EventParameter(H1, H2) end,
4423	     'ObservedEvent_eventParList'),
4424    chk_ObservedEvent_eventParList(T1, T2);
4425chk_ObservedEvent_eventParList(L1, L2) ->
4426    wrong_type('ObservedEvent_eventParList', L1, L2).
4427
4428
4429%% -- EventName --
4430
4431is_EventName(N) -> is_PkgdName(N).
4432
4433chk_EventName(N, N) ->
4434    chk_type(fun is_EventName/1, 'EventName', N);
4435chk_EventName(N1, N2) ->
4436    case (is_EventName(N1) andalso is_EventName(N2)) of
4437	true ->
4438	    not_equal('EventName', N1, N2);
4439	false ->
4440	    wrong_type('EventName', N1, N2)
4441    end.
4442
4443
4444%% -- EventParameter --
4445
4446is_EventParameter(#'EventParameter'{eventParameterName = Name,
4447				    value              = Val,
4448				    extraInfo          = EI}) ->
4449    d("is_EventParameter -> entery with"
4450      "~n   Name: ~p"
4451      "~n   Val:  ~p"
4452      "~n   EI:   ~p", [Name, Val, EI]),
4453    is_Name(Name) andalso
4454	is_Value(Val) andalso
4455	is_EventParameter_extraInfo(EI);
4456is_EventParameter(_) ->
4457    false.
4458
4459is_EventParameter_extraInfo(asn1_NOVALUE) ->
4460    true;
4461is_EventParameter_extraInfo({Tag, Val}) ->
4462    is_EventParameter_extraInfo_tag(Tag) andalso
4463	is_EventParameter_extraInfo_val(Tag, Val);
4464is_EventParameter_extraInfo(_) ->
4465    false.
4466
4467is_EventParameter_extraInfo_tag(Tag) ->
4468    Tags = [relation, range, sublist],
4469    lists:member(Tag, Tags).
4470
4471is_EventParameter_extraInfo_val(relation, Val) ->
4472    is_Relation(Val);
4473is_EventParameter_extraInfo_val(range, Val) ->
4474    is_BOOLEAN(Val);
4475is_EventParameter_extraInfo_val(sublist, Val) ->
4476    is_BOOLEAN(Val).
4477
4478chk_EventParameter(#'EventParameter'{eventParameterName = Name1,
4479				     value              = Val1,
4480				     extraInfo          = EI1},
4481		   #'EventParameter'{eventParameterName = Name2,
4482				     value              = Val2,
4483				     extraInfo          = EI2}) ->
4484    validate(fun() -> chk_Name(Name1, Name2) end, 'EventParameter'),
4485    validate(fun() -> chk_Value(Val1, Val2)  end, 'EventParameter'),
4486    chk_EventParameter_extraInfo(EI1, EI2),
4487    ok;
4488chk_EventParameter(P1, P2) ->
4489    wrong_type('EventParameter', P1, P2).
4490
4491chk_EventParameter_extraInfo(asn1_NOVALUE, asn1_NOVALUE) ->
4492    ok;
4493chk_EventParameter_extraInfo(EI, EI) ->
4494    chk_type(fun is_EventParameter_extraInfo/1,
4495	     'EventParameter_extraInfo', EI);
4496chk_EventParameter_extraInfo({Tag, Val1} = EI1, {Tag, Val2} = EI2) ->
4497    case (is_EventParameter_extraInfo_tag(Tag) andalso
4498	  is_EventParameter_extraInfo_val(Tag, Val1) andalso
4499	  is_EventParameter_extraInfo_val(Tag, Val2)) of
4500	true ->
4501	    chk_EventParameter_extraInfo_val(Tag, Val1, Val2);
4502	false ->
4503	    wrong_type('EventParameter_extraInfo', EI1, EI2)
4504    end;
4505chk_EventParameter_extraInfo({Tag1, Val1} = EI1, {Tag2, Val2} = EI2) ->
4506    case ((is_EventParameter_extraInfo_tag(Tag1) andalso
4507	   is_EventParameter_extraInfo_val(Tag1, Val1)) andalso
4508	  (is_EventParameter_extraInfo_tag(Tag2) andalso
4509	   is_EventParameter_extraInfo_val(Tag2, Val2))) of
4510	true ->
4511	    not_equal('EventParameter_extraInfo', EI1, EI2);
4512	false ->
4513	    wrong_type('EventParameter_extraInfo', EI1, EI2)
4514    end;
4515chk_EventParameter_extraInfo(EI1, EI2) ->
4516    wrong_type('EventParameter_extraInfo', EI1, EI2).
4517
4518chk_EventParameter_extraInfo_val(relation, Val1, Val2) ->
4519    validate(fun() -> chk_Relation(Val1, Val2) end,
4520	     'EventParameter_extraInfo_val');
4521chk_EventParameter_extraInfo_val(range, Val1, Val2) ->
4522    validate(fun() -> chk_BOOLEAN(Val1, Val2) end,
4523	     'EventParameter_extraInfo_val');
4524chk_EventParameter_extraInfo_val(sublist, Val1, Val2) ->
4525    validate(fun() -> chk_BOOLEAN(Val1, Val2) end,
4526	     'EventParameter_extraInfo_val').
4527
4528
4529%% -- ServiceChangeRequest --
4530
4531is_ServiceChangeRequest(#'ServiceChangeRequest'{terminationID      = Tids,
4532						serviceChangeParms = Parms}) ->
4533    is_TerminationIDList(Tids) andalso is_ServiceChangeParm(Parms);
4534is_ServiceChangeRequest(_) ->
4535    false.
4536
4537chk_ServiceChangeRequest(R, R) ->
4538    chk_type(fun is_ServiceChangeRequest/1, 'ServiceChangeRequest', R);
4539chk_ServiceChangeRequest(
4540  #'ServiceChangeRequest'{terminationID      = Tids1,
4541			  serviceChangeParms = Parms1},
4542  #'ServiceChangeRequest'{terminationID      = Tids2,
4543			  serviceChangeParms = Parms2}) ->
4544    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end,
4545	     'ServiceChangeRequest'),
4546    validate(fun() -> chk_ServiceChangeParm(Parms1, Parms2) end,
4547	     'ServiceChangeRequest'),
4548    ok;
4549chk_ServiceChangeRequest(R1, R2) ->
4550    wrong_type('ServiceChangeRequest', R1, R2).
4551
4552
4553%% -- ServiceChangeReply --
4554
4555is_ServiceChangeReply(#'ServiceChangeReply'{terminationID       = Tids,
4556					    serviceChangeResult = Res}) ->
4557    is_TerminationIDList(Tids) andalso is_ServiceChangeResult(Res);
4558is_ServiceChangeReply(_) ->
4559    false.
4560
4561chk_ServiceChangeReply(R, R) ->
4562    chk_type(fun is_ServiceChangeReply/1, 'ServiceChangeReply', R);
4563chk_ServiceChangeReply(
4564  #'ServiceChangeReply'{terminationID       = Tids1,
4565			serviceChangeResult = Res1},
4566  #'ServiceChangeReply'{terminationID       = Tids2,
4567			serviceChangeResult = Res2}) ->
4568    validate(fun() -> chk_TerminationIDList(Tids1, Tids2) end,
4569	     'ServiceChangeReply'),
4570    validate(fun() -> chk_ServiceChangeResult(Res1, Res2) end,
4571	     'ServiceChangeReply'),
4572    ok;
4573chk_ServiceChangeReply(R1, R2) ->
4574    wrong_type('ServiceChangeReply', R1, R2).
4575
4576
4577%% -- ServiceChangeResult --
4578
4579is_ServiceChangeResult({Tag, Val}) ->
4580    is_ServiceChangeResult_tag(Tag) andalso
4581	is_ServiceChangeResult_val(Tag, Val);
4582is_ServiceChangeResult(_) ->
4583    false.
4584
4585is_ServiceChangeResult_tag(Tag) ->
4586    Tags = [errorDescriptor, serviceChangeResParms],
4587    lists:member(Tag, Tags).
4588
4589is_ServiceChangeResult_val(errorDescriptor, Val) ->
4590    is_ErrorDescriptor(Val);
4591is_ServiceChangeResult_val(serviceChangeResParms, Val) ->
4592    is_ServiceChangeResParm(Val).
4593
4594chk_ServiceChangeResult(Res, Res) ->
4595    chk_type(fun is_ServiceChangeResult/1, 'ServiceChangeResult', Res);
4596chk_ServiceChangeResult({Tag, Val1} = Res1, {Tag, Val2} = Res2) ->
4597    case (is_ServiceChangeResult_tag(Tag) andalso
4598	  is_ServiceChangeResult_val(Tag, Val1) andalso
4599	  is_ServiceChangeResult_val(Tag, Val2)) of
4600	true ->
4601	    chk_ServiceChangeResult_val(Tag, Val1, Val2);
4602	false ->
4603	    wrong_type('ServiceChangeResult', Res1, Res2)
4604    end;
4605chk_ServiceChangeResult({Tag1, Val1} = Res1, {Tag2, Val2} = Res2) ->
4606    case ((is_ServiceChangeResult_tag(Tag1) andalso
4607	   is_ServiceChangeResult_val(Tag1, Val1)) andalso
4608	  (is_ServiceChangeResult_tag(Tag2) andalso
4609	   is_ServiceChangeResult_val(Tag2, Val2))) of
4610	true ->
4611	    not_equal('ServiceChangeResult', Res1, Res2);
4612	false ->
4613	    wrong_type('ServiceChangeResult', Res1, Res2)
4614    end;
4615chk_ServiceChangeResult(Res1, Res2) ->
4616    wrong_type('ServiceChangeResult', Res1, Res2).
4617
4618chk_ServiceChangeResult_val(errorDescriptor, Val1, Val2) ->
4619    validate(fun() -> chk_ErrorDescriptor(Val1, Val2) end,
4620	     'ServiceChangeResult');
4621chk_ServiceChangeResult_val(serviceChangeResParms, Val1, Val2) ->
4622    validate(fun() -> chk_ServiceChangeResParm(Val1, Val2) end,
4623	     'ServiceChangeResult').
4624
4625
4626%% -- WildcardField --
4627
4628is_WildcardField(WF) -> is_OCTET_STRING(WF, {exact, 1}).
4629
4630chk_WildcardField(WF, WF) ->
4631    case is_WildcardField(WF) of
4632	true ->
4633	    ok;
4634	false ->
4635	    wrong_type('WildcardField', WF)
4636    end;
4637chk_WildcardField(WF1, WF2) ->
4638    case (is_WildcardField(WF1) andalso is_WildcardField(WF2)) of
4639	true ->
4640	    not_equal('WildcardField', WF1, WF2);
4641	false ->
4642	    wrong_type('WildcardField', WF1, WF2)
4643    end.
4644
4645
4646%% -- TerminationID --
4647
4648is_TerminationID(#'TerminationID'{wildcard = W,
4649				  id       = ID}) ->
4650    is_TerminationID_wildcard(W) andalso is_TerminationID_id(ID);
4651is_TerminationID(#megaco_term_id{contains_wildcards = _W,
4652				 id                 = _ID}) ->
4653    true; % What are the types?
4654is_TerminationID(_) ->
4655    false.
4656
4657is_TerminationID_wildcard([]) ->
4658    true;
4659is_TerminationID_wildcard([H|T]) ->
4660    is_WildcardField(H) andalso is_TerminationID_wildcard(T);
4661is_TerminationID_wildcard(_) ->
4662    false.
4663
4664is_TerminationID_id(ID) -> is_OCTET_STRING(ID, {range, 1, 8}).
4665
4666chk_TerminationID(Id,Id) ->
4667    chk_type(fun is_TerminationID/1, 'TerminationID', Id);
4668chk_TerminationID(#'TerminationID'{wildcard = W1,
4669                                   id       = I1},
4670                  #'TerminationID'{wildcard = W2,
4671                                   id       = I2}) ->
4672    chk_TerminationID_wildcard(W1, W2),
4673    chk_TerminationID_id(I1, I2),
4674    ok;
4675chk_TerminationID(#megaco_term_id{contains_wildcards = W1,
4676                                  id                 = I1},
4677                  #megaco_term_id{contains_wildcards = W2,
4678                                  id                 = I2}) ->
4679    chk_TerminationID_wildcard(W1, W2),
4680    chk_TerminationID_id(I1, I2),
4681    ok;
4682chk_TerminationID(Tid1, Tid2) ->
4683    wrong_type('TerminationID', Tid1, Tid2).
4684
4685chk_TerminationID_wildcard([], []) ->
4686    ok;
4687chk_TerminationID_wildcard([] = WF1, WF2) ->
4688    not_equal('TerminationID_wildcard', WF1, WF2);
4689chk_TerminationID_wildcard(WF1, [] = WF2) ->
4690    not_equal('TerminationID_wildcard', WF1, WF2);
4691chk_TerminationID_wildcard([H|T1], [H|T2]) ->
4692    case is_WildcardField(H) of
4693	true ->
4694	    chk_TerminationID_wildcard(T1, T2);
4695	false ->
4696	    wrong_type('TerminationID_wildcard_val', H)
4697    end;
4698chk_TerminationID_wildcard([H1|T1], [H2|T2]) ->
4699    validate(fun() -> chk_WildcardField(H1, H2) end,
4700	     'TerminationID_wildcard_val'),
4701    chk_TerminationID_wildcard(T1, T2);
4702chk_TerminationID_wildcard(WF1,WF2) ->
4703    not_equal('TerminationId_wildcard', WF1, WF2).
4704
4705chk_TerminationID_id(Id, Id) ->
4706    case is_OCTET_STRING(Id, {range, 1, 8}) of
4707	true ->
4708	    ok;
4709	false ->
4710	    wrong_type('TerminationID_id', Id, Id)
4711    end;
4712chk_TerminationID_id(Id1, Id2) ->
4713    not_equal(terminationId_id, Id1, Id2).
4714
4715
4716%% -- TerminationIDList --
4717
4718is_TerminationIDList([]) ->
4719    true;
4720is_TerminationIDList([H|T]) ->
4721    is_TerminationID(H) andalso is_TerminationIDList(T);
4722is_TerminationIDList(_) ->
4723    false.
4724
4725chk_TerminationIDList([], []) ->
4726    ok;
4727chk_TerminationIDList([] = L1, L2) ->
4728    not_equal('TerminationIDList', L1, L2);
4729chk_TerminationIDList(L1, [] = L2) ->
4730    not_equal('TerminationIDList', L1, L2);
4731chk_TerminationIDList([H|T1], [H|T2]) ->
4732    case is_TerminationID(H) of
4733	true ->
4734	    chk_TerminationIDList(T1, T2);
4735	false ->
4736	    wrong_type('TerminationIDList', H)
4737    end;
4738chk_TerminationIDList([H1|T1], [H2|T2]) ->
4739    validate(fun() -> chk_TerminationID(H1, H2) end, 'TerminationIDList'),
4740    chk_TerminationIDList(T1, T2);
4741chk_TerminationIDList(L1, L2) ->
4742    wrong_type('TerminationIDList', L1, L2).
4743
4744
4745%% -- MediaDescriptor --
4746
4747is_MediaDescriptor(#'MediaDescriptor'{termStateDescr = TSD,
4748				      streams        = S}) ->
4749    d("is_MediaDescriptor -> entry with"
4750      "~n   TSD: ~p"
4751      "~n   S:   ~p", [TSD, S]),
4752    is_opt_TerminationStateDescriptor(TSD) andalso
4753	is_MediaDescriptor_streams(S);
4754is_MediaDescriptor(_) ->
4755    false.
4756
4757is_MediaDescriptor_streams(asn1_NOVALUE) ->
4758    true;
4759is_MediaDescriptor_streams({Tag, Val}) ->
4760    is_MediaDescriptor_streams_tag(Tag) andalso
4761	is_MediaDescriptor_streams_val(Tag, Val);
4762is_MediaDescriptor_streams(_) ->
4763    false.
4764
4765is_MediaDescriptor_streams_tag(Tag) ->
4766    Tags = [oneStream, multiStream],
4767    lists:member(Tag, Tags).
4768
4769is_MediaDescriptor_streams_val(oneStream, SP) ->
4770    is_StreamParms(SP);
4771is_MediaDescriptor_streams_val(multiStream, SDL) ->
4772    is_MediaDescriptor_multiStream(SDL).
4773
4774is_MediaDescriptor_multiStream([]) ->
4775    true;
4776is_MediaDescriptor_multiStream([H|T]) ->
4777    is_StreamDescriptor(H) andalso is_MediaDescriptor_multiStream(T);
4778is_MediaDescriptor_multiStream(_) ->
4779    false.
4780
4781chk_MediaDescriptor(D, D) ->
4782    chk_type(fun is_MediaDescriptor/1, 'MediaDescriptor', D);
4783chk_MediaDescriptor(#'MediaDescriptor'{termStateDescr = TSD1,
4784				       streams        = S1},
4785		    #'MediaDescriptor'{termStateDescr = TSD2,
4786				       streams        = S2}) ->
4787    validate(
4788      fun() ->
4789	      chk_opt_TerminationStateDescriptor(TSD1, TSD2)
4790      end,
4791      'MediaDescriptor'),
4792    validate(
4793      fun() ->
4794	      chk_MediaDescriptor_streams(S1, S2)
4795      end,
4796      'MediaDescriptor'),
4797    ok;
4798chk_MediaDescriptor(D1, D2) ->
4799    wrong_type('MediaDescriptor', D1, D2).
4800
4801
4802chk_MediaDescriptor_streams(asn1_NOVALUE, asn1_NOVALUE) ->
4803    ok;
4804chk_MediaDescriptor_streams({oneStream, SP1}, {oneStream, SP2}) ->
4805    validate(fun() ->
4806		     chk_StreamParms(SP1, SP2)
4807	     end,
4808	     'MediaDescriptor_streams');
4809chk_MediaDescriptor_streams({multiStream, SDs1}, {multiStream, SDs2}) ->
4810    validate(fun() ->
4811		     chk_MediaDescriptor_multiStream(SDs1, SDs2)
4812	     end,
4813	     'MediaDescriptor_streams');
4814chk_MediaDescriptor_streams(S1, S2) ->
4815    wrong_type('MediaDescriptor_streams', S1, S2).
4816
4817chk_MediaDescriptor_multiStream([], []) ->
4818    ok;
4819chk_MediaDescriptor_multiStream([] = MS1, MS2) ->
4820    not_equal('MediaDescriptor_multiStream', MS1, MS2);
4821chk_MediaDescriptor_multiStream(MS1, [] = MS2) ->
4822    not_equal('MediaDescriptor_multiStream', MS1, MS2);
4823chk_MediaDescriptor_multiStream([H|T1], [H|T2]) ->
4824    case is_StreamDescriptor(H) of
4825	true ->
4826	    chk_MediaDescriptor_multiStream(T1, T2);
4827	false ->
4828	    wrong_type('MediaDescriptor_multiStream_val', H)
4829    end;
4830chk_MediaDescriptor_multiStream([H1|T1], [H2|T2]) ->
4831    validate(fun() -> chk_StreamDescriptor(H1, H2) end,
4832	     'MediaDescriptor_multiStream_val'),
4833    chk_MediaDescriptor_multiStream(T1, T2);
4834chk_MediaDescriptor_multiStream(MS1, MS2) ->
4835    wrong_type('MediaDescriptor_multiStream_val', MS1, MS2).
4836
4837
4838%% -- StreamDescriptor --
4839
4840is_StreamDescriptor(#'StreamDescriptor'{streamID    = SID,
4841					streamParms = Parms}) ->
4842    d("is_StreamDescriptor -> entry with"
4843      "~n   SID:   ~p"
4844      "~n   Parms: ~p", [SID, Parms]),
4845    is_StreamID(SID) andalso is_StreamParms(Parms);
4846is_StreamDescriptor(X) ->
4847    d("is_StreamDescriptor -> entry when ERROR with"
4848      "~n   X: ~p", [X]),
4849    false.
4850
4851chk_StreamDescriptor(D, D) ->
4852    chk_type(fun is_StreamDescriptor/1, 'StreamDescriptor', D);
4853chk_StreamDescriptor(#'StreamDescriptor'{streamID    = SID1,
4854					 streamParms = Parms1},
4855		     #'StreamDescriptor'{streamID    = SID2,
4856					 streamParms = Parms2}) ->
4857    validate(fun() -> chk_StreamID(SID1, SID2) end, 'StreamDescriptor'),
4858    validate(fun() -> chk_StreamParms(Parms1, Parms2) end, 'StreamDescriptor'),
4859    ok;
4860chk_StreamDescriptor(D1, D2) ->
4861    wrong_type('StreamDescriptor', D1, D2).
4862
4863
4864%% -- StreamParms --
4865
4866is_StreamParms(#'StreamParms'{localControlDescriptor = LCD,
4867			      localDescriptor        = LD,
4868			      remoteDescriptor       = RD,
4869			      statisticsDescriptor   = SD}) ->
4870    d("is_StreamParms -> entry with"
4871      "~n   LCD: ~p"
4872      "~n   LD:  ~p"
4873      "~n   RD:  ~p"
4874      "~n   SD:  ~p", [LCD, LD, RD, SD]),
4875    is_opt_LocalControlDescriptor(LCD) andalso
4876	is_opt_LocalRemoteDescriptor(LD) andalso
4877	is_opt_LocalRemoteDescriptor(RD) andalso
4878	is_opt_StatisticsDescriptor(SD);
4879is_StreamParms(X) ->
4880    d("is_StreamParms -> entry when ERROR with"
4881      "~n   X: ~p", [X]),
4882    false.
4883
4884chk_StreamParms(SP, SP) ->
4885    chk_type(fun is_StreamParms/1, 'StreamParms', SP);
4886chk_StreamParms(#'StreamParms'{localControlDescriptor = LCD1,
4887			       localDescriptor        = LD1,
4888			       remoteDescriptor       = RD1,
4889			       statisticsDescriptor   = SD1},
4890		#'StreamParms'{localControlDescriptor = LCD2,
4891			       localDescriptor        = LD2,
4892			       remoteDescriptor       = RD2,
4893			       statisticsDescriptor   = SD2}) ->
4894    validate(fun() -> chk_opt_LocalControlDescriptor(LCD1, LCD2) end,
4895	     'StreamParms_localControlDescriptor'),
4896    validate(fun() -> chk_opt_LocalRemoteDescriptor(LD1, LD2) end,
4897	     'StreamParms_localDescriptor'),
4898    validate(fun() -> chk_opt_LocalRemoteDescriptor(RD1, RD2) end,
4899	     'StreamParms_remoteDescriptor'),
4900    validate(fun() -> chk_opt_StatisticsDescriptor(SD1, SD2) end,
4901	     'StreamParms_statisticsDescriptor'),
4902    ok;
4903chk_StreamParms(P1, P2) ->
4904    wrong_type('StreamParms', P1, P2).
4905
4906
4907%% -- LocalControlDescriptor --
4908
4909is_opt_LocalControlDescriptor(D) ->
4910    d("is_opt_LocalControlDescriptor -> entry"),
4911    is_OPTIONAL(fun is_LocalControlDescriptor/1, D).
4912
4913is_LocalControlDescriptor(#'LocalControlDescriptor'{streamMode    = SM,
4914						    reserveValue  = RV,
4915						    reserveGroup  = RG,
4916						    propertyParms = PP}) ->
4917    d("is_LocalControlDescriptor -> entry with"
4918      "~n   SM: ~p"
4919      "~n   RV: ~p"
4920      "~n   RG: ~p"
4921      "~n   PP: ~p", [SM, RV, RG, PP]),
4922    is_opt_StreamMode(SM) andalso
4923	is_opt_BOOLEAN(RV) andalso
4924	is_opt_BOOLEAN(RG) andalso
4925	is_LocalControlDescriptor_propertyParms(PP);
4926is_LocalControlDescriptor(_) ->
4927    false.
4928
4929is_LocalControlDescriptor_propertyParms([]) ->
4930    d("is_LocalControlDescriptor_propertyParms -> entry when done"),
4931    true;
4932is_LocalControlDescriptor_propertyParms([H|T]) ->
4933    d("is_LocalControlDescriptor_propertyParms -> entry with"
4934      "~n   H: ~p"
4935      "~n   T: ~p", [H, T]),
4936    is_PropertyParm(H) andalso is_LocalControlDescriptor_propertyParms(T);
4937is_LocalControlDescriptor_propertyParms(_) ->
4938    false.
4939
4940chk_opt_LocalControlDescriptor(LCD1, LCD2) ->
4941    chk_OPTIONAL('LocalControlDescriptor', LCD1, LCD2,
4942		 fun is_LocalControlDescriptor/1,
4943		 fun chk_LocalControlDescriptor/2).
4944
4945chk_LocalControlDescriptor(LCD, LCD) ->
4946    chk_type(fun is_LocalControlDescriptor/1, 'LocalControlDescriptor', LCD);
4947chk_LocalControlDescriptor(#'LocalControlDescriptor'{streamMode    = SM1,
4948						     reserveValue  = RV1,
4949						     reserveGroup  = RG1,
4950						     propertyParms = PP1},
4951			   #'LocalControlDescriptor'{streamMode    = SM2,
4952						     reserveValue  = RV2,
4953						     reserveGroup  = RG2,
4954						     propertyParms = PP2}) ->
4955    validate(
4956      fun() -> chk_opt_StreamMode(SM1, SM2) end,
4957      'LocalControlDescriptor'),
4958    validate(
4959      fun() -> chk_opt_BOOLEAN(RV1, RV2) end,
4960      'LocalControlDescriptor_reserveValue'),
4961    validate(
4962      fun() -> chk_opt_BOOLEAN(RG1, RG2) end,
4963      'LocalControlDescriptor_reserveGroup'),
4964    chk_LocalControlDescriptor_propertyParms(PP1, PP2),
4965    ok;
4966chk_LocalControlDescriptor(LCD1, LCD2) ->
4967    wrong_type('LocalControlDescriptor', LCD1, LCD2).
4968
4969
4970chk_LocalControlDescriptor_propertyParms([], []) ->
4971    ok;
4972chk_LocalControlDescriptor_propertyParms([] = PP1, PP2) ->
4973    not_equal('LocalControlDescriptor_propertyParms', PP1, PP2);
4974chk_LocalControlDescriptor_propertyParms(PP1, [] = PP2) ->
4975    not_equal('LocalControlDescriptor_propertyParms', PP1, PP2);
4976chk_LocalControlDescriptor_propertyParms([H|T1], [H|T2]) ->
4977    case is_PropertyParm(H) of
4978	true ->
4979	    chk_LocalControlDescriptor_propertyParms(T1, T2);
4980	false ->
4981	    wrong_type('LocalControlDescriptor_propertyParms_val', H)
4982    end;
4983chk_LocalControlDescriptor_propertyParms([H1|T1], [H2|T2]) ->
4984    validate(fun() -> chk_PropertyParm(H1, H2) end,
4985	     'LocalControlDescriptor_propertyParms_val'),
4986    chk_LocalControlDescriptor_propertyParms(T1, T2);
4987chk_LocalControlDescriptor_propertyParms(PP1, PP2) ->
4988    wrong_type('LocalControlDescriptor_propertyParms', PP1, PP2).
4989
4990
4991%% -- StreamMode --
4992
4993is_opt_StreamMode(asn1_NOVALUE) ->
4994    true;
4995is_opt_StreamMode(SM) ->
4996    is_StreamMode(SM).
4997
4998is_StreamMode(SM) ->
4999    lists:member(SM, [sendOnly, recvOnly, sendRecv, inactive, loopBack]).
5000
5001chk_opt_StreamMode(asn1_NOVALUE, asn1_NOVALUE) ->
5002    ok;
5003chk_opt_StreamMode(SM1, SM2) ->
5004    chk_StreamMode(SM1, SM2).
5005
5006chk_StreamMode(SM, SM) ->
5007    chk_type(fun is_StreamMode/1, 'StreamMode', SM);
5008chk_StreamMode(SM1, SM2) ->
5009    case (is_StreamMode(SM1) andalso is_StreamMode(SM2)) of
5010	true ->
5011	    not_equal('StreamMode', SM1, SM2);
5012	false ->
5013	    wrong_type('StreamMode', SM1, SM2)
5014    end.
5015
5016
5017%% -- PropertyParm --
5018
5019is_PropertyParm(#'PropertyParm'{name      = N,
5020				value     = V,
5021				extraInfo = I}) ->
5022    d("is_PropertyParm -> entry with"
5023      "~n   N: ~p"
5024      "~n   V: ~p"
5025      "~n   I: ~p", [N, V, I]),
5026    is_PkgdName(N) andalso
5027	is_PropertyParm_value(V) andalso
5028	is_PropertyParm_extraInfo(I);
5029is_PropertyParm(_) ->
5030    false.
5031
5032is_PropertyParm_value([]) ->
5033    d("is_PropertyParm_value -> entry when done"),
5034    true;
5035is_PropertyParm_value([H|T]) ->
5036    d("is_PropertyParm_value -> entry with"
5037      "~n   H: ~p", [H]),
5038    is_OCTET_STRING(H) andalso is_PropertyParm_value(T);
5039is_PropertyParm_value(_) ->
5040    false.
5041
5042is_PropertyParm_extraInfo(asn1_NOVALUE) ->
5043    true;
5044is_PropertyParm_extraInfo({Tag, Val}) ->
5045    d("is_PropertyParm_extraInfo -> entry with"
5046      "~n   Tag: ~p"
5047      "~n   Val: ~p", [Tag, Val]),
5048    is_PropertyParm_extraInfo_tag(Tag) andalso
5049	is_PropertyParm_extraInfo_val(Tag, Val);
5050is_PropertyParm_extraInfo(_) ->
5051    false.
5052
5053is_PropertyParm_extraInfo_tag(Tag) ->
5054    Tags = [relation, range, sublist],
5055    lists:member(Tag, Tags).
5056
5057is_PropertyParm_extraInfo_val(relation, Val) ->
5058    is_Relation(Val);
5059is_PropertyParm_extraInfo_val(range, Val) ->
5060    is_BOOLEAN(Val);
5061is_PropertyParm_extraInfo_val(sublist, Val) ->
5062    is_BOOLEAN(Val).
5063
5064chk_PropertyParm(P, P) ->
5065    chk_type(fun is_PropertyParm/1, 'PropertyParm', P);
5066chk_PropertyParm(#'PropertyParm'{name      = N1,
5067				 value     = V1,
5068				 extraInfo = I1},
5069		 #'PropertyParm'{name      = N2,
5070				 value     = V2,
5071				 extraInfo = I2}) ->
5072    validate(fun() -> chk_PkgdName(N1, N2) end, 'PropertyParm'),
5073    chk_PropertyParm_value(V1, V2),
5074    chk_PropertyParm_extraInfo(I1, I2),
5075    ok;
5076chk_PropertyParm(P1, P2) ->
5077    wrong_type('PropertyParm', P1, P2).
5078
5079chk_PropertyParm_value([], []) ->
5080    ok;
5081chk_PropertyParm_value([] = V1, V2) ->
5082    not_equal('PropertyParm_value', V1, V2);
5083chk_PropertyParm_value(V1, [] = V2) ->
5084    not_equal('PropertyParm_value', V1, V2);
5085chk_PropertyParm_value([H|T1], [H|T2]) ->
5086    case is_OCTET_STRING(H) of
5087	true ->
5088	    chk_PropertyParm_value(T1, T2);
5089	false ->
5090	    wrong_type('PropertyParm_value_val', H)
5091    end;
5092chk_PropertyParm_value([H1|_], [H2|_]) ->
5093    case (is_OCTET_STRING(H1) andalso is_OCTET_STRING(H2)) of
5094	true ->
5095	    not_equal('PropertyParm_value_val', H1, H2);
5096	false ->
5097	    wrong_type('PropertyParm_value_val', H1, H2)
5098    end;
5099chk_PropertyParm_value(V1, V2) ->
5100    wrong_type('PropertyParm_value', V1, V2).
5101
5102chk_PropertyParm_extraInfo(EI, EI) ->
5103    chk_type(fun is_PropertyParm_extraInfo/1, 'PropertyParm_extraInfo', EI);
5104chk_PropertyParm_extraInfo({Tag, Val1} = EI1, {Tag, Val2} = EI2) ->
5105    case (is_PropertyParm_extraInfo_tag(Tag) and
5106	  is_PropertyParm_extraInfo_val(Tag, Val1) and
5107	  is_PropertyParm_extraInfo_val(Tag, Val2)) of
5108	true ->
5109	    chk_PropertyParm_extraInfo_val(Tag, Val1, Val2);
5110	false ->
5111	    wrong_type('PropertyParm_extraInfo', EI1, EI2)
5112    end;
5113chk_PropertyParm_extraInfo({Tag1, Val1} = EI1, {Tag2, Val2} = EI2) ->
5114    case ((is_PropertyParm_extraInfo_tag(Tag1) and
5115	   is_PropertyParm_extraInfo_val(Tag1, Val1)) and
5116	  (is_PropertyParm_extraInfo_tag(Tag2) and
5117	   is_PropertyParm_extraInfo_val(Tag2, Val2))) of
5118	true ->
5119	    not_equal('PropertyParm_extraInfo', EI1, EI2);
5120	false ->
5121	    wrong_type('PropertyParm_extraInfo', EI1, EI2)
5122    end;
5123chk_PropertyParm_extraInfo(EI1, EI2) ->
5124    wrong_type('PropertyParm_extraInfo', EI1, EI2).
5125
5126chk_PropertyParm_extraInfo_val(relation, Val1, Val2) ->
5127    validate(fun() -> chk_Relation(Val1, Val2) end, 'PropertyParm_extraInfo');
5128chk_PropertyParm_extraInfo_val(range, Val1, Val2) ->
5129    validate(fun() -> chk_BOOLEAN(Val1, Val2) end, 'PropertyParm_extraInfo');
5130chk_PropertyParm_extraInfo_val(sublist, Val1, Val2) ->
5131    validate(fun() -> chk_BOOLEAN(Val1, Val2) end, 'PropertyParm_extraInfo').
5132
5133
5134%% -- Name --
5135
5136is_Name(N) ->
5137    %% Binary: is_OCTET_STRING(N, {exact, 2}).
5138    case is_OCTET_STRING(N, {range, 1, 64}) of
5139	true ->
5140	    is_NAME(N);
5141	false ->
5142	    false
5143    end.
5144
5145is_NAME([H|T]) when H =< $z, $a =< H ->
5146    is_NAME2(T);
5147is_NAME([H|T]) when H =< $Z, $A =< H ->
5148    is_NAME2(T);
5149is_NAME(_) ->
5150    false.
5151
5152is_NAME2([]) ->
5153    true;
5154is_NAME2([$_|T]) ->
5155    is_NAME2(T);
5156is_NAME2([H|T]) when H =< $z, $a =< H ->
5157    is_NAME2(T);
5158is_NAME2([H|T]) when H =< $Z, $A =< H ->
5159    is_NAME2(T);
5160is_NAME2([H|T]) when H =< $9, $0 =< H ->
5161    is_NAME2(T);
5162is_NAME2(_) ->
5163    false.
5164
5165
5166
5167chk_Name(N, N) ->
5168    chk_type(fun is_Name/1, 'Name', N);
5169chk_Name(N1, N2) ->
5170    case (is_Name(N1) andalso is_Name(N2)) of
5171	true ->
5172	    not_equal('Name', N1, N2);
5173	false ->
5174	    wrong_type('Name', N1, N2)
5175    end.
5176
5177
5178%% -- PkgdName --
5179
5180%% PkgdName is either "AB/CD" or just plain "ABCD"
5181%% Note that in ASN.1 the parts is exactly 2 char
5182%% each, unless you don't use the native config
5183%% option. In text and in binary without the native
5184%% option, it is 63 + 1 chars for each.
5185is_PkgdName(N) ->
5186    d("is_PkgdName -> entry with"
5187      "~n   N: ~p", [N]),
5188    case string:tokens(N, "/") of
5189	["*" = PackageName, "*" = ItemID] ->
5190	    d("is_PkgdName -> tokenized (0): "
5191	      "~n   PackageName: ~p"
5192	      "~n   ItemID:      ~p", [PackageName, ItemID]),
5193	    true;
5194	[PackageName, "*" = ItemID] ->
5195	    d("is_PkgdName -> tokenized (1): "
5196	      "~n   PackageName: ~p"
5197	      "~n   ItemID:      ~p", [PackageName, ItemID]),
5198	    is_Name(PackageName);
5199	[PackageName, ItemID] ->
5200	    d("is_PkgdName -> tokenized (2): "
5201	      "~n   PackageName: ~p"
5202	      "~n   ItemID:      ~p", [PackageName, ItemID]),
5203	    is_Name(PackageName) andalso is_Name(ItemID);
5204	_ ->
5205	    is_Name(N)
5206    end.
5207
5208chk_PkgdName(N, N) ->
5209    case is_PkgdName(N) of
5210	true ->
5211	    ok;
5212	false ->
5213	    wrong_type('PkgdName', N, N)
5214    end;
5215chk_PkgdName(N1, N2) ->
5216    case (is_PkgdName(N1) andalso is_PkgdName(N2)) of
5217	true ->
5218	    not_equal('PkgdName', N1, N2);
5219	false ->
5220	    wrong_type('PkgdName', N1, N2)
5221    end.
5222
5223
5224%% -- Relation --
5225
5226is_Relation(R) ->
5227    lists:member(R, [greaterThan, smallerThan, unequalTo]).
5228
5229chk_Relation(R, R) ->
5230    chk_type(fun is_Relation/1, 'Relation', R);
5231chk_Relation(R1, R2) ->
5232    case (is_Relation(R1) andalso is_Relation(R2)) of
5233	true ->
5234	    not_equal('Relation', R1, R2);
5235	false ->
5236	    wrong_type('Relation', R1, R2)
5237    end.
5238
5239
5240%% -- LocalRemoteDescriptor --
5241
5242is_opt_LocalRemoteDescriptor(D) ->
5243    d("is_LocalRemoteDescriptor -> entry"),
5244    is_OPTIONAL(fun is_LocalRemoteDescriptor/1, D).
5245
5246is_LocalRemoteDescriptor(#'LocalRemoteDescriptor'{propGrps = PGs}) ->
5247    d("is_LocalRemoteDescriptor -> entry with"
5248      "~n   PGs: ~p", [PGs]),
5249    is_LocalRemoteDescriptor_propGrps(PGs);
5250is_LocalRemoteDescriptor(_) ->
5251    false.
5252
5253is_LocalRemoteDescriptor_propGrps([]) ->
5254    true;
5255is_LocalRemoteDescriptor_propGrps([H|T]) ->
5256    is_PropertyGroup(H) andalso is_LocalRemoteDescriptor_propGrps(T);
5257is_LocalRemoteDescriptor_propGrps(_) ->
5258    false.
5259
5260chk_opt_LocalRemoteDescriptor(D1, D2) ->
5261    chk_OPTIONAL('LocalRemoteDescriptor', D1, D2,
5262		 fun is_LocalRemoteDescriptor/1,
5263		 fun chk_LocalRemoteDescriptor/2).
5264
5265chk_LocalRemoteDescriptor(LRD, LRD) ->
5266    chk_type(fun is_LocalRemoteDescriptor/1, 'LocalRemoteDescriptor', LRD);
5267chk_LocalRemoteDescriptor(#'LocalRemoteDescriptor'{propGrps = PG1},
5268			  #'LocalRemoteDescriptor'{propGrps = PG2}) ->
5269    chk_LocalRemoteDescriptor_propGrps(PG1, PG2),
5270    ok;
5271chk_LocalRemoteDescriptor(LRD1, LRD2) ->
5272    wrong_type('LocalRemoteDescriptor', LRD1, LRD2).
5273
5274chk_LocalRemoteDescriptor_propGrps([], []) ->
5275    ok;
5276chk_LocalRemoteDescriptor_propGrps([] = PG1, PG2) ->
5277    not_equal('LocalRemoteDescriptor_propGrps', PG1, PG2);
5278chk_LocalRemoteDescriptor_propGrps(PG1, [] = PG2) ->
5279    not_equal('LocalRemoteDescriptor_propGrps', PG1, PG2);
5280chk_LocalRemoteDescriptor_propGrps([H|T1], [H|T2]) ->
5281    case is_PropertyGroup(H) of
5282	true ->
5283	    chk_LocalRemoteDescriptor_propGrps(T1, T2);
5284	false ->
5285	    wrong_type('LocalRemoteDescriptor_propGrps_val', H)
5286    end;
5287chk_LocalRemoteDescriptor_propGrps([H1|T1], [H2|T2]) ->
5288    validate(fun() -> chk_PropertyGroup(H1, H2) end,
5289	     'LocalRemoteDescriptor_propGrps_val'),
5290    chk_LocalRemoteDescriptor_propGrps(T1, T2);
5291chk_LocalRemoteDescriptor_propGrps(PG1, PG2) ->
5292    wrong_type('LocalRemoteDescriptor_propGrps', PG1, PG2).
5293
5294
5295%% -- PropertyGroup --
5296
5297is_PropertyGroup([]) ->
5298    true;
5299is_PropertyGroup([H|T]) ->
5300    is_PropertyParm(H) andalso is_PropertyGroup(T);
5301is_PropertyGroup(_) ->
5302    false.
5303
5304chk_PropertyGroup([], []) ->
5305    ok;
5306chk_PropertyGroup([] = PG1, PG2) ->
5307    not_equal('PropertyGroup', PG1, PG2);
5308chk_PropertyGroup(PG1, [] = PG2) ->
5309    not_equal('PropertyGroup', PG1, PG2);
5310chk_PropertyGroup([H|T1], [H|T2]) ->
5311    case is_PropertyParm(H) of
5312	true ->
5313	    chk_PropertyGroup(T1, T2);
5314	false ->
5315	    wrong_type('PropertyGroup_val', H)
5316    end;
5317chk_PropertyGroup([H1|T1], [H2|T2]) ->
5318    validate(fun() -> chk_PropertyParm(H1, H2) end, 'PropertyGroup_val'),
5319    chk_PropertyGroup(T1, T2);
5320chk_PropertyGroup(PG1, PG2) ->
5321    wrong_type('PropertyGroup', PG1, PG2).
5322
5323
5324%% -- TerminationStateDescriptor --
5325
5326is_opt_TerminationStateDescriptor(D) ->
5327    is_OPTIONAL(fun is_TerminationStateDescriptor/1, D).
5328
5329is_TerminationStateDescriptor(
5330  #'TerminationStateDescriptor'{propertyParms      = PP,
5331				eventBufferControl = EBC,
5332				serviceState       = SS}) ->
5333    is_TerminationStateDescriptor_propertyParms(PP) andalso
5334	is_opt_EventBufferControl(EBC) andalso
5335	is_opt_ServiceState(SS);
5336is_TerminationStateDescriptor(_) ->
5337    false.
5338
5339is_TerminationStateDescriptor_propertyParms([]) ->
5340    true;
5341is_TerminationStateDescriptor_propertyParms([H|T]) ->
5342    is_PropertyParm(H) andalso is_TerminationStateDescriptor_propertyParms(T);
5343is_TerminationStateDescriptor_propertyParms(_) ->
5344    false.
5345
5346chk_opt_TerminationStateDescriptor(D1, D2) ->
5347    chk_OPTIONAL('TerminationStateDescriptor', D1, D2,
5348		 fun is_TerminationStateDescriptor/1,
5349		 fun chk_TerminationStateDescriptor/2).
5350
5351chk_TerminationStateDescriptor(D, D) ->
5352    chk_type(fun is_TerminationStateDescriptor/1,
5353	     'TerminationStateDescriptor', D);
5354chk_TerminationStateDescriptor(
5355  #'TerminationStateDescriptor'{propertyParms      = PP1,
5356				eventBufferControl = EBC1,
5357				serviceState       = SS1},
5358  #'TerminationStateDescriptor'{propertyParms      = PP2,
5359				eventBufferControl = EBC2,
5360				serviceState       = SS2}) ->
5361    chk_TerminationStateDescriptor_propertyParms(PP1, PP2),
5362    validate(
5363      fun() ->
5364	      chk_opt_EventBufferControl(EBC1, EBC2)
5365      end,
5366      'TerminationStateDescriptor'),
5367    validate(
5368      fun() ->
5369	      chk_opt_ServiceState(SS1, SS2)
5370      end,
5371      'TerminationStateDescriptor'),
5372    ok;
5373chk_TerminationStateDescriptor(D1, D2) ->
5374    wrong_type('TerminationStateDescriptor', D1, D2).
5375
5376
5377chk_TerminationStateDescriptor_propertyParms([], []) ->
5378    ok;
5379chk_TerminationStateDescriptor_propertyParms([] = P1, P2) ->
5380    not_equal('TerminationStateDescriptor_propertyParms', P1, P2);
5381chk_TerminationStateDescriptor_propertyParms(P1, [] = P2) ->
5382    not_equal('TerminationStateDescriptor_propertyParms', P1, P2);
5383chk_TerminationStateDescriptor_propertyParms([H|T1], [H|T2]) ->
5384    case is_PropertyParm(H) of
5385	true ->
5386	    chk_TerminationStateDescriptor_propertyParms(T1, T2);
5387	false ->
5388	    wrong_type('TerminationStateDescriptor_propertyParms_val', H)
5389    end;
5390chk_TerminationStateDescriptor_propertyParms([H1|_], [H2|_]) ->
5391    case (is_PropertyParm(H1) andalso is_PropertyParm(H2)) of
5392	true ->
5393	    not_equal('TerminationStateDescriptor_propertyParms_val', H1, H2);
5394	false ->
5395	    wrong_type('TerminationStateDescriptor_propertyParms_val', H1, H2)
5396    end;
5397chk_TerminationStateDescriptor_propertyParms(P1, P2) ->
5398    wrong_type('TerminationStateDescriptor_propertyParms', P1, P2).
5399
5400
5401%% -- EventBufferControl --
5402
5403is_opt_EventBufferControl(asn1_NOVALUE) ->
5404    true;
5405is_opt_EventBufferControl(EBC) ->
5406    is_EventBufferControl(EBC).
5407
5408is_EventBufferControl(EBC) ->
5409    lists:member(EBC, [off, lockStep]).
5410
5411chk_opt_EventBufferControl(asn1_NOVALUE, asn1_NOVALUE) ->
5412    ok;
5413chk_opt_EventBufferControl(EBC1, EBC2) ->
5414    chk_EventBufferControl(EBC1, EBC2).
5415
5416chk_EventBufferControl(EBC, EBC) ->
5417    chk_type(fun is_EventBufferControl/1, 'EventBufferControl', EBC);
5418chk_EventBufferControl(EBC1, EBC2) ->
5419    case (is_EventBufferControl(EBC1) andalso is_EventBufferControl(EBC2)) of
5420	true ->
5421	    not_equal('EventBufferControl', EBC1, EBC2);
5422	false ->
5423	    wrong_type('EventBufferControl', EBC1, EBC2)
5424    end.
5425
5426
5427%% -- ServiceState --
5428
5429is_opt_ServiceState(asn1_NOVALUE) ->
5430    true;
5431is_opt_ServiceState(SS) ->
5432    is_ServiceState(SS).
5433
5434is_ServiceState(SS) ->
5435    lists:member(SS, [test, outOfSvc, inSvc]).
5436
5437chk_opt_ServiceState(asn1_NOVALUE, asn1_NOVALUE) ->
5438    ok;
5439chk_opt_ServiceState(SS1, SS2) ->
5440    chk_ServiceState(SS1, SS2).
5441
5442chk_ServiceState(SS, SS) ->
5443    chk_type(fun is_ServiceState/1, 'ServiceState', SS);
5444chk_ServiceState(SS1, SS2) ->
5445    case (is_ServiceState(SS1) andalso is_ServiceState(SS2)) of
5446	true ->
5447	    not_equal('ServiceState', SS1, SS2);
5448	false ->
5449	    wrong_type('ServiceState', SS1, SS2)
5450    end.
5451
5452
5453%% -- MuxDescriptor --
5454
5455is_MuxDescriptor(#'MuxDescriptor'{muxType         = MT,
5456				  termList        = TL,
5457				  nonStandardData = NSD}) ->
5458    is_MuxType(MT) andalso
5459	is_MuxDescriptor_termList(TL) andalso
5460	is_NonStandardData(NSD);
5461is_MuxDescriptor(_) ->
5462    false.
5463
5464is_MuxDescriptor_termList([]) ->
5465    true;
5466is_MuxDescriptor_termList([H|T]) ->
5467    is_TerminationID(H) andalso is_MuxDescriptor_termList(T);
5468is_MuxDescriptor_termList(_) ->
5469    false.
5470
5471chk_MuxDescriptor(D, D) ->
5472    chk_type(fun is_MuxDescriptor/1, 'MuxDescriptor', D);
5473chk_MuxDescriptor(#'MuxDescriptor'{muxType         = MT1,
5474				   termList        = TL1,
5475				   nonStandardData = NSD1},
5476		  #'MuxDescriptor'{muxType         = MT2,
5477				   termList        = TL2,
5478				   nonStandardData = NSD2}) ->
5479    validate(fun() -> chk_MuxType(MT1, MT2) end, 'MuxDescriptor'),
5480    chk_MuxDescriptor_termList(TL1, TL2),
5481    validate(fun() -> chk_NonStandardData(NSD1, NSD2) end, 'MuxDescriptor'),
5482    ok;
5483chk_MuxDescriptor(D1, D2) ->
5484    wrong_type('MuxDescriptor', D1, D2).
5485
5486chk_MuxDescriptor_termList([], []) ->
5487    ok;
5488chk_MuxDescriptor_termList([] = TL1, TL2) ->
5489    not_equal('MuxDescriptor_termList', TL1, TL2);
5490chk_MuxDescriptor_termList(TL1, [] = TL2) ->
5491    not_equal('MuxDescriptor_termList', TL1, TL2);
5492chk_MuxDescriptor_termList([H|T1], [H|T2]) ->
5493    case is_TerminationID(H) of
5494	true ->
5495	    chk_MuxDescriptor_termList(T1, T2);
5496	false ->
5497	    wrong_type('MuxDescriptor_termList_val', H)
5498    end;
5499chk_MuxDescriptor_termList([H1|T1], [H2|T2]) ->
5500    validate(fun() -> chk_TerminationID(H1, H2) end,
5501	     'MuxDescriptor_termList_val'),
5502    chk_MuxDescriptor_termList(T1, T2);
5503chk_MuxDescriptor_termList(TL1, TL2) ->
5504    wrong_type('MuxDescriptor_termList', TL1, TL2).
5505
5506
5507%% -- MuxType --
5508
5509is_MuxType(MT) ->
5510    lists:member(MT, [h221, h223, h226, v76, nx64k]).
5511
5512chk_MuxType(MT, MT) ->
5513    chk_type(fun is_MuxType/1, 'MuxType', MT);
5514chk_MuxType(MT1, MT2) ->
5515    case (is_MuxType(MT1) andalso is_MuxType(MT2)) of
5516	true ->
5517	    not_equal('MuxType', MT1, MT2);
5518	false ->
5519	    wrong_type('MuxType', MT1, MT2)
5520    end.
5521
5522
5523%% -- StreamID --
5524
5525is_opt_StreamID(V) ->
5526    is_OPTIONAL(fun is_StreamID/1, V).
5527
5528is_StreamID(V) ->
5529    d("is_StreamID -> entry with"
5530      "~n   V: ~p", [V]),
5531    is_INTEGER(V, {range, 0, 65535}).
5532
5533chk_opt_StreamID(V1, V2) ->
5534    chk_OPTIONAL('StreamID', V1, V2, fun is_StreamID/1, fun chk_StreamID/2).
5535
5536chk_StreamID(ID, ID) ->
5537    chk_type(fun is_StreamID/1, 'StreamID', ID);
5538chk_StreamID(ID1, ID2) ->
5539    case (is_StreamID(ID1) andalso is_StreamID(ID2)) of
5540	true ->
5541	    not_equal('StreamID', ID1, ID2);
5542	false ->
5543	    wrong_type('StreamID', ID1, ID2)
5544    end.
5545
5546
5547%% -- EventsDescriptor --
5548
5549is_EventsDescriptor(#'EventsDescriptor'{requestID = RID,
5550					eventList = EVL}) ->
5551    d("is_EventsDescriptor -> entry with"
5552      "~n   RID: ~p"
5553      "~n   EVL: ~p", [RID, EVL]),
5554    is_opt_RequestID(RID) andalso is_EventsDescriptor_eventList(EVL);
5555is_EventsDescriptor(_) ->
5556    false.
5557
5558is_EventsDescriptor_eventList([]) ->
5559    true;
5560is_EventsDescriptor_eventList([H|T]) ->
5561    is_RequestedEvent(H) andalso is_EventsDescriptor_eventList(T);
5562is_EventsDescriptor_eventList(_) ->
5563    false.
5564
5565chk_EventsDescriptor(D, D) ->
5566    chk_type(fun is_EventsDescriptor/1, 'EventsDescriptor', D);
5567chk_EventsDescriptor(#'EventsDescriptor'{requestID = RID1,
5568					 eventList = EVL1},
5569		     #'EventsDescriptor'{requestID = RID2,
5570					 eventList = EVL2}) ->
5571    validate(fun() -> chk_opt_RequestID(RID1, RID2) end, 'EventsDescriptor'),
5572    chk_EventsDescriptor_eventList(EVL1, EVL2),
5573    ok;
5574chk_EventsDescriptor(D1, D2) ->
5575    wrong_type('EventsDescriptor', D1, D2).
5576
5577chk_EventsDescriptor_eventList([], []) ->
5578    ok;
5579chk_EventsDescriptor_eventList([] = EVL1, EVL2) ->
5580    not_equal('EventsDescriptor_eventList', EVL1, EVL2);
5581chk_EventsDescriptor_eventList(EVL1, [] = EVL2) ->
5582    not_equal('EventsDescriptor_eventList', EVL1, EVL2);
5583chk_EventsDescriptor_eventList([H|T1], [H|T2]) ->
5584    case is_RequestedEvent(H) of
5585	true ->
5586	    chk_EventsDescriptor_eventList(T1, T2);
5587	false ->
5588	    wrong_type('EventsDescriptor_eventList_val', H)
5589    end;
5590chk_EventsDescriptor_eventList([H1|T1], [H2|T2]) ->
5591    validate(fun() -> chk_RequestedEvent(H1, H2) end,
5592	     'EventsDescriptor_eventList_val'),
5593    chk_EventsDescriptor_eventList(T1, T2);
5594chk_EventsDescriptor_eventList(EVL1, EVL2) ->
5595    wrong_type('EventsDescriptor_eventList', EVL1, EVL2).
5596
5597
5598%% -- RequestedEvent --
5599
5600is_RequestedEvent(#'RequestedEvent'{pkgdName    = N,
5601				    streamID    = SID,
5602				    eventAction = EA,
5603				    evParList   = EPL}) ->
5604    d("is_RequestedEvent -> entry with"
5605      "~n   N:   ~p"
5606      "~n   SID: ~p"
5607      "~n   EA:  ~p"
5608      "~n   EPL: ~p", [N, SID, EA, EPL]),
5609    is_PkgdName(N) andalso
5610	is_opt_StreamID(SID) andalso
5611	is_opt_RequestedActions(EA) andalso
5612	is_RequestedEvent_evParList(EPL);
5613is_RequestedEvent(_) ->
5614    false.
5615
5616is_RequestedEvent_evParList([]) ->
5617    true;
5618is_RequestedEvent_evParList([H|T]) ->
5619    is_EventParameter(H) andalso is_RequestedEvent_evParList(T);
5620is_RequestedEvent_evParList(_) ->
5621    false.
5622
5623chk_RequestedEvent(RE, RE) ->
5624    chk_type(fun is_RequestedEvent/1, 'RequestedEvent', RE);
5625chk_RequestedEvent(#'RequestedEvent'{pkgdName    = N1,
5626				     streamID    = SID1,
5627				     eventAction = EA1,
5628				     evParList   = EPL1},
5629		   #'RequestedEvent'{pkgdName    = N2,
5630				     streamID    = SID2,
5631				     eventAction = EA2,
5632				     evParList   = EPL2}) ->
5633    validate(fun() -> chk_PkgdName(N1, N2) end, 'RequestedEvent'),
5634    validate(fun() -> chk_opt_StreamID(SID1, SID2) end, 'RequestedEvent'),
5635    validate(fun() -> chk_opt_RequestedActions(EA1, EA2) end,
5636	     'RequestedEvent'),
5637    chk_RequestedEvent_evParList(EPL1, EPL2),
5638    ok;
5639chk_RequestedEvent(RE1, RE2) ->
5640    wrong_type('RequestedEvent', RE1, RE2).
5641
5642chk_RequestedEvent_evParList([], []) ->
5643    ok;
5644chk_RequestedEvent_evParList([] = EPL1, EPL2) ->
5645    not_equal('RequestedEvent_evParList', EPL1, EPL2);
5646chk_RequestedEvent_evParList(EPL1, [] = EPL2) ->
5647    not_equal('RequestedEvent_evParList', EPL1, EPL2);
5648chk_RequestedEvent_evParList([H|T1], [H|T2]) ->
5649    case is_EventParameter(H) of
5650	true ->
5651	    chk_RequestedEvent_evParList(T1, T2);
5652	false ->
5653	    wrong_type('RequestedEvent_evParList_val', H)
5654    end;
5655chk_RequestedEvent_evParList([H1|T1], [H2|T2]) ->
5656    validate(fun() -> chk_EventParameter(H1, H2) end,
5657	     'RequestedEvent_evParList_val'),
5658    chk_RequestedEvent_evParList(T1, T2);
5659chk_RequestedEvent_evParList(EPL1, EPL2) ->
5660    wrong_type('RequestedEvent_evParList', EPL1, EPL2).
5661
5662
5663%% -- RequestedActions --
5664
5665is_opt_RequestedActions(asn1_NOVALUE) ->
5666    true;
5667is_opt_RequestedActions(RA) ->
5668    is_RequestedActions(RA).
5669
5670is_RequestedActions(#'RequestedActions'{keepActive        = KA,
5671					eventDM           = EDM,
5672					secondEvent       = SE,
5673					signalsDescriptor = SD}) ->
5674    d("is_RequestedActions -> entry with"
5675      "~n   KA:  ~p"
5676      "~n   EDM: ~p"
5677      "~n   SE:  ~p"
5678      "~n   SD:  ~p", [KA, EDM, SE, SD]),
5679    is_opt_BOOLEAN(KA) andalso
5680	is_opt_EventDM(EDM) andalso
5681	is_opt_SecondEventsDescriptor(SE) andalso
5682	is_opt_SignalsDescriptor(SD);
5683is_RequestedActions(_) ->
5684    false.
5685
5686chk_opt_RequestedActions(asn1_NOVALUE, asn1_NOVALUE) ->
5687    ok;
5688chk_opt_RequestedActions(RA1, RA2) ->
5689    chk_RequestedActions(RA1, RA2).
5690
5691chk_RequestedActions(RA, RA) ->
5692    chk_type(fun is_RequestedActions/1, 'RequestedActions', RA);
5693chk_RequestedActions(#'RequestedActions'{keepActive        = KA1,
5694					 eventDM           = EDM1,
5695					 secondEvent       = SA1,
5696					 signalsDescriptor = SD1},
5697		     #'RequestedActions'{keepActive        = KA2,
5698					 eventDM           = EDM2,
5699					 secondEvent       = SA2,
5700					 signalsDescriptor = SD2}) ->
5701    validate(fun() -> chk_opt_BOOLEAN(KA1, KA2) end, 'RequestedActions'),
5702    validate(fun() -> chk_opt_EventDM(EDM1, EDM2) end, 'RequestedActions'),
5703    validate(fun() -> chk_opt_SecondEventsDescriptor(SA1, SA2) end,
5704	     'RequestedActions'),
5705    validate(fun() -> chk_opt_SignalsDescriptor(SD1, SD2) end,
5706	     'RequestedActions'),
5707    ok;
5708chk_RequestedActions(RA1, RA2) ->
5709    wrong_type('RequestedActions', RA1, RA2).
5710
5711
5712%% -- EventDM --
5713
5714is_opt_EventDM(EDM) ->
5715    is_OPTIONAL(fun is_EventDM/1, EDM).
5716
5717is_EventDM({Tag, Val}) ->
5718    is_EventDM_tag(Tag) andalso is_EventDM_val(Tag, Val);
5719is_EventDM(_) ->
5720    false.
5721
5722is_EventDM_tag(Tag) ->
5723    Tags = [digitMapName, digitMapValue],
5724    lists:member(Tag, Tags).
5725
5726is_EventDM_val(digitMapName, Val) ->
5727    is_DigitMapName(Val);
5728is_EventDM_val(digitMapValue, Val) ->
5729    is_DigitMapValue(Val).
5730
5731chk_opt_EventDM(EDM1, EDM2) ->
5732    chk_OPTIONAL('EventDM', EDM1, EDM2, fun is_EventDM/1, fun chk_EventDM/2).
5733
5734chk_EventDM(EDM, EDM) ->
5735    chk_type(fun is_EventDM/1, 'EventDM', EDM);
5736chk_EventDM({Tag, Val1} = EDM1, {Tag, Val2} = EDM2) ->
5737    case (is_EventDM_tag(Tag) andalso
5738	  is_EventDM_val(Tag, Val1) andalso
5739	  is_EventDM_val(Tag, Val2)) of
5740	true ->
5741	    chk_EventDM_val(Tag, Val1, Val2);
5742	false ->
5743	    wrong_type('EventDM', EDM1, EDM2)
5744    end;
5745chk_EventDM({Tag1, Val1} = EDM1, {Tag2, Val2} = EDM2) ->
5746    case ((is_EventDM_tag(Tag1) andalso
5747	   is_EventDM_val(Tag1, Val1)) andalso
5748	  (is_EventDM_tag(Tag2) andalso
5749	   is_EventDM_val(Tag2, Val2))) of
5750	true ->
5751	    not_equal('EventDM', EDM1, EDM2);
5752	false ->
5753	    wrong_type('EventDM', EDM1, EDM2)
5754    end;
5755chk_EventDM(EDM1, EDM2) ->
5756    wrong_type('EventDM', EDM1, EDM2).
5757
5758chk_EventDM_val(digitMapName, Val1, Val2) ->
5759    validate(fun() -> chk_DigitMapName(Val1, Val2) end, 'EventDM');
5760chk_EventDM_val(digitMapValue, Val1, Val2) ->
5761    validate(fun() -> chk_DigitMapValue(Val1, Val2) end, 'EventDM').
5762
5763
5764%% -- SecondEventsDescriptor --
5765
5766is_opt_SecondEventsDescriptor(asn1_NOVALUE) ->
5767    true;
5768is_opt_SecondEventsDescriptor(D) ->
5769    is_SecondEventsDescriptor(D).
5770
5771is_SecondEventsDescriptor(#'SecondEventsDescriptor'{requestID = RID,
5772						    eventList = EL}) ->
5773    is_opt_RequestID(RID) andalso is_SecondEventsDescriptor_eventList(EL);
5774is_SecondEventsDescriptor(_) ->
5775    false.
5776
5777is_SecondEventsDescriptor_eventList([]) ->
5778    true;
5779is_SecondEventsDescriptor_eventList([H|T]) ->
5780    is_SecondRequestedEvent(H) andalso is_SecondEventsDescriptor_eventList(T);
5781is_SecondEventsDescriptor_eventList(_) ->
5782    false.
5783
5784chk_opt_SecondEventsDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
5785    ok;
5786chk_opt_SecondEventsDescriptor(D1, D2) ->
5787    chk_SecondEventsDescriptor(D1, D2).
5788
5789chk_SecondEventsDescriptor(D, D) ->
5790    chk_type(fun is_SecondEventsDescriptor/1, 'SecondEventsDescriptor', D);
5791chk_SecondEventsDescriptor(#'SecondEventsDescriptor'{requestID = RID1,
5792						     eventList = EL1},
5793			   #'SecondEventsDescriptor'{requestID = RID2,
5794						     eventList = EL2}) ->
5795    validate(fun() -> chk_opt_RequestID(RID1, RID2) end,
5796	     'SecondEventsDescriptor'),
5797    chk_SecondEventsDescriptor_eventList(EL1, EL2),
5798    ok;
5799chk_SecondEventsDescriptor(D1, D2) ->
5800    wrong_type('SecondEventsDescriptor', D1, D2).
5801
5802chk_SecondEventsDescriptor_eventList([], []) ->
5803    ok;
5804chk_SecondEventsDescriptor_eventList([] = EL1, EL2) ->
5805    not_equal('SecondEventsDescriptor_eventList', EL1, EL2);
5806chk_SecondEventsDescriptor_eventList(EL1, [] = EL2) ->
5807    not_equal('SecondEventsDescriptor_eventList', EL1, EL2);
5808chk_SecondEventsDescriptor_eventList([H|T1], [H|T2]) ->
5809    case is_SecondRequestedEvent(H) of
5810	true ->
5811	    chk_SecondEventsDescriptor_eventList(T1, T2);
5812	false ->
5813	    wrong_type('SecondEventsDescriptor_eventList_val', H)
5814    end;
5815chk_SecondEventsDescriptor_eventList([H1|T1], [H2|T2]) ->
5816    validate(fun() -> chk_SecondRequestedEvent(H1, H2) end,
5817	     'SecondEventsDescriptor_eventList_val'),
5818    chk_SecondEventsDescriptor_eventList(T1, T2);
5819chk_SecondEventsDescriptor_eventList(L1, L2) ->
5820    wrong_type('SecondEventsDescriptor_eventList_val', L1, L2).
5821
5822
5823%% -- SecondRequestedEvent --
5824
5825is_SecondRequestedEvent(#'SecondRequestedEvent'{pkgdName    = N,
5826						streamID    = SID,
5827						eventAction = EA,
5828						evParList   = EPL}) ->
5829    is_PkgdName(N) andalso
5830	is_opt_StreamID(SID) andalso
5831	is_opt_SecondRequestedActions(EA) andalso
5832	is_SecondRequestedEvent_evParList(EPL);
5833is_SecondRequestedEvent(_) ->
5834    false.
5835
5836is_SecondRequestedEvent_evParList([]) ->
5837    true;
5838is_SecondRequestedEvent_evParList([H|T]) ->
5839    is_EventParameter(H) andalso is_SecondRequestedEvent_evParList(T);
5840is_SecondRequestedEvent_evParList(_) ->
5841    false.
5842
5843chk_SecondRequestedEvent(RE, RE) ->
5844    chk_type(fun is_SecondRequestedEvent/1, 'SecondRequestedEvent', RE);
5845chk_SecondRequestedEvent(#'SecondRequestedEvent'{pkgdName    = N1,
5846						 streamID    = SID1,
5847						 eventAction = EA1,
5848						 evParList   = EPL1},
5849			 #'SecondRequestedEvent'{pkgdName    = N2,
5850						 streamID    = SID2,
5851						 eventAction = EA2,
5852						 evParList   = EPL2}) ->
5853    validate(fun() -> chk_PkgdName(N1, N2) end, 'SecondRequestedEvent'),
5854    validate(fun() -> chk_opt_StreamID(SID1, SID2) end,
5855	     'SecondRequestedEvent'),
5856    validate(fun() -> chk_opt_SecondRequestedActions(EA1, EA2) end,
5857	     'SecondRequestedEvent'),
5858    chk_SecondRequestedEvent_evParList(EPL1, EPL2),
5859    ok;
5860chk_SecondRequestedEvent(RE1, RE2) ->
5861    wrong_type('SecondRequestedEvent', RE1, RE2).
5862
5863chk_SecondRequestedEvent_evParList([], []) ->
5864    ok;
5865chk_SecondRequestedEvent_evParList([] = EPL1, EPL2) ->
5866    not_equal('SecondRequestedEvent_evParList', EPL1, EPL2);
5867chk_SecondRequestedEvent_evParList(EPL1, [] = EPL2) ->
5868    not_equal('SecondRequestedEvent_evParList', EPL1, EPL2);
5869chk_SecondRequestedEvent_evParList([H|T1], [H|T2]) ->
5870    case is_EventParameter(H) of
5871	true ->
5872	    chk_SecondRequestedEvent_evParList(T1, T2);
5873	false ->
5874	    wrong_type('SecondRequestedEvent_evParList_val', H)
5875    end;
5876chk_SecondRequestedEvent_evParList([H1|T1], [H2|T2]) ->
5877    validate(fun() -> chk_EventParameter(H1, H2) end,
5878	     'SecondRequestedEvent_evParList_val'),
5879    chk_SecondRequestedEvent_evParList(T1, T2);
5880chk_SecondRequestedEvent_evParList(EPL1, EPL2) ->
5881    wrong_type('SecondRequestedEvent_evParList', EPL1, EPL2).
5882
5883
5884%% -- SecondRequestedActions --
5885
5886is_opt_SecondRequestedActions(asn1_NOVALUE) ->
5887    true;
5888is_opt_SecondRequestedActions(SRA) ->
5889    is_SecondRequestedActions(SRA).
5890
5891is_SecondRequestedActions(#'SecondRequestedActions'{keepActive        = KA,
5892						    eventDM           = EDM,
5893						    signalsDescriptor = SD}) ->
5894    is_opt_BOOLEAN(KA) andalso
5895	is_opt_EventDM(EDM) andalso
5896	is_opt_SignalsDescriptor(SD);
5897is_SecondRequestedActions(_) ->
5898    false.
5899
5900chk_opt_SecondRequestedActions(asn1_NOVALUE, asn1_NOVALUE) ->
5901    ok;
5902chk_opt_SecondRequestedActions(SRA1, SRA2) ->
5903    chk_SecondRequestedActions(SRA1, SRA2).
5904
5905chk_SecondRequestedActions(SRA, SRA) ->
5906    chk_type(fun is_SecondRequestedActions/1, 'SecondRequestedActions', SRA);
5907chk_SecondRequestedActions(
5908  #'SecondRequestedActions'{keepActive        = KA1,
5909			    eventDM           = EDM1,
5910			    signalsDescriptor = SD1},
5911  #'SecondRequestedActions'{keepActive        = KA2,
5912			    eventDM           = EDM2,
5913			    signalsDescriptor = SD2}) ->
5914    validate(fun() -> chk_opt_BOOLEAN(KA1, KA2) end,
5915	     'SecondRequestedActions'),
5916    validate(fun() -> chk_opt_EventDM(EDM1, EDM2) end,
5917	     'SecondRequestedActions'),
5918    validate(fun() -> chk_opt_SignalsDescriptor(SD1, SD2) end,
5919	     'SecondRequestedActions'),
5920    ok;
5921chk_SecondRequestedActions(SRA1, SRA2) ->
5922    wrong_type('SecondRequestedActions', SRA1, SRA2).
5923
5924
5925%% -- EventBufferDescriptor --
5926
5927is_EventBufferDescriptor([]) ->
5928    true;
5929is_EventBufferDescriptor([H|T]) ->
5930    is_EventSpec(H) andalso is_EventBufferDescriptor(T);
5931is_EventBufferDescriptor(_) ->
5932    false.
5933
5934chk_EventBufferDescriptor([], []) ->
5935    ok;
5936chk_EventBufferDescriptor([] = D1, D2) ->
5937    not_equal('EventBufferDescriptor', D1, D2);
5938chk_EventBufferDescriptor(D1, [] = D2) ->
5939    not_equal('EventBufferDescriptor', D1, D2);
5940chk_EventBufferDescriptor([H|T1], [H|T2]) ->
5941    case is_EventSpec(H) of
5942	true ->
5943	    chk_EventBufferDescriptor(T1, T2);
5944	false ->
5945	    wrong_type('EventBufferDescriptor_val', H)
5946    end;
5947chk_EventBufferDescriptor([H1|T1], [H2|T2]) ->
5948    validate(fun() -> chk_EventSpec(H1, H2) end,
5949	     'EventBufferDescriptor_val'),
5950    chk_EventBufferDescriptor(T1, T2);
5951chk_EventBufferDescriptor(D1, D2) ->
5952    wrong_type('EventBufferDescriptor_val', D1, D2).
5953
5954
5955%% -- EventSpec --
5956
5957is_EventSpec(#'EventSpec'{eventName    = N,
5958			  streamID     = SID,
5959			  eventParList = EPL}) ->
5960    is_EventName(N) andalso
5961	is_opt_StreamID(SID) andalso
5962	is_EventSpec_eventParList(EPL);
5963is_EventSpec(_) ->
5964    false.
5965
5966is_EventSpec_eventParList([]) ->
5967    true;
5968is_EventSpec_eventParList([H|T]) ->
5969    is_EventParameter(H) andalso is_EventSpec_eventParList(T);
5970is_EventSpec_eventParList(_) ->
5971    false.
5972
5973chk_EventSpec(ES, ES) ->
5974    chk_type(fun is_EventSpec/1, 'EventSpec', ES);
5975chk_EventSpec(#'EventSpec'{eventName    = N1,
5976			   streamID     = SID1,
5977			   eventParList = EPL1},
5978	      #'EventSpec'{eventName    = N2,
5979			   streamID     = SID2,
5980			   eventParList = EPL2}) ->
5981    validate(fun() -> chk_EventName(N1, N2) end, 'EventSpec'),
5982    validate(fun() -> chk_opt_StreamID(SID1, SID2) end, 'EventSpec'),
5983    chk_EventSpec_eventParList(EPL1, EPL2),
5984    ok;
5985chk_EventSpec(ES1, ES2) ->
5986    wrong_type('EventSpec', ES1, ES2).
5987
5988chk_EventSpec_eventParList([], []) ->
5989    ok;
5990chk_EventSpec_eventParList([] = EPL1, EPL2) ->
5991    not_equal('EventSpec_eventParList', EPL1, EPL2);
5992chk_EventSpec_eventParList(EPL1, [] = EPL2) ->
5993    not_equal('EventSpec_eventParList', EPL1, EPL2);
5994chk_EventSpec_eventParList([H|T1], [H|T2]) ->
5995    case is_EventParameter(H) of
5996	true ->
5997	    chk_EventSpec_eventParList(T1, T2);
5998	false ->
5999	    wrong_type('EventSpec_eventParList_val', H)
6000    end;
6001chk_EventSpec_eventParList([H1|T1], [H2|T2]) ->
6002    validate(fun() -> chk_EventParameter(H1, H2) end,
6003	     'EventSpec_eventParList_val'),
6004    chk_EventSpec_eventParList(T1, T2);
6005chk_EventSpec_eventParList(EPL1, EPL2) ->
6006    wrong_type('EventSpec_eventParList', EPL1, EPL2).
6007
6008
6009%% -- SignalsDescriptor --
6010
6011is_opt_SignalsDescriptor(asn1_NOVALUE) ->
6012    true;
6013is_opt_SignalsDescriptor(D) ->
6014    is_SignalsDescriptor(D).
6015
6016is_SignalsDescriptor([]) ->
6017    true;
6018is_SignalsDescriptor([H|T]) ->
6019    is_SignalRequest(H) andalso is_SignalsDescriptor(T);
6020is_SignalsDescriptor(_) ->
6021    false.
6022
6023chk_opt_SignalsDescriptor(asn1_NOVALUE, asn1_NOVALUE) ->
6024    ok;
6025chk_opt_SignalsDescriptor(D1, D2) ->
6026    chk_SignalsDescriptor(D1, D2).
6027
6028chk_SignalsDescriptor([], []) ->
6029    ok;
6030chk_SignalsDescriptor([] = D1, D2) ->
6031    not_equal('SignalsDescriptor', D1, D2);
6032chk_SignalsDescriptor(D1, [] = D2) ->
6033    not_equal('SignalsDescriptor', D1, D2);
6034chk_SignalsDescriptor([H|T1], [H|T2]) ->
6035    case is_SignalRequest(H) of
6036	true ->
6037	    chk_SignalsDescriptor(T1, T2);
6038	false ->
6039	    wrong_type('SignalsDescriptor_val', H)
6040    end;
6041chk_SignalsDescriptor([H1|T1], [H2|T2]) ->
6042    validate(fun() -> chk_SignalRequest(H1, H2) end, 'SignalsDescriptor_val'),
6043    chk_SignalsDescriptor(T1, T2);
6044chk_SignalsDescriptor(D1, D2) ->
6045    wrong_type('SignalsDescriptor', D1, D2).
6046
6047
6048%% -- SignalRequest --
6049
6050is_SignalRequest({Tag, Val}) ->
6051    is_SignalRequest_tag(Tag) andalso is_SignalRequest_val(Tag, Val);
6052is_SignalRequest(_) ->
6053    false.
6054
6055is_SignalRequest_tag(Tag) ->
6056    Tags = [signal, seqSigList],
6057    lists:member(Tag, Tags).
6058
6059is_SignalRequest_val(signal, Val) ->
6060    is_Signal(Val);
6061is_SignalRequest_val(seqSigList, Val) ->
6062    is_SeqSigList(Val).
6063
6064chk_SignalRequest(R, R) ->
6065    chk_type(fun is_SignalRequest/1, 'SignalRequest', R);
6066chk_SignalRequest({Tag, Val1} = R1, {Tag, Val2} = R2) ->
6067    case (is_SignalRequest_tag(Tag) andalso
6068	  is_SignalRequest_val(Tag, Val1) andalso
6069	  is_SignalRequest_val(Tag, Val2)) of
6070	true ->
6071	    chk_SignalRequest_val(Tag, Val1, Val2);
6072	false ->
6073	    wrong_type('SignalRequest', R1, R2)
6074    end;
6075chk_SignalRequest({Tag1, Val1} = R1, {Tag2, Val2} = R2) ->
6076    case ((is_SignalRequest_tag(Tag1) andalso
6077	   is_SignalRequest_val(Tag1, Val1)) andalso
6078	  (is_SignalRequest_tag(Tag2) andalso
6079	   is_SignalRequest_val(Tag2, Val2))) of
6080	true ->
6081	    not_equal('SignalRequest', R1, R2);
6082	false ->
6083	    wrong_type('SignalRequest', R1, R2)
6084    end;
6085chk_SignalRequest(R1, R2) ->
6086    wrong_type('SignalRequest', R1, R2).
6087
6088chk_SignalRequest_val(signal, Val1, Val2) ->
6089    validate(fun() -> chk_Signal(Val1, Val2) end, 'SignalRequest');
6090chk_SignalRequest_val(seqSigList, Val1, Val2) ->
6091    validate(fun() -> chk_SeqSigList(Val1, Val2) end, 'SignalRequest').
6092
6093
6094%% -- SeqSigList --
6095
6096is_SeqSigList(#'SeqSigList'{id         = ID,
6097			    signalList = SL}) ->
6098    is_INTEGER(ID, {range, 0, 65535}) andalso
6099	is_SeqSigList_signalList(SL);
6100is_SeqSigList(_) ->
6101    false.
6102
6103is_SeqSigList_signalList([]) ->
6104    true;
6105is_SeqSigList_signalList([H|T]) ->
6106    is_Signal(H) andalso is_SeqSigList_signalList(T);
6107is_SeqSigList_signalList(_) ->
6108    false.
6109
6110chk_SeqSigList(L, L) ->
6111    chk_type(fun is_SeqSigList/1, 'SeqSigList', L);
6112chk_SeqSigList(#'SeqSigList'{id         = ID1,
6113			     signalList = SL1},
6114	       #'SeqSigList'{id         = ID2,
6115			     signalList = SL2}) ->
6116    validate(fun() -> chk_INTEGER(ID1, ID2, {range, 0, 65535}) end,
6117	     'SeqSigList'),
6118    chk_SeqSigList_signalList(SL1, SL2),
6119    ok;
6120chk_SeqSigList(L1, L2) ->
6121    wrong_type('SeqSigList', L1, L2).
6122
6123chk_SeqSigList_signalList([], []) ->
6124    ok;
6125chk_SeqSigList_signalList([] = L1, L2) ->
6126    not_equal('SeqSigList_signalList', L1, L2);
6127chk_SeqSigList_signalList(L1, [] = L2) ->
6128    not_equal('SeqSigList_signalList', L1, L2);
6129chk_SeqSigList_signalList([H|T1], [H|T2]) ->
6130    case is_Signal(H) of
6131	true ->
6132	    chk_SeqSigList_signalList(T1, T2);
6133	false ->
6134	    wrong_type('SeqSigList_signalList_val', H)
6135    end;
6136chk_SeqSigList_signalList([H1|T1], [H2|T2]) ->
6137    validate(fun() -> chk_Signal(H1, H2) end,
6138	     'SeqSigList_signalList_val'),
6139    chk_SeqSigList_signalList(T1, T2);
6140chk_SeqSigList_signalList(L1, L2) ->
6141    wrong_type('SeqSigList_signalList', L1, L2).
6142
6143
6144%% -- Signal --
6145
6146is_Signal(#'Signal'{signalName       = N,
6147		    streamID         = SID,
6148		    sigType          = ST,
6149		    duration         = Dur,
6150		    notifyCompletion = NC,
6151		    keepActive       = KA,
6152		    sigParList       = SPL,
6153		    direction        = Dir,
6154		    requestID        = RID}) ->
6155    is_SignalName(N) andalso
6156	is_opt_StreamID(SID) andalso
6157	is_opt_SignalType(ST) andalso
6158	is_opt_INTEGER(Dur, {range, 0, 65535}) andalso
6159	is_opt_NotifyCompletion(NC) andalso
6160	is_opt_BOOLEAN(KA) andalso
6161	is_Signal_sigParList(SPL) andalso
6162	is_opt_SignalDirection(Dir) andalso
6163	is_opt_RequestID(RID).
6164
6165is_Signal_sigParList([]) ->
6166    true;
6167is_Signal_sigParList([H|T]) ->
6168    is_SigParameter(H) andalso is_Signal_sigParList(T);
6169is_Signal_sigParList(_) ->
6170    false.
6171
6172chk_Signal(S, S) ->
6173    chk_type(fun is_Signal/1, 'Signal', S);
6174chk_Signal(#'Signal'{signalName       = N1,
6175		     streamID         = SID1,
6176		     sigType          = ST1,
6177		     duration         = Dur1,
6178		     notifyCompletion = NC1,
6179		     keepActive       = KA1,
6180		     sigParList       = SPL1,
6181		     direction        = Dir1,
6182		     requestID        = RID1},
6183	   #'Signal'{signalName       = N2,
6184		     streamID         = SID2,
6185		     sigType          = ST2,
6186		     duration         = Dur2,
6187		     notifyCompletion = NC2,
6188		     keepActive       = KA2,
6189		     sigParList       = SPL2,
6190		     direction        = Dir2,
6191		     requestID        = RID2}) ->
6192    validate(fun() -> chk_SignalName(N1, N2) end, 'Signal'),
6193    validate(fun() -> chk_opt_StreamID(SID1, SID2) end, 'Signal'),
6194    validate(fun() -> chk_opt_SignalType(ST1, ST2) end, 'Signal'),
6195    validate(fun() -> chk_opt_INTEGER(Dur1, Dur2, {range, 0, 65535}) end,
6196	     'Signal'),
6197    validate(fun() -> chk_opt_NotifyCompletion(NC1, NC2) end, 'Signal'),
6198    validate(fun() -> chk_opt_BOOLEAN(KA1, KA2) end, 'Signal'),
6199    chk_Signal_sigParList(SPL1, SPL2),
6200    validate(fun() -> chk_opt_SignalDirection(Dir1, Dir2) end, 'Signal'),
6201    validate(fun() -> chk_opt_RequestID(RID1, RID2) end, 'Signal'),
6202    ok;
6203chk_Signal(S1, S2) ->
6204    wrong_type('Signal', S1, S2).
6205
6206chk_Signal_sigParList([], []) ->
6207    ok;
6208chk_Signal_sigParList([] = L1, L2) ->
6209    not_equal('Signal_sigParList', L1, L2);
6210chk_Signal_sigParList(L1, [] = L2) ->
6211    not_equal('Signal_sigParList', L1, L2);
6212chk_Signal_sigParList([H|T1], [H|T2]) ->
6213    case is_SigParameter(H) of
6214	true ->
6215	    chk_Signal_sigParList(T1, T2);
6216	false ->
6217	    wrong_type('Signal_sigParList_val', H)
6218    end;
6219chk_Signal_sigParList([H1|T1], [H2|T2]) ->
6220    validate(fun() -> chk_SigParameter(H1, H2) end,
6221	     'Signal_sigParList_val'),
6222    chk_Signal_sigParList(T1, T2);
6223chk_Signal_sigParList(L1, L2) ->
6224    wrong_type('Signal_sigParList', L1, L2).
6225
6226
6227%% -- SignalType --
6228
6229is_opt_SignalType(T) ->
6230    is_OPTIONAL(fun is_SignalType/1, T).
6231
6232is_SignalType(T) ->
6233    Types = [brief, onOff, timeOut],
6234    lists:member(T, Types).
6235
6236chk_opt_SignalType(T1, T2) ->
6237    chk_OPTIONAL('SignalType', T1, T2,
6238		 fun is_SignalType/1, fun chk_SignalType/2).
6239
6240chk_SignalType(T, T) ->
6241    chk_type(fun is_SignalType/1, 'SignalType', T);
6242chk_SignalType(T1, T2) ->
6243    case (is_SignalType(T1) andalso is_SignalType(T2)) of
6244	true ->
6245	    not_equal('SignalType', T1, T2);
6246	false ->
6247	    wrong_type('SignalType', T1, T2)
6248    end.
6249
6250
6251%% -- SignalDirection --
6252
6253is_opt_SignalDirection(T) ->
6254    is_OPTIONAL(fun is_SignalDirection/1, T).
6255
6256is_SignalDirection(Dir) ->
6257    Dirs = [internal, external, both],
6258    lists:member(Dir, Dirs).
6259
6260chk_opt_SignalDirection(T1, T2) ->
6261    chk_OPTIONAL('SignalDirection', T1, T2,
6262		 fun is_SignalDirection/1, fun chk_SignalDirection/2).
6263
6264chk_SignalDirection(Dir, Dir) ->
6265    chk_type(fun is_SignalDirection/1, 'SignalDirection', Dir);
6266chk_SignalDirection(Dir1, Dir2) ->
6267    case (is_SignalDirection(Dir1) andalso is_SignalDirection(Dir2)) of
6268	true ->
6269	    not_equal('SignalDirection', Dir1, Dir2);
6270	false ->
6271	    wrong_type('SignalDirection', Dir1, Dir2)
6272    end.
6273
6274
6275%% -- SignalName --
6276
6277is_SignalName(N) -> is_PkgdName(N).
6278
6279chk_SignalName(N1, N2) ->
6280    validate(fun() -> chk_PkgdName(N1, N2) end, 'SignalName').
6281
6282
6283%% -- NotifyCompletion --
6284
6285is_opt_NotifyCompletion(NC) ->
6286    is_OPTIONAL(fun is_NotifyCompletion/1, NC).
6287
6288is_NotifyCompletion(NC) ->
6289    Valids = [onTimeOut,
6290	      onInterruptByEvent,
6291	      onInterruptByNewSignalDescr,
6292	      otherReason],
6293    lists:all(fun(X) -> lists:member(X, Valids) end, NC).
6294
6295chk_opt_NotifyCompletion(NC1, NC2) ->
6296    chk_OPTIONAL('NotifyCompletion', NC1, NC2,
6297		 fun is_NotifyCompletion/1,
6298		 fun chk_NotifyCompletion/2).
6299
6300chk_NotifyCompletion(NC, NC) ->
6301    chk_type(fun is_NotifyCompletion/1, 'NotifyCompletion', NC);
6302chk_NotifyCompletion(NC1, NC2) ->
6303    case (is_NotifyCompletion(NC1) andalso is_NotifyCompletion(NC2)) of
6304	true ->
6305	    not_equal('NotifyCompletion', NC1, NC2);
6306	false ->
6307	    wrong_type('NotifyCompletion', NC1, NC2)
6308    end.
6309
6310
6311%% -- SigParameter --
6312
6313is_SigParameter(#'SigParameter'{sigParameterName = N,
6314				value            = V,
6315				extraInfo        = I}) ->
6316    is_Name(N) andalso
6317	is_Value(V) andalso
6318	is_SigParameter_extraInfo(I);
6319is_SigParameter(_) ->
6320    false.
6321
6322is_SigParameter_extraInfo({Tag, Val}) ->
6323    is_SigParameter_extraInfo_tag(Tag) andalso
6324	is_SigParameter_extraInfo_val(Tag, Val);
6325is_SigParameter_extraInfo(_) ->
6326    false.
6327
6328is_SigParameter_extraInfo_tag(Tag) ->
6329    Tags = [relation, range, sublist],
6330    lists:member(Tag, Tags).
6331
6332is_SigParameter_extraInfo_val(relation, Val) ->
6333    is_Relation(Val);
6334is_SigParameter_extraInfo_val(range, Val) ->
6335    is_BOOLEAN(Val);
6336is_SigParameter_extraInfo_val(sublist, Val) ->
6337    is_BOOLEAN(Val).
6338
6339chk_SigParameter(P, P) ->
6340    chk_type(fun is_SigParameter/1, 'SigParameter', P);
6341chk_SigParameter(#'SigParameter'{sigParameterName = N1,
6342				 value            = V1,
6343				 extraInfo        = I1},
6344		 #'SigParameter'{sigParameterName = N2,
6345				 value            = V2,
6346				 extraInfo        = I2}) ->
6347    validate(fun() -> chk_Name(N1, N2) end, 'SigParameter'),
6348    validate(fun() -> chk_Value(V1, V2) end, 'SigParameter'),
6349    chk_SigParameter_extraInfo(I1, I2),
6350    ok;
6351chk_SigParameter(P1, P2) ->
6352    wrong_type('SigParameter', P1, P2).
6353
6354chk_SigParameter_extraInfo(EI, EI) ->
6355    chk_type(fun is_SigParameter_extraInfo/1, 'SigParameter_extraInfo', EI);
6356chk_SigParameter_extraInfo({Tag, Val1} = EI1, {Tag, Val2} = EI2) ->
6357    case (is_SigParameter_extraInfo_tag(Tag) and
6358	  is_SigParameter_extraInfo_val(Tag, Val1) and
6359	  is_SigParameter_extraInfo_val(Tag, Val2)) of
6360	true ->
6361	    chk_SigParameter_extraInfo_val(Tag, Val1, Val2);
6362	false ->
6363	    wrong_type('SigParameter_extraInfo', EI1, EI2)
6364    end;
6365chk_SigParameter_extraInfo({Tag1, Val1} = EI1, {Tag2, Val2} = EI2) ->
6366    case ((is_SigParameter_extraInfo_tag(Tag1) and
6367	   is_SigParameter_extraInfo_val(Tag1, Val1)) and
6368	  (is_SigParameter_extraInfo_tag(Tag2) and
6369	   is_SigParameter_extraInfo_val(Tag2, Val2))) of
6370	true ->
6371	    not_equal('SigParameter_extraInfo', EI1, EI2);
6372	false ->
6373	    wrong_type('SigParameter_extraInfo', EI1, EI2)
6374    end;
6375chk_SigParameter_extraInfo(EI1, EI2) ->
6376    wrong_type('SigParameter_extraInfo', EI1, EI2).
6377
6378chk_SigParameter_extraInfo_val(relation, Val1, Val2) ->
6379    validate(fun() -> chk_Relation(Val1, Val2) end, 'SigParameter_extraInfo');
6380chk_SigParameter_extraInfo_val(range, Val1, Val2) ->
6381    validate(fun() -> chk_BOOLEAN(Val1, Val2) end, 'SigParameter_extraInfo');
6382chk_SigParameter_extraInfo_val(sublist, Val1, Val2) ->
6383    validate(fun() -> chk_BOOLEAN(Val1, Val2) end, 'SigParameter_extraInfo').
6384
6385
6386%% -- RequestID --
6387
6388is_opt_RequestID(asn1_NOVALUE) ->
6389    true;
6390is_opt_RequestID(V) ->
6391    is_RequestID(V).
6392
6393is_RequestID(V) -> is_INTEGER(V, {range, 0, 4294967295}).
6394
6395chk_opt_RequestID(asn1_NOVALUE, asn1_NOVALUE) ->
6396    ok;
6397chk_opt_RequestID(V1, V2) ->
6398    chk_RequestID(V1, V2).
6399
6400chk_RequestID(ID, ID) ->
6401    chk_type(fun is_RequestID/1, 'RequestID', ID);
6402chk_RequestID(ID1, ID2) ->
6403    case (is_RequestID(ID1) andalso is_RequestID(ID2)) of
6404	true ->
6405	    not_equal('RequestID', ID1, ID2);
6406	false ->
6407	    wrong_type('RequestID', ID1, ID2)
6408    end.
6409
6410
6411%% -- ModemDescriptor --
6412
6413is_ModemDescriptor(D) when is_record(D, 'ModemDescriptor') ->
6414    true;
6415is_ModemDescriptor(_) ->
6416    false.
6417
6418chk_ModemDescriptor(D, D) when is_record(D, 'ModemDescriptor') ->
6419    ok;
6420chk_ModemDescriptor(#'ModemDescriptor'{mtl             = MTL1,
6421				       mpl             = MPL1,
6422				       nonStandardData = NSD1},
6423		    #'ModemDescriptor'{mtl             = MTL2,
6424				       mpl             = MPL2,
6425				       nonStandardData = NSD2}) ->
6426    chk_ModemDescriptor_mtl(MTL1, MTL2),
6427    chk_ModemDescriptor_mpl(MPL1, MPL2),
6428    chk_opt_NonStandardData(NSD1, NSD2),
6429    ok;
6430chk_ModemDescriptor(D1, D2) ->
6431    wrong_type('ModemDescriptor', D1, D2).
6432
6433chk_ModemDescriptor_mtl([], []) ->
6434    ok;
6435chk_ModemDescriptor_mtl([] = MTL1, MTL2) ->
6436    not_equal('ModemDescriptor_mtl', MTL1, MTL2);
6437chk_ModemDescriptor_mtl(MTL1, [] = MTL2) ->
6438    not_equal('ModemDescriptor_mtl', MTL1, MTL2);
6439chk_ModemDescriptor_mtl([H|T1], [H|T2]) ->
6440    case is_ModemType(H) of
6441	true ->
6442	    chk_ModemDescriptor_mtl(T1, T2);
6443	false ->
6444	    wrong_type('ModemDescriptor_mtl_val', H)
6445    end;
6446chk_ModemDescriptor_mtl([H1|T1], [H2|T2]) ->
6447    validate(fun() -> chk_ModemType(H1, H2) end, 'ModemDescriptor_mtl_val'),
6448    chk_ModemDescriptor_mtl(T1, T2);
6449chk_ModemDescriptor_mtl(MTL1, MTL2) ->
6450    wrong_type('ModemDescriptor_mtl', MTL1, MTL2).
6451
6452
6453chk_ModemDescriptor_mpl([], []) ->
6454    ok;
6455chk_ModemDescriptor_mpl([] = MPL1, MPL2) ->
6456    not_equal('ModemDescriptor_mpl', MPL1, MPL2);
6457chk_ModemDescriptor_mpl(MPL1, [] = MPL2) ->
6458    not_equal('ModemDescriptor_mpl', MPL1, MPL2);
6459chk_ModemDescriptor_mpl([H|T1], [H|T2]) ->
6460    case is_PropertyParm(H) of
6461	true ->
6462	    chk_ModemDescriptor_mpl(T1, T2);
6463	false ->
6464	    wrong_type('ModemDescriptor_mpl_val', H)
6465    end;
6466chk_ModemDescriptor_mpl([H1|T1], [H2|T2]) ->
6467    validate(fun() -> chk_PropertyParm(H1, H2) end, 'ModemDescriptor_mpl_val'),
6468    chk_ModemDescriptor_mpl(T1, T2);
6469chk_ModemDescriptor_mpl(MPL1, MPL2) ->
6470    wrong_type('ModemDescriptor_mpl', MPL1, MPL2).
6471
6472
6473%% -- ModemType --
6474
6475chk_ModemType(MT, MT) ->
6476    case is_ModemType(MT) of
6477	true ->
6478	    ok;
6479	false ->
6480	    wrong_type('ModemType', MT, MT)
6481    end;
6482chk_ModemType(MT1, MT2) ->
6483    case (is_ModemType(MT1) andalso is_ModemType(MT2)) of
6484	true ->
6485	    not_equal('ModemType', MT1, MT2);
6486	false ->
6487	    wrong_type('ModemType', MT1, MT2)
6488    end.
6489
6490is_ModemType(MT) ->
6491    lists:member(MT,
6492		 [v18, v22, v22bis, v32, v32bis, v34, v90, v91, synchISDN]).
6493
6494
6495%% -- DigitMapDescriptor --
6496
6497is_DigitMapDescriptor(#'DigitMapDescriptor'{digitMapName  = Name,
6498					    digitMapValue = Val}) ->
6499    is_opt_DigitMapName(Name) andalso is_opt_DigitMapValue(Val);
6500is_DigitMapDescriptor(_) ->
6501    false.
6502
6503chk_DigitMapDescriptor(D, D) ->
6504    chk_type(fun is_DigitMapDescriptor/1, 'DigitMapDescriptor', D);
6505chk_DigitMapDescriptor(#'DigitMapDescriptor'{digitMapName  = Name1,
6506					     digitMapValue = Val1},
6507		       #'DigitMapDescriptor'{digitMapName  = Name2,
6508					     digitMapValue = Val2}) ->
6509    d("chk_DigitMapDescriptor -> entry with"
6510      "~n   Name1: ~p"
6511      "~n   Name2: ~p"
6512      "~n   Val1:  ~p"
6513      "~n   Val2:  ~p", [Name1, Name2, Val1, Val2]),
6514    validate(fun() -> chk_opt_DigitMapName(Name1, Name2) end,
6515		      'DigitMapDescriptor'),
6516    validate(fun() -> chk_opt_DigitMapValue(Val1, Val2) end,
6517		      'DigitMapDescriptor'),
6518    ok;
6519chk_DigitMapDescriptor(D1, D2) ->
6520    wrong_type('DigitMapDescriptor', D1, D2).
6521
6522
6523%% -- DigitMapName --
6524
6525is_opt_DigitMapName(asn1_NOVALUE) ->
6526    true;
6527is_opt_DigitMapName(N) ->
6528    is_DigitMapName(N).
6529
6530is_DigitMapName(N) -> is_Name(N).
6531
6532chk_opt_DigitMapName(asn1_NOVALUE, asn1_NOVALUE) ->
6533    ok;
6534chk_opt_DigitMapName(N1, N2) ->
6535    chk_DigitMapName(N1, N2).
6536
6537chk_DigitMapName(N, N) ->
6538    chk_type(fun is_DigitMapName/1, 'DigitMapName', N);
6539chk_DigitMapName(N1, N2) ->
6540    case (is_DigitMapName(N1) andalso is_DigitMapName(N2)) of
6541	true ->
6542	    not_equal('DigitMapName', N1, N2);
6543	false ->
6544	    wrong_type('DigitMapName', N1, N2)
6545    end.
6546
6547
6548%% -- DigitMapValue --
6549
6550is_opt_DigitMapValue(V) ->
6551    is_OPTIONAL(fun is_DigitMapValue/1, V).
6552
6553is_DigitMapValue(#'DigitMapValue'{startTimer    = Start,
6554				  shortTimer    = Short,
6555				  longTimer     = Long,
6556				  digitMapBody  = Body,
6557				  durationTimer = Dur}) ->
6558    is_DigitMapValue_startTimer(Start) andalso
6559	is_DigitMapValue_shortTimer(Short) andalso
6560	is_DigitMapValue_longTimer(Long) andalso
6561	is_IA5String(Body) andalso
6562	is_DigitMapValue_durationTimer(Dur);
6563is_DigitMapValue(_) ->
6564    false.
6565
6566is_DigitMapValue_startTimer(asn1_NOVALUE)    -> true;
6567is_DigitMapValue_startTimer(T)               -> is_INTEGER(T, {range, 0, 99}).
6568
6569is_DigitMapValue_shortTimer(asn1_NOVALUE)    -> true;
6570is_DigitMapValue_shortTimer(T)               -> is_INTEGER(T, {range, 0, 99}).
6571
6572is_DigitMapValue_longTimer(asn1_NOVALUE)     -> true;
6573is_DigitMapValue_longTimer(T)                -> is_INTEGER(T, {range, 0, 99}).
6574
6575is_DigitMapValue_durationTimer(asn1_NOVALUE) -> true;
6576is_DigitMapValue_durationTimer(T)            -> is_INTEGER(T, {range, 0, 99}).
6577
6578chk_opt_DigitMapValue(V1, V2) ->
6579    chk_OPTIONAL('DigitMapValue', V1, V2,
6580		 fun is_DigitMapValue/1, fun chk_DigitMapValue/2).
6581
6582chk_DigitMapValue(#'DigitMapValue'{startTimer    = Start1,
6583				   shortTimer    = Short1,
6584				   longTimer     = Long1,
6585				   digitMapBody  = Body1,
6586				   durationTimer = Dur1},
6587		  #'DigitMapValue'{startTimer    = Start2,
6588				   shortTimer    = Short2,
6589				   longTimer     = Long2,
6590				   digitMapBody  = Body2,
6591				   durationTimer = Dur2}) ->
6592    d("chk_DigitMapValue -> entry with"
6593      "~n   Start1: ~p"
6594      "~n   Start2: ~p"
6595      "~n   Short1: ~p"
6596      "~n   Short2: ~p"
6597      "~n   Long1:  ~p"
6598      "~n   Long2:  ~p"
6599      "~n   Body1:  ~p"
6600      "~n   Body2:  ~p"
6601      "~n   Dur1:   ~p"
6602      "~n   Dur2:   ~p", [Start1, Start2,
6603			  Short1, Short2,
6604			  Long1, Long2,
6605			  Body1, Body2,
6606			  Dur1, Dur2]),
6607    chk_DigitMapValue_startTimer(Start1, Start2),
6608    chk_DigitMapValue_shortTimer(Short1, Short2),
6609    chk_DigitMapValue_longTimer(Long1, Long2),
6610    chk_DigitMapValue_digitMapBody(Body1, Body2),
6611    chk_DigitMapValue_durationTimer(Dur1, Dur2),
6612    ok;
6613chk_DigitMapValue(V1, V2) ->
6614    wrong_type('DigitMapValue', V1, V2).
6615
6616chk_DigitMapValue_startTimer(T, T) ->
6617    chk_type(fun is_DigitMapValue_startTimer/1, 'DigitMapValue_startTimer', T);
6618chk_DigitMapValue_startTimer(T1, T2) ->
6619    case (is_DigitMapValue_startTimer(T1) andalso
6620	  is_DigitMapValue_startTimer(T2)) of
6621	true ->
6622	    not_equal('DigitMapValue_startTimer', T1, T2);
6623	false ->
6624	    wrong_type('DigitMapValue_startTimer', T1, T2)
6625    end.
6626
6627chk_DigitMapValue_shortTimer(T, T) ->
6628    chk_type(fun is_DigitMapValue_shortTimer/1, 'DigitMapValue_shortTimer', T);
6629chk_DigitMapValue_shortTimer(T1, T2) ->
6630    case (is_DigitMapValue_shortTimer(T1) andalso
6631	  is_DigitMapValue_shortTimer(T2)) of
6632	true ->
6633	    not_equal('DigitMapValue_shortTimer', T1, T2);
6634	false ->
6635	    wrong_type('DigitMapValue_shortTimer', T1, T2)
6636    end.
6637
6638chk_DigitMapValue_longTimer(T, T) ->
6639    chk_type(fun is_DigitMapValue_longTimer/1, 'DigitMapValue_longTimer', T);
6640chk_DigitMapValue_longTimer(T1, T2) ->
6641    case (is_DigitMapValue_longTimer(T1) andalso
6642	  is_DigitMapValue_longTimer(T2)) of
6643	true ->
6644	    not_equal('DigitMapValue_longTimer', T1, T2);
6645	false ->
6646	    wrong_type('DigitMapValue_longTimer', T1, T2)
6647    end.
6648
6649chk_DigitMapValue_durationTimer(T, T) ->
6650    chk_type(fun is_DigitMapValue_durationTimer/1,
6651	     'DigitMapValue_durationTimer', T);
6652chk_DigitMapValue_durationTimer(T1, T2) ->
6653    case (is_DigitMapValue_durationTimer(T1) andalso
6654	  is_DigitMapValue_durationTimer(T2)) of
6655	true ->
6656	    not_equal('DigitMapValue_durationTimer', T1, T2);
6657	false ->
6658	    wrong_type('DigitMapValue_durationTimer', T1, T2)
6659    end.
6660
6661chk_DigitMapValue_digitMapBody(B, B) ->
6662    d("chk_DigitMapValue_digitMapBody -> entry with"
6663      "~n   B: ~p", [B]),
6664    chk_type(fun is_IA5String/1, 'DigitMapValue_digitMapBody', B);
6665chk_DigitMapValue_digitMapBody(B1, B2) ->
6666    d("chk_DigitMapValue_digitMapBody -> entry with"
6667      "~n   B1: ~p"
6668      "~n   B2: ~p", [B1, B2]),
6669    case (is_IA5String(B1) andalso is_IA5String(B2)) of
6670	true ->
6671	    %% If they are different it could be because
6672	    %% of trailing tab's and newline's.
6673	    case compare_strings(B1, B2) of
6674		{[], []} ->
6675		    ok;
6676		{Str1, []} ->
6677		    case strip_tab_and_newline(Str1) of
6678			[] ->
6679			    ok;
6680			_ ->
6681			    not_equal('DigitMapValue_digitMapBody', B1, B2)
6682		    end;
6683		{[], Str2} ->
6684		    case strip_tab_and_newline(Str2) of
6685			[] ->
6686			    ok;
6687			_ ->
6688			    not_equal('DigitMapValue_digitMapBody', B1, B2)
6689		    end;
6690		_ ->
6691		    not_equal('DigitMapValue_digitMapBody', B1, B2)
6692	    end;
6693	false ->
6694	    wrong_type('DigitMapValue_digitMapBody', B1, B2)
6695    end.
6696
6697%% -- ServiceChangeParm --
6698
6699is_ServiceChangeParm(#'ServiceChangeParm'{serviceChangeMethod  = M,
6700					  serviceChangeAddress = A,
6701					  serviceChangeVersion = V,
6702					  serviceChangeProfile = P,
6703					  serviceChangeReason  = R,
6704					  serviceChangeDelay   = D,
6705					  serviceChangeMgcId   = Id,
6706					  timeStamp            = TS,
6707					  nonStandardData      = NSD,
6708					  serviceChangeInfo    = I}) ->
6709    is_ServiceChangeMethod(M) andalso
6710	is_opt_ServiceChangeAddress(A) andalso
6711	is_opt_INTEGER(V, {range, 0, 99}) andalso
6712	is_opt_ServiceChangeProfile(P) andalso
6713	is_Value(R) andalso
6714	is_opt_INTEGER(D, {range, 0, 4294967295}) andalso
6715	is_opt_MId(Id) andalso
6716	is_opt_TimeNotation(TS) andalso
6717	is_opt_NonStandardData(NSD) andalso
6718	is_opt_AuditDescriptor(I);
6719is_ServiceChangeParm(_) ->
6720    false.
6721
6722chk_ServiceChangeParm(P, P) ->
6723    chk_type(fun is_ServiceChangeParm/1, 'ServiceChangeParm', P);
6724chk_ServiceChangeParm(#'ServiceChangeParm'{serviceChangeMethod  = M1,
6725					   serviceChangeAddress = A1,
6726					   serviceChangeVersion = V1,
6727					   serviceChangeProfile = P1,
6728					   serviceChangeReason  = R1,
6729					   serviceChangeDelay   = D1,
6730					   serviceChangeMgcId   = Id1,
6731					   timeStamp            = TS1,
6732					   nonStandardData      = NSD1,
6733					   serviceChangeInfo    = I1},
6734		      #'ServiceChangeParm'{serviceChangeMethod  = M2,
6735					   serviceChangeAddress = A2,
6736					   serviceChangeVersion = V2,
6737					   serviceChangeProfile = P2,
6738					   serviceChangeReason  = R2,
6739					   serviceChangeDelay   = D2,
6740					   serviceChangeMgcId   = Id2,
6741					   timeStamp            = TS2,
6742					   nonStandardData      = NSD2,
6743					   serviceChangeInfo    = I2}) ->
6744    validate(fun() -> chk_ServiceChangeMethod(M1, M2) end,
6745	     'ServiceChangeParm'),
6746    validate(fun() -> chk_opt_ServiceChangeAddress(A1, A2) end,
6747	     'ServiceChangeParm'),
6748    validate(fun() -> chk_opt_INTEGER(V1, V2, {range, 0, 99}) end,
6749	     'ServiceChangeParm'),
6750    validate(fun() -> chk_opt_ServiceChangeProfile(P1, P2) end,
6751	     'ServiceChangeParm'),
6752    validate(fun() -> chk_Value(R1, R2) end,
6753	     'ServiceChangeParm'),
6754    validate(fun() -> chk_opt_INTEGER(D1, D2, {range, 0, 4294967295}) end,
6755	     'ServiceChangeParm'),
6756    validate(fun() -> chk_opt_MId(Id1, Id2) end,
6757	     'ServiceChangeParm'),
6758    validate(fun() -> chk_opt_TimeNotation(TS1, TS2) end,
6759	     'ServiceChangeParm'),
6760    validate(fun() -> chk_opt_NonStandardData(NSD1, NSD2) end,
6761	     'ServiceChangeParm'),
6762    validate(fun() -> chk_opt_AuditDescriptor(I1, I2) end,
6763	     'ServiceChangeParm'),
6764    ok;
6765chk_ServiceChangeParm(P1, P2) ->
6766    wrong_type('ServiceChangeParm', P1, P2).
6767
6768
6769%% -- ServiceChangeAddress --
6770
6771is_opt_ServiceChangeAddress(A) ->
6772    is_OPTIONAL(fun is_ServiceChangeAddress/1, A).
6773
6774is_ServiceChangeAddress({Tag, Val}) ->
6775    is_ServiceChangeAddress_tag(Tag) andalso
6776	is_ServiceChangeAddress_val(Tag, Val);
6777is_ServiceChangeAddress(_) ->
6778    false.
6779
6780is_ServiceChangeAddress_tag(Tag) ->
6781    Tags = [portNumber, ip4Address, ip6Address, domainName, deviceName,
6782	    mtpAddress],
6783    lists:member(Tag, Tags).
6784
6785is_ServiceChangeAddress_val(portNumber, Val) ->
6786    is_INTEGER(Val, {range, 0, 65535});
6787is_ServiceChangeAddress_val(ip4Address, Val) ->
6788    is_IP4Address(Val);
6789is_ServiceChangeAddress_val(ip6Address, Val) ->
6790    is_IP6Address(Val);
6791is_ServiceChangeAddress_val(domainName, Val) ->
6792    is_DomainName(Val);
6793is_ServiceChangeAddress_val(deviceName, Val) ->
6794    is_PathName(Val);
6795is_ServiceChangeAddress_val(mtpAddress, Val) ->
6796    is_OCTET_STRING(Val, {range, 2, 4}).
6797
6798
6799chk_opt_ServiceChangeAddress(A1, A2) ->
6800    chk_OPTIONAL('ServiceChangeAddress', A1, A2,
6801		 fun is_ServiceChangeAddress/1,
6802		 fun chk_ServiceChangeAddress/2).
6803
6804chk_ServiceChangeAddress(A, A) ->
6805    chk_type(fun is_ServiceChangeAddress/1, 'ServiceChangeAddress', A);
6806chk_ServiceChangeAddress({Tag, Val1} = A1, {Tag, Val2} = A2) ->
6807    case (is_ServiceChangeAddress_tag(Tag) andalso
6808	  is_ServiceChangeAddress_val(Tag, Val1) andalso
6809	  is_ServiceChangeAddress_val(Tag, Val2)) of
6810	true ->
6811	    chk_ServiceChangeAddress_val(Tag, Val1, Val2);
6812	false ->
6813	    wrong_type('ServiceChangeAddress', A1, A2)
6814    end;
6815chk_ServiceChangeAddress({Tag1, Val1} = A1, {Tag2, Val2} = A2) ->
6816    case ((is_ServiceChangeAddress_tag(Tag1) andalso
6817	   is_ServiceChangeAddress_val(Tag1, Val1)) andalso
6818	  (is_ServiceChangeAddress_tag(Tag2) andalso
6819	   is_ServiceChangeAddress_val(Tag2, Val2))) of
6820	true ->
6821	    not_equal('ServiceChangeAddress', A1, A2);
6822	false ->
6823	    wrong_type('ServiceChangeAddress', A1, A2)
6824    end;
6825chk_ServiceChangeAddress(A1, A2) ->
6826    wrong_type('ServiceChangeAddress', A1, A2).
6827
6828chk_ServiceChangeAddress_val(portNumber, Val1, Val2) ->
6829    validate(fun() -> chk_INTEGER(Val1, Val2, {range, 0, 99}) end,
6830	     'ServiceChangeAddress');
6831chk_ServiceChangeAddress_val(ip4Address, Val1, Val2) ->
6832    validate(fun() -> chk_IP4Address(Val1, Val2) end,
6833	     'ServiceChangeAddress');
6834chk_ServiceChangeAddress_val(ip6Address, Val1, Val2) ->
6835    validate(fun() -> chk_IP6Address(Val1, Val2) end,
6836	     'ServiceChangeAddress');
6837chk_ServiceChangeAddress_val(domainName, Val1, Val2) ->
6838    validate(fun() -> chk_DomainName(Val1, Val2) end,
6839	     'ServiceChangeAddress');
6840chk_ServiceChangeAddress_val(deviceName, Val1, Val2) ->
6841    validate(fun() -> chk_PathName(Val1, Val2) end,
6842	     'ServiceChangeAddress');
6843chk_ServiceChangeAddress_val(mtpAddress, Val1, Val2) ->
6844    validate(fun() -> chk_OCTET_STRING(Val1, Val2, {range, 2, 4}) end,
6845	     'ServiceChangeAddress').
6846
6847
6848%% -- ServiceChangeResParm --
6849
6850is_ServiceChangeResParm(#'ServiceChangeResParm'{serviceChangeMgcId   = Id,
6851						serviceChangeAddress = A,
6852						serviceChangeVersion = V,
6853						serviceChangeProfile = P,
6854						timeStamp            = TS}) ->
6855    is_opt_MId(Id) andalso
6856	is_opt_ServiceChangeAddress(A) andalso
6857	is_opt_INTEGER(V, {range, 0, 99}) andalso
6858	is_opt_ServiceChangeProfile(P) andalso
6859	is_opt_TimeNotation(TS);
6860is_ServiceChangeResParm(_) ->
6861    false.
6862
6863chk_ServiceChangeResParm(P, P) ->
6864    chk_type(fun is_ServiceChangeResParm/1, 'ServiceChangeResParm', P);
6865chk_ServiceChangeResParm(
6866  #'ServiceChangeResParm'{serviceChangeMgcId   = Id1,
6867			  serviceChangeAddress = A1,
6868			  serviceChangeVersion = V1,
6869			  serviceChangeProfile = P1,
6870			  timeStamp            = TS1},
6871  #'ServiceChangeResParm'{serviceChangeMgcId   = Id2,
6872			  serviceChangeAddress = A2,
6873			  serviceChangeVersion = V2,
6874			  serviceChangeProfile = P2,
6875			  timeStamp            = TS2}) ->
6876    validate(fun() -> chk_opt_MId(Id1, Id2) end, 'ServiceChangeResParm'),
6877    validate(fun() -> chk_opt_ServiceChangeAddress(A1, A2) end,
6878	     'ServiceChangeResParm'),
6879    validate(fun() -> chk_opt_INTEGER(V1, V2, {range, 0, 99}) end,
6880	     'ServiceChangeResParm'),
6881    validate(fun() -> chk_opt_ServiceChangeProfile(P1, P2) end,
6882	     'ServiceChangeResParm'),
6883    validate(fun() -> chk_opt_TimeNotation(TS1, TS2) end,
6884	     'ServiceChangeResParm'),
6885    ok;
6886chk_ServiceChangeResParm(P1, P2) ->
6887    wrong_type('ServiceChangeResParm', P1, P2).
6888
6889
6890%% -- ServiceChangeMethod --
6891
6892is_ServiceChangeMethod(M) ->
6893    Methods = [failover, forced, graceful, restart, disconnected, handOff],
6894    lists:member(M, Methods).
6895
6896chk_ServiceChangeMethod(M, M) ->
6897    chk_type(fun is_ServiceChangeMethod/1, 'ServiceChangeMethod', M);
6898chk_ServiceChangeMethod(M1, M2) ->
6899    case (is_ServiceChangeMethod(M1) andalso is_ServiceChangeMethod(M2)) of
6900	true ->
6901	    not_equal('ServiceChangeMethod', M1, M2);
6902	false ->
6903	    wrong_type('ServiceChangeMethod', M1, M2)
6904    end.
6905
6906
6907%% -- ServiceChangeProfile --
6908
6909is_opt_ServiceChangeProfile(P) ->
6910    is_OPTIONAL(fun is_ServiceChangeProfile/1, P).
6911
6912is_ServiceChangeProfile(#'ServiceChangeProfile'{profileName = N}) ->
6913    is_IA5String(N, {range, 1, 67});
6914is_ServiceChangeProfile(_) ->
6915    false.
6916
6917chk_opt_ServiceChangeProfile(P1, P2) ->
6918    chk_OPTIONAL('ServiceChangeProfile', P1, P2,
6919		 fun is_ServiceChangeProfile/1,
6920		 fun chk_ServiceChangeProfile/2).
6921
6922chk_ServiceChangeProfile(P, P) ->
6923    chk_type(fun is_ServiceChangeProfile/1, 'ServiceChangeProfile', P);
6924chk_ServiceChangeProfile(#'ServiceChangeProfile'{profileName = N1},
6925			 #'ServiceChangeProfile'{profileName = N2}) ->
6926    validate(fun() -> chk_IA5String(N1, N2, {range, 1, 67}) end,
6927	     'ServiceChangeProfile'),
6928    ok;
6929chk_ServiceChangeProfile(P1, P2) ->
6930    wrong_type('ServiceChangeProfile', P1, P2).
6931
6932
6933%% -- PackagesDescriptor --
6934
6935is_PackagesDescriptor([]) ->
6936    true;
6937is_PackagesDescriptor([H|T]) ->
6938    is_PackagesItem(H) andalso is_PackagesDescriptor(T);
6939is_PackagesDescriptor(_) ->
6940    false.
6941
6942chk_PackagesDescriptor([], []) ->
6943    ok;
6944chk_PackagesDescriptor([] = D1, D2) ->
6945    not_equal('PackagesDescriptor', D1, D2);
6946chk_PackagesDescriptor(D1, [] = D2) ->
6947    not_equal('PackagesDescriptor', D1, D2);
6948chk_PackagesDescriptor([H|T1], [H|T2]) ->
6949    case is_PackagesItem(H) of
6950	true ->
6951	    chk_PackagesDescriptor(T1, T2);
6952	false ->
6953	    wrong_type('PackagesDescriptor_val', H)
6954    end;
6955chk_PackagesDescriptor([H1|T1], [H2|T2]) ->
6956    validate(fun() -> chk_PackagesItem(H1, H2) end,
6957	     'PackagesDescriptor_val'),
6958    chk_PackagesDescriptor(T1, T2);
6959chk_PackagesDescriptor(D1, D2) ->
6960    wrong_type('PackagesDescriptor_val', D1, D2).
6961
6962
6963%% -- PackagesItem --
6964
6965is_PackagesItem(#'PackagesItem'{packageName    = N,
6966				packageVersion = V}) ->
6967    is_Name(N) andalso is_INTEGER(V, {range, 0, 99});
6968is_PackagesItem(_) ->
6969    false.
6970
6971chk_PackagesItem(I, I) ->
6972    chk_type(fun is_PackagesItem/1, 'PackagesItem', I);
6973chk_PackagesItem(#'PackagesItem'{packageName    = N1,
6974				 packageVersion = V1},
6975		 #'PackagesItem'{packageName    = N2,
6976				 packageVersion = V2}) ->
6977    validate(fun() -> chk_Name(N1, N2) end, 'PackagesItem'),
6978    validate(fun() -> chk_INTEGER(V1, V2, {range, 0, 99}) end, 'PackagesItem'),
6979    ok;
6980chk_PackagesItem(I1, I2) ->
6981    wrong_type('PackagesItem', I1, I2).
6982
6983
6984%% -- StatisticsDescriptor --
6985
6986is_opt_StatisticsDescriptor(D) ->
6987    is_OPTIONAL(fun is_StatisticsDescriptor/1, D).
6988
6989is_StatisticsDescriptor([]) ->
6990    true;
6991is_StatisticsDescriptor([H|T]) ->
6992    is_StatisticsParameter(H) andalso is_StatisticsDescriptor(T);
6993is_StatisticsDescriptor(_) ->
6994    false.
6995
6996chk_opt_StatisticsDescriptor(D1, D2) ->
6997    chk_OPTIONAL('StatisticsDescriptor', D1, D2,
6998		 fun is_StatisticsDescriptor/1,
6999		 fun chk_StatisticsDescriptor/2).
7000
7001chk_StatisticsDescriptor([], []) ->
7002    ok;
7003chk_StatisticsDescriptor([] = D1, D2) ->
7004    not_equal('StatisticsDescriptor', D1, D2);
7005chk_StatisticsDescriptor(D1, [] = D2) ->
7006    not_equal('StatisticsDescriptor', D1, D2);
7007chk_StatisticsDescriptor([H|T1], [H|T2]) ->
7008    case is_StatisticsParameter(H) of
7009	true ->
7010	    chk_StatisticsDescriptor(T1, T2);
7011	false ->
7012	    wrong_type('StatisticsDescriptor_val', H)
7013    end;
7014chk_StatisticsDescriptor([H1|T1], [H2|T2]) ->
7015    validate(fun() -> chk_StatisticsParameter(H1, H2) end,
7016	     'StatisticsDescriptor_val'),
7017    chk_StatisticsDescriptor(T1, T2);
7018chk_StatisticsDescriptor(D1, D2) ->
7019    wrong_type('StatisticsDescriptor_val', D1, D2).
7020
7021
7022%% -- StatisticsParameter --
7023
7024is_StatisticsParameter(#'StatisticsParameter'{statName  = N,
7025					      statValue = V}) ->
7026    is_PkgdName(N) andalso is_opt_Value(V);
7027is_StatisticsParameter(_) ->
7028    false.
7029
7030chk_StatisticsParameter(P, P) ->
7031    chk_type(fun is_StatisticsParameter/1, 'StatisticsParameter', P);
7032chk_StatisticsParameter(#'StatisticsParameter'{statName  = N1,
7033					       statValue = V1},
7034			#'StatisticsParameter'{statName  = N2,
7035					       statValue = V2}) ->
7036    validate(fun() -> chk_PkgdName(N1, N2) end, 'StatisticsParameter'),
7037    validate(fun() -> chk_opt_Value(V1, V2) end, 'StatisticsParameter'),
7038    ok;
7039chk_StatisticsParameter(P1, P2) ->
7040    wrong_type('StatisticsParameter', P1, P2).
7041
7042
7043%% -- NonStandardData --
7044
7045is_opt_NonStandardData(asn1_NOVALUE) ->
7046    true;
7047is_opt_NonStandardData(NSD) ->
7048    is_NonStandardData(NSD).
7049
7050%% is_NonStandardData(#'NonStandardData'{nonStandardIdentifier = Id,
7051%% 				      data                  = D}) ->
7052%%     is_NonStandardIdentifier(Id) andalso is_OCTET_STRING(D);
7053%% is_NonStandardData(_) ->
7054%%     false.
7055
7056is_NonStandardData(_) ->
7057    true.
7058
7059chk_opt_NonStandardData(asn1_NOVALUE, asn1_NOVALUE) ->
7060    true;
7061chk_opt_NonStandardData(NSD1, NSD2) ->
7062    chk_NonStandardData(NSD1, NSD2).
7063
7064chk_NonStandardData(NSD, NSD) ->
7065    chk_type(fun is_NonStandardData/1, 'NonStandardData', NSD);
7066%% chk_NonStandardData(#'NonStandardData'{nonStandardIdentifier = Id1,
7067%% 				       data                  = D1},
7068%% 		    #'NonStandardData'{nonStandardIdentifier = Id2,
7069%% 				       data                  = D2}) ->
7070%%     validate(fun() -> chk_NonStandardIdentifier(Id1, Id2) end,
7071%% 	     'NonStandardData'),
7072%%     validate(fun() -> chk_OCTET_STRING(D1, D2) end, 'NonStandardData'),
7073%%     ok;
7074%% chk_NonStandardData(NSD1, NSD2) ->
7075%%     wrong_type('NonStandardData', NSD1, NSD2).
7076chk_NonStandardData(NSD1, NSD2) ->
7077    not_equal('NonStandardData', NSD1, NSD2).
7078
7079
7080%% -- NonStandardIdentifier --
7081
7082%% is_NonStandardIdentifier({Tag, Val}) ->
7083%%     is_NonStandardIdentifier_tag(Tag) andalso
7084%% 	is_NonStandardIdentifier_val(Tag, Val);
7085%% is_NonStandardIdentifier(_) ->
7086%%     false.
7087
7088%% is_NonStandardIdentifier_tag(Tag) ->
7089%%     Tags = [object, h221NonStandard, experimental],
7090%%     lists:member(Tag, Tags).
7091
7092%% is_NonStandardIdentifier_val(object, Val) ->
7093%%     is_OBJECT_IDENTIFIER(Val);
7094%% is_NonStandardIdentifier_val(h221NonStandard, Val) ->
7095%%     is_H221NonStandard(Val);
7096%% is_NonStandardIdentifier_val(experimental, Val) ->
7097%%     is_IA5String(Val, {exact, 8}).
7098
7099%% chk_NonStandardIdentifier(Id, Id) ->
7100%%     chk_type(fun is_NonStandardIdentifier/1, 'NonStandardIdentifier', Id);
7101%% chk_NonStandardIdentifier({Tag, Val1} = Id1, {Tag, Val2} = Id2) ->
7102%%     case (is_NonStandardIdentifier_tag(Tag) andalso
7103%% 	  is_NonStandardIdentifier_val(Tag, Val1) andalso
7104%% 	  is_NonStandardIdentifier_val(Tag, Val1)) of
7105%% 	true ->
7106%% 	    chk_NonStandardIdentifier_val(Tag, Val1, Val2);
7107%% 	false ->
7108%% 	    wrong_type('NonStandardIdentifier', Id1, Id2)
7109%%     end;
7110%% chk_NonStandardIdentifier({Tag1, Val1} = Id1, {Tag2, Val2} = Id2) ->
7111%%     case ((is_NonStandardIdentifier_tag(Tag1) andalso
7112%% 	   is_NonStandardIdentifier_val(Tag1, Val1)) andalso
7113%% 	  (is_NonStandardIdentifier_tag(Tag2) andalso
7114%% 	   is_NonStandardIdentifier_val(Tag2, Val1))) of
7115%% 	true ->
7116%% 	    not_equal('NonStandardIdentifier', Id1, Id2);
7117%% 	false ->
7118%% 	    wrong_type('NonStandardIdentifier', Id1, Id2)
7119%%     end;
7120%% chk_NonStandardIdentifier(Id1, Id2) ->
7121%%     wrong_type('NonStandardIdentifier', Id1, Id2).
7122
7123%% chk_NonStandardIdentifier_val(object, Val1, Val2) ->
7124%%     chk_OBJECT_IDENTIFIER(Val1, Val2);
7125%% chk_NonStandardIdentifier_val(h221NonStandard, Val1, Val2) ->
7126%%     chk_H221NonStandard(Val1, Val2);
7127%% chk_NonStandardIdentifier_val(experimental, Val1, Val2) ->
7128%%     chk_IA5String(Val1, Val2, {exact, 8}).
7129
7130
7131%% -- H221NonStandard --
7132
7133%% is_H221NonStandard(#'H221NonStandard'{t35CountryCode1  = CC1,
7134%% 				      t35CountryCode2  = CC2,
7135%% 				      t35Extension     = Ext,
7136%% 				      manufacturerCode = MC}) ->
7137%%     is_INTEGER(CC1, {range, 0, 255}) andalso
7138%% 	is_INTEGER(CC2, {range, 0, 255}) andalso
7139%% 	is_INTEGER(Ext, {range, 0, 255}) andalso
7140%% 	is_INTEGER(Ext, {range, 0, 65535});
7141%% is_H221NonStandard(_) ->
7142%%     false.
7143
7144%% chk_H221NonStandard(NS, NS) ->
7145%%     chk_type(fun is_H221NonStandard/1, 'H221NonStandard', NS);
7146%% chk_H221NonStandard(#'H221NonStandard'{t35CountryCode1  = CC11,
7147%% 				       t35CountryCode2  = CC21,
7148%% 				       t35Extension     = Ext1,
7149%% 				       manufacturerCode = MC1},
7150%% 		    #'H221NonStandard'{t35CountryCode1  = CC12,
7151%% 				       t35CountryCode2  = CC22,
7152%% 				       t35Extension     = Ext2,
7153%% 				       manufacturerCode = MC2}) ->
7154%%     validate(fun() -> chk_INTEGER(CC11, CC12, {range, 0, 255}) end,
7155%% 	     'H221NonStandard'),
7156%%     validate(fun() -> chk_INTEGER(CC21, CC22, {range, 0, 255}) end,
7157%% 	     'H221NonStandard'),
7158%%     validate(fun() -> chk_INTEGER(Ext1, Ext2, {range, 0, 255}) end,
7159%% 	     'H221NonStandard'),
7160%%     validate(fun() -> chk_INTEGER(MC1, MC2, {range, 0, 65535}) end,
7161%% 	     'H221NonStandard'),
7162%%     ok;
7163%% chk_H221NonStandard(NS1, NS2) ->
7164%%     wrong_type('H221NonStandard', NS1, NS2).
7165
7166
7167%% -- TimeNotation --
7168
7169is_opt_TimeNotation(asn1_NOVALUE) ->
7170    true;
7171is_opt_TimeNotation(TN) ->
7172    is_TimeNotation(TN).
7173
7174is_TimeNotation(#'TimeNotation'{date = D, time = T}) ->
7175    is_IA5String(D, {exact, 8}) andalso is_IA5String(T, {exact, 8});
7176is_TimeNotation(_) ->
7177    false.
7178
7179chk_opt_TimeNotation(asn1_NOVALUE, asn1_NOVALUE) ->
7180    ok;
7181chk_opt_TimeNotation(TN1, TN2) ->
7182    chk_TimeNotation(TN1, TN2).
7183
7184chk_TimeNotation(TN, TN) ->
7185    chk_type(fun is_TimeNotation/1, 'TimeNotation', TN);
7186chk_TimeNotation(#'TimeNotation'{date = D1, time = T1},
7187		 #'TimeNotation'{date = D2, time = T2}) ->
7188    validate(fun() -> chk_IA5String(D1, D2, {exact, 8}) end, 'TimeNotation'),
7189    validate(fun() -> chk_IA5String(T1, T2, {exact, 8}) end, 'TimeNotation'),
7190    ok;
7191chk_TimeNotation(TN1, TN2) ->
7192    wrong_type('TimeNotation', TN1, TN2).
7193
7194
7195%% -- Value --
7196
7197is_opt_Value(V) ->
7198    is_OPTIONAL(fun is_Value/1, V).
7199
7200is_Value([]) ->
7201    true;
7202is_Value([H|T]) ->
7203    is_OCTET_STRING(H) andalso is_Value(T);
7204is_Value(_) ->
7205    false.
7206
7207chk_opt_Value(V1, V2) ->
7208    chk_OPTIONAL('Value', V1, V2, fun is_Value/1, fun chk_Value/2).
7209
7210chk_Value(V, V) ->
7211    case is_Value(V) of
7212	true ->
7213	    ok;
7214	false ->
7215	    wrong_type('Value', V, V)
7216    end;
7217chk_Value(V1, V2) ->
7218    case (is_Value(V1) andalso is_Value(V2)) of
7219	true ->
7220	    not_equal('Value', V1, V2);
7221	false ->
7222	    wrong_type('Value', V1, V2)
7223    end.
7224
7225
7226%% ----------------------------------------------------------------------
7227%% Basic type check functions
7228%% ----------------------------------------------------------------------
7229
7230
7231is_opt_BOOLEAN(B) ->
7232    is_OPTIONAL(fun is_BOOLEAN/1, B).
7233
7234is_BOOLEAN(B) ->
7235    lists:member(B, [true, false]).
7236
7237chk_opt_BOOLEAN(B1, B2) ->
7238    chk_OPTIONAL('BOOLEAN', B1, B2, fun is_BOOLEAN/1, fun chk_BOOLEAN/2).
7239
7240chk_BOOLEAN(B, B) ->
7241    chk_type(fun is_BOOLEAN/1, 'BOOLEAN', B);
7242chk_BOOLEAN(B1, B2) ->
7243    case (is_BOOLEAN(B1) andalso is_BOOLEAN(B2)) of
7244	true ->
7245	    not_equal('BOOLEAN', B1, B2);
7246	false ->
7247	    wrong_type('BOOLEAN', B1, B2)
7248    end.
7249
7250
7251is_IA5String(S) when is_list(S) ->
7252    true;
7253is_IA5String(_) ->
7254    false.
7255
7256% chk_IA5String(S, S) ->
7257%     chk_type(fun is_IA5String/1, 'IA5String', S);
7258% chk_IA5String(S1, S2) ->
7259%     case (is_IA5String(S1) andalso is_IA5String(S2)) of
7260% 	true ->
7261% 	    not_equal('IA5String', S1, S2);
7262% 	false ->
7263% 	    wrong_type('IA5String', S1, S2)
7264%     end.
7265
7266is_IA5String(S, _) when is_list(S) ->
7267    true;
7268is_IA5String(_, _) ->
7269    false.
7270
7271chk_IA5String(S, S, R) ->
7272    chk_type(fun is_IA5String/2, 'IA5String', S, R);
7273chk_IA5String(S1, S2, R) ->
7274    case (is_IA5String(S1, R) andalso is_IA5String(S2, R)) of
7275	true ->
7276	    not_equal('IA5String', S1, S2);
7277	false ->
7278	    wrong_type('IA5String', S1, S2)
7279    end.
7280
7281
7282is_OCTET_STRING(L) -> is_OCTET_STRING(L, any).
7283
7284is_OCTET_STRING(L, any) when is_list(L) ->
7285    true;
7286is_OCTET_STRING(L, {exact, Len}) when is_list(L) andalso (length(L) =:= Len) ->
7287    true;
7288is_OCTET_STRING(L, {atleast, Len}) when is_list(L) andalso (Len =< length(L)) ->
7289    true;
7290is_OCTET_STRING(L, {atmost, Len}) when is_list(L) andalso (length(L) =< Len) ->
7291    true;
7292is_OCTET_STRING(L, {range, Min, Max})
7293  when is_list(L) andalso (Min =< length(L)) andalso (length(L) =< Max) ->
7294    true;
7295is_OCTET_STRING(_, _) ->
7296    false.
7297
7298%% chk_OCTET_STRING(L1, L2) ->
7299%%     chk_OCTET_STRING(L1, L2, any).
7300
7301chk_OCTET_STRING(L, L, R) ->
7302    chk_type(fun is_OCTET_STRING/2, 'OCTET STRING', L, R);
7303chk_OCTET_STRING(L1, L2, R) ->
7304    case (is_OCTET_STRING(L1, R) andalso is_OCTET_STRING(L2, R)) of
7305	true ->
7306	    not_equal('OCTET STRING', L1, L2);
7307	false ->
7308	    wrong_type('OCTET STRING', L1, L2)
7309    end.
7310
7311
7312%% is_OBJECT_IDENTIFIER(_) ->
7313%%     true.
7314
7315%% chk_OBJECT_IDENTIFIER(X, X) ->
7316%%     ok;
7317%% chk_OBJECT_IDENTIFIER(X1, X2) ->
7318%%     not_equal('OBJECT IDENTIFIER', X1, X2).
7319
7320
7321is_opt_NULL(N) ->
7322    is_OPTIONAL(fun is_NULL/1, N).
7323
7324is_NULL('NULL') ->
7325    true;
7326is_NULL(_) ->
7327    false.
7328
7329chk_opt_NULL(N1, N2) ->
7330    chk_OPTIONAL('NULL', N1, N2, fun is_NULL/1, fun chk_NULL/2).
7331
7332chk_NULL(N, N) ->
7333    chk_type(fun is_NULL/1, 'NULL', N);
7334chk_NULL(N1, N2) ->
7335    case (is_NULL(N1) andalso is_NULL(N2)) of
7336	true ->
7337	    not_equal('NULL', N1, N2);
7338	false ->
7339	    wrong_type('NULL', N1, N2)
7340    end.
7341
7342
7343is_opt_INTEGER(I, R) ->
7344    is_OPTIONAL(fun(X) -> is_INTEGER(X, R) end, I).
7345
7346is_INTEGER(I, any) when is_integer(I) ->
7347    true;
7348is_INTEGER(I, {exact, I}) when is_integer(I) ->
7349    true;
7350is_INTEGER(I, {atleast, Min}) when is_integer(I) andalso is_integer(Min) andalso (Min =< I) ->
7351    true;
7352is_INTEGER(I, {atmost, Max}) when is_integer(I) andalso is_integer(Max) andalso (I =< Max) ->
7353    true;
7354is_INTEGER(I, {range, Min, Max})
7355  when is_integer(I) andalso
7356       is_integer(Min) andalso
7357       is_integer(Max) andalso
7358       (Min =< I) andalso (I =< Max) ->
7359    true;
7360is_INTEGER(_, _) ->
7361    false.
7362
7363chk_opt_INTEGER(I1, I2, R) ->
7364    chk_OPTIONAL('INTEGER', I1, I2,
7365		 fun(X) -> is_INTEGER(X, R) end,
7366		 fun(Y1, Y2) -> chk_INTEGER(Y1, Y2, R) end).
7367
7368chk_INTEGER(I, I, R) ->
7369    chk_type(fun is_INTEGER/2, 'INTEGER', I, R);
7370chk_INTEGER(I1, I2, R) ->
7371    case (is_INTEGER(I1, R) andalso is_INTEGER(I2, R)) of
7372	true ->
7373	    not_equal('INTEGER', I1, I2);
7374	false ->
7375	    wrong_type('INTEGER', I1, I2)
7376    end.
7377
7378
7379%% ----------------------------------------------------------------------
7380%% Various utility functions
7381%% ----------------------------------------------------------------------
7382
7383
7384to_lower([C|Cs]) when (C >= $A) andalso (C =< $Z) ->
7385    [C+($a-$A)|to_lower(Cs)];
7386to_lower([C|Cs]) ->
7387    [C|to_lower(Cs)];
7388to_lower([]) ->
7389    [].
7390
7391
7392validate(F, Type) when is_function(F) ->
7393    case (catch F()) of
7394	{error, Reason} ->
7395	    error({Type, Reason});
7396	ok ->
7397	    ok
7398    end.
7399
7400
7401chk_type(F, T, V) when is_function(F) andalso is_atom(T) ->
7402    case F(V) of
7403	true ->
7404	    ok;
7405	false ->
7406	    wrong_type(T, V)
7407    end.
7408
7409chk_type(F, T, V1, V2) when is_function(F) andalso is_atom(T) ->
7410    case F(V1, V2) of
7411	true ->
7412	    ok;
7413	false ->
7414	    wrong_type(T, V1)
7415    end.
7416
7417
7418is_OPTIONAL(_, asn1_NOVALUE) ->
7419    true;
7420is_OPTIONAL(F, Val) when is_function(F) ->
7421    F(Val).
7422
7423chk_OPTIONAL(_, asn1_NOVALUE, asn1_NOVALUE, _, _) ->
7424    ok;
7425chk_OPTIONAL(Type, asn1_NOVALUE = V1, V2, IS, _CHK) when is_function(IS) ->
7426    case IS(V2) of
7427	true ->
7428	    not_equal(Type, V1, V2);
7429	false ->
7430	    wrong_type(Type, V1, V2)
7431    end;
7432chk_OPTIONAL(Type, V1, asn1_NOVALUE = V2, IS, _CHK) when is_function(IS) ->
7433    case IS(V1) of
7434	true ->
7435	    not_equal(Type, V1, V2);
7436	false ->
7437	    wrong_type(Type, V1, V2)
7438    end;
7439chk_OPTIONAL(_Type, V1, V2, _IS, CHK) when is_function(CHK) ->
7440    CHK(V1, V2).
7441
7442
7443%% ----------------------------------------------------------------------
7444
7445compare_strings([] = L1, L2) ->
7446    {L1, L2};
7447compare_strings(L1, [] = L2) ->
7448    {L1, L2};
7449compare_strings([H|T1], [H|T2]) ->
7450    compare_strings(T1, T2);
7451compare_strings(L1, L2) ->
7452    {L1, L2}.
7453
7454strip_tab_and_newline([]) ->
7455    [];
7456strip_tab_and_newline([$\n|T]) ->
7457    strip_tab_and_newline(T);
7458strip_tab_and_newline([$\t|T]) ->
7459    strip_tab_and_newline(T);
7460strip_tab_and_newline([H|T]) ->
7461    [H|strip_tab_and_newline(T)].
7462
7463
7464%% ----------------------------------------------------------------------
7465
7466atmost_once(Type, Val) ->
7467    error({atmost_once, {Type, Val}}).
7468
7469wrong_type(Type, Val) ->
7470    error({wrong_type, {Type, Val}}).
7471
7472wrong_type(Type, Val1, Val2) ->
7473    error({wrong_type, {Type, Val1, Val2}}).
7474
7475not_equal(What, Val1, Val2) ->
7476    error({not_equal, {What, Val1, Val2}}).
7477
7478error(Reason) ->
7479    throw({error, Reason}).
7480
7481
7482%% ----------------------------------------------------------------------
7483
7484d(F) ->
7485    d(F, []).
7486
7487d(F, A) ->
7488    d(get(dbg), F, A).
7489
7490d(true, F, A) ->
7491    io:format("DBG:" ++ F ++ "~n", A);
7492d(_, _, _) ->
7493    ok.
7494
7495