New OID database - with public definitions in oid_db.h. Removed old OID
[yaz-moved-to-github.git] / src / zget.c
1 /*
2  * Copyright (C) 1995-2007, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: zget.c,v 1.13 2007-04-12 13:52:57 adam Exp $
6  */
7 /**
8  * \file zget.c
9  * \brief Implements Z39.50 package creator utilities
10  */
11
12 #include <yaz/proto.h>
13 #include <yaz/oid_db.h>
14
15 Z_InitRequest *zget_InitRequest(ODR o)
16 {
17     Z_InitRequest *r = (Z_InitRequest *)odr_malloc(o, sizeof(*r));
18
19     r->referenceId = 0;
20     r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
21     ODR_MASK_ZERO(r->options);
22     r->protocolVersion = (Odr_bitmask *)
23         odr_malloc(o, sizeof(*r->protocolVersion));
24
25     ODR_MASK_SET(r->options, Z_Options_search);
26     ODR_MASK_SET(r->options, Z_Options_present);
27
28     ODR_MASK_ZERO(r->protocolVersion);
29
30     ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_1);
31     ODR_MASK_SET(r->protocolVersion, Z_ProtocolVersion_2);
32
33     r->preferredMessageSize = odr_intdup(o, 1024*1024);
34     r->maximumRecordSize = odr_intdup(o, 1024*1024);
35     r->idAuthentication = 0;
36     r->implementationId = "81";
37     r->implementationName = "YAZ";
38     r->implementationVersion = YAZ_VERSION
39 #ifdef YAZ_DATE_STR
40     " (" YAZ_DATE_STR ")"
41 #endif
42 #ifdef YAZ_OS
43     " " YAZ_OS
44 #endif
45         ;
46     r->userInformationField = 0;
47     r->otherInfo = 0;
48     return r;
49 }
50
51 Z_InitResponse *zget_InitResponse(ODR o)
52 {
53     Z_InitResponse *r = (Z_InitResponse *)odr_malloc(o, sizeof(*r));
54
55     r->referenceId = 0;
56     r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
57     ODR_MASK_ZERO(r->options);
58     r->protocolVersion = (Odr_bitmask *)odr_malloc(o, sizeof(*r->protocolVersion));
59     ODR_MASK_ZERO(r->protocolVersion);
60     r->preferredMessageSize = odr_intdup(o, 30*1024);
61     r->maximumRecordSize = odr_intdup(o, 30*1024);
62     r->result = odr_intdup(o, 1);
63     r->implementationId = "81";
64     r->implementationName = "YAZ";
65     r->implementationVersion = YAZ_VERSION
66 #ifdef YAZ_DATE_STR
67     " (" YAZ_DATE_STR ")"
68 #endif
69 #ifdef YAZ_OS
70     " " YAZ_OS
71 #endif
72         ;
73     r->userInformationField = 0;
74     r->otherInfo = 0;
75     return r;
76 }
77
78 Z_SearchRequest *zget_SearchRequest(ODR o)
79 {
80     Z_SearchRequest *r = (Z_SearchRequest *)odr_malloc(o, sizeof(*r));
81
82     r->referenceId = 0;
83     r->smallSetUpperBound = odr_intdup(o, 0);
84     r->largeSetLowerBound = odr_intdup(o, 1);
85     r->mediumSetPresentNumber = odr_intdup(o, 0);
86     r->replaceIndicator = odr_intdup(o, 1);
87     r->resultSetName = "default";
88     r->num_databaseNames = 0;
89     r->databaseNames = 0;
90     r->smallSetElementSetNames = 0;
91     r->mediumSetElementSetNames = 0;
92     r->preferredRecordSyntax = 0;
93     r->query = 0;
94     r->additionalSearchInfo = 0;
95     r->otherInfo = 0;
96     return r;
97 }
98
99 Z_SearchResponse *zget_SearchResponse(ODR o)
100 {
101     Z_SearchResponse *r = (Z_SearchResponse *)odr_malloc(o, sizeof(*r));
102
103     r->referenceId = 0;
104     r->resultCount = odr_intdup(o, 0);
105     r->numberOfRecordsReturned = odr_intdup(o, 0);
106     r->nextResultSetPosition = odr_intdup(o, 0);
107     r->searchStatus = odr_intdup(o, 1);
108     r->resultSetStatus = 0;
109     r->presentStatus = 0;
110     r->records = 0;
111     r->additionalSearchInfo = 0;
112     r->otherInfo = 0;
113     return r;
114 }
115
116 Z_PresentRequest *zget_PresentRequest(ODR o)
117 {
118     Z_PresentRequest *r = (Z_PresentRequest *)odr_malloc(o, sizeof(*r));
119
120     r->referenceId = 0;
121     r->resultSetId = "default";
122     r->resultSetStartPoint = odr_intdup(o, 1);
123     r->numberOfRecordsRequested = odr_intdup(o, 10);
124     r->num_ranges = 0;
125     r->additionalRanges = 0;
126     r->recordComposition = 0;
127     r->preferredRecordSyntax = 0;
128     r->maxSegmentCount = 0;
129     r->maxRecordSize = 0;
130     r->maxSegmentSize = 0;
131     r->otherInfo = 0;
132     return r;
133 }
134
135 Z_PresentResponse *zget_PresentResponse(ODR o)
136 {
137     Z_PresentResponse *r = (Z_PresentResponse *)odr_malloc(o, sizeof(*r));
138
139     r->referenceId = 0;
140     r->numberOfRecordsReturned = odr_intdup(o, 0);
141     r->nextResultSetPosition = odr_intdup(o, 0);
142     r->presentStatus = odr_intdup(o, Z_PresentStatus_success);
143     r->records = 0;
144     r->otherInfo = 0;
145     return r;
146 }
147
148 Z_DeleteResultSetRequest *zget_DeleteResultSetRequest(ODR o)
149 {
150     Z_DeleteResultSetRequest *r = (Z_DeleteResultSetRequest *)
151         odr_malloc(o, sizeof(*r));
152
153     r->referenceId = 0;
154     r->deleteFunction = odr_intdup(o, Z_DeleteResultSetRequest_list);
155     r->num_resultSetList = 0;
156     r->resultSetList = 0;
157     r->otherInfo = 0;
158     return r;
159 }
160
161 Z_DeleteResultSetResponse *zget_DeleteResultSetResponse(ODR o)
162 {
163     Z_DeleteResultSetResponse *r = (Z_DeleteResultSetResponse *)
164         odr_malloc(o, sizeof(*r));
165     
166     r->referenceId = 0;
167     r->deleteOperationStatus = odr_intdup(o, Z_DeleteStatus_success);
168     r->deleteListStatuses = 0;
169     r->numberNotDeleted = 0;
170     r->bulkStatuses = 0;
171     r->deleteMessage = 0;
172     r->otherInfo = 0;
173     return r;
174 }
175
176 Z_ScanRequest *zget_ScanRequest(ODR o)
177 {
178     Z_ScanRequest *r = (Z_ScanRequest *)odr_malloc(o, sizeof(*r));
179     
180     r->referenceId = 0;
181     r->num_databaseNames = 0;
182     r->databaseNames = 0;
183     r->attributeSet = 0;
184     r->termListAndStartPoint = 0;
185     r->stepSize = 0;
186     r->numberOfTermsRequested = odr_intdup(o, 20);
187     r->preferredPositionInResponse = 0;
188     r->otherInfo = 0;
189     return r;
190 }
191
192 Z_ScanResponse *zget_ScanResponse(ODR o)
193 {
194     Z_ScanResponse *r = (Z_ScanResponse *)odr_malloc(o, sizeof(*r));
195     
196     r->referenceId = 0;
197     r->stepSize = 0;
198     r->scanStatus = odr_intdup(o, Z_Scan_success);
199     r->numberOfEntriesReturned = odr_intdup(o, 0);
200     r->positionOfTerm =0;
201     r->entries = 0;
202     r->attributeSet = 0;
203     r->otherInfo = 0;
204     return r;
205 }
206
207 Z_TriggerResourceControlRequest *zget_TriggerResourceControlRequest(ODR o)
208 {
209     Z_TriggerResourceControlRequest *r = (Z_TriggerResourceControlRequest *)
210         odr_malloc(o, sizeof(*r));
211     
212     r->referenceId = 0;
213     r->requestedAction = odr_intdup(o, Z_TriggerResourceControlRequest_resourceReport);
214     r->prefResourceReportFormat = 0;
215     r->resultSetWanted = 0;
216     r->otherInfo = 0;
217     return r;
218 }
219
220 Z_ResourceControlRequest *zget_ResourceControlRequest(ODR o)
221 {
222     Z_ResourceControlRequest *r = (Z_ResourceControlRequest *)
223         odr_malloc(o, sizeof(*r));
224
225     r->referenceId = 0;
226     r->suspendedFlag = 0;
227     r->resourceReport = 0;
228     r->partialResultsAvailable = 0;
229     r->responseRequired = odr_intdup(o, 0);
230     r->triggeredRequestFlag = 0;
231     r->otherInfo = 0;
232     return r;
233 }
234
235 Z_ResourceControlResponse *zget_ResourceControlResponse(ODR o)
236 {
237     Z_ResourceControlResponse *r = (Z_ResourceControlResponse *)
238         odr_malloc(o, sizeof(*r));
239
240     r->referenceId = 0;
241     r->continueFlag = odr_intdup(o, 1);
242     r->resultSetWanted = 0;
243     r->otherInfo = 0;
244     return r;
245 }
246
247 Z_AccessControlRequest *zget_AccessControlRequest(ODR o)
248 {
249     Z_AccessControlRequest *r = (Z_AccessControlRequest *)
250         odr_malloc(o, sizeof(*r));
251
252     r->referenceId = 0;
253     r->which = Z_AccessControlRequest_simpleForm;
254     r->u.simpleForm = 0;
255     r->otherInfo = 0;
256     return r;
257 }
258
259 Z_AccessControlResponse *zget_AccessControlResponse(ODR o)
260 {
261     Z_AccessControlResponse *r = (Z_AccessControlResponse *)
262         odr_malloc(o, sizeof(*r));
263
264     r->referenceId = 0;
265     r->which = Z_AccessControlResponse_simpleForm;
266     r->u.simpleForm = 0;
267     r->diagnostic = 0;
268     r->otherInfo = 0;
269     return r;
270 }
271
272 Z_Segment *zget_Segment(ODR o)
273 {
274     Z_Segment *r = (Z_Segment *)odr_malloc(o, sizeof(*r));
275
276     r->referenceId = 0;
277     r->numberOfRecordsReturned = odr_intdup(o, 0);
278     r->num_segmentRecords = 0;
279     r->segmentRecords = (Z_NamePlusRecord **) odr_nullval();
280     r->otherInfo = 0;
281     return r;
282 }
283
284 Z_Close *zget_Close(ODR o)
285 {
286     Z_Close *r = (Z_Close *)odr_malloc(o, sizeof(*r));
287
288     r->referenceId = 0;
289     r->closeReason = odr_intdup(o, Z_Close_finished);
290     r->diagnosticInformation = 0;
291     r->resourceReportFormat = 0;
292     r->resourceReport = 0;
293     r->otherInfo = 0;
294     return r;
295 }
296
297 Z_ResourceReportRequest *zget_ResourceReportRequest(ODR o)
298 {
299     Z_ResourceReportRequest *r = (Z_ResourceReportRequest *)
300         odr_malloc(o, sizeof(*r));
301
302     r->referenceId = 0;
303     r->opId = 0;
304     r->prefResourceReportFormat = 0;
305     r->otherInfo = 0;
306     return r;
307 }
308
309 Z_ResourceReportResponse *zget_ResourceReportResponse(ODR o)
310 {
311     Z_ResourceReportResponse *r = (Z_ResourceReportResponse *)
312         odr_malloc(o, sizeof(*r));
313
314     r->referenceId = 0;
315     r->resourceReportStatus = odr_intdup(o, Z_ResourceReportResponse_success);
316     r->resourceReport = 0;
317     r->otherInfo = 0;
318     return r;
319 }
320
321 Z_SortRequest *zget_SortRequest(ODR o)
322 {
323     Z_SortRequest *r = (Z_SortRequest *)odr_malloc(o, sizeof(*r));
324
325     r->referenceId = 0;
326     r->inputResultSetNames = 0;
327     r->sortedResultSetName = 0;
328     r->sortSequence = 0;
329     r->otherInfo = 0;
330     return r;
331 }
332
333 Z_SortResponse *zget_SortResponse(ODR o)
334 {
335     Z_SortResponse *r = (Z_SortResponse *)odr_malloc(o, sizeof(*r));
336
337     r->referenceId = 0;
338     r->sortStatus = odr_intdup(o, Z_SortResponse_success);
339     r->resultSetStatus = odr_intdup(o, Z_SortResponse_empty);
340     r->diagnostics = 0;
341     r->resultCount = 0;
342     r->otherInfo = 0;
343     return r;
344 }
345
346 Z_ExtendedServicesRequest *zget_ExtendedServicesRequest(ODR o)
347 {
348     Z_ExtendedServicesRequest *r = (Z_ExtendedServicesRequest *)
349         odr_malloc(o, sizeof(*r));
350
351     r->referenceId = 0;
352     r->function = odr_intdup(o, Z_ExtendedServicesRequest_create);
353     r->packageType = 0;
354     r->packageName = 0;
355     r->userId = 0;
356     r->retentionTime = 0;
357     r->permissions = 0;
358     r->description = 0;
359     r->taskSpecificParameters = 0;
360     r->waitAction = odr_intdup(o, Z_ExtendedServicesRequest_waitIfPossible);
361     r->elements = 0;
362     r->otherInfo = 0;
363     return r;
364 }
365
366 Z_ExtendedServicesResponse *zget_ExtendedServicesResponse(ODR o)
367 {
368     Z_ExtendedServicesResponse *r = (Z_ExtendedServicesResponse *)
369         odr_malloc(o, sizeof(*r));
370
371     r->referenceId = 0;
372     r->operationStatus = odr_intdup(o, Z_ExtendedServicesResponse_done);
373     r->num_diagnostics = 0;
374     r->diagnostics = 0;
375     r->taskPackage = 0;
376     r->otherInfo = 0;
377     return r;
378 }
379
380 Z_DuplicateDetectionRequest *zget_DuplicateDetectionRequest(ODR o)
381 {
382     Z_DuplicateDetectionRequest *r = (Z_DuplicateDetectionRequest *)
383         odr_malloc(o, sizeof(*r));
384     
385     r->referenceId = 0;
386     r->num_inputResultSetIds = 0;
387     r->inputResultSetIds = 0;
388     r->outputResultSetName = 0;
389     r->applicablePortionOfRecord = 0;
390     r->num_duplicateDetectionCriteria = 0;
391     r->duplicateDetectionCriteria = 0;
392     r->clustering = 0;
393     r->num_retentionCriteria = 0;
394     r->retentionCriteria = 0;
395     r->num_sortCriteria = 0;
396     r->sortCriteria = 0;
397     r->otherInfo = 0;
398     return r;
399 }
400
401 Z_DuplicateDetectionResponse *zget_DuplicateDetectionResponse(ODR o)
402 {
403     Z_DuplicateDetectionResponse *r = (Z_DuplicateDetectionResponse *)
404         odr_malloc(o, sizeof(*r));
405  
406     r->referenceId = 0;
407     r->status = odr_intdup(o, Z_DuplicateDetectionResponse_success);
408     r->resultSetCount = 0;
409     r->num_diagnostics = 0;
410     r->diagnostics = 0;
411     r->otherInfo = 0;
412     return r;
413 }
414  
415 Z_APDU *zget_APDU(ODR o, int which)
416 {
417     Z_APDU *r = (Z_APDU *)odr_malloc(o, sizeof(*r));
418     
419     switch (r->which = which)
420     {
421     case Z_APDU_initRequest:
422         r->u.initRequest = zget_InitRequest(o);
423         break;
424     case Z_APDU_initResponse:
425         r->u.initResponse = zget_InitResponse(o);
426         break;
427     case Z_APDU_searchRequest:
428         r->u.searchRequest = zget_SearchRequest(o);
429         break;
430     case Z_APDU_searchResponse:
431         r->u.searchResponse = zget_SearchResponse(o);
432         break;
433     case Z_APDU_presentRequest:
434         r->u.presentRequest = zget_PresentRequest(o);
435         break;
436     case Z_APDU_presentResponse:
437         r->u.presentResponse = zget_PresentResponse(o);
438         break;
439     case Z_APDU_deleteResultSetRequest:
440         r->u.deleteResultSetRequest = zget_DeleteResultSetRequest(o);
441         break;
442     case Z_APDU_deleteResultSetResponse:
443         r->u.deleteResultSetResponse = zget_DeleteResultSetResponse(o);
444         break;
445     case Z_APDU_scanRequest:
446         r->u.scanRequest = zget_ScanRequest(o);
447         break;
448     case Z_APDU_scanResponse:
449         r->u.scanResponse = zget_ScanResponse(o);
450         break;
451     case Z_APDU_triggerResourceControlRequest:
452         r->u.triggerResourceControlRequest =
453             zget_TriggerResourceControlRequest(o);
454         break;
455     case Z_APDU_resourceControlRequest:
456         r->u.resourceControlRequest = zget_ResourceControlRequest(o);
457         break;
458     case Z_APDU_resourceControlResponse:
459         r->u.resourceControlResponse = zget_ResourceControlResponse(o);
460         break;
461     case Z_APDU_segmentRequest:
462         r->u.segmentRequest = zget_Segment(o);
463         break;
464     case Z_APDU_close:
465         r->u.close = zget_Close(o);
466         break;
467     case Z_APDU_accessControlRequest:
468         r->u.accessControlRequest = zget_AccessControlRequest(o);
469         break;
470     case Z_APDU_accessControlResponse:
471         r->u.accessControlResponse = zget_AccessControlResponse(o);
472         break;
473     case Z_APDU_resourceReportRequest:
474         r->u.resourceReportRequest = zget_ResourceReportRequest(o);
475         break;
476     case Z_APDU_resourceReportResponse:
477         r->u.resourceReportResponse = zget_ResourceReportResponse(o);
478         break;
479     case Z_APDU_sortRequest:
480         r->u.sortRequest = zget_SortRequest(o);
481         break;
482     case Z_APDU_sortResponse:
483         r->u.sortResponse = zget_SortResponse(o);
484         break;
485     case Z_APDU_extendedServicesRequest:
486         r->u.extendedServicesRequest = zget_ExtendedServicesRequest(o);
487         break;
488     case Z_APDU_extendedServicesResponse:
489         r->u.extendedServicesResponse = zget_ExtendedServicesResponse(o);
490         break;
491     case Z_APDU_duplicateDetectionRequest:
492         r->u.duplicateDetectionRequest = zget_DuplicateDetectionRequest(o);
493         break;
494     case Z_APDU_duplicateDetectionResponse:
495         r->u.duplicateDetectionResponse = zget_DuplicateDetectionResponse(o);
496         break;
497     default:
498         return 0;
499     }
500     return r;
501 }
502
503 Z_DefaultDiagFormat *zget_DefaultDiagFormat(ODR o, int error,
504                                             const char *addinfo)
505 {
506     Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *) 
507         odr_malloc (o, sizeof(*dr));
508     
509     dr->diagnosticSetId = yaz_string_to_oid_odr(
510         yaz_oid_std(), CLASS_DIAGSET, OID_STR_BIB1, o);
511     dr->condition = odr_intdup(o, error);
512     dr->which = Z_DefaultDiagFormat_v2Addinfo;
513     dr->u.v2Addinfo = odr_strdup (o, addinfo ? addinfo : "");
514     return dr;
515 }
516
517 Z_DiagRec *zget_DiagRec(ODR o, int error, const char *addinfo)
518 {
519     Z_DiagRec *dr = (Z_DiagRec*) odr_malloc(o, sizeof(*dr));
520     dr->which = Z_DiagRec_defaultFormat;
521     dr->u.defaultFormat = zget_DefaultDiagFormat(o, error, addinfo);
522     return dr;
523 }
524
525 Z_DiagRecs *zget_DiagRecs(ODR o, int error, const char *addinfo)
526 {
527     Z_DiagRecs *drecs = (Z_DiagRecs*) odr_malloc(o, sizeof(*drecs));
528     Z_DiagRec **dr = (Z_DiagRec**) odr_malloc(o, sizeof(**dr));
529     drecs->diagRecs = dr;
530     dr[0] = zget_DiagRec(o, error, addinfo);
531     drecs->num_diagRecs = 1;
532     return drecs;
533 }
534
535 Z_NamePlusRecord *zget_surrogateDiagRec(ODR o, const char *dbname,
536                                         int error, const char *addinfo)
537 {
538     Z_NamePlusRecord *rec = (Z_NamePlusRecord *) odr_malloc (o, sizeof(*rec));
539     Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (o, sizeof(*drec));
540     
541     if (dbname)
542         rec->databaseName = odr_strdup(o, dbname);
543     else
544         rec->databaseName = 0;
545     rec->which = Z_NamePlusRecord_surrogateDiagnostic;
546     rec->u.surrogateDiagnostic = drec;
547     drec->which = Z_DiagRec_defaultFormat;
548     drec->u.defaultFormat = zget_DefaultDiagFormat(o, error, addinfo);
549     return rec;
550 }
551
552 Z_External *zget_init_diagnostics(ODR odr, int error, const char *addinfo)
553 {
554     Z_External *x, *x2;
555     Z_OtherInformation *u;
556     Z_OtherInformationUnit *l;
557     Z_DiagnosticFormat *d;
558     Z_DiagnosticFormat_s *e;
559
560     x = (Z_External*) odr_malloc(odr, sizeof *x);
561     x->descriptor = 0;
562     x->indirect_reference = 0;  
563     x->direct_reference = yaz_string_to_oid_odr(yaz_oid_std(),
564                                                 CLASS_USERINFO,
565                                                 OID_STR_USERINFO_1,
566                                                 odr);
567     x->which = Z_External_userInfo1;
568
569     u = odr_malloc(odr, sizeof *u);
570     x->u.userInfo1 = u;
571     u->num_elements = 1;
572     u->list = (Z_OtherInformationUnit**) odr_malloc(odr, sizeof *u->list);
573     u->list[0] = (Z_OtherInformationUnit*) odr_malloc(odr, sizeof *u->list[0]);
574     l = u->list[0];
575     l->category = 0;
576     l->which = Z_OtherInfo_externallyDefinedInfo;
577
578     x2 = (Z_External*) odr_malloc(odr, sizeof *x);
579     l->information.externallyDefinedInfo = x2;
580     x2->descriptor = 0;
581     x2->indirect_reference = 0;
582     x2->direct_reference = yaz_string_to_oid_odr(yaz_oid_std(),
583                                                  CLASS_DIAGSET,
584                                                  OID_STR_DIAG1,
585                                                  odr);
586     x2->which = Z_External_diag1;
587
588     d = (Z_DiagnosticFormat*) odr_malloc(odr, sizeof *d);
589     x2->u.diag1 = d;
590     d->num = 1;
591     d->elements = (Z_DiagnosticFormat_s**) odr_malloc (odr, sizeof *d->elements);
592     d->elements[0] = (Z_DiagnosticFormat_s*) odr_malloc (odr, sizeof *d->elements[0]);
593     e = d->elements[0];
594
595     e->which = Z_DiagnosticFormat_s_defaultDiagRec;
596     e->u.defaultDiagRec = zget_DefaultDiagFormat(odr, error, addinfo);
597     e->message = 0;
598     return x;
599 }
600
601 Z_External *zget_init_diagnostics_octet(ODR odr, int error,
602                                         const char *addinfo)
603 {
604     Z_External *x, *x2;
605     Z_OtherInformation *u;
606     Z_OtherInformationUnit *l;
607     Z_DiagnosticFormat *d;
608     Z_DiagnosticFormat_s *e;
609     char *octet_buf;
610     int octet_len;
611     ODR encode;
612
613     u = odr_malloc(odr, sizeof *u);
614     u->num_elements = 1;
615     u->list = (Z_OtherInformationUnit**) odr_malloc(odr, sizeof *u->list);
616     u->list[0] = (Z_OtherInformationUnit*) odr_malloc(odr, sizeof *u->list[0]);
617     l = u->list[0];
618     l->category = 0;
619     l->which = Z_OtherInfo_externallyDefinedInfo;
620
621     x2 = (Z_External*) odr_malloc(odr, sizeof *x);
622     l->information.externallyDefinedInfo = x2;
623     x2->descriptor = 0;
624     x2->indirect_reference = 0;
625
626     x2->direct_reference = yaz_string_to_oid_odr(yaz_oid_std(),
627                                                  CLASS_DIAGSET,
628                                                  OID_STR_DIAG1,
629                                                  odr);
630     x2->which = Z_External_diag1;
631
632     d = (Z_DiagnosticFormat*) odr_malloc(odr, sizeof *d);
633     x2->u.diag1 = d;
634     d->num = 1;
635     d->elements = (Z_DiagnosticFormat_s**) odr_malloc (odr, sizeof *d->elements);
636     d->elements[0] = (Z_DiagnosticFormat_s*) odr_malloc (odr, sizeof *d->elements[0]);
637     e = d->elements[0];
638
639     e->which = Z_DiagnosticFormat_s_defaultDiagRec;
640     e->u.defaultDiagRec = zget_DefaultDiagFormat(odr, error, addinfo);
641     e->message = 0;
642
643     encode = odr_createmem(ODR_ENCODE);
644
645     z_OtherInformation(encode, &u, 0, 0);
646
647     octet_buf = odr_getbuf(encode, &octet_len, 0);
648
649     x = (Z_External*) odr_malloc(odr, sizeof *x);
650     x->descriptor = 0;
651     x->indirect_reference = 0;  
652     x->direct_reference = yaz_string_to_oid_odr(yaz_oid_std(),
653                                                 CLASS_USERINFO,
654                                                 OID_STR_USERINFO_1,
655                                                 odr);
656
657     x->which = Z_External_octet;
658     x->u.octet_aligned = (Odr_oct *) odr_malloc(odr, sizeof(Odr_oct));
659     x->u.octet_aligned->buf = odr_malloc(odr, octet_len);
660     memcpy(x->u.octet_aligned->buf, octet_buf, octet_len);
661     x->u.octet_aligned->len = octet_len;
662
663     odr_destroy(encode);
664
665     return x;
666 }
667
668 /*
669  * Local variables:
670  * c-basic-offset: 4
671  * indent-tabs-mode: nil
672  * End:
673  * vim: shiftwidth=4 tabstop=8 expandtab
674  */
675