Adding access control
[yaz-moved-to-github.git] / asn / proto.c
index 6930f81..26ca7bf 100644 (file)
@@ -4,7 +4,16 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: proto.c,v $
- * Revision 1.23  1995-05-22 11:30:18  quinn
+ * Revision 1.26  1995-06-02 09:49:13  quinn
+ * Adding access control
+ *
+ * Revision 1.25  1995/05/25  11:00:08  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.24  1995/05/22  13:58:18  quinn
+ * Fixed an ODR_NULLVAL.
+ *
+ * Revision 1.23  1995/05/22  11:30:18  quinn
  * Adding Z39.50-1992 stuff to proto.c. Adding zget.c
  *
  * Revision 1.22  1995/05/17  08:40:56  quinn
@@ -104,6 +113,97 @@ int z_UserInformationField(ODR o, Z_UserInformationField **p, int opt)
        11, opt);
 }
 
+int z_InfoCategory(ODR o, Z_InfoCategory **p, int opt)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
+    return
+       odr_implicit(o, odr_oid, &(*p)->categoryTypeId, ODR_CONTEXT, 1, 1) &&
+       odr_implicit(o, odr_integer, &(*p)->categoryValue, ODR_CONTEXT, 2, 0) &&
+       odr_sequence_end(o);
+}
+
+int z_OtherInformationUnit(ODR o, Z_OtherInformationUnit **p, int opt)
+{
+    static Odr_arm arm[] =
+    {
+       {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_OtherInfo_characterInfo,
+           odr_visiblestring},
+       {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_OtherInfo_binaryInfo,
+           odr_octetstring},
+       {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_OtherInfo_externallyDefinedInfo,
+           odr_external},
+       {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_OtherInfo_oid, odr_oid},
+       {-1, -1, -1, -1, 0}
+    };
+
+    if (!odr_sequence_begin(o, p, sizeof(**p)))
+       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_sequence_end(o);
+}
+    
+int z_OtherInformation(ODR o, Z_OtherInformation **p, int opt)
+{
+    if (o->direction == ODR_ENCODE)
+       *p = odr_malloc(o, sizeof(**p));
+
+    odr_implicit_settag(o, ODR_CONTEXT, 201);
+    if (odr_sequence_of(o, z_OtherInformationUnit, &(*p)->list,
+       &(*p)->num_elements))
+       return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_StringOrNumeric(ODR o, Z_StringOrNumeric **p, int opt)
+{
+    static Odr_arm arm[] =
+    {
+       {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_StringOrNumeric_string,
+           odr_visiblestring},
+       {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_StringOrNumeric_numeric,
+           odr_integer},
+       {-1, -1, -1, -1, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+       *p = odr_malloc(o, sizeof(**p));
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
+       return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+/*
+ * check tagging!!
+ */
+int z_Unit(ODR o, Z_Unit **p, int opt)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
+    return
+       odr_implicit(o, odr_visiblestring, &(*p)->unitSystem, ODR_CONTEXT,
+           1, 1) &&
+       odr_explicit(o, z_StringOrNumeric, &(*p)->unitType, ODR_CONTEXT,
+           2, 1) &&
+       odr_explicit(o, z_StringOrNumeric, &(*p)->unit, ODR_CONTEXT, 3, 1) &&
+       odr_implicit(o, odr_integer, &(*p)->scaleFactor, ODR_CONTEXT, 4, 1) &&
+       odr_sequence_end(o);
+}
+
+int z_IntUnit(ODR o, Z_IntUnit **p, int opt)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
+    return
+       odr_implicit(o, odr_integer, &(*p)->value, ODR_CONTEXT, 1, 0) &&
+       odr_implicit(o, z_Unit, &(*p)->unitUsed, ODR_CONTEXT, 2, 0) &&
+       odr_sequence_end(o);
+}
+
 /* ---------------------- INITIALIZE SERVICE ------------------- */
 
 #if 0
@@ -124,10 +224,10 @@ int z_IdPass(ODR o, Z_IdPass **p, int opt)
     if (!odr_sequence_begin(o, p, sizeof(**p)))
        return opt && odr_ok(o);
     return
-       odr_implicit(o, odr_visiblestring, &(*p)->groupId, ODR_CONTEXT, 0, 0) &&
-       odr_implicit(o, odr_visiblestring, &(*p)->userId, ODR_CONTEXT, 1, 0) &&
+       odr_implicit(o, odr_visiblestring, &(*p)->groupId, ODR_CONTEXT, 0, 1) &&
+       odr_implicit(o, odr_visiblestring, &(*p)->userId, ODR_CONTEXT, 1, 1) &&
        odr_implicit(o, odr_visiblestring, &(*p)->password, ODR_CONTEXT, 2,
-           0) &&
+           1) &&
        odr_sequence_end(o);
 }
 
@@ -425,7 +525,6 @@ int z_Operator(ODR o, Z_Operator **p, int opt)
        {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Operator_prox, z_ProximityOperator},
        {-1, -1, -1, -1, 0}
     };
-    int dummy = 999;
 
     if (!*p && o->direction != ODR_DECODE)
        return opt;
@@ -434,7 +533,7 @@ int z_Operator(ODR o, Z_Operator **p, int opt)
     if (o->direction == ODR_DECODE)
        *p = odr_malloc(o, sizeof(**p));
     else
-       (*p)->u.and = &dummy;
+       (*p)->u.and = ODR_NULLVAL;
 
     if (odr_choice(o, arm, &(*p)->u, &(*p)->which) &&
        odr_constructed_end(o))