818
871
ObjSet=#'ObjectSet'{class=ClassRef}) ->
872
%% io:format("check_object,SET: ~p~n",[ObjSet#'ObjectSet'.set]),
819
873
?dbg("check_object set: ~p~n",[ObjSet#'ObjectSet'.set]),
820
874
{_,ClassDef} = get_referenced_type(S,ClassRef),
821
875
NewClassRef = check_externaltypereference(S,ClassRef),
823
case (catch get_unique_fieldname(ClassDef)) of
824
{error,'__undefined_'} -> {unique,undefined};
878
#'ObjectSet'{set={'Externaltypereference',undefined,'MSAccessProtocol',
884
{UniqueFieldName,UniqueInfo} =
885
case (catch get_unique_fieldname(S,ClassDef)) of
886
{error,'__undefined_',_} ->
887
{{unique,undefined},{unique,undefined}};
825
888
{asn1,Msg,_} -> error({class,Msg,S});
889
{'EXIT',Msg} -> error({class,{internal_error,Msg},S});
890
Other -> {element(1,Other),Other}
829
893
case prepare_objset(ObjSet#'ObjectSet'.set) of
831
895
CheckedSet = check_object_list(S,NewClassRef,SET),
832
NewSet = get_unique_valuelist(S,CheckedSet,UniqueFieldName),
896
NewSet = get_unique_valuelist(S,CheckedSet,UniqueInfo),
833
897
ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
834
898
set=extensionmark(NewSet,EXT)};
836
{'SingleValue',{definedvalue,ObjName}} ->
838
get_referenced_type(S,#identifier{val=ObjName}),
839
#'Object'{def=CheckedObj} =
840
check_object(S,ObjDef,ObjDef#typedef.typespec),
842
NewSet = get_unique_valuelist(S,[{{RefedMod,get_datastr_name(ObjDef)}, CheckedObj}],
844
ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
846
{'SingleValue',#'Externalvaluereference'{value=ObjName}} ->
847
{RefedMod,ObjDef} = get_referenced_type(S,#identifier{val=ObjName}),
900
{'SingleValue',ERef = #'Externalvaluereference'{}} ->
901
{RefedMod,ObjDef} = get_referenced_type(S,ERef),
848
902
#'Object'{def=CheckedObj} =
849
903
check_object(S,ObjDef,ObjDef#typedef.typespec),
851
905
NewSet = get_unique_valuelist(S,[{{RefedMod,get_datastr_name(ObjDef)},
854
908
ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
856
910
['EXTENSIONMARK'] ->
857
911
ObjSet#'ObjectSet'{uniquefname=UniqueFieldName,
858
912
set=['EXTENSIONMARK']};
914
OSref when is_record(OSref,'Externaltypereference') ->
915
{_,OS=#typedef{typespec=OSdef}} = get_referenced_type(S,OSref),
916
check_object(S,OS,OSdef);
860
918
{Type,{'EXCEPT',Exclusion}} when record(Type,type) ->
861
919
{_,TDef} = get_referenced_type(S,Type#type.def),
862
920
OS = TDef#typedef.typespec,
968
1055
%% is the union of object sets if the last field name is an object
969
1056
%% set. If the last field is an object the resulting object set is
970
1057
%% the set of objects in ObjectSet.
971
object_set_from_objects(S,FieldName,ObjectSet) when is_record(ObjectSet,'ObjectSet') ->
1058
object_set_from_objects(S,RefedObjMod,FieldName,ObjectSet) ->
1059
object_set_from_objects(S,RefedObjMod,FieldName,ObjectSet,[]).
1060
object_set_from_objects(S,RefedObjMod,FieldName,ObjectSet,InterSect)
1061
when is_record(ObjectSet,'ObjectSet') ->
972
1062
#'ObjectSet'{class=Cl,set=Set} = ObjectSet,
973
1063
{_,ClassDef} = get_referenced_type(S,Cl),
974
object_set_from_objects(S,ClassDef,FieldName,Set,[]);
975
object_set_from_objects(S,FieldName,Object) when is_record(Object,'Object') ->
1064
object_set_from_objects(S,RefedObjMod,ClassDef,FieldName,Set,InterSect,[]);
1065
object_set_from_objects(S,RefedObjMod,FieldName,Object,InterSect)
1066
when is_record(Object,'Object') ->
976
1067
#'Object'{classname=Cl,def=Def}=Object,
977
object_set_from_objects(S,Cl,FieldName,[Def],[]).
978
object_set_from_objects(S,ClassDef,FieldName,[O|Os],Acc) ->
979
case object_set_from_objects2(S,ClassDef,FieldName,element(3,O)) of
1068
object_set_from_objects(S,RefedObjMod,Cl,FieldName,[Def],InterSect,[]).
1069
object_set_from_objects(S,RefedObjMod,ClassDef,FieldName,['EXTENSIONMARK'|Os],
1071
object_set_from_objects(S,RefedObjMod,ClassDef,FieldName,Os,InterSect,%%Acc);
1072
['EXTENSIONMARK'|Acc]);
1073
object_set_from_objects(S,RefedObjMod,ClassDef,FieldName,[O|Os],InterSect,Acc) ->
1074
case object_set_from_objects2(S,mod_of_obj(RefedObjMod,element(1,O)),
1075
ClassDef,FieldName,element(3,O),InterSect) of
980
1076
ObjS when list(ObjS) ->
981
object_set_from_objects(S,ClassDef,FieldName,Os,ObjS++Acc);
1077
object_set_from_objects(S,RefedObjMod,ClassDef,FieldName,Os,InterSect,ObjS++Acc);
983
object_set_from_objects(S,ClassDef,FieldName,Os,[Obj|Acc])
1079
object_set_from_objects(S,RefedObjMod,ClassDef,FieldName,Os,InterSect,[Obj|Acc])
985
object_set_from_objects(_S,_ClassDef,_FieldName,[],Acc) ->
1081
object_set_from_objects(_S,_RefedObjMod,_ClassDef,_FieldName,[],InterSect,Acc) ->
986
1082
%% For instance may Acc contain objects of same class from
987
1083
%% different object sets that in fact might be duplicates.
988
Pred = fun({A,B,_},{A,C,_}) when B =< C -> true;
989
({A,_,_},{B,_,_}) when A < B -> true;
992
lists:usort(Pred,Acc).
1084
remove_duplicate_objects(osfo_intersection(InterSect,Acc)).
994
object_set_from_objects2(S,ClassDef,[{valuefieldreference,OName}],
1086
object_set_from_objects2(S,RefedObjMod,ClassDef,[{valuefieldreference,OName}],
1087
Fields,_InterSect) ->
996
1088
%% this is an object
997
1089
case lists:keysearch(OName,1,Fields) of
998
1090
{value,{_,TDef}} ->
999
#'Object'{classname=_NextClName,def=ODef}=TDef#typedef.typespec,
1000
{_,_,NextFields}=ODef,
1001
%% {_,NextClass} = get_referenced_type(S,NextClName),
1003
case (catch get_unique_fieldname(ClassDef)) of
1004
{error,'__undefined_'} -> {unique,undefined};
1005
{asn1,Msg,_} -> error({class,Msg,S});
1008
VDef = get_unique_value(S,NextFields,UniqueFieldName),
1009
{get_datastr_name(TDef),VDef,NextFields};
1091
mk_object_set_from_object(S,RefedObjMod,TDef,ClassDef);
1011
1093
[] % it may be an absent optional field
1013
object_set_from_objects2(_S,_ClassDef,[{typefieldreference,OSName}],
1095
object_set_from_objects2(S,RefedObjMod,ClassDef,[{typefieldreference,OSName}],
1096
Fields,_InterSect) ->
1015
1097
%% this is an object set
1016
1098
case lists:keysearch(OSName,1,Fields) of
1017
1099
{value,{_,TDef}} ->
1018
#'ObjectSet'{class=_NextClName,set=NextSet} = TDef#typedef.typespec,
1100
case TDef#typedef.typespec of
1101
#'ObjectSet'{class=_NextClName,set=NextSet} ->%% = TDef#typedef.typespec,
1103
#'Object'{def=_ObjDef} ->
1104
mk_object_set_from_object(S,RefedObjMod,TDef,ClassDef)
1106
%% error({error,{internal,unexpected_object,TDef}})
1021
1109
[] % it may be an absent optional field
1023
object_set_from_objects2(S,_ClassDef,[{valuefieldreference,OName}|Rest],
1111
object_set_from_objects2(S,RefedObjMod,_ClassDef,[{valuefieldreference,OName}|Rest],
1112
Fields,InterSect) ->
1025
1113
%% this is an object
1026
1114
case lists:keysearch(OName,1,Fields) of
1027
1115
{value,{_,TDef}} ->
1028
1116
#'Object'{classname=NextClName,def=ODef}=TDef#typedef.typespec,
1029
1117
{_,_,NextFields}=ODef,
1030
1118
{_,NextClass} = get_referenced_type(S,NextClName),
1031
object_set_from_objects2(S,NextClass,Rest,NextFields);
1119
object_set_from_objects2(S,RefedObjMod,NextClass,Rest,NextFields,InterSect);
1035
object_set_from_objects2(S,_ClassDef,[{typefieldreference,OSName}|Rest],
1123
object_set_from_objects2(S,RefedObjMod,_ClassDef,[{typefieldreference,OSName}|Rest],
1124
Fields,InterSect) ->
1037
1125
%% this is an object set
1038
case lists:keysearch(OSName,1,Fields) of
1040
#'ObjectSet'{class=NextClName,set=NextSet} = TDef,
1126
Next = {NextClName,NextSet} =
1127
case lists:keysearch(OSName,1,Fields) of
1128
{value,{_,TDef}} when is_record(TDef,'ObjectSet') ->
1129
#'ObjectSet'{class=NextClN,set=NextS} = TDef,
1131
{value,{_,#typedef{typespec=OS}}} ->
1132
%% objectsets in defined syntax will come here as typedef{}
1133
%% #'ObjectSet'{class=NextClN,set=NextS} = OS,
1135
#'ObjectSet'{class=NextClN,set=NextS} ->
1137
#'Object'{classname=NextClN,def=NextDef} ->
1041
1147
{_,NextClass} = get_referenced_type(S,NextClName),
1042
object_set_from_objects(S,NextClass,Rest,NextSet,[]);
1148
object_set_from_objects(S,RefedObjMod,NextClass,Rest,NextSet,InterSect,[])
1151
mk_object_set_from_object(S,RefedObjMod,TDef,Class) ->
1152
#'Object'{classname=_NextClName,def=ODef} = TDef#typedef.typespec,
1153
{_,_,NextFields}=ODef,
1156
case (catch get_unique_fieldname(S,Class)) of
1157
{error,'__undefined_',_} -> {unique,undefined};
1158
{asn1,Msg,_} -> error({class,Msg,S});
1159
{'EXIT',Msg} -> error({class,{internal_error,Msg},S});
1162
VDef = get_unique_value(S,NextFields,UniqueFieldName),
1168
{{RefedObjMod,get_datastr_name(TDef)},VDef,NextFields}
1172
mod_of_obj(_RefedObjMod,{NewMod,ObjName})
1173
when is_atom(NewMod),is_atom(ObjName) ->
1175
mod_of_obj(RefedObjMod,_) ->
1052
1179
merge_sets(Root,{'SingleValue',Ext}) ->
1086
1213
#'Object'{classname=ClassRef,
1088
1215
check_object_list(S,ClassRef,Objs,[{{no_mod,no_name},Def#'Object'.def}|Acc]);
1089
{'SingleValue',{definedvalue,ObjName}} ->
1090
{RefedMod,ObjectDef} = get_referenced_type(S,#identifier{val=ObjName}),
1091
#'Object'{def=Def} = check_object(S,ObjectDef,ObjectDef#typedef.typespec),
1092
check_object_list(S,ClassRef,Objs,
1093
[{{RefedMod,get_datastr_name(ObjectDef)},Def}|Acc]);
1094
1216
{'SingleValue',Ref = #'Externalvaluereference'{}} ->
1095
{RefedMod,ObjectDef} = get_referenced_type(S,Ref),
1096
#'Object'{def=Def} = check_object(S,ObjectDef,ObjectDef#typedef.typespec),
1097
check_object_list(S,ClassRef,Objs,
1098
[{{RefedMod,get_datastr_name(ObjectDef)},Def}|Acc]);
1217
?dbg("{SingleValue,Externalvaluereference}~n",[]),
1219
#'Object'{def=Def}} = check_referenced_object(S,Ref),
1220
check_object_list(S,ClassRef,Objs,[{{RefedMod,ObjName},Def}|Acc]);
1099
1221
ObjRef when record(ObjRef,'Externalvaluereference') ->
1100
1222
?dbg("Externalvaluereference~n",[]),
1101
{RefedMod,ObjectDef} = get_referenced_type(S,ObjRef),
1102
?dbg("Externalvaluereference, ObjectDef: ~p~n",[ObjectDef]),
1103
#'Object'{def=Def} = check_object(S,ObjectDef,ObjectDef#typedef.typespec),
1104
check_object_list(S,ClassRef,Objs,
1105
[{{RefedMod,get_datastr_name(ObjectDef)},Def}|Acc]);
1224
#'Object'{def=Def}} = check_referenced_object(S,ObjRef),
1225
check_object_list(S,ClassRef,Objs,[{{RefedMod,ObjName},Def}|Acc]);
1106
1226
{'ValueFromObject',{_,Object},FieldName} ->
1107
1227
{_,Def} = get_referenced_type(S,Object),
1108
1228
TypeDef = get_fieldname_element(S,Def,FieldName),
1141
1278
check_object_list(_,_,[],Acc) ->
1142
1279
lists:reverse(Acc).
1281
check_referenced_object(S,ObjRef)
1282
when is_record(ObjRef,'Externalvaluereference')->
1283
case get_referenced_type(S,ObjRef) of
1284
{RefedMod,ObjectDef} when is_record(ObjectDef,valuedef) ->
1285
?dbg("Externalvaluereference, ObjectDef: ~p~n",[ObjectDef]),
1286
#type{def=ClassRef} = ObjectDef#valuedef.type,
1287
Def = ObjectDef#valuedef.value,
1288
{RefedMod,get_datastr_name(ObjectDef),
1289
check_object(update_state(S,RefedMod),ObjectDef,#'Object'{classname=ClassRef,
1291
{RefedMod,ObjectDef} when is_record(ObjectDef,typedef) ->
1292
{RefedMod,get_datastr_name(ObjectDef),
1293
check_object(update_state(S,RefedMod),ObjectDef,ObjectDef#typedef.typespec)}
1296
check_ObjectSetFromObjects(S,ObjName,FieldName,InterSection) ->
1297
{RefedMod,TDef} = get_referenced_type(S,ObjName),
1298
ObjOrSet = check_object(update_state(S,RefedMod),TDef,TDef#typedef.typespec),
1299
InterSec = prepare_intersection(S,InterSection),
1300
_NewSet = object_set_from_objects(S,RefedMod,FieldName,ObjOrSet,InterSec).
1302
prepare_intersection(_S,[]) ->
1304
prepare_intersection(S,{'EXCEPT',ObjRef}) ->
1305
except_names(S,ObjRef);
1306
prepare_intersection(_S,T) ->
1307
exit({error,{internal_error,not_implemented,object_set_from_objects,T}}).
1308
except_names(_S,{'SingleValue',#'Externalvaluereference'{value=ObjName}}) ->
1310
except_names(_,T) ->
1311
exit({error,{internal_error,not_implemented,object_set_from_objects,T}}).
1313
osfo_intersection(InterSect,ObjList) ->
1314
Res = [X|| X = {{_,N},_,_} <- ObjList,
1315
lists:member({except,N},InterSect) == false],
1316
case lists:member('EXTENSIONMARK',ObjList) of
1318
Res ++ ['EXTENSIONMARK'];
1145
1323
%% get_fieldname_element/3
1146
1324
%% gets the type/value/object/... of the referenced element in FieldName
1150
1328
%% Def is the def of the first object referenced by FieldName
1151
1329
get_fieldname_element(S,Def,[{_RefType,FieldName}]) when record(Def,typedef) ->
1152
1330
{_,_,ObjComps} = (Def#typedef.typespec)#'Object'.def,
1153
case lists:keysearch(FieldName,1,ObjComps) of
1154
{value,{_,TDef}} when record(TDef,typedef) ->
1156
{value,{_,VDef}} when record(VDef,valuedef) ->
1157
check_value(S,VDef);
1331
check_fieldname_element(S,lists:keysearch(FieldName,1,ObjComps));
1332
get_fieldname_element(S,Def,[{_RefType,FieldName}|Rest])
1333
when record(Def,typedef) ->
1334
%% As FieldName is followd by other FieldNames it has to be an
1335
%% object or objectset.
1336
{_,_,ObjComps} = (Def#typedef.typespec)#'Object'.def,
1337
NewDef = check_fieldname_element(S,lists:keysearch(FieldName,1,ObjComps)),
1338
ObjDef = fun(#'Object'{def=D}) -> D;
1339
(#'ObjectSet'{set=Set}) -> Set
1343
L when is_list(L) ->
1344
[get_fieldname_element(S,X,Rest) || X <- L];
1159
throw({assigned_object_error,"not_assigned_object",S})
1346
get_fieldname_element(S,ObjDef,Rest)
1348
get_fieldname_element(S,{object,_,Fields},[{_RefType,FieldName}|Rest]) ->
1349
NewDef = check_fieldname_element(S,lists:keysearch(FieldName,1,Fields)),
1350
get_fieldname_element(S,NewDef,Rest);
1351
get_fieldname_element(_S,Def,[]) ->
1161
1353
get_fieldname_element(_S,Def,[{_RefType,_FieldName}|_RestFName])
1162
1354
when record(Def,typedef) ->
1357
check_fieldname_element(S,{value,{_,Def}}) ->
1358
check_fieldname_element(S,Def);
1359
check_fieldname_element(S,TDef) when is_record(TDef,typedef) ->
1360
check_type(S,TDef,TDef#typedef.typespec);
1361
check_fieldname_element(S,VDef) when is_record(VDef,valuedef) ->
1362
check_value(S,VDef);
1363
check_fieldname_element(S,Eref)
1364
when is_record(Eref,'Externaltypereference');
1365
is_record(Eref,'Externalvaluereference') ->
1366
{_,TDef}=get_referenced_type(S,Eref),
1367
check_fieldname_element(S,TDef);
1368
check_fieldname_element(S,Other) ->
1369
throw({error,{assigned_object_error,"not_assigned_object",Other,S}}).
1165
1371
transform_set_to_object_list([{Name,_UVal,Fields}|Objs],Acc) ->
1166
1372
transform_set_to_object_list(Objs,[{Name,{object,generatesyntax,Fields}}|Acc]);
1173
1379
get_unique_valuelist(_S,ObjSet,{unique,undefined}) -> % no unique field in object
1174
lists:map(fun({N,{_,_,F}})->{N,F};
1175
(V={_,_,_}) ->V end, ObjSet);
1176
get_unique_valuelist(S,ObjSet,UFN) ->
1177
get_unique_vlist(S,ObjSet,UFN,[]).
1180
get_unique_vlist(_S,[],_,[]) ->
1380
lists:map(fun({N,{_,_,F}})->{N,no_unique_value,F};
1382
({A,B}) -> {A,no_unique_value,B}
1384
get_unique_valuelist(S,ObjSet,{UFN,Opt}) ->
1385
get_unique_vlist(S,ObjSet,UFN,Opt,[]).
1388
get_unique_vlist(_S,[],_,_,[]) ->
1181
1389
['EXTENSIONMARK'];
1182
get_unique_vlist(S,[],_,Acc) ->
1183
case catch check_uniqueness(Acc) of
1390
get_unique_vlist(S,[],_,Opt,Acc) ->
1391
case catch check_uniqueness(remove_duplicate_objects(Acc)) of
1392
{asn1_error,_} when Opt =/= 'OPTIONAL' ->
1393
error({'ObjectSet',"not unique objects in object set",S});
1184
1394
{asn1_error,_} ->
1185
% exit({error,Reason,S});
1186
error({'ObjectSet',"not unique objects in object set",S});
1188
1397
lists:reverse(Acc)
1190
get_unique_vlist(S,[{ObjName,Obj}|Rest],UniqueFieldName,Acc) ->
1399
get_unique_vlist(S,['EXTENSIONMARK'|Rest],UniqueFieldName,Opt,Acc) ->
1400
get_unique_vlist(S,Rest,UniqueFieldName,Opt,Acc);
1401
get_unique_vlist(S,[{ObjName,Obj}|Rest],UniqueFieldName,Opt,Acc) ->
1191
1402
{_,_,Fields} = Obj,
1192
% VDef = get_unique_value(S,Fields,UniqueFieldName),
1194
1404
case get_unique_value(S,Fields,UniqueFieldName) of
1195
1405
#valuedef{value=V} -> [{ObjName,V,Fields}];
1736
1964
%% objectset_or_fixedtypevalueset_field ->
1738
1966
objectsetfield ->
1740
case ObjFieldSetting of
1741
Ref when record(Ref,'Externaltypereference');
1742
record(Ref,'Externalvaluereference') ->
1743
get_referenced_type(S,ObjFieldSetting);
1744
ObjectList when list(ObjectList) ->
1745
%% an objctset defined in the object,though maybe
1746
%% parsed as a SequenceOfValue
1747
%% The ObjectList may be a list of references to
1748
%% objects, a ValueFromObject
1749
?dbg("objectsetfield: ~p~n",[CField]),
1750
{_,_,Type,_} = CField,
1751
ClassDef = Type#type.def,
1753
?dbg("objectsetfield: ~p~n",[Type]),
1760
{'SingleValue',_} ->
1761
%% a Union of defined objects
1762
?dbg("objectsetfield, SingleValue~n",[]),
1763
union_of_defed_objs(CField,ObjFieldSetting);
1765
{{'SingleValue',_},_} ->
1766
%% a Union of defined objects
1767
union_of_defed_objs(CField,ObjFieldSetting);
1769
{object,_,[#type{def={'TypeFromObject',
1772
%% This case occurs when an ObjectSetFromObjects
1773
%% production is used
1774
{M,Def} = get_referenced_type(S,RefedObj),
1775
{M,get_fieldname_element(S,Def,FieldName)};
1776
#type{def=Eref} when
1777
record(Eref,'Externaltypereference') ->
1778
get_referenced_type(S,Eref);
1780
get_referenced_type(S,#'Externaltypereference'{module=S#state.mname,type=ObjFieldSetting})
1967
ObjSetSpec = get_objectset_def(S,ObjFieldSetting,CField),
1782
1968
?dbg("objectsetfield, ObjSetSpec:~p~n",[ObjSetSpec]),
1783
1969
{{ObjFieldName,
1784
1970
ObjSetSpec#typedef{checked=true,
1785
1971
typespec=check_object(S,ObjSetSpec,
1786
ObjSetSpec#typedef.typespec)}},RestSettings}
1972
ObjSetSpec#typedef.typespec)}},RestSettings}
1975
get_objectset_def(S,Ref,CField)
1976
when is_record(Ref,'Externaltypereference');
1977
is_record(Ref,'Externalvaluereference') ->
1978
{_M,T}=get_referenced_type(S,Ref),
1979
get_objectset_def2(S,T,CField);
1980
get_objectset_def(S,ObjectList,CField) when is_list(ObjectList) ->
1981
%% an objctset defined in the object,though maybe
1982
%% parsed as a SequenceOfValue
1983
%% The ObjectList may be a list of references to
1984
%% objects, a ValueFromObject
1985
?dbg("objectsetfield: ~p~n",[CField]),
1986
get_objectset_def2(S,ObjectList,CField);
1987
get_objectset_def(S,'EXTENSIONMARK',CField) ->
1988
?dbg("objectsetfield: ~p~n",[CField]),
1989
get_objectset_def2(S,['EXTENSIONMARK'],CField);
1990
get_objectset_def(_S,ObjFieldSetting={'SingleValue',_},CField) ->
1991
%% a Union of defined objects
1992
?dbg("objectsetfield, SingleValue~n",[]),
1993
union_of_defed_objs(CField,ObjFieldSetting);
1994
get_objectset_def(_S,ObjFieldSetting={{'SingleValue',_},_},CField) ->
1995
%% a Union of defined objects
1996
?dbg("objectsetfield, SingleValue~n",[]),
1997
union_of_defed_objs(CField,ObjFieldSetting);
1998
get_objectset_def(S,{object,_,[#type{def={'TypeFromObject',
2000
FieldName}}]},_CField) ->
2001
%% This case occurs when an ObjectSetFromObjects
2002
%% production is used
2003
{_M,Def} = get_referenced_type(S,RefedObj),
2004
get_fieldname_element(S,Def,FieldName);
2005
get_objectset_def(S,{object,_,[{setting,_,ERef}]},CField)
2006
when is_record(ERef,'Externaltypereference') ->
2007
{_,T} = get_referenced_type(S,ERef),
2008
get_objectset_def2(S,T,CField);
2009
get_objectset_def(S,#type{def=ERef},_CField)
2010
when is_record(ERef,'Externaltypereference') ->
2011
{_,T} = get_referenced_type(S,ERef),
2013
get_objectset_def(S,ObjFieldSetting,CField)
2014
when is_atom(ObjFieldSetting) ->
2015
ERef = #'Externaltypereference'{module=S#state.mname,
2016
type=ObjFieldSetting},
2017
{_,T} = get_referenced_type(S,ERef),
2018
get_objectset_def2(S,T,CField).
2020
get_objectset_def2(_S,T = #typedef{typespec=#'Object'{}},_CField) ->
2021
#typedef{typespec=#'Object'{classname=Class,def=Def}} = T,
2022
T#typedef{typespec=#'ObjectSet'{class=Class,set=[Def]}};
2023
get_objectset_def2(_S,Set,CField) when is_list(Set) ->
2024
{_,_,Type,_} = CField,
2025
ClassDef = Type#type.def,
2026
#typedef{typespec=#'ObjectSet'{class=ClassDef,
2028
get_objectset_def2(_S,T = #typedef{typespec=#'ObjectSet'{}},_CField) ->
2030
get_objectset_def2(_S,T,_CField) ->
2031
io:format("Warning get_objectset_def2: uncontrolled object set structure:~n~p~n",[T]).
1789
2033
type_name(S,#type{def=Def}) ->
1790
2034
CurrMod = S#state.mname,
1791
2035
case asn1ct_gen:type(asn1ct_gen:get_inner(Def)) of
1925
2172
check_value(NewS#state{recordtopname=[RecName|TopName]},
1926
2173
V#valuedef{type=Type#typedef.typespec}),
1927
2174
#newv{value=CheckedVal}
2177
%% A parameter that couldn't be categorized.
2178
#valuedef{value=CheckedVal}=
2179
check_value(NewS#state{recordtopname=[RecName|TopName]},
2180
V#valuedef{type=Type}),
2181
#newv{value=CheckedVal}
1932
2185
{opentypefieldvalue,ANYType,ANYValue} ->
1933
CheckedV=check_value(S,#valuedef{name=Name,type=ANYType,value=ANYValue}),
2187
check_value(SVal,#valuedef{name=Name,
1934
2191
#newv{value=CheckedV#valuedef.value};
1936
2193
throw({error,{asn1,{'cant check value of type',Def}}})
1939
ok=validate_integer(S,Value,[],Constr),
1940
#newv{value=normalize_value(S,Vtype,Value,[])};
2196
ok=validate_integer(SVal,Value,[],Constr),
2197
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1941
2198
{'INTEGER',NamedNumberList} ->
1942
ok=validate_integer(S,Value,NamedNumberList,Constr),
1943
#newv{value=normalize_value(S,Vtype,Value,[])};
2199
ok=validate_integer(SVal,Value,NamedNumberList,Constr),
2200
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1944
2201
{'BIT STRING',NamedNumberList} ->
1945
ok=validate_bitstring(S,Value,NamedNumberList,Constr),
1946
#newv{value=normalize_value(S,Vtype,Value,[])};
2202
ok=validate_bitstring(SVal,Value,NamedNumberList,Constr),
2203
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1948
ok=validate_null(S,Value,Constr),
2205
ok=validate_null(SVal,Value,Constr),
1950
2207
'OBJECT IDENTIFIER' ->
1951
{ok,_}=validate_objectidentifier(S,Value,Constr),
1952
#newv{value = normalize_value(S,Vtype,Value,[])};
2208
{ok,_}=validate_objectidentifier(SVal,Value,Constr),
2209
#newv{value = normalize_value(SVal,Vtype,Value,[])};
2211
{ok,_}=validate_relative_oid(SVal,Value,Constr),
2212
#newv{value = Value};
1953
2213
'ObjectDescriptor' ->
1954
ok=validate_objectdescriptor(S,Value,Constr),
1955
#newv{value=normalize_value(S,Vtype,Value,[])};
2214
ok=validate_objectdescriptor(SVal,Value,Constr),
2215
#newv{value=normalize_value(SVal,Vtype,Value,[])};
2217
ok = validate_real(SVal,Value,Constr),
2218
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1956
2219
{'ENUMERATED',NamedNumberList} ->
1957
ok=validate_enumerated(S,Value,NamedNumberList,Constr),
1958
#newv{value=normalize_value(S,Vtype,Value,[])};
2220
ok=validate_enumerated(SVal,Value,NamedNumberList,Constr),
2221
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1960
ok=validate_boolean(S,Value,Constr),
1961
#newv{value=normalize_value(S,Vtype,Value,[])};
2223
ok=validate_boolean(SVal,Value,Constr),
2224
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1962
2225
'OCTET STRING' ->
1963
ok=validate_octetstring(S,Value,Constr),
1964
#newv{value=normalize_value(S,Vtype,Value,[])};
2226
ok=validate_octetstring(SVal,Value,Constr),
2227
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1965
2228
'NumericString' ->
1966
ok=validate_restrictedstring(S,Value,Def,Constr),
1967
#newv{value=normalize_value(S,Vtype,Value,[])};
2229
ok=validate_restrictedstring(SVal,Value,Def,Constr),
2230
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1968
2231
TString when TString =:= 'TeletexString';
1969
2232
TString =:= 'T61String' ->
1970
ok=validate_restrictedstring(S,Value,Def,Constr),
1971
#newv{value=normalize_value(S,Vtype,Value,[])};
2233
ok=validate_restrictedstring(SVal,Value,Def,Constr),
2234
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1972
2235
'VideotexString' ->
1973
ok=validate_restrictedstring(S,Value,Def,Constr),
1974
#newv{value=normalize_value(S,Vtype,Value,[])};
2236
ok=validate_restrictedstring(SVal,Value,Def,Constr),
2237
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1976
#newv{value=normalize_value(S,Vtype,Value,[])};
2239
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1977
2240
% exit({'cant check value of type' ,Def});
1978
2241
'GeneralizedTime' ->
1979
#newv{value=normalize_value(S,Vtype,Value,[])};
2242
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1980
2243
% exit({'cant check value of type' ,Def});
1981
2244
'GraphicString' ->
1982
ok=validate_restrictedstring(S,Value,Def,Constr),
1983
#newv{value=normalize_value(S,Vtype,Value,[])};
2245
ok=validate_restrictedstring(SVal,Value,Def,Constr),
2246
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1984
2247
'VisibleString' ->
1985
ok=validate_restrictedstring(S,Value,Def,Constr),
1986
#newv{value=normalize_value(S,Vtype,Value,[])};
2248
ok=validate_restrictedstring(SVal,Value,Def,Constr),
2249
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1987
2250
'GeneralString' ->
1988
ok=validate_restrictedstring(S,Value,Def,Constr),
1989
#newv{value=normalize_value(S,Vtype,Value,[])};
2251
ok=validate_restrictedstring(SVal,Value,Def,Constr),
2252
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1990
2253
'PrintableString' ->
1991
ok=validate_restrictedstring(S,Value,Def,Constr),
1992
#newv{value=normalize_value(S,Vtype,Value,[])};
2254
ok=validate_restrictedstring(SVal,Value,Def,Constr),
2255
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1994
ok=validate_restrictedstring(S,Value,Def,Constr),
1995
#newv{value=normalize_value(S,Vtype,Value,[])};
2257
ok=validate_restrictedstring(SVal,Value,Def,Constr),
2258
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1997
ok=validate_restrictedstring(S,Value,Def,Constr),
1998
#newv{value=normalize_value(S,Vtype,Value,[])};
2260
ok=validate_restrictedstring(SVal,Value,Def,Constr),
2261
#newv{value=normalize_value(SVal,Vtype,Value,[])};
1999
2262
'UTF8String' ->
2000
ok = validate_restrictedstring(S,Vtype,Value,Constr),
2263
ok = validate_restrictedstring(SVal,Vtype,Value,Constr),
2001
2264
%%io:format("Vtype: ~p~nValue: ~p~n",[Vtype,Value]);
2002
#newv{value=normalize_value(S,Vtype,Value,[])};
2265
#newv{value=normalize_value(SVal,Vtype,Value,[])};
2003
2266
'UniversalString' -> %added 6/12 -00
2004
ok = validate_restrictedstring(S,Value,Def,Constr),
2005
#newv{value=normalize_value(S,Vtype,Value,[])};
2267
ok = validate_restrictedstring(SVal,Value,Def,Constr),
2268
#newv{value=normalize_value(SVal,Vtype,Value,[])};
2006
2269
Seq when record(Seq,'SEQUENCE') ->
2007
{ok,SeqVal} = validate_sequence(S,Value,
2270
{ok,SeqVal} = validate_sequence(SVal,Value,
2008
2271
Seq#'SEQUENCE'.components,
2010
#newv{value=normalize_value(S,Vtype,SeqVal,TopName)};
2273
#newv{value=normalize_value(SVal,Vtype,SeqVal,TopName)};
2011
2274
{'SEQUENCE OF',Components} ->
2012
ok=validate_sequenceof(S,Value,Components,Constr),
2013
#newv{value=normalize_value(S,Vtype,Value,TopName)};
2275
ok=validate_sequenceof(SVal,Value,Components,Constr),
2276
#newv{value=normalize_value(SVal,Vtype,Value,TopName)};
2014
2277
{'CHOICE',Components} ->
2015
ok=validate_choice(S,Value,Components,Constr),
2016
#newv{value=normalize_value(S,Vtype,Value,TopName)};
2278
ok=validate_choice(SVal,Value,Components,Constr),
2279
#newv{value=normalize_value(SVal,Vtype,Value,TopName)};
2017
2280
Set when record(Set,'SET') ->
2018
ok=validate_set(S,Value,Set#'SET'.components,
2281
ok=validate_set(SVal,Value,Set#'SET'.components,
2020
#newv{value=normalize_value(S,Vtype,Value,TopName)};
2283
#newv{value=normalize_value(SVal,Vtype,Value,TopName)};
2021
2284
{'SET OF',Components} ->
2022
ok=validate_setof(S,Value,Components,Constr),
2023
#newv{value=normalize_value(S,Vtype,Value,TopName)};
2285
ok=validate_setof(SVal,Value,Components,Constr),
2286
#newv{value=normalize_value(SVal,Vtype,Value,TopName)};
2024
2287
{'SelectionType',SelName,SelT} ->
2025
CheckedT = check_selectiontype(S,SelName,SelT),
2288
CheckedT = check_selectiontype(SVal,SelName,SelT),
2026
2289
NewV = V#valuedef{type=CheckedT},
2027
2290
SelVDef=check_value(S#state{value=NewV},NewV),
2028
2291
#newv{value=SelVDef#valuedef.value};
2122
2386
is_space_list([H|T],Acc) ->
2123
2387
is_space_list(T,[H|Acc]).
2125
validate_objectidentifier(S,ERef,C)
2389
validate_objectidentifier(S,ERef,C) ->
2390
validate_objectidentifier(S,o_id,ERef,C).
2392
validate_objectidentifier(S,OID,ERef,C)
2126
2393
when record(ERef,'Externalvaluereference') ->
2127
validate_objectidentifier(S,[ERef],C);
2128
validate_objectidentifier(S,L,_) ->
2394
validate_objectidentifier(S,OID,[ERef],C);
2395
validate_objectidentifier(S,OID,Tup,C) when is_tuple(Tup) ->
2396
validate_objectidentifier(S,OID,tuple_to_list(Tup),C);
2397
validate_objectidentifier(S,OID,L,_) ->
2129
2398
NewL = is_space_list(L,[]),
2130
case validate_objectidentifier1(S,NewL) of
2399
case validate_objectidentifier1(S,OID,NewL) of
2131
2400
NewL2 when is_list(NewL2) ->{ok,list_to_tuple(NewL2)};
2132
2401
Other -> {ok,Other}
2135
validate_objectidentifier1(S, [Id|T]) when record(Id,'Externalvaluereference') ->
2404
validate_objectidentifier1(S, OID, [Id|T])
2405
when record(Id,'Externalvaluereference') ->
2136
2406
case catch get_referenced_type(S,Id) of
2137
2407
{M,V} when record(V,valuedef) ->
2138
%%NewS = S#state{mname=M},
2139
2408
NewS = update_state(S,M),
2140
2409
case check_value(NewS,V) of
2141
% #valuedef{type=#type{def='OBJECT IDENTIFIER'},
2142
% checked=true,value=Value} when tuple(Value) ->
2143
% validate_objectid(S, T, lists:reverse(tuple_to_list(Value)));
2144
2410
#valuedef{type=#type{def=ERef},checked=true,
2145
value=Value} when tuple(Value) ->
2146
case is_object_id(NewS,ERef) of
2411
value=Value} when is_tuple(Value) ->
2412
case is_object_id(OID,NewS,ERef) of
2148
validate_objectid(NewS, T, lists:reverse(tuple_to_list(Value)));
2414
%% T must be a RELATIVE-OID
2415
validate_oid(true,NewS, rel_oid, T, lists:reverse(tuple_to_list(Value)));
2150
error({value, "illegal OBJECT IDENTIFIER", S})
2417
error({value, {"illegal "++to_string(OID),[Id|T]}, S})
2153
error({value, "illegal OBJECT IDENTIFIER", S})
2420
error({value, {"illegal "++to_string(OID),[Id|T]}, S})
2156
validate_objectid(S, [Id|T], [])
2423
validate_oid(true,S, OID, [Id|T], [])
2158
validate_objectidentifier1(S,V) ->
2159
validate_objectid(S,V,[]).
2425
validate_objectidentifier1(S,OID,V) ->
2426
validate_oid(true,S,OID,V,[]).
2161
validate_objectid(_, [], Acc) ->
2428
validate_oid(false, S, OID, V, Acc) ->
2429
error({value, {"illegal "++to_string(OID), V,Acc}, S});
2430
validate_oid(_,_, _, [], Acc) ->
2162
2431
lists:reverse(Acc);
2163
validate_objectid(S, [Value|Vrest], Acc) when integer(Value) ->
2164
validate_objectid(S, Vrest, [Value|Acc]);
2165
validate_objectid(S, [{'NamedNumber',_Name,Value}|Vrest], Acc)
2166
when integer(Value) ->
2167
validate_objectid(S, Vrest, [Value|Acc]);
2168
validate_objectid(S, [Id|Vrest], Acc)
2432
validate_oid(_, S, OID, [Value|Vrest], Acc) when is_integer(Value) ->
2433
validate_oid(valid_objectid(OID,Value,Acc),S, OID, Vrest, [Value|Acc]);
2434
validate_oid(_, S, OID, [{'NamedNumber',_Name,Value}|Vrest], Acc)
2435
when is_integer(Value) ->
2436
validate_oid(valid_objectid(OID,Value,Acc), S, OID, Vrest, [Value|Acc]);
2437
validate_oid(_, S, OID, [Id|Vrest], Acc)
2169
2438
when record(Id,'Externalvaluereference') ->
2170
2439
case catch get_referenced_type(S, Id) of
2171
{M,V} when record(V,valuedef) ->
2172
%%NewS = S#state{mname=M},
2440
{M,V} when is_record(V,valuedef) ->
2173
2441
NewS = update_state(S,M),
2174
case check_value(NewS, V) of
2175
#valuedef{checked=true,value=Value} when integer(Value) ->
2176
validate_objectid(NewS, Vrest, [Value|Acc]);
2178
error({value, "illegal OBJECT IDENTIFIER", S})
2442
NewVal = case check_value(NewS, V) of
2443
#valuedef{checked=true,value=Value} ->
2444
fun(Int) when is_integer(Int) -> [Int];
2445
(L) when is_list(L) -> L;
2446
(T) when is_tuple(T) -> tuple_to_list(T)
2449
error({value, {"illegal "++to_string(OID),
2450
[Id|Vrest],Acc}, S})
2453
List when is_list(List) ->
2454
validate_oid(valid_objectid(OID,NewVal,Acc), NewS,
2455
OID, Vrest,lists:reverse(NewVal)++Acc);
2181
2460
case reserved_objectid(Id#'Externalvaluereference'.value, Acc) of
2182
Value when integer(Value) ->
2183
validate_objectid(S, Vrest, [Value|Acc]);
2461
Value when is_integer(Value) ->
2462
validate_oid(valid_objectid(OID,Value,Acc),
2463
S, OID,Vrest, [Value|Acc]);
2185
error({value, "illegal OBJECT IDENTIFIER", S})
2465
error({value, {"illegal "++to_string(OID),[Id,Vrest],Acc}, S})
2188
validate_objectid(S, [{Atom,Value}],[]) when atom(Atom),integer(Value) ->
2468
validate_oid(_, S, OID, [{Atom,Value}],[])
2469
when is_atom(Atom),is_integer(Value) ->
2189
2470
%% this case when an OBJECT IDENTIFIER value has been parsed as a
2190
2471
%% SEQUENCE value
2191
2472
Rec = #'Externalvaluereference'{module=S#state.mname,
2193
validate_objectidentifier1(S,[Rec,Value]);
2194
validate_objectid(S, [{Atom,EVRef}],[])
2195
when atom(Atom),record(EVRef,'Externalvaluereference') ->
2474
validate_objectidentifier1(S, OID, [Rec,Value]);
2475
validate_oid(_, S, OID, [{Atom,EVRef}],[])
2476
when is_atom(Atom),is_record(EVRef,'Externalvaluereference') ->
2196
2477
%% this case when an OBJECT IDENTIFIER value has been parsed as a
2197
2478
%% SEQUENCE value OTP-4354
2479
Rec = #'Externalvaluereference'{module=EVRef#'Externalvaluereference'.module,
2481
validate_objectidentifier1(S, OID, [Rec,EVRef]);
2482
validate_oid(_, S, OID, [Atom|Rest],Acc) when is_atom(Atom) ->
2198
2483
Rec = #'Externalvaluereference'{module=S#state.mname,
2200
validate_objectidentifier1(S,[Rec,EVRef]);
2201
validate_objectid(S, _V, _Acc) ->
2202
error({value, "illegal OBJECT IDENTIFIER",S}).
2204
is_object_id(S,ERef=#'Externaltypereference'{}) ->
2485
validate_oid(true,S, OID, [Rec|Rest],Acc);
2486
validate_oid(_, S, OID, V, Acc) ->
2487
error({value, {"illegal "++to_string(OID),V,Acc},S}).
2489
validate_relative_oid(S,Value,Constr) ->
2490
validate_objectidentifier(S,rel_oid,Value,Constr).
2492
is_object_id(OID,S,ERef=#'Externaltypereference'{}) ->
2205
2493
{_,OI} = get_referenced_type(S,ERef),
2206
is_object_id(S,OI#typedef.typespec);
2207
is_object_id(_S,'OBJECT IDENTIFIER') ->
2209
is_object_id(S,#type{def=Def}) ->
2210
is_object_id(S,Def);
2211
is_object_id(_S,_) ->
2494
is_object_id(OID,S,OI#typedef.typespec);
2495
is_object_id(o_id,_S,'OBJECT IDENTIFIER') ->
2497
is_object_id(rel_oid,_S,'RELATIVE-OID') ->
2499
is_object_id(_,_S,'INTEGER') ->
2501
is_object_id(OID,S,#type{def=Def}) ->
2502
is_object_id(OID,S,Def);
2503
is_object_id(_,_S,_) ->
2507
"OBJECT IDENTIFIER";
2508
to_string(rel_oid) ->
2214
2511
%% ITU-T Rec. X.680 Annex B - D
2215
2512
reserved_objectid('itu-t',[]) -> 0;
2216
2513
reserved_objectid('ccitt',[]) -> 0;
2584
2912
io:format("WARNING: Enumerated value is not correct ~p~n",[V]),
2588
2917
normalize_choice(S,{'CHOICE',{C,V}},CType,NameList) when atom(C) ->
2591
Rec when record(Rec,'Externalvaluereference') ->
2592
get_normalized_value(S,V,CType,
2593
fun normalize_choice/4,
2597
2918
case catch lists:keysearch(C,#'ComponentType'.name,CType) of
2598
2919
{value,#'ComponentType'{typespec=CT,name=Name}} ->
2599
{C,normalize_value(S,CT,{'DEFAULT',Value},
2920
{C,normalize_value(S,CT,{'DEFAULT',V},
2600
2921
[Name|NameList])};
2602
2923
io:format("WARNING: Wrong format of type/value ~p/~p~n",
2606
2927
normalize_choice(S,{'DEFAULT',ValueList},CType,NameList) when is_list(ValueList) ->
2607
2928
lists:map(fun(X)-> normalize_choice(S,X,CType,NameList) end, ValueList);
2608
2929
normalize_choice(S,Val=#'Externalvaluereference'{},CType,NameList) ->
2609
{_,#valuedef{value=V}}=get_referenced_type(S,Val),
2610
normalize_choice(S,{'CHOICE',V},CType,NameList);
2930
{M,#valuedef{value=V}}=get_referenced_type(S,Val),
2931
normalize_choice(update_state(S,M),{'CHOICE',V},CType,NameList);
2611
2932
% get_normalized_value(S,Val,CType,fun normalize_choice/4,[NameList]);
2612
2933
normalize_choice(S,CV={Name,_ChoiceVal},CType,NameList)
2613
2934
when atom(Name) ->
2614
2935
% normalize_choice(S,ChoiceVal,CType,NameList).
2615
normalize_choice(S,{'CHOICE',CV},CType,NameList).
2936
normalize_choice(S,{'CHOICE',CV},CType,NameList);
2937
normalize_choice(_S,V,_CType,_NameList) ->
2938
exit({error,{bad_choice_value,V}}).
2940
%% normalize_choice(NameList,S,CVal = {'CHOICE',{_,_}},CType,_) ->
2941
%% normalize_choice(S,CVal,CType,NameList);
2942
%% normalize_choice(NameList,S,CVal={'DEFAULT',VL},CType,_) when is_list(VL)->
2943
%% normalize_choice(S,CVal,CType,NameList);
2944
%% normalize_choice(NameList,S,CV={Name,_CV},CType,_) when is_atom(Name)->
2945
%% normalize_choice(S,{'CHOICE',CV},CType,NameList);
2946
%% normalize_choice(_,_S,V,_,_) ->
2949
normalize_sequence(S,Value,Components,NameList)
2950
when is_tuple(Components) ->
2951
normalize_sequence(S,Value,lists:flatten(tuple_to_list(Components)),
2617
2953
normalize_sequence(S,{Name,Value},Components,NameList)
2618
2954
when atom(Name),list(Value) ->
2619
2955
normalize_sequence(S,Value,Components,NameList);
2620
2956
normalize_sequence(S,Value,Components,NameList) ->
2621
2957
normalized_record('SEQUENCE',S,Value,Components,NameList).
2959
normalize_set(S,Value,Components,NameList) when is_tuple(Components) ->
2960
normalize_set(S,Value,lists:flatten(tuple_to_list(Components)),NameList);
2623
2961
normalize_set(S,{Name,Value},Components,NameList)
2624
2962
when atom(Name),list(Value) ->
2625
2963
normalized_record('SET',S,Value,Components,NameList);
2626
2964
normalize_set(S,Value,Components,NameList) ->
2627
2965
NewName = list_to_atom(asn1ct_gen:list2name(NameList)),
2628
case is_record_normalized(NewName,Value,length(Components)) of
2966
case is_record_normalized(S,NewName,Value,length(Components)) of
3434
3840
%% parameter, and changes format of the actual parameter according to
3435
3841
%% above table if necessary.
3436
3842
match_args(S,FA = [FormArg|Ft], AA = [ActArg|At], Acc) ->
3843
OldParams = S#state.parameters,
3437
3844
case categorize_arg(S,FormArg,ActArg) of
3438
3845
[CategorizedArg] ->
3439
match_args(S,Ft, At, [{FormArg,CategorizedArg}|Acc]);
3846
match_args(S#state{parameters=
3847
[{FormArg,CategorizedArg}|OldParams]},
3848
Ft, At, [{FormArg,CategorizedArg}|Acc]);
3440
3849
CategorizedArgs ->
3441
match_args(S,FA, CategorizedArgs ++ AA, Acc)
3850
match_args(S#state{parameters=CategorizedArgs++OldParams},
3851
FA, CategorizedArgs ++ AA, Acc)
3443
match_args(_,[], [], Acc) ->
3853
match_args(_S,[], [], Acc) ->
3444
3854
lists:reverse(Acc);
3445
3855
match_args(_,_, _, _) ->
3446
3856
throw({error,{asn1,{wrong_number_of_arguments}}}).
3448
3858
%%%%%%%%%%%%%%%%%
3449
%% categorize_arg(FormalArg,ActualArg) -> {FormalArg,CatgorizedActualArg}
3859
%% categorize_arg(S,FormalArg,ActualArg) -> {FormalArg,CatgorizedActualArg}
3451
categorize_arg(S,{Governor,_},ActArg) ->
3452
case {governor_category(S,Governor),parameter_name_style(ActArg)} of
3861
categorize_arg(S,{Governor,Param},ActArg) ->
3862
case {governor_category(S,Governor),parameter_name_style(Param,ActArg)} of
3453
3863
{absent,beginning_uppercase} -> %% a type
3454
categorize(type,ActArg);
3864
categorize(S,type,ActArg);
3455
3865
{type,beginning_lowercase} -> %% a value
3456
categorize(value,ActArg);
3866
categorize(S,value,Governor,ActArg);
3457
3867
{type,beginning_uppercase} -> %% a value set
3458
categorize(value_set,ActArg);
3868
categorize(S,value_set,ActArg);
3459
3869
{absent,entirely_uppercase} -> %% a class
3460
categorize(class,ActArg);
3461
{class,beginning_lowercase} ->
3462
categorize(object,ActArg);
3463
{class,beginning_uppercase} ->
3464
categorize(object_set,ActArg);
3870
categorize(S,class,ActArg);
3871
{{class,ClassRef},beginning_lowercase} ->
3872
categorize(S,object,ActArg,ClassRef);
3873
{{class,ClassRef},beginning_uppercase} ->
3874
categorize(S,object_set,ActArg,ClassRef);
3468
categorize_arg(_S,FormalArg,ActualArg) ->
3878
categorize_arg(S,FormalArg,ActualArg) ->
3469
3879
%% governor is absent => a type or a class
3470
3880
case FormalArg of
3471
3881
#'Externaltypereference'{type=Name} ->
3472
3882
case is_class_name(Name) of
3474
categorize(class,ActualArg);
3884
categorize(S,class,ActualArg);
3476
categorize(type,ActualArg)
3886
categorize(S,type,ActualArg)
3479
3889
throw({error,{unexpected_formal_argument,FA}})
3892
governor_category(S,#type{def=Eref})
3893
when is_record(Eref,'Externaltypereference') ->
3894
governor_category(S,Eref);
3482
3895
governor_category(_S,#type{}) ->
3484
3897
governor_category(S,Ref) when is_record(Ref,'Externaltypereference') ->
3485
3898
case is_class(S,Ref) of
4023
4540
%% filter_extensions(C)
4024
%% takes a list of constraints as input and
4025
%% returns a list with the intersection of all extension roots
4026
%% and only the extension of the last constraint kept if any
4027
%% extension in the last constraint
4541
%% takes a list of constraints as input and returns a list with the
4542
%% constraints and all extensions but the last are removed.
4543
filter_extensions([L]) when is_list(L) ->
4544
[filter_extensions(L)];
4028
4545
filter_extensions(C=[_H]) ->
4030
4547
filter_extensions(C) when list(C) ->
4031
filter_extensions(C,[]).
4548
filter_extensions(C,[], []).
4033
filter_extensions([C],Acc) ->
4034
lists:reverse([C|Acc]);
4035
filter_extensions([{C,_E},H2|T],Acc) when tuple(C) ->
4036
filter_extensions([H2|T],[C|Acc]);
4037
filter_extensions([{'SizeConstraint',{A,_B}},H2|T],Acc)
4550
filter_extensions([],Acc,[]) ->
4552
filter_extensions([],Acc,[EC|ExtAcc]) ->
4553
CwoExt = remove_extension(ExtAcc,[]),
4555
filter_extensions([C={A,_E}|T],Acc,ExtAcc) when tuple(A) ->
4556
filter_extensions(T,Acc,[C|ExtAcc]);
4557
filter_extensions([C={'SizeConstraint',{A,_B}}|T],Acc,ExtAcc)
4038
4558
when list(A);tuple(A) ->
4039
filter_extensions([H2|T],[{'SizeConstraint',A}|Acc]);
4040
filter_extensions([H1,H2|T],Acc) ->
4041
filter_extensions([H2|T],[H1|Acc]).
4559
filter_extensions(T,Acc,[C|ExtAcc]);
4560
filter_extensions([C={'PermittedAlphabet',{{'SingleValue',_},E}}|T],Acc,ExtAcc)
4561
when is_tuple(E); is_list(E) ->
4562
filter_extensions(T,Acc,[C|ExtAcc]);
4563
filter_extensions([H|T],Acc,ExtAcc) ->
4564
filter_extensions(T,[H|Acc],ExtAcc).
4566
remove_extension([],Acc) ->
4568
remove_extension([{'SizeConstraint',{A,_B}}|R],Acc) ->
4569
remove_extension(R,[{'SizeConstraint',A}|Acc]);
4570
remove_extension([{C,_E}|R],Acc) when is_tuple(C) ->
4571
remove_extension(R,[C|Acc]);
4572
remove_extension([{'PermittedAlphabet',{A={'SingleValue',_},
4574
when is_tuple(E);is_list(E) ->
4575
remove_extension(R,[{'PermittedAlphabet',A}|Acc]).
4043
4577
%% constraint_intersection(S,C) takes a list of constraints as input and
4044
4578
%% performs intersections. Intersecions are performed when an
5131
5716
untagged_choice(_,[]) ->
5720
tag_untagged_choice(S,Cs) ->
5721
tag_untagged_choice(S,Cs,[]).
5722
tag_untagged_choice(S,[C = #'ComponentType'{typespec=#type{tag=[],def={'CHOICE',_}}}|Rest],Acc) ->
5723
TagList = C#'ComponentType'.tags,
5724
TaggedC = C#'ComponentType'{tags=get_least_tag(TagList)},
5725
tag_untagged_choice(S,Rest,[TaggedC|Acc]);
5726
tag_untagged_choice(S,[C = #'ComponentType'{typespec=#type{tag=[],def=ExRef}}|Rest],Acc) when record(ExRef,'Externaltypereference') ->
5727
case get_referenced_type(S,ExRef) of
5728
{_,#typedef{typespec=#type{tag=[],
5729
def={'CHOICE',_}}}} ->
5730
TagList = C#'ComponentType'.tags,
5731
TaggedC = C#'ComponentType'{tags = get_least_tag(TagList)},
5732
tag_untagged_choice(S,Rest,[TaggedC|Acc]);
5734
tag_untagged_choice(S,Rest,[C|Acc])
5736
tag_untagged_choice(S,[C|Rest],Acc) ->
5737
tag_untagged_choice(S,Rest,[C|Acc]);
5738
tag_untagged_choice(_S,[],Acc) ->
5740
get_least_tag([]) ->
5742
get_least_tag(TagList) ->
5743
%% The smallest tag 'PRIVATE' < 'CONTEXT' < 'APPLICATION' < 'UNIVERSAL'
5744
Pred = fun({'PRIVATE',_},{'CONTEXT',_}) -> true;
5745
({'CONTEXT',_},{'APPLICATION',_}) -> true;
5746
({'APPLICATION',_},{'UNIVERSAL',_}) -> true;
5747
({A,T1},{A,T2}) when T1 =< T2 -> true; (_,_) -> false
5749
[T|_] = lists:sort(Pred,TagList),
5752
%% adds the textual order to the components to keep right order of
5753
%% components in the asn1-value.
5754
textual_order(Cs) ->
5755
Fun = fun(C,Index) ->
5756
{C#'ComponentType'{textual_order=Index},Index+1}
5758
{NewCs,_} = textual_order(Cs,Fun,1),
5760
textual_order(Cs,Fun,IxIn) when is_list(Cs) ->
5761
lists:mapfoldl(Fun,IxIn,Cs);
5762
textual_order({Root,Ext},Fun,IxIn) ->
5763
{NewRoot,IxR} = textual_order(Root,Fun,IxIn),
5764
{NewExt,_} = textual_order(Ext,Fun,IxR),
5765
{{NewRoot,NewExt},dummy};
5766
textual_order({Root1,Ext,Root2},Fun,IxIn) ->
5767
{NewRoot1,IxR} = textual_order(Root1,Fun,IxIn),
5768
{NewExt,IxE} = textual_order(Ext,Fun,IxR),
5769
{NewRoot2,_} = textual_order(Root2,Fun,IxE),
5770
{{NewRoot1,NewExt,NewRoot2},dummy}.
5772
extension(Components) when is_list(Components) ->
5773
{Components,noext,[]};
5774
extension({Root,ExtList}) ->
5775
ToOpt = fun(mandatory) ->
5779
{Root, [X#'ComponentType'{prop=ToOpt(Y)}||
5780
X = #'ComponentType'{prop=Y}<-ExtList],[]};
5781
extension({Root1,ExtList,Root2}) ->
5782
ToOpt = fun(mandatory) ->
5786
{Root1, [X#'ComponentType'{prop=ToOpt(Y)}||
5787
X = #'ComponentType'{prop=Y}<-ExtList], Root2}.
5134
5789
check_setof(S,Type,Component) when record(Component,type) ->
5135
5790
check_type(S,Type,Component).
6244
6906
merge_tags2([], Acc) ->
6245
6907
lists:reverse(Acc).
6247
merge_constraints(C1, []) ->
6249
merge_constraints([], C2) ->
6251
merge_constraints(C1, C2) ->
6252
{SList,VList,PAList,Rest} = splitlist(C1++C2,[],[],[],[]),
6253
SizeC = merge_constraints(SList),
6254
ValueC = merge_constraints(VList),
6255
PermAlphaC = merge_constraints(PAList),
6258
SizeC ++ ValueC ++ PermAlphaC;
6260
throw({error,{asn1,{not_implemented,{merge_constraints,Rest}}}})
6909
%% merge_constraints(C1, []) ->
6911
%% merge_constraints([], C2) ->
6913
%% merge_constraints(C1, C2) ->
6914
%% {SList,VList,PAList,Rest} = splitlist(C1++C2,[],[],[],[]),
6915
%% SizeC = merge_constraints(SList),
6916
%% ValueC = merge_constraints(VList),
6917
%% PermAlphaC = merge_constraints(PAList),
6920
%% SizeC ++ ValueC ++ PermAlphaC;
6922
%% throw({error,{asn1,{not_implemented,{merge_constraints,Rest}}}})
6263
merge_constraints([]) -> [];
6264
merge_constraints([C1 = {_,{Low1,High1}},{_,{Low2,High2}}|Rest]) when Low1 >= Low2,
6266
merge_constraints([C1|Rest]);
6267
merge_constraints([C1={'PermittedAlphabet',_},C2|Rest]) ->
6268
[C1|merge_constraints([C2|Rest])];
6269
merge_constraints([C1 = {_,{_Low1,_High1}},C2 = {_,{_Low2,_High2}}|_Rest]) ->
6270
throw({error,asn1,{conflicting_constraints,{C1,C2}}});
6271
merge_constraints([C]) ->
6925
%% merge_constraints([]) -> [];
6926
%% merge_constraints([C1 = {_,{Low1,High1}},{_,{Low2,High2}}|Rest]) when Low1 >= Low2,
6927
%% High1 =< High2 ->
6928
%% merge_constraints([C1|Rest]);
6929
%% merge_constraints([C1={'PermittedAlphabet',_},C2|Rest]) ->
6930
%% [C1|merge_constraints([C2|Rest])];
6931
%% merge_constraints([C1 = {_,{_Low1,_High1}},C2 = {_,{_Low2,_High2}}|_Rest]) ->
6932
%% throw({error,asn1,{conflicting_constraints,{C1,C2}}});
6933
%% merge_constraints([C]) ->
6274
splitlist([C={'SizeConstraint',_}|Rest],Sacc,Vacc,PAacc,Restacc) ->
6275
splitlist(Rest,[C|Sacc],Vacc,PAacc,Restacc);
6276
splitlist([C={'ValueRange',_}|Rest],Sacc,Vacc,PAacc,Restacc) ->
6277
splitlist(Rest,Sacc,[C|Vacc],PAacc,Restacc);
6278
splitlist([C={'PermittedAlphabet',_}|Rest],Sacc,Vacc,PAacc,Restacc) ->
6279
splitlist(Rest,Sacc,Vacc,[C|PAacc],Restacc);
6280
splitlist([C|Rest],Sacc,Vacc,PAacc,Restacc) ->
6281
splitlist(Rest,Sacc,Vacc,PAacc,[C|Restacc]);
6282
splitlist([],Sacc,Vacc,PAacc,Restacc) ->
6283
{lists:reverse(Sacc),
6284
lists:reverse(Vacc),
6285
lists:reverse(PAacc),
6286
lists:reverse(Restacc)}.
6936
%% splitlist([C={'SizeConstraint',_}|Rest],Sacc,Vacc,PAacc,Restacc) ->
6937
%% splitlist(Rest,[C|Sacc],Vacc,PAacc,Restacc);
6938
%% splitlist([C={'ValueRange',_}|Rest],Sacc,Vacc,PAacc,Restacc) ->
6939
%% splitlist(Rest,Sacc,[C|Vacc],PAacc,Restacc);
6940
%% splitlist([C={'PermittedAlphabet',_}|Rest],Sacc,Vacc,PAacc,Restacc) ->
6941
%% splitlist(Rest,Sacc,Vacc,[C|PAacc],Restacc);
6942
%% splitlist([C|Rest],Sacc,Vacc,PAacc,Restacc) ->
6943
%% splitlist(Rest,Sacc,Vacc,PAacc,[C|Restacc]);
6944
%% splitlist([],Sacc,Vacc,PAacc,Restacc) ->
6945
%% {lists:reverse(Sacc),
6946
%% lists:reverse(Vacc),
6947
%% lists:reverse(PAacc),
6948
%% lists:reverse(Restacc)}.