Merge branch 'master' into sru_2_0
[yaz-moved-to-github.git] / client / client.c
index a115f2b..56178da 100644 (file)
@@ -83,6 +83,7 @@ static file_history_t file_history = 0;
 
 static char sru_method[10] = "soap";
 static char sru_version[10] = "1.2";
+static char sru_recordPacking[10] = "";
 static char *codeset = 0;               /* character set for output */
 static int hex_dump = 0;
 static char *dump_file_prefix = 0;
@@ -317,14 +318,9 @@ static void print_refid(Z_ReferenceId *id)
 
 static Z_ReferenceId *set_refid(ODR out)
 {
-    Z_ReferenceId *id;
     if (!refid)
         return 0;
-    id = (Z_ReferenceId *) odr_malloc(out, sizeof(*id));
-    id->size = id->len = strlen(refid);
-    id->buf = (unsigned char *) odr_malloc(out, id->len);
-    memcpy(id->buf, refid, id->len);
-    return id;
+    return odr_create_Odr_oct(out, refid, strlen(refid));
 }
 
 /* INIT SERVICE ------------------------------- */
@@ -1420,12 +1416,12 @@ static int send_SRW_scanRequest(const char *arg, Odr_int *pos, int num)
     switch (queryType)
     {
     case QueryType_CQL:
-        sr->u.scan_request->query_type = Z_SRW_query_type_cql;
-        sr->u.scan_request->scanClause.cql = encode_SRW_term(out, arg);
+        sr->u.scan_request->queryType = "cql";
+        sr->u.scan_request->scanClause = encode_SRW_term(out, arg);
         break;
     case QueryType_Prefix:
-        sr->u.scan_request->query_type = Z_SRW_query_type_pqf;
-        sr->u.scan_request->scanClause.pqf = encode_SRW_term(out, arg);
+        sr->u.scan_request->queryType = "pqf";
+        sr->u.scan_request->scanClause = encode_SRW_term(out, arg);
         break;
     default:
         printf("Only CQL and PQF supported in SRW\n");
@@ -1459,23 +1455,25 @@ static int send_SRW_searchRequest(const char *arg)
     switch (queryType)
     {
     case QueryType_CQL:
-        srw_sr->u.request->query_type = Z_SRW_query_type_cql;
-        srw_sr->u.request->query.cql = encode_SRW_term(srw_sr_odr_out, arg);
+        srw_sr->u.request->queryType = "cql";
+        srw_sr->u.request->query = encode_SRW_term(srw_sr_odr_out, arg);
 
-        sr->u.request->query_type = Z_SRW_query_type_cql;
-        sr->u.request->query.cql = encode_SRW_term(srw_sr_odr_out, arg);
+        sr->u.request->queryType = "cql";
+        sr->u.request->query = encode_SRW_term(srw_sr_odr_out, arg);
         break;
     case QueryType_Prefix:
-        srw_sr->u.request->query_type = Z_SRW_query_type_pqf;
-        srw_sr->u.request->query.pqf = encode_SRW_term(srw_sr_odr_out, arg);
+        srw_sr->u.request->queryType = "pqf";
+        srw_sr->u.request->query = encode_SRW_term(srw_sr_odr_out, arg);
 
-        sr->u.request->query_type = Z_SRW_query_type_pqf;
-        sr->u.request->query.pqf = encode_SRW_term(srw_sr_odr_out, arg);
+        sr->u.request->queryType = "pqf";
+        sr->u.request->query = encode_SRW_term(srw_sr_odr_out, arg);
         break;
     default:
         printf("Only CQL and PQF supported in SRW\n");
         return 0;
     }
+    if (*sru_recordPacking)
+        sr->u.request->recordPacking = sru_recordPacking;
     sru_maximumRecords = 0;
     sr->u.request->maximumRecords = odr_intdup(out, 0);
     sr->u.request->facetList = facet_list;
@@ -1560,12 +1558,12 @@ static int send_Z3950_searchRequest(const char *arg)
     req->referenceId = set_refid(out);
     if (!strcmp(arg, "@big")) /* strictly for troublemaking */
     {
-        static unsigned char big[2100];
+        static char big[2100];
         static Odr_oct bigo;
 
         /* send a very big referenceid to test transport stack etc. */
         memset(big, 'A', 2100);
-        bigo.len = bigo.size = 2100;
+        bigo.len = 2100;
         bigo.buf = big;
         req->referenceId = &bigo;
     }
@@ -1619,7 +1617,7 @@ static int send_Z3950_searchRequest(const char *arg)
     case QueryType_CCL:
         query.which = Z_Query_type_2;
         query.u.type_2 = &ccl_query;
-        ccl_query.buf = (unsigned char*) arg;
+        ccl_query.buf = (char *) arg;
         ccl_query.len = strlen(arg);
         break;
     case QueryType_CCL2RPN:
@@ -1867,7 +1865,7 @@ static void print_referenceId(int iLevel, Z_ReferenceId *referenceId)
         int i;
 
         print_level(iLevel);
-        printf("Ref Id (%d, %d): ", referenceId->len, referenceId->size);
+        printf("Ref Id (%d): ", referenceId->len);
         for (i = 0; i < referenceId->len; i++)
             printf("%c", referenceId->buf[i]);
         printf("\n");
@@ -2129,16 +2127,8 @@ static Z_External *create_external_itemRequest(void)
         r->indirect_reference = 0;
         r->descriptor = 0;
         r->which = Z_External_single;
-
-        r->u.single_ASN1_type = (Odr_oct *)
-            odr_malloc(out, sizeof(*r->u.single_ASN1_type));
-        r->u.single_ASN1_type->buf = (unsigned char *)
-        odr_malloc(out, item_request_size);
-        r->u.single_ASN1_type->len = item_request_size;
-        r->u.single_ASN1_type->size = item_request_size;
-        memcpy(r->u.single_ASN1_type->buf, item_request_buf,
-                item_request_size);
-
+        r->u.single_ASN1_type =
+            odr_create_Odr_oct(out, item_request_buf, item_request_size);
         do_hex_dump(item_request_buf,item_request_size);
     }
     return r;
@@ -2182,18 +2172,8 @@ static Z_External *create_external_ILL_APDU(void)
         r->indirect_reference = 0;
         r->descriptor = 0;
         r->which = Z_External_single;
-
-        r->u.single_ASN1_type = (Odr_oct *)
-            odr_malloc(out, sizeof(*r->u.single_ASN1_type));
-        r->u.single_ASN1_type->buf = (unsigned char *)
-        odr_malloc(out, ill_request_size);
-        r->u.single_ASN1_type->len = ill_request_size;
-        r->u.single_ASN1_type->size = ill_request_size;
-        memcpy(r->u.single_ASN1_type->buf, ill_request_buf, ill_request_size);
-/*         printf("len = %d\n", ill_request_size); */
-/*              do_hex_dump(ill_request_buf,ill_request_size); */
-/*              printf("--- end of extenal\n"); */
-
+        r->u.single_ASN1_type = odr_create_Odr_oct(out, ill_request_buf,
+                                                   ill_request_size);
     }
     return r;
 }
@@ -2482,16 +2462,8 @@ static int send_Z3950_update(int version, int action_no, const char *recid,
         notToKeep->elements[0] = (Z_IU0SuppliedRecords_elem *)
             odr_malloc(out, sizeof(**notToKeep->elements));
         notToKeep->elements[0]->which = Z_IUSuppliedRecords_elem_opaque;
-        if (recid)
-        {
-            notToKeep->elements[0]->u.opaque = (Odr_oct *)
-                odr_malloc(out, sizeof(Odr_oct));
-            notToKeep->elements[0]->u.opaque->buf = (unsigned char *) recid;
-            notToKeep->elements[0]->u.opaque->size = strlen(recid);
-            notToKeep->elements[0]->u.opaque->len = strlen(recid);
-        }
-        else
-            notToKeep->elements[0]->u.opaque = 0;
+        notToKeep->elements[0]->u.opaque = recid ?
+            odr_create_Odr_oct(out, recid, strlen(recid)) : 0;
         notToKeep->elements[0]->supplementalId = 0;
         notToKeep->elements[0]->correlationInfo = 0;
         notToKeep->elements[0]->record = record_this;
@@ -2529,16 +2501,8 @@ static int send_Z3950_update(int version, int action_no, const char *recid,
         notToKeep->elements[0] = (Z_IUSuppliedRecords_elem *)
             odr_malloc(out, sizeof(**notToKeep->elements));
         notToKeep->elements[0]->which = Z_IUSuppliedRecords_elem_opaque;
-        if (recid)
-        {
-            notToKeep->elements[0]->u.opaque = (Odr_oct *)
-                odr_malloc(out, sizeof(Odr_oct));
-            notToKeep->elements[0]->u.opaque->buf = (unsigned char *) recid;
-            notToKeep->elements[0]->u.opaque->size = strlen(recid);
-            notToKeep->elements[0]->u.opaque->len = strlen(recid);
-        }
-        else
-            notToKeep->elements[0]->u.opaque = 0;
+        notToKeep->elements[0]->u.opaque = recid ?
+            odr_create_Odr_oct(out, recid, strlen(recid)) : 0;
         notToKeep->elements[0]->supplementalId = 0;
         notToKeep->elements[0]->correlationInfo = 0;
         notToKeep->elements[0]->record = record_this;
@@ -2582,7 +2546,7 @@ static int cmd_xmles(const char *arg)
                           &ext->u.single_ASN1_type->len) == 0)
             return 0;
 
-        ext->u.single_ASN1_type->buf = (unsigned char *) asn_buf;
+        ext->u.single_ASN1_type->buf = asn_buf;
 
         oid = yaz_string_to_oid_odr(yaz_oid_std(),
                                     CLASS_EXTSERV, oid_str, out);
@@ -2825,7 +2789,8 @@ static int cmd_sru(const char *arg)
     }
     else
     {
-        int r = sscanf(arg, "%9s %9s", sru_method, sru_version);
+        int r = sscanf(arg, "%9s %9s %9s", sru_method, sru_version,
+            sru_recordPacking);
         if (r >= 1)
         {
             if (!yaz_matchstr(sru_method, "post"))
@@ -3168,6 +3133,8 @@ static int send_SRW_presentRequest(const char *arg)
         return 0;
     if (!parse_show_args(arg, setstring, &setno, &nos))
         return 0;
+    if (*sru_recordPacking)
+        sr->u.request->recordPacking = sru_recordPacking;
     sr->u.request->startRecord = odr_intdup(out, setno);
     sru_maximumRecords = nos;
     sr->u.request->maximumRecords = odr_intdup(out, nos);
@@ -3384,10 +3351,8 @@ static int send_Z3950_scanrequest(const char *set,  const char *query,
             req->termListAndStartPoint->term->u.general)
         {
             req->termListAndStartPoint->term->u.general->buf =
-                (unsigned char *) odr_strdup(out, term);
-            req->termListAndStartPoint->term->u.general->len =
-                req->termListAndStartPoint->term->u.general->size =
-                strlen(term);
+                odr_strdup(out, term);
+            req->termListAndStartPoint->term->u.general->len = strlen(term);
         }
     }
     req->referenceId = set_refid(out);
@@ -4455,7 +4420,7 @@ static void http_response(Z_HTTP_Response *hres)
             Z_SOAP *soap_package = 0;
             ODR o = odr_createmem(ODR_DECODE);
             Z_SOAP_Handler soap_handlers[] = {
-                {YAZ_XMLNS_SRU_v2_response, 0, (Z_SOAP_fun) yaz_srw_codec},
+                {YAZ_XMLNS_SRU_v2_mask, 0, (Z_SOAP_fun) yaz_srw_codec},
                 {YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec},
                 {YAZ_XMLNS_SRU_v1_response, 0, (Z_SOAP_fun) yaz_srw_codec},
                 {0, 0, 0}