X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=asn%2Fproto.c;h=6d61a122ab82b838e2fe0a19ef2a532f5a650493;hp=c309e7bedb25f5460073103143d33c6ef03d4d12;hb=d0ef7e3d61ea8c14a8649fd199e9060039f3b7b0;hpb=657fb99115b87a5244e9a33bbe4ca3d9d18849c4 diff --git a/asn/proto.c b/asn/proto.c index c309e7b..6d61a12 100644 --- a/asn/proto.c +++ b/asn/proto.c @@ -4,7 +4,34 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: proto.c,v $ - * Revision 1.38 1995-09-27 15:02:40 quinn + * Revision 1.47 1996-05-29 15:47:50 quinn + * Fixed in bug DiagRecs decoder. Thanks to Linda Harris. + * + * Revision 1.46 1996/04/10 11:39:42 quinn + * Fixed bug in UserInfo + * + * Revision 1.45 1996/02/23 10:00:25 quinn + * Fixes to SCAN + * + * Revision 1.44 1996/02/20 12:51:41 quinn + * Completed SCAN. Fixed problems with EXTERNAL. + * + * Revision 1.43 1996/02/10 12:22:49 quinn + * Work on SCAN + * + * Revision 1.42 1996/01/22 09:46:31 quinn + * Added Sort PDU. Moved StringList to main protocol file. + * + * Revision 1.41 1996/01/10 15:21:24 quinn + * Added links to access control PDUs + * + * Revision 1.40 1996/01/02 11:46:40 quinn + * Changed 'operator' to 'roperator' to avoid C++ conflict. + * + * Revision 1.39 1995/09/29 17:11:53 quinn + * Smallish + * + * Revision 1.38 1995/09/27 15:02:40 quinn * Modified function heads & prototypes. * * Revision 1.37 1995/08/21 09:10:15 quinn @@ -130,7 +157,7 @@ * We'll use a general octetstring here, since string operations are * clumsy on long strings. */ -int MDF z_SUTRS(ODR o, Odr_oct **p, int opt) +int z_SUTRS(ODR o, Odr_oct **p, int opt) { return odr_implicit(o, odr_octetstring, p, ODR_UNIVERSAL, ODR_GENERALSTRING, opt); @@ -141,7 +168,7 @@ int z_ReferenceId(ODR o, Z_ReferenceId **p, int opt) return odr_implicit(o, odr_octetstring, (Odr_oct**) p, ODR_CONTEXT, 2, opt); } -int MDF z_DatabaseName(ODR o, Z_DatabaseName **p, int opt) +int z_DatabaseName(ODR o, Z_DatabaseName **p, int opt) { return odr_implicit(o, odr_visiblestring, (char **) p, ODR_CONTEXT, 105, opt); @@ -153,7 +180,7 @@ int z_ResultSetId(ODR o, char **p, int opt) opt); } -int MDF z_ElementSetName(ODR o, char **p, int opt) +int z_ElementSetName(ODR o, char **p, int opt) { return odr_implicit(o, odr_visiblestring, p, ODR_CONTEXT, 103, opt); } @@ -164,7 +191,7 @@ int z_UserInformationField(ODR o, Z_External **p, int opt) 11, opt); } -int MDF z_InternationalString(ODR o, char **p, int opt) +int z_InternationalString(ODR o, char **p, int opt) { return odr_generalstring(o, p, opt); } @@ -179,7 +206,7 @@ int z_InfoCategory(ODR o, Z_InfoCategory **p, int opt) odr_sequence_end(o); } -int MDF z_OtherInformationUnit(ODR o, Z_OtherInformationUnit **p, int opt) +int z_OtherInformationUnit(ODR o, Z_OtherInformationUnit **p, int opt) { static Odr_arm arm[] = { @@ -197,11 +224,11 @@ int MDF z_OtherInformationUnit(ODR o, Z_OtherInformationUnit **p, int opt) return opt && odr_ok(o); return odr_implicit(o, z_InfoCategory, &(*p)->category, ODR_CONTEXT, 1, 1) && - odr_choice(o, arm, &(*p)->which, &(*p)->information) && + odr_choice(o, arm, &(*p)->information, &(*p)->which) && odr_sequence_end(o); } -int MDF z_OtherInformation(ODR o, Z_OtherInformation **p, int opt) +int z_OtherInformation(ODR o, Z_OtherInformation **p, int opt) { if (o->direction == ODR_DECODE) *p = odr_malloc(o, sizeof(**p)); @@ -215,7 +242,7 @@ int MDF z_OtherInformation(ODR o, Z_OtherInformation **p, int opt) return opt && odr_ok(o); } -int MDF z_StringOrNumeric(ODR o, Z_StringOrNumeric **p, int opt) +int z_StringOrNumeric(ODR o, Z_StringOrNumeric **p, int opt) { static Odr_arm arm[] = { @@ -239,7 +266,7 @@ int MDF z_StringOrNumeric(ODR o, Z_StringOrNumeric **p, int opt) /* * check tagging!! */ -int MDF z_Unit(ODR o, Z_Unit **p, int opt) +int z_Unit(ODR o, Z_Unit **p, int opt) { if (!odr_sequence_begin(o, p, sizeof(**p))) return opt && odr_ok(o); @@ -253,7 +280,7 @@ int MDF z_Unit(ODR o, Z_Unit **p, int opt) odr_sequence_end(o); } -int MDF z_IntUnit(ODR o, Z_IntUnit **p, int opt) +int z_IntUnit(ODR o, Z_IntUnit **p, int opt) { if (!odr_sequence_begin(o, p, sizeof(**p))) return opt && odr_ok(o); @@ -263,10 +290,23 @@ int MDF z_IntUnit(ODR o, Z_IntUnit **p, int opt) odr_sequence_end(o); } +int z_StringList(ODR o, Z_StringList **p, int opt) +{ + if (o->direction == ODR_DECODE) + *p = odr_malloc(o, sizeof(**p)); + else if (!*p) + return opt; + if (odr_sequence_of(o, z_InternationalString, &(*p)->strings, + &(*p)->num_strings)) + return 1; + *p = 0; + return opt && odr_ok(o); +} + /* ---------------------- INITIALIZE SERVICE ------------------- */ #if 0 -int MDF z_NSRAuthentication(ODR o, Z_NSRAuthentication **p, int opt) +int z_NSRAuthentication(ODR o, Z_NSRAuthentication **p, int opt) { if (!odr_sequence_begin(o, p, sizeof(**p))) return opt && odr_ok(o); @@ -290,7 +330,7 @@ int z_IdPass(ODR o, Z_IdPass **p, int opt) odr_sequence_end(o); } -int MDF z_StrAuthentication(ODR o, char **p, int opt) +int z_StrAuthentication(ODR o, char **p, int opt) { return odr_visiblestring(o, p, opt); } @@ -530,7 +570,7 @@ int z_AttributeElement(ODR o, Z_AttributeElement **p, int opt) odr_sequence_end(o); } -int MDF z_Term(ODR o, Z_Term **p, int opt) +int z_Term(ODR o, Z_Term **p, int opt) { static Odr_arm arm[] = { @@ -658,7 +698,7 @@ int z_Complex(ODR o, Z_Complex **p, int opt) return z_RPNStructure(o, &(*p)->s1, 0) && z_RPNStructure(o, &(*p)->s2, 0) && - z_Operator(o, &(*p)->operator, 0) && + z_Operator(o, &(*p)->roperator, 0) && odr_sequence_end(o); } @@ -758,7 +798,7 @@ int z_DatabaseRecord(ODR o, Z_DatabaseRecord **p, int opt) #ifdef Z_95 -int MDF z_DefaultDiagFormat(ODR o, Z_DefaultDiagFormat **p, int opt) +int z_DefaultDiagFormat(ODR o, Z_DefaultDiagFormat **p, int opt) { static Odr_arm arm[] = { @@ -783,7 +823,7 @@ int MDF z_DefaultDiagFormat(ODR o, Z_DefaultDiagFormat **p, int opt) odr_sequence_end(o); } -int MDF z_DiagRec(ODR o, Z_DiagRec **p, int opt) +int z_DiagRec(ODR o, Z_DiagRec **p, int opt) { static Odr_arm arm[] = { @@ -836,7 +876,7 @@ int z_DiagRecs(ODR o, Z_DiagRecs **p, int opt) &(*p)->num_diagRecs)) return 1; *p = 0; - return 0; + return opt && odr_ok(o); } int z_NamePlusRecord(ODR o, Z_NamePlusRecord **p, int opt) @@ -942,7 +982,7 @@ int z_AccessControlResponse(ODR o, Z_AccessControlResponse **p, int opt) /* ------------------------ SCAN SERVICE -------------------- */ -int MDF z_AttributeList(ODR o, Z_AttributeList **p, int opt) +int z_AttributeList(ODR o, Z_AttributeList **p, int opt) { if (o->direction == ODR_DECODE) *p = odr_malloc(o, sizeof(**p)); @@ -1010,6 +1050,77 @@ int z_AlternativeTerm(ODR o, Z_AlternativeTerm **p, int opt) return opt && !o->error; } +#if 1 + +int z_ByDatabase(ODR o, Z_ByDatabase **p, int opt) +{ + if (!odr_sequence_begin(o, p, sizeof(**p))) + return opt && odr_ok(o); + return + z_DatabaseName(o, &(*p)->db, 1) && + odr_implicit(o, odr_integer, &(*p)->num, ODR_CONTEXT, 1, 1) && + z_OtherInformation(o, &(*p)->otherDbInfo, 1) && + odr_sequence_end(o); +} + +int z_ByDatabaseList(ODR o, Z_ByDatabaseList **p, int opt) +{ + if (!odr_initmember(o, p, sizeof(**p))) + return opt && odr_ok(o); + if (odr_sequence_of(o, z_ByDatabase, &(*p)->elements, &(*p)->num_elements)) + return 1; + *p = 0; + return opt && odr_ok(o); +} + +int z_ScanOccurrences(ODR o, Z_ScanOccurrences **p, int opt) +{ + Odr_arm arm[] = + { + {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_ScanOccurrences_global, odr_integer}, + {ODR_EXPLICIT, ODR_CONTEXT, 3, Z_ScanOccurrences_byDatabase, + z_ByDatabaseList}, + {-1, -1, -1, -1, 0} + }; + + if (!odr_initmember(o, p, sizeof(**p))) + return opt && odr_ok(o); + if (odr_choice(o, arm, &(*p)->u, &(*p)->which)) + return 1; + *p = 0; + return opt && odr_ok(o); +} + +int z_OccurrenceByAttributesElem(ODR o, Z_OccurrenceByAttributesElem **p, + int opt) +{ + if (!odr_sequence_begin(o, p, sizeof(**p))) + return opt && odr_ok(o); + return + odr_explicit(o, z_AttributeList, &(*p)->attributes, ODR_CONTEXT, + 1, 1) && + z_ScanOccurrences(o, &(*p)->occurrences, 1) && + z_OtherInformation(o, &(*p)->otherOccurInfo, 1) && + odr_sequence_end(o); +} + +int z_OccurrenceByAttributes(ODR o, Z_OccurrenceByAttributes **p, int opt) +{ + if (!odr_initmember(o, p, sizeof(**p))) + return opt && odr_ok(o); + if (!odr_sequence_of(o, z_OccurrenceByAttributesElem, &(*p)->elements, + &(*p)->num_elements)) + return 1; + *p = 0; + return opt && odr_ok(o); +} + +#else + +/* + * Incomplete definition of occurencebyattributes. + */ + int z_OccurrenceByAttributes(ODR o, Z_OccurrenceByAttributes **p, int opt) { if (!odr_sequence_begin(o, p, sizeof(**p))) @@ -1020,6 +1131,8 @@ int z_OccurrenceByAttributes(ODR o, Z_OccurrenceByAttributes **p, int opt) odr_sequence_end(o); } +#endif + int z_TermInfo(ODR o, Z_TermInfo **p, int opt) { if (!odr_sequence_begin(o, p, sizeof(**p))) @@ -1028,6 +1141,8 @@ int z_TermInfo(ODR o, Z_TermInfo **p, int opt) (willow_scan ? odr_implicit(o, z_Term, &(*p)->term, ODR_CONTEXT, 1, 0) : z_Term(o, &(*p)->term, 0)) && + odr_implicit(o, z_InternationalString, &(*p)->displayTerm, ODR_CONTEXT, + 0, 1) && z_AttributeList(o, &(*p)->suggestedAttributes, 1) && odr_implicit(o, z_AlternativeTerm, &(*p)->alternativeTerm, ODR_CONTEXT, 4, 1) && @@ -1035,6 +1150,7 @@ int z_TermInfo(ODR o, Z_TermInfo **p, int opt) 2, 1) && odr_implicit(o, z_OccurrenceByAttributes, &(*p)->byAttributes, ODR_CONTEXT, 3, 1) && + z_OtherInformation(o, &(*p)->otherTermInfo, 1) && odr_sequence_end(o); } @@ -1129,6 +1245,7 @@ int z_ScanResponse(ODR o, Z_ScanResponse **p, int opt) odr_implicit(o, odr_integer, &(*p)->positionOfTerm, ODR_CONTEXT, 6, 1)&& odr_explicit(o, z_ListEntries, &(*p)->entries, ODR_CONTEXT, 7, 1) && odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 8, 1) && + z_OtherInformation(o, &(*p)->otherInfo, 1) && odr_sequence_end(o); } @@ -1198,7 +1315,7 @@ int z_ElementSpec(ODR o, Z_ElementSpec **p, int opt) return opt && odr_ok(o); } -int MDF z_Specification(ODR o, Z_Specification **p, int opt) +int z_Specification(ODR o, Z_Specification **p, int opt) { if (!odr_sequence_begin(o, p, sizeof(**p))) return opt && odr_ok(o); @@ -1423,7 +1540,7 @@ int z_Close(ODR o, Z_Close **p, int opt) /* ------------------------ APDU ------------------------- */ -int MDF z_Permissions(ODR o, Z_Permissions **p, int opt) +int z_Permissions(ODR o, Z_Permissions **p, int opt) { if (!odr_sequence_begin(o, p, sizeof(**p))) return opt && odr_ok(o); @@ -1471,9 +1588,154 @@ int z_ExtendedServicesResponse(ODR o, Z_ExtendedServicesResponse **p, int opt) odr_sequence_end(o); } +/* ------------------------ SORT ------------------------- */ + +int z_SortAttributes(ODR o, Z_SortAttributes **p, int opt) +{ + if (!odr_sequence_begin(o, p, sizeof(**p))) + return opt && odr_ok(o); + return + odr_oid(o, &(*p)->id, 0) && + z_AttributeList(o, &(*p)->list, 0) && + odr_sequence_end(o); +} + +int z_SortKey(ODR o, Z_SortKey **p, int opt) +{ + static Odr_arm arm[] = + { + {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKey_sortField, + z_InternationalString}, + {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortKey_elementSpec, z_Specification}, + {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortKey_sortAttributes, + z_SortAttributes}, + {-1, -1, -1, -1, 0} + }; + + if (!odr_initmember(o, p, sizeof(**p))) + return opt && odr_ok(o); + if (odr_choice(o, arm, &(*p)->u, &(*p)->which)) + return 1; + *p = 0; + return opt && odr_ok(o); +} + +int z_SortDbSpecific(ODR o, Z_SortDbSpecific **p, int opt) +{ + if (!odr_sequence_begin(o, p, sizeof(**p))) + return opt && odr_ok(o); + return + z_DatabaseName(o, &(*p)->databaseName, 0) && + z_SortKey(o, &(*p)->dbSort, 0) && + odr_sequence_end(o); +} + +int z_SortDbSpecificList(ODR o, Z_SortDbSpecificList **p, int opt) +{ + if (!odr_initmember(o, p, sizeof(**p))) + return opt && odr_ok(o); + if (odr_sequence_of(o, z_SortDbSpecific, &(*p)->dbSpecific, + &(*p)->num_dbSpecific)) + return 1; + *p = 0; + return opt && odr_ok(o); +} + +int z_SortElement(ODR o, Z_SortElement **p, int opt) +{ + static Odr_arm arm[] = + { + {ODR_EXPLICIT, ODR_CONTEXT, 1, Z_SortElement_generic, z_SortKey}, + {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortElement_databaseSpecific, + z_SortDbSpecificList}, + {-1, -1, -1, -1, 0} + }; + + if (!odr_initmember(o, p, sizeof(**p))) + return opt && odr_ok(o); + if (odr_choice(o, arm, &(*p)->u, &(*p)->which)) + return 1; + *p = 0; + return opt && odr_ok(o); +} + +int z_SortMissingValueAction(ODR o, Z_SortMissingValueAction **p, int opt) +{ + static Odr_arm arm[] = + { + {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortMissingValAct_abort, odr_null}, + {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortMissingValAct_null, odr_null}, + {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_SortMissingValAct_valData, + odr_octetstring}, + {-1, -1, -1, -1, 0} + }; + + if (!odr_initmember(o, p, sizeof(**p))) + return opt && odr_ok(o); + if (odr_choice(o, arm, &(*p)->u, &(*p)->which)) + return 1; + *p = 0; + return opt && odr_ok(o); +} + +int z_SortKeySpec(ODR o, Z_SortKeySpec **p, int opt) +{ + if (!odr_sequence_begin(o, p, sizeof(**p))) + return opt && odr_ok(o); + return + z_SortElement(o, &(*p)->sortElement, 0) && + odr_implicit(o, odr_integer, &(*p)->sortRelation, ODR_CONTEXT, 1, 0) && + odr_implicit(o, odr_integer, &(*p)->caseSensitivity, ODR_CONTEXT, + 2, 0) && + odr_explicit(o, z_SortMissingValueAction, &(*p)->missingValueAction, + ODR_CONTEXT, 3, 1) && + odr_sequence_end(o); +} + +int z_SortResponse(ODR o, Z_SortResponse **p, int opt) +{ + if (!odr_sequence_begin(o, p, sizeof(**p))) + return opt && odr_ok(o); + return + z_ReferenceId(o, &(*p)->referenceId, 1) && + odr_implicit(o, odr_integer, &(*p)->sortStatus, ODR_CONTEXT, + 3, 0) && + odr_implicit(o, odr_integer, &(*p)->resultSetStatus, ODR_CONTEXT, + 4, 1) && + odr_implicit(o, z_DiagRecs, &(*p)->diagnostics, ODR_CONTEXT, 5, 1) && + z_OtherInformation(o, &(*p)->otherInfo, 1) && + odr_sequence_end(o); +} + +int z_SortKeySpecList(ODR o, Z_SortKeySpecList **p, int opt) +{ + if (!odr_initmember(o, p, sizeof(**p))) + return opt && odr_ok(o); + if (odr_sequence_of(o, z_SortKeySpec, &(*p)->specs, &(*p)->num_specs)) + return 1; + *p = 0; + return opt && odr_ok(o); +} + +int z_SortRequest(ODR o, Z_SortRequest **p, int opt) +{ + if (!odr_sequence_begin(o, p, sizeof(**p))) + return opt && odr_ok(o); + return + z_ReferenceId(o, &(*p)->referenceId, 1) && + odr_implicit(o, z_StringList, &(*p)->inputResultSetNames, + ODR_CONTEXT, 3, 0) && + odr_implicit(o, z_InternationalString, &(*p)->sortedResultSetName, + ODR_CONTEXT, 4, 0) && + odr_implicit(o, z_SortKeySpecList, &(*p)->sortSequence, ODR_CONTEXT, + 5, 0) && + z_OtherInformation(o, &(*p)->otherInfo, 1) && + odr_sequence_end(o); +} + /* ------------------------ APDU ------------------------- */ -int MDF z_APDU(ODR o, Z_APDU **p, int opt) +int z_APDU(ODR o, Z_APDU **p, int opt) { static Odr_arm arm[] = { @@ -1490,6 +1752,10 @@ int MDF z_APDU(ODR o, Z_APDU **p, int opt) z_DeleteResultSetRequest}, {ODR_IMPLICIT, ODR_CONTEXT, 27, Z_APDU_deleteResultSetResponse, z_DeleteResultSetResponse}, + {ODR_IMPLICIT, ODR_CONTEXT, 28, Z_APDU_accessControlRequest, + z_AccessControlRequest}, + {ODR_IMPLICIT, ODR_CONTEXT, 29, Z_APDU_accessControlResponse, + z_AccessControlResponse}, {ODR_IMPLICIT, ODR_CONTEXT, 30, Z_APDU_resourceControlRequest, z_ResourceControlRequest}, {ODR_IMPLICIT, ODR_CONTEXT, 31, Z_APDU_resourceControlResponse, @@ -1498,6 +1764,8 @@ int MDF z_APDU(ODR o, Z_APDU **p, int opt) z_TriggerResourceControlRequest}, {ODR_IMPLICIT, ODR_CONTEXT, 35, Z_APDU_scanRequest, z_ScanRequest}, {ODR_IMPLICIT, ODR_CONTEXT, 36, Z_APDU_scanResponse, z_ScanResponse}, + {ODR_IMPLICIT, ODR_CONTEXT, 43, Z_APDU_sortRequest, z_SortRequest}, + {ODR_IMPLICIT, ODR_CONTEXT, 44, Z_APDU_sortResponse, z_SortResponse}, {ODR_IMPLICIT, ODR_CONTEXT, 45, Z_APDU_segmentRequest, z_Segment}, {ODR_IMPLICIT, ODR_CONTEXT, 46, Z_APDU_extendedServicesRequest, z_ExtendedServicesRequest},