2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.2 1995-02-06 21:26:07 quinn
8 * Repaired this evening's damages..
10 * Revision 1.1 1995/02/06 16:44:47 quinn
11 * First hack at Z/SR protocol
19 /* ---------------------- INITIALIZE SERVICE ------------------- */
21 int z_ReferenceId(ODR o, Z_ReferenceId **p, int opt)
23 return odr_implicit(o, odr_octetstring, (Odr_oct**) p, ODR_CONTEXT, 2, opt);
26 int z_DatabaseName(Odr o, Z_DatabaseName **p, int opt)
28 return odr_implicit(o, odr_visiblestring, (char **) p, ODR_CONTEXT, 105,
32 /* ---------------------- INITIALIZE SERVICE ------------------- */
34 int z_InitRequest(ODR o, Z_InitRequest **p, int opt)
38 if (!odr_sequence_begin(o, p, sizeof(**p)))
42 z_ReferenceId(o, &pp->referenceId, 1) &&
43 odr_implicit(o, odr_bitstring, &pp->protocolVersion, ODR_CONTEXT,
45 odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
46 odr_implicit(o, odr_integer, &pp->preferredMessageSize, ODR_CONTEXT,
48 odr_implicit(o, odr_integer, &pp->maximumRecordSize, ODR_CONTEXT,
50 odr_implicit(o, odr_visiblestring, &pp->idAuthentication, ODR_CONTEXT,
52 odr_implicit(o, odr_visiblestring, &pp->implementationId, ODR_CONTEXT,
54 odr_implicit(o, odr_visiblestring, &pp->implementationName, ODR_CONTEXT,
56 odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
57 ODR_CONTEXT, 112, 1) &&
61 int z_InitResponse(ODR o, Z_InitResponse **p, int opt)
65 if (!odr_sequence_begin(o, p, sizeof(**p)))
69 z_ReferenceId(o, &pp->referenceId, 1) &&
70 odr_implicit(o, odr_bitstring, &pp->protocolVersion, ODR_CONTEXT,
72 odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
73 odr_implicit(o, odr_integer, &pp->preferredMessageSize, ODR_CONTEXT,
75 odr_implicit(o, odr_integer, &pp->maximumRecordSize, ODR_CONTEXT,
77 odr_implicit(o, odr_bool, &pp->result, ODR_CONTEXT, 12, 0) &&
78 odr_implicit(o, odr_visiblestring, &pp->idAuthentication, ODR_CONTEXT,
80 odr_implicit(o, odr_visiblestring, &pp->implementationId, ODR_CONTEXT,
82 odr_implicit(o, odr_visiblestring, &pp->implementationName, ODR_CONTEXT,
84 odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
85 ODR_CONTEXT, 112, 1) &&
89 /* ------------------------ SEARCH SERVICE ----------------------- */
91 int z_ElementSetName(ODR o, Z_ElementSetName **p, int opt)
93 return odr_implicit(o, odr_visiblestring, (char**) p, ODR_CONTEXT, 103,
97 int z_PreferredRecordSyntax(ODR o, Z_PreferredRecordSyntax **p, int opt)
99 return odr_implicit(o, odr_oid, (Odr_oid**) p, ODR_CONTEXT, 104, opt);
102 int z_DatabaseSpecificUnit(ODR o, Z_DatabaseSpecificUnit **p, int opt)
104 if (!odr_sequence_begin(o, p, sizeof(**p)))
107 z_DatabaseName(o, &(*p)->databaseName, 0) &&
108 z_ElementSetName(o, &(*p)->elementSetName, 0) &&
112 int z_DatabaseSpecific(ODR o, Z_DatabaseSpecific **p, int opt)
114 if (o->direction == ODR_DECODE && !*p)
115 *p = nalloc(o, sizeof(**p));
119 odr_implicit_settag(o, ODR_CONTEXT, 1);
120 if (odr_sequence_of(o, z_DatabaseSpecificUnit, &(*p)->elements,
121 &(*p)->num_elements))
127 int z_ElementSetNames(ODR o, Z_ElementSetNames **p, int opt)
129 static Odr_arm arm[] =
131 {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ElementSetNames_generic,
133 {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementSetNames_databaseSpecific,
138 if (!odr_constructed_begin(o, p, ODR_CONTEXT, 19, 0))
141 if (o->direction == ODR_DECODE && !*p)
142 *p = nalloc(o, sizeof(**p));
144 if (odr_choice(o, arm, &(*p)->u, &(*p)->which) &&
145 odr_constructed_enmd(o))
151 /* ----------------------- RPN QUERY -----------------------*/
153 int z_RPNStructure(ODR o, Z_RPNStructure, int opt);
155 int z_Operand(ODR o, Z_Operand **p, int opt)
159 {-1, -1, -1, Z_Operand_APT, z_AttributesPlusTerm},
160 {-1, -1, -1, Z_Operand_resultSetId, z_ResultSetId},
164 if (o->direction ==ODR_DECODE && !*p)
165 *p = nalloc(o, sizeof(**p));
168 if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
174 int z_Complex(ODR o, Z_Complex **p, int opt)
176 if (!odr_sequence_begin(o, p, sizeof(**p)))
179 z_RPNStructure(o, &(*p)->s1, 0) &&
180 z_RPNStructure(o, &(*p)->s2, 0) &&
181 z_Operator(o, &(*p)->operator) &&
185 int z_RPNStructure(ODR o, Z_RPNStructure, int opt)
189 {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_RPNStructure_simple, z_Operand),
190 {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_RPNStructure_complex, z_Complex},
194 if (o->direction == ODR_DECODE && !*p)
195 *p = nalloc(o, sizeof(**p));
198 if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
204 int z_RPNQuery(ODR o, Z_RPNQuery **p, int opt)
206 if (!odr_sequence_begin(o, p, sizeof(**p))
209 odr_oid(o, &(*p)->attributeSetId, 0) &&
210 z_RPNStructure(o, &(*p)->RPNStructure, 0) &&
214 /* -----------------------END RPN QUERY ----------------------- */
216 int z_Query(ODR o, Z_Query **p, int opt)
220 {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Query_type_1, z_RPNQuery},
221 {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Query_type_2, odr_oct},
225 if (o->direction == ODR_DECODE && !*p)
226 *p = nalloc(o, sizeof(**p);
229 if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
235 int z_SearchRequest(ODR o, Z_SearchRequest **p, int opt)
239 if (!odr_sequence_begin(o, p, sizeof(**p)))
243 z_ReferenceId(o, &pp->referenceId, 1) &&
244 odr_implicit(o, odr_integer, &pp->smallSetUpperBound, ODR_CONTEXT,
246 odr_implicit(o, odr_integer, &pp->largeSetLowerBound, ODR_CONTEXT,
248 odr_implicit(o, odr_integer, &pp->mediumSetPresentNumber, ODR_CONTEXT,
250 odr_implicit(o, odr_bool, &pp->replaceIndicator, ODR_CONTEXT, 16, 1) &&
251 odr_implicit(o, odr_visiblestring, &pp->resultSetName, ODR_CONTEXT,
253 odr_implicit(o, z_ElementSetNames, &pp->smallSetElementSetNames,
254 ODR_CONTEXT, 100, 1) &&
255 odr_implicit(o, z_ElementSetNames, &pp->mediumSetElementSetNames,
256 ODR_CONTEXT, 101, 1) &&
257 z_PreferredRecordSyntax(o, &pp->preferredRecordSyntax, 1) &&
258 odr_explicit(o, z_query, ODR_CONTEXT, 21, 0) &&
262 int z_APDU(ODR o, Z_APDU **p, int opt)
264 static Odr_arm arm[] =
266 {ODR_IMPLICIT, ODR_CONTEXT, 20, Z_APDU_InitRequest, z_InitRequest},
267 {ODR_IMPLICIT, ODR_CONTEXT, 21, Z_APDU_InitResponse, z_InitResponse},
268 {ODR_IMPLICIT, ODR_CONTEXT, 22, Z_APDU_SearchRequest, z_SearchRequest},
273 if (o->direction == ODR_DECODE && !*p)
274 *p = nalloc(o, sizeof(**p));
275 if (!odr_choice(o, arm, &(*p)->u, &(*p)->which))
277 if (o->direction == ODR_DECODE)