+}
+
+Z_RecordComposition *mp_util::piggyback_to_RecordComposition(
+ ODR odr, Odr_int result_set_size, Z_SearchRequest *sreq)
+{
+ Z_RecordComposition *comp = 0;
+ Odr_int present_dummy;
+ const char *element_set_name = 0;
+ mp::util::piggyback_sr(sreq, result_set_size,
+ present_dummy, &element_set_name);
+ if (element_set_name)
+ {
+ comp = (Z_RecordComposition *) odr_malloc(odr, sizeof(*comp));
+ comp->which = Z_RecordComp_simple;
+ comp->u.simple = (Z_ElementSetNames *)
+ odr_malloc(odr, sizeof(Z_ElementSetNames));
+ comp->u.simple->which = Z_ElementSetNames_generic;
+ comp->u.simple->u.generic = odr_strdup(odr, element_set_name);
+ }
+ return comp;
+}
+
+void mp_util::piggyback_sr(Z_SearchRequest *sreq,
+ Odr_int result_set_size,
+ Odr_int &number_to_present,
+ const char **element_set_name)
+{
+ Z_ElementSetNames *esn;
+ const char *smallSetElementSetNames = 0;
+ const char *mediumSetElementSetNames = 0;
+
+ esn = sreq->smallSetElementSetNames;
+ if (esn && esn->which == Z_ElementSetNames_generic)
+ smallSetElementSetNames = esn->u.generic;
+
+ esn = sreq->mediumSetElementSetNames;
+ if (esn && esn->which == Z_ElementSetNames_generic)
+ mediumSetElementSetNames = esn->u.generic;
+
+ piggyback(*sreq->smallSetUpperBound,
+ *sreq->largeSetLowerBound,
+ *sreq->mediumSetPresentNumber,
+ smallSetElementSetNames,
+ mediumSetElementSetNames,
+ result_set_size,
+ number_to_present,
+ element_set_name);
+}
+
+void mp_util::piggyback(int smallSetUpperBound,
+ int largeSetLowerBound,
+ int mediumSetPresentNumber,
+ int result_set_size,
+ int &number_to_present)
+{
+ Odr_int tmp = number_to_present;
+ piggyback(smallSetUpperBound, largeSetLowerBound, mediumSetPresentNumber,
+ 0, 0, result_set_size, tmp, 0);
+ number_to_present = tmp;
+}
+
+void mp_util::piggyback(Odr_int smallSetUpperBound,
+ Odr_int largeSetLowerBound,
+ Odr_int mediumSetPresentNumber,
+ const char *smallSetElementSetNames,
+ const char *mediumSetElementSetNames,
+ Odr_int result_set_size,
+ Odr_int &number_to_present,
+ const char **element_set_name)
+{
+ // deal with piggyback
+
+ if (result_set_size < smallSetUpperBound)
+ {
+ // small set . Return all records in set
+ number_to_present = result_set_size;
+ if (element_set_name && smallSetElementSetNames)
+ *element_set_name = smallSetElementSetNames;
+
+ }
+ else if (result_set_size > largeSetLowerBound)
+ {
+ // large set . Return no records
+ number_to_present = 0;
+ if (element_set_name)
+ *element_set_name = 0;
+ }
+ else
+ {
+ // medium set . Return mediumSetPresentNumber records
+ number_to_present = mediumSetPresentNumber;
+ if (number_to_present > result_set_size)
+ number_to_present = result_set_size;
+ if (element_set_name && mediumSetElementSetNames)
+ *element_set_name = mediumSetElementSetNames;
+ }
+}
+
+bool mp_util::pqf(ODR odr, Z_APDU *apdu, const std::string &q)
+{