+ }
+ else
+ return -1;
+
+ }
+ return 0;
+}
+
+int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
+ void *client_data, const char *ns)
+{
+ xmlNodePtr pptr = (xmlNodePtr) vptr;
+ 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 = (Z_SRW_PDU *) odr_malloc(o, sizeof(**p));
+ (*p)->srw_version = odr_strdup(o, "1.1");
+
+ 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->recordVersion = 0;
+ req->recordOldVersion = 0;
+ req->record.recordData_buf = 0;
+ req->record.recordData_len = 0;
+ req->record.recordSchema = 0;
+ req->record.recordPacking = 0;
+ req->extra_record = 0;
+ req->extraRequestData = 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, "operation", o,
+ &oper)){
+ if ( oper ){
+ if ( !strcmp(oper, "delete"))
+ req->operation = "delete";
+ else if (!strcmp(oper,"replace" ))
+ req->operation = "replace";
+ else if ( !strcmp( oper, "insert"))
+ req->operation = "insert";
+ }
+ }
+ else if (match_xsd_string(ptr, "recordId", o,
+ &req->recordId))
+ ;
+ else if (match_xsd_string(ptr, "recordVersion", o,
+ &req->recordVersion))
+ ;
+ else if (match_element(ptr, "record"))
+ yaz_srw_record(o, ptr, &req->record, &req->extra_record,
+ client_data, ns);
+ 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->recordVersion = 0;
+ res->recordChecksum = 0;
+ res->diagnostics = 0;
+ res->num_diagnostics = 0;
+ res->record.recordData_buf = 0;
+ res->record.recordData_len = 0;
+ res->record.recordSchema = 0;
+ res->record.recordPacking = 0;
+ res->extra_record = 0;
+ res->extraResponseData = 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, "recordId", o,
+ &res->recordId))
+ ;
+ else if (match_xsd_string(ptr, "recordVersion", o,
+ &res->recordVersion ))
+ ;
+ else if (match_element(ptr, "record"))
+ yaz_srw_record(o, ptr, &res->record, &res->extra_record,
+ client_data, ns);
+ else if (match_element(ptr, "diagnostics"))
+ yaz_srw_diagnostics(o, ptr, &res->diagnostics,
+ &res->num_diagnostics,
+ client_data, ns);
+ }
+ }
+ 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_srw;
+
+ if ((*p)->which == Z_SRW_update_request)
+ {
+ Z_SRW_updateRequest *req = (*p)->u.update_request;
+ xmlNodePtr ptr = xmlNewChild(pptr, 0, "updateRequest", 0);
+ ns_srw = xmlNewNs(ptr, ns, "zu");
+ xmlSetNs(ptr, ns_srw);
+
+ add_xsd_string(ptr, "version", (*p)->srw_version);
+ 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_srw = xmlNewNs(ptr, ns, "zu");
+ xmlSetNs(ptr, ns_srw);
+
+ add_xsd_string(ptr, "version", (*p)->srw_version);
+ add_xsd_string(ptr, "operationStatus", res->operationStatus );
+ add_xsd_string(ptr, "recordId", res->recordId );
+ if (res->recordVersion)
+ add_xsd_string(ptr, "recordVersion", res->recordVersion );
+ if (res->recordChecksum)
+ add_xsd_string(ptr, "recordChecksum", res->recordChecksum );
+ if (res->record.recordData_len)
+ {
+ xmlNodePtr rptr = xmlNewChild(ptr, 0, "record", 0);
+ yaz_srw_record(o, rptr, &res->record, &res->extra_record,
+ client_data, ns);
+ }