+ZOOM_API(void)
+ZOOM_scanset_destroy (ZOOM_scanset scan)
+{
+ if (!scan)
+ return;
+ (scan->refcount)--;
+ if (scan->refcount == 0)
+ {
+ odr_destroy (scan->odr);
+
+ ZOOM_options_destroy (scan->options);
+ xfree (scan);
+ }
+}
+
+static int send_scan (ZOOM_connection c)
+{
+ ZOOM_scanset scan;
+ Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_scanRequest);
+ Z_ScanRequest *req = apdu->u.scanRequest;
+ if (!c->tasks)
+ return 0;
+ assert (c->tasks->which == ZOOM_TASK_SCAN);
+ scan = c->tasks->u.scan.scan;
+
+ req->termListAndStartPoint = scan->termListAndStartPoint;
+ req->attributeSet = scan->attributeSet;
+
+ *req->numberOfTermsRequested =
+ ZOOM_options_get_int(scan->options, "number", 10);
+
+ req->preferredPositionInResponse =
+ odr_intdup (c->odr_out,
+ ZOOM_options_get_int(scan->options, "position", 1));
+
+ req->stepSize =
+ odr_intdup (c->odr_out,
+ ZOOM_options_get_int(scan->options, "stepSize", 0));
+
+ req->databaseNames = set_DatabaseNames (c, scan->options,
+ &req->num_databaseNames);
+
+ send_APDU (c, apdu);
+
+ return 1;
+}
+
+ZOOM_API(size_t)
+ZOOM_scanset_size (ZOOM_scanset scan)
+{
+ if (!scan || !scan->scan_response || !scan->scan_response->entries)
+ return 0;
+ return scan->scan_response->entries->num_entries;
+}
+
+ZOOM_API(const char *)
+ZOOM_scanset_term (ZOOM_scanset scan, size_t pos,
+ int *occ, int *len)
+{
+ const char *term = 0;
+ size_t noent = ZOOM_scanset_size (scan);
+ Z_ScanResponse *res = scan->scan_response;
+
+ *len = 0;
+ *occ = 0;
+ if (pos >= noent)
+ return 0;
+ if (res->entries->entries[pos]->which == Z_Entry_termInfo)
+ {
+ Z_TermInfo *t = res->entries->entries[pos]->u.termInfo;
+
+ if (t->term->which == Z_Term_general)
+ {
+ term = (const char *) t->term->u.general->buf;
+ *len = t->term->u.general->len;
+ }
+ *occ = t->globalOccurrences ? *t->globalOccurrences : 0;
+ }
+ return term;
+}
+
+ZOOM_API(const char *)
+ZOOM_scanset_option_get (ZOOM_scanset scan, const char *key)
+{
+ return ZOOM_options_get (scan->options, key);
+}
+
+ZOOM_API(void)
+ZOOM_scanset_option_set (ZOOM_scanset scan, const char *key,
+ const char *val)
+{
+ ZOOM_options_set (scan->options, key, val);
+}
+
+static int ZOOM_connection_exec_task (ZOOM_connection c)
+{
+ ZOOM_task task = c->tasks;
+
+ yaz_log (LOG_DEBUG, "ZOOM_connection_exec_task");