+ yaz_log(log_details, "%p ZOOM_connection_exec_task "
+ "remove tasks because no connection exist", c);
+ ZOOM_connection_remove_tasks(c);
+ }
+ if (ret == zoom_complete)
+ {
+ yaz_log(log_details, "%p ZOOM_connection_exec_task "
+ "task removed (complete)", c);
+ ZOOM_connection_remove_task(c);
+ return 0;
+ }
+ yaz_log(log_details, "%p ZOOM_connection_exec_task "
+ "task pending", c);
+ return 1;
+}
+
+static zoom_ret send_sort_present(ZOOM_connection c)
+{
+ zoom_ret r = zoom_complete;
+
+ if (c->tasks && c->tasks->which == ZOOM_TASK_SEARCH)
+ r = send_sort(c, c->tasks->u.search.resultset);
+ if (r == zoom_complete)
+ r = send_present(c);
+ return r;
+}
+
+static int es_response_taskpackage_update(ZOOM_connection c,
+ Z_IUUpdateTaskPackage *utp)
+{
+ if (utp && utp->targetPart)
+ {
+ Z_IUTargetPart *targetPart = utp->targetPart;
+ switch ( *targetPart->updateStatus ) {
+ case Z_IUTargetPart_success:
+ ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "success");
+ break;
+ case Z_IUTargetPart_partial:
+ ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "partial");
+ break;
+ case Z_IUTargetPart_failure:
+ ZOOM_options_set(c->tasks->u.package->options,"updateStatus", "failure");
+ if (targetPart->globalDiagnostics && targetPart->num_globalDiagnostics > 0)
+ response_diag(c, targetPart->globalDiagnostics[0]);
+ break;
+ }
+ // NOTE: Individual record status, surrogate diagnostics, and supplemental diagnostics ARE NOT REPORTED.
+ }
+ return 1;
+}
+
+static int es_response_taskpackage(ZOOM_connection c,
+ Z_TaskPackage *taskPackage)
+{
+ // targetReference
+ Odr_oct *id = taskPackage->targetReference;
+ if (id)
+ ZOOM_options_setl(c->tasks->u.package->options,
+ "targetReference", (char*) id->buf, id->len);
+
+ // taskStatus
+ switch ( *taskPackage->taskStatus ) {
+ case Z_TaskPackage_pending:
+ ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "pending");
+ break;
+ case Z_TaskPackage_active:
+ ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "active");
+ break;
+ case Z_TaskPackage_complete:
+ ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "complete");
+ break;
+ case Z_TaskPackage_aborted:
+ ZOOM_options_set(c->tasks->u.package->options,"taskStatus", "aborted");
+ if ( taskPackage->num_packageDiagnostics && taskPackage->packageDiagnostics )
+ response_diag(c, taskPackage->packageDiagnostics[0]);
+ break;
+ }
+
+ // taskSpecificParameters
+ // NOTE: Only Update implemented, no others.
+ if ( taskPackage->taskSpecificParameters->which == Z_External_update ) {
+ Z_IUUpdateTaskPackage *utp = taskPackage->taskSpecificParameters->u.update->u.taskPackage;
+ es_response_taskpackage_update(c, utp);
+ }
+ return 1;
+}
+
+
+static int es_response(ZOOM_connection c,
+ Z_ExtendedServicesResponse *res)
+{
+ if (!c->tasks || c->tasks->which != ZOOM_TASK_PACKAGE)
+ return 0;
+ switch (*res->operationStatus) {
+ case Z_ExtendedServicesResponse_done:
+ ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "done");
+ break;
+ case Z_ExtendedServicesResponse_accepted:
+ ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "accepted");
+ break;
+ case Z_ExtendedServicesResponse_failure:
+ ZOOM_options_set(c->tasks->u.package->options,"operationStatus", "failure");
+ if (res->diagnostics && res->num_diagnostics > 0)
+ response_diag(c, res->diagnostics[0]);
+ break;
+ }
+ if (res->taskPackage &&
+ res->taskPackage->which == Z_External_extendedService)
+ {
+ Z_TaskPackage *taskPackage = res->taskPackage->u.extendedService;
+ es_response_taskpackage(c, taskPackage);