dd40eb6a0b75650e4187b73de67b8c80cc1e3494
[yaz-moved-to-github.git] / asn / proto.c
1 /*
2  * Copyright (C) 1994, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: proto.c,v $
7  * Revision 1.1  1995-02-06 16:44:47  quinn
8  * First hack at Z/SR protocol
9  *
10  */
11
12 #include <odr.h>
13
14 #include <proto.h>
15
16 int z_ReferenceId(ODR o, Z_ReferenceId **p, int opt)
17 {
18     return odr_implicit(o, odr_octetstring, (Odr_oct**) p, ODR_CONTEXT, 2, opt);
19 }
20
21 int z_DatabaseName(Odr o, Z_DatabaseName **p, int opt)
22 {
23     return odr_implicit(o, odr_visiblestring, (char **) p, ODR_CONTEXT, 105,
24         opt);
25 }
26
27 int z_InitRequest(ODR o, Z_InitRequest **p, int opt)
28 {
29     Z_InitRequest *pp;
30
31     if (!odr_sequence_begin(o, p, sizeof(**p)))
32         return opt;
33     pp = *p;
34     return
35         z_ReferenceId(o, &pp->referenceId, 1) &&
36         odr_implicit(o, odr_bitstring, &pp->protocolVersion, ODR_CONTEXT, 
37             3, 0) &&
38         odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
39         odr_implicit(o, odr_integer, &pp->preferredMessageSize, ODR_CONTEXT,
40             5, 0) &&
41         odr_implicit(o, odr_integer, &pp->maximumRecordSize, ODR_CONTEXT,
42             6, 0) &&
43         odr_implicit(o, odr_visiblestring, &pp->idAuthentication, ODR_CONTEXT,
44             7, 1) &&
45         odr_implicit(o, odr_visiblestring, &pp->implementationId, ODR_CONTEXT,
46             110, 1) &&
47         odr_implicit(o, odr_visiblestring, &pp->implementationName, ODR_CONTEXT,
48             111, 1) &&
49         odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
50             ODR_CONTEXT, 112, 1) &&
51         odr_sequence_end(o);
52 }
53
54 int z_InitResponse(ODR o, Z_InitResponse **p, int opt)
55 {
56     Z_InitResponse *pp;
57
58     if (!odr_sequence_begin(o, p, sizeof(**p)))
59         return opt;
60     pp = *p;
61     return
62         z_ReferenceId(o, &pp->referenceId, 1) &&
63         odr_implicit(o, odr_bitstring, &pp->protocolVersion, ODR_CONTEXT, 
64             3, 0) &&
65         odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
66         odr_implicit(o, odr_integer, &pp->preferredMessageSize, ODR_CONTEXT,
67             5, 0) &&
68         odr_implicit(o, odr_integer, &pp->maximumRecordSize, ODR_CONTEXT,
69             6, 0) &&
70         odr_implicit(o, odr_bool, &pp->result, ODR_CONTEXT, 12, 0) &&
71         odr_implicit(o, odr_visiblestring, &pp->idAuthentication, ODR_CONTEXT,
72             7, 1) &&
73         odr_implicit(o, odr_visiblestring, &pp->implementationId, ODR_CONTEXT,
74             110, 1) &&
75         odr_implicit(o, odr_visiblestring, &pp->implementationName, ODR_CONTEXT,
76             111, 1) &&
77         odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
78             ODR_CONTEXT, 112, 1) &&
79         odr_sequence_end(o);
80 }
81
82 int z_SearchRequest(ODR o, Z_SearchRequest **p, int opt)
83 {
84     Z_SearchRequest *pp;
85
86     if (!odr_sequence_begin(o, p, sizeof(**p)))
87         return opt;
88     pp = *p;
89     return
90         z_ReferenceId(o, &pp->referenceId, 1) &&
91         odr_implicit(o, odr_integer, &pp->smallSetUpperBound, ODR_CONTEXT,
92             13, 0) &&
93         odr_implicit(o, odr_integer, &pp->largeSetLowerBound, ODR_CONTEXT,
94             14, 0) &&
95         odr_implicit(o, odr_integer, &pp->mediumSetPresentNumber, ODR_CONTEXT,
96             15, 0) &&
97         odr_implicit(o, odr_bool, &pp->replaceIndicator, ODR_CONTEXT, 16, 1) &&
98         odr_implicit(o, odr_visiblestring, &pp->resultSetName, ODR_CONTEXT,
99             17, 9) &&
100
101         /* MORE */
102
103         odr_sequence_end(o);
104 }
105
106 int z_APDU(ODR o, Z_APDU **p, int opt)
107 {
108     static Odr_arm arm[] =
109     {
110         {ODR_IMPLICIT, ODR_CONTEXT, 20, Z_APDU_InitRequest, z_InitRequest},
111         {ODR_IMPLICIT, ODR_CONTEXT, 21, Z_APDU_InitResponse, z_InitResponse},
112         {ODR_IMPLICIT, ODR_CONTEXT, 22, Z_APDU_SearchRequest, z_SearchRequest},
113
114         {-1, -1, -1, -1, 0}
115     };
116
117     if (o->direction == ODR_DECODE && !*p)
118         *p = nalloc(o, sizeof(**p));
119     if (!odr_choice(o, arm, &(*p)->u, &(*p)->which))
120     {
121         if (o->direction == ODR_DECODE)
122         {
123             *p = 0;
124             return opt;
125         }
126     }
127     return 1;
128 }