+int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
+ void *client_data, const char *ns_ucp_str)
+{
+ xmlNodePtr pptr = (xmlNodePtr) vptr;
+ const char *ns_srw_str = YAZ_XMLNS_SRU_v1_1;
+ if (o->direction == ODR_DECODE)
+ {
+ Z_SRW_PDU **p = handler_data;
+ xmlNodePtr method = pptr->children;
+
+ while (method && method->type == XML_TEXT_NODE)
+ method = method->next;
+
+ if (!method)
+ return -1;
+ if (method->type != XML_ELEMENT_NODE)
+ return -1;
+
+ *p = yaz_srw_get_core_v_1_1(o);
+
+ if (!xmlStrcmp(method->name, BAD_CAST "updateRequest"))
+ {
+ xmlNodePtr ptr = method->children;
+ Z_SRW_updateRequest *req;
+ char *oper = 0;
+
+ (*p)->which = Z_SRW_update_request;
+ req = (*p)->u.update_request = (Z_SRW_updateRequest *)
+ odr_malloc(o, sizeof(*req));
+ req->database = 0;
+ req->operation = 0;
+ req->recordId = 0;
+ req->recordVersions = 0;
+ req->num_recordVersions = 0;
+ req->record = 0;
+ req->extra_record = 0;
+ req->extraRequestData_buf = 0;
+ req->extraRequestData_len = 0;
+ req->stylesheet = 0;
+
+ for (; ptr; ptr = ptr->next)
+ {
+ if (match_xsd_string(ptr, "version", o,
+ &(*p)->srw_version))
+ ;
+ else if (match_xsd_string(ptr, "action", o,
+ &oper)){
+ if ( oper ){
+ if ( !strcmp(oper, "info:srw/action/1/delete"))
+ req->operation = "delete";
+ else if (!strcmp(oper,"info:srw/action/1/replace" ))
+ req->operation = "replace";
+ else if ( !strcmp( oper, "info:srw/action/1/create"))
+ req->operation = "insert";
+ }
+ }
+ else if (match_xsd_string(ptr, "recordIdentifier", o,
+ &req->recordId))
+ ;
+ else if (match_element(ptr, "recordVersions" ) )
+ yaz_srw_versions( o, ptr, &req->recordVersions,
+ &req->num_recordVersions, client_data,
+ ns_ucp_str);
+ else if (match_element(ptr, "record"))
+ {
+ req->record = yaz_srw_get_record(o);
+ yaz_srw_record(o, ptr, req->record, &req->extra_record,
+ client_data, ns_ucp_str);
+ }
+ else if (match_xsd_string(ptr, "stylesheet", o,
+ &req->stylesheet))
+ ;
+ else if (match_xsd_string(ptr, "database", o,
+ &req->database))
+ ;
+ }
+ }
+ else if (!xmlStrcmp(method->name, BAD_CAST "updateResponse"))
+ {
+ xmlNodePtr ptr = method->children;
+ Z_SRW_updateResponse *res;
+
+ (*p)->which = Z_SRW_update_response;
+ res = (*p)->u.update_response = (Z_SRW_updateResponse *)
+ odr_malloc(o, sizeof(*res));
+
+ res->operationStatus = 0;
+ res->recordId = 0;
+ res->recordVersions = 0;
+ res->num_recordVersions = 0;
+ res->diagnostics = 0;
+ res->num_diagnostics = 0;
+ res->record = 0;
+ res->extra_record = 0;
+ res->extraResponseData_buf = 0;
+ res->extraResponseData_len = 0;
+
+ for (; ptr; ptr = ptr->next)
+ {
+ if (match_xsd_string(ptr, "version", o,
+ &(*p)->srw_version))
+ ;
+ else if (match_xsd_string(ptr, "operationStatus", o,
+ &res->operationStatus ))
+ ;
+ else if (match_xsd_string(ptr, "recordIdentifier", o,
+ &res->recordId))
+ ;
+ else if (match_element(ptr, "recordVersions" ))
+ yaz_srw_versions(o, ptr, &res->recordVersions,
+ &res->num_recordVersions,
+ client_data, ns_ucp_str);
+ else if (match_element(ptr, "record"))
+ {
+ res->record = yaz_srw_get_record(o);
+ yaz_srw_record(o, ptr, res->record, &res->extra_record,
+ client_data, ns_ucp_str);
+ }
+ else if (match_element(ptr, "diagnostics"))
+ yaz_srw_diagnostics(o, ptr, &res->diagnostics,
+ &res->num_diagnostics,
+ client_data, ns_ucp_str);
+ }
+ }
+ else if (!xmlStrcmp(method->name, BAD_CAST "explainUpdateRequest"))
+ {
+ }
+ else if (!xmlStrcmp(method->name, BAD_CAST "explainUpdateResponse"))
+ {
+ }
+ else
+ {
+ *p = 0;
+ return -1;
+ }
+ }
+ else if (o->direction == ODR_ENCODE)
+ {
+ Z_SRW_PDU **p = handler_data;
+ xmlNsPtr ns_ucp, ns_srw;
+
+
+ if ((*p)->which == Z_SRW_update_request)
+ {
+ Z_SRW_updateRequest *req = (*p)->u.update_request;
+ xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "updateRequest", 0);
+ ns_ucp = xmlNewNs(ptr, BAD_CAST ns_ucp_str, BAD_CAST "zu");
+ xmlSetNs(ptr, ns_ucp);
+ ns_srw = xmlNewNs(ptr, BAD_CAST ns_srw_str, BAD_CAST "zs");
+
+ add_xsd_string_ns(ptr, "version", (*p)->srw_version, ns_srw);
+ add_xsd_string(ptr, "action", req->operation);
+ add_xsd_string(ptr, "recordIdentifier", req->recordId );
+ if (req->recordVersions)
+ yaz_srw_versions( o, ptr, &req->recordVersions,
+ &req->num_recordVersions,
+ client_data, ns_ucp_str);
+ if (req->record && req->record->recordData_len)
+ {
+ xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "record", 0);
+ xmlSetNs(rptr, ns_srw);
+ yaz_srw_record(o, rptr, req->record, &req->extra_record,
+ client_data, ns_ucp_str);
+ }
+ if (req->extraRequestData_len)
+ {
+ add_XML_n(ptr, "extraRequestData",
+ req->extraRequestData_buf,
+ req->extraRequestData_len, ns_srw);
+ }
+ add_xsd_string(ptr, "stylesheet", req->stylesheet);
+ add_xsd_string(ptr, "database", req->database);
+ }
+ else if ((*p)->which == Z_SRW_update_response)
+ {
+ Z_SRW_updateResponse *res = (*p)->u.update_response;
+ xmlNodePtr ptr = xmlNewChild(pptr, 0, (xmlChar *)
+ "updateResponse", 0);
+ ns_ucp = xmlNewNs(ptr, BAD_CAST ns_ucp_str, BAD_CAST "zu");
+ xmlSetNs(ptr, ns_ucp);
+ ns_srw = xmlNewNs(ptr, BAD_CAST ns_srw_str, BAD_CAST "zs");
+
+ add_xsd_string_ns(ptr, "version", (*p)->srw_version, ns_srw);
+ add_xsd_string(ptr, "operationStatus", res->operationStatus );
+ add_xsd_string(ptr, "recordIdentifier", res->recordId );
+ if (res->recordVersions)
+ yaz_srw_versions(o, ptr, &res->recordVersions,
+ &res->num_recordVersions,
+ client_data, ns_ucp_str);
+ if (res->record && res->record->recordData_len)
+ {
+ xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "record", 0);
+ xmlSetNs(rptr, ns_srw);
+ yaz_srw_record(o, rptr, res->record, &res->extra_record,
+ client_data, ns_ucp_str);
+ }
+ if (res->num_diagnostics)
+ {
+ xmlNsPtr ns_diag =
+ xmlNewNs(pptr, BAD_CAST YAZ_XMLNS_DIAG_v1_1,
+ BAD_CAST "diag" );
+
+ xmlNodePtr rptr = xmlNewChild(ptr, ns_diag, BAD_CAST "diagnostics", 0);
+ yaz_srw_diagnostics(o, rptr, &res->diagnostics,
+ &res->num_diagnostics, client_data,
+ ns_ucp_str);
+ }
+ if (res->extraResponseData_len)
+ add_XML_n(ptr, "extraResponseData",
+ res->extraResponseData_buf,
+ res->extraResponseData_len, ns_srw);
+ }
+ else
+ return -1;
+
+ }
+ return 0;
+}
+