* Sebastian Hammer, Adam Dickmeiss
*
* $Log: seshigh.c,v $
- * Revision 1.87 1999-03-31 11:18:25 adam
+ * Revision 1.91 1999-06-01 14:29:12 adam
+ * Work on Extended Services.
+ *
+ * Revision 1.90 1999/05/27 13:02:20 adam
+ * Assigned OID for old DB Update (VAL_DBUPDATE0).
+ *
+ * Revision 1.89 1999/05/26 15:24:26 adam
+ * Fixed minor bugs regarding DB Update (introduced by previous commit).
+ *
+ * Revision 1.88 1999/04/20 09:56:48 adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.87 1999/03/31 11:18:25 adam
* Implemented odr_strdup. Added Reference ID to backend server API.
*
* Revision 1.86 1999/02/02 13:57:38 adam
req = request_get(&assoc->incoming); /* get a new request structure */
odr_reset(assoc->decode);
odr_setbuf(assoc->decode, assoc->input_buffer, res, 0);
- if (!z_APDU(assoc->decode, &req->request, 0))
+ if (!z_APDU(assoc->decode, &req->request, 0, 0))
{
logf(LOG_LOG, "ODR error on incoming PDU: %s [near byte %d] ",
odr_errmsg(odr_geterror(assoc->decode)),
return;
}
req->request_mem = odr_extract_mem(assoc->decode);
- if (assoc->print && !z_APDU(assoc->print, &req->request, 0))
+ if (assoc->print && !z_APDU(assoc->print, &req->request, 0, 0))
{
logf(LOG_WARN, "ODR print error: %s",
odr_errmsg(odr_geterror(assoc->print)));
static int process_response(association *assoc, request *req, Z_APDU *res)
{
odr_setbuf(assoc->encode, req->response, req->size_response, 1);
- if (!z_APDU(assoc->encode, &res, 0))
+ if (!z_APDU(assoc->encode, &res, 0, 0))
{
logf(LOG_WARN, "ODR error when encoding response: %s",
odr_errmsg(odr_geterror(assoc->decode)));
req->response = odr_getbuf(assoc->encode, &req->len_response,
&req->size_response);
odr_setbuf(assoc->encode, 0, 0, 0); /* don'txfree if we abort later */
- if (assoc->print && !z_APDU(assoc->print, &res, 0))
+ if (assoc->print && !z_APDU(assoc->print, &res, 0, 0))
{
logf(LOG_WARN, "ODR print error: %s",
odr_errmsg(odr_geterror(assoc->print)));
#if ASN_COMPILED
rec->u.nonSurrogateDiagnostic = dr;
#else
-#ifdef Z_95
rec->u.nonSurrogateDiagnostic = drec;
drec->which = Z_DiagRec_defaultFormat;
drec->u.defaultFormat = dr;
-#else
- rec->u.nonSurrogateDiagnostic = dr;
-#endif
#endif
- dr->diagnosticSetId = odr_oiddup (assoc->encode,
- oid_ent_to_oid(&bib1, oid));
+ dr->diagnosticSetId =
+ odr_oiddup (assoc->encode, oid_ent_to_oid(&bib1, oid));
dr->condition = err;
set_addinfo (dr, addinfo);
return rec;
int error, char *addinfo)
{
int oid[OID_SIZE];
- Z_NamePlusRecord *rec = (Z_NamePlusRecord *)odr_malloc (assoc->encode, sizeof(*rec));
+ Z_NamePlusRecord *rec = (Z_NamePlusRecord *)
+ odr_malloc (assoc->encode, sizeof(*rec));
int *err = (int *)odr_malloc (assoc->encode, sizeof(*err));
oident bib1;
Z_DiagRec *drec = (Z_DiagRec *)odr_malloc (assoc->encode, sizeof(*drec));
- Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *)odr_malloc (assoc->encode, sizeof(*dr));
-
+ Z_DefaultDiagFormat *dr = (Z_DefaultDiagFormat *)
+ odr_malloc (assoc->encode, sizeof(*dr));
+
bib1.proto = assoc->proto;
bib1.oclass = CLASS_DIAGSET;
bib1.value = VAL_BIB1;
int *next, int *pres, oid_value format,
Z_ReferenceId *referenceId)
{
- int oid[OID_SIZE];
int recno, total_length = 0, toget = *num, dumped_records = 0;
Z_Records *records =
(Z_Records *) odr_malloc (a->encode, sizeof(*records));
(Z_NamePlusRecordList *) odr_malloc (a->encode, sizeof(*reclist));
Z_NamePlusRecord **list =
(Z_NamePlusRecord **) odr_malloc (a->encode, sizeof(*list) * toget);
- oident recform;
records->which = Z_Records_DBOSD;
records->u.databaseOrSurDiagnostics = reclist;
bend_fetchrequest freq;
bend_fetchresult *fres;
Z_NamePlusRecord *thisrec;
- Z_DatabaseRecord *thisext;
int this_length = 0;
-
/*
* we get the number of bytes allocated on the stream before any
* allocation done by the backend - this should give us a reasonable
return 0;
strcpy(thisrec->databaseName, fres->basename);
thisrec->which = Z_NamePlusRecord_databaseRecord;
- if (!(thisrec->u.databaseRecord = thisext = (Z_External *)
- odr_malloc(a->encode, sizeof(Z_DatabaseRecord))))
+ thisrec->u.databaseRecord = z_ext_record(a->encode, fres->format,
+ fres->record, fres->len);
+ if (!thisrec->u.databaseRecord)
return 0;
- recform.proto = a->proto;
- recform.oclass = CLASS_RECSYN;
- recform.value = fres->format;
- thisext->direct_reference =
- odr_oiddup(a->encode, oid_ent_to_oid(&recform, oid));
- thisext->indirect_reference = 0;
- thisext->descriptor = 0;
- if (fres->len < 0) /* Structured data */
- {
- switch (fres->format)
- {
- case VAL_SUTRS: thisext->which = Z_External_sutrs; break;
- case VAL_GRS1: thisext->which = Z_External_grs1; break;
- case VAL_EXPLAIN: thisext->which = Z_External_explainRecord;
- break;
- case VAL_SUMMARY: thisext->which = Z_External_summary; break;
- case VAL_OPAC: thisext->which = Z_External_OPAC; break;
-
- default:
- logf(LOG_FATAL, "Unknown structured format from backend.");
- return 0;
- }
-
- /*
- * We cheat on the pointers here. Obviously, the record field
- * of the backend-fetch structure should have been a union for
- * correctness, but we're stuck with this for backwards
- * compatibility.
- */
- thisext->u.grs1 = (Z_GenericRecord*) fres->record;
- }
- else if (fres->format == VAL_SUTRS) /* SUTRS is a single-ASN.1-type */
- {
-#if 0
- Z_SUTRS *sutrs = (Z_SUTRS *)odr_malloc(a->encode, 1+fres->len);
-
- memcpy(sutrs, fres->record, fres->len);
- sutrs[fres->len] = '\0';
-#else
- Odr_oct *sutrs = (Odr_oct *)odr_malloc(a->encode, sizeof(*sutrs));
-
- thisext->which = Z_External_sutrs;
- thisext->u.sutrs = sutrs;
- sutrs->buf = (unsigned char *)odr_malloc(a->encode, fres->len);
- sutrs->len = sutrs->size = fres->len;
- memcpy(sutrs->buf, fres->record, fres->len);
-#endif
- }
- else /* octet-aligned record. */
- {
- thisext->which = Z_External_octet;
- if (!(thisext->u.octet_aligned = (Odr_oct *)odr_malloc(a->encode,
- sizeof(Odr_oct))))
- return 0;
- if (!(thisext->u.octet_aligned->buf = (unsigned char *)
- odr_malloc(a->encode, fres->len)))
- return 0;
- memcpy(thisext->u.octet_aligned->buf, fres->record, fres->len);
- thisext->u.octet_aligned->len = thisext->u.octet_aligned->size =
- fres->len;
- }
reclist->records[reclist->num_records] = thisrec;
reclist->num_records++;
*next = fres->last_in_set ? 0 : recno + 1;
resp->referenceId = req->referenceId;
- if ( esrequest.errcode == 0 )
+ if (esrequest.errcode == -1)
{
/* Backend service indicates request will be processed */
- logf(LOG_DEBUG,"Request will be processed...Good !");
+ logf(LOG_DEBUG,"Request could be processed...Accepted !");
+ *resp->operationStatus = Z_ExtendedServicesResponse_accepted;
+ }
+ else if (esrequest.errcode == 0)
+ {
+ /* Backend service indicates request will be processed */
+ logf(LOG_DEBUG,"Request could be processed...Done !");
*resp->operationStatus = Z_ExtendedServicesResponse_done;
}
else
{
+ Z_DiagRecs *diagRecs = diagrecs (assoc, esrequest.errcode,
+ esrequest.errstring);
+
/* Backend indicates error, request will not be processed */
- logf(LOG_DEBUG,"Request will not be processed...BAD !");
+ logf(LOG_DEBUG,"Request could not be processed...failure !");
*resp->operationStatus = Z_ExtendedServicesResponse_failure;
+ resp->num_diagnostics = diagRecs->num_diagRecs;
+ resp->diagnostics = diagRecs->diagRecs;
}
/* Do something with the members of bend_extendedservice */
logf(LOG_DEBUG,"Send the result apdu");
-
return apdu;
}