Added several type casts due to no portable way of doing printf of
[yaz-moved-to-github.git] / src / zoom-c.c
index 6b90468..c05e51c 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: zoom-c.c,v 1.63 2006-02-19 18:36:10 adam Exp $
+ * $Id: zoom-c.c,v 1.70 2006-04-21 10:28:07 adam Exp $
  */
 /**
  * \file zoom-c.c
@@ -54,7 +54,6 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c);
 static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out);
 static char *cql2pqf(ZOOM_connection c, const char *cql);
 
-
 static void initlog()
 {
     static int log_level_initialized = 0;
@@ -246,6 +245,12 @@ void ZOOM_connection_remove_task (ZOOM_connection c)
             assert (0);
         }
         xfree (task);
+
+        if (!c->tasks)
+        {
+            ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_END);
+            ZOOM_connection_put_event(c, event);
+        }
     }
 }
 
@@ -315,7 +320,7 @@ static char **set_DatabaseNames (ZOOM_connection con, ZOOM_options options,
     char **databaseNames;
     const char *cp = ZOOM_options_get (options, "databaseName");
     
-    if (!cp || !*cp)
+    if ((!cp || !*cp) && con->host_port)
     {
         if (strncmp (con->host_port, "unix:", 5) == 0)
             cp = strchr(con->host_port+5, ':');
@@ -339,6 +344,19 @@ ZOOM_connection_new (const char *host, int portnum)
     return c;
 }
 
+static zoom_sru_mode get_sru_mode_from_string(const char *s)
+{
+    if (!s || !*s)
+        return zoom_sru_soap;
+    if (!yaz_matchstr(s, "soap"))
+        return zoom_sru_soap;
+    else if (!yaz_matchstr(s, "get"))
+        return zoom_sru_get;
+    else if (!yaz_matchstr(s, "post"))
+        return zoom_sru_post;
+    return zoom_sru_error;
+}
+
 ZOOM_API(void)
 ZOOM_connection_connect(ZOOM_connection c,
                         const char *host, int portnum)
@@ -388,6 +406,9 @@ ZOOM_connection_connect(ZOOM_connection c,
     else
         c->lang = 0;
 
+    val = ZOOM_options_get (c->options, "sru");
+    c->sru_mode = get_sru_mode_from_string(val);
+
     xfree (c->host_port);
     if (portnum)
     {
@@ -897,8 +918,8 @@ ZOOM_resultset_records (ZOOM_resultset r, ZOOM_record *recs,
 
     if (!r)
         return ;
-    yaz_log(log_api, "%p ZOOM_resultset_records r=%p start=%d count=%d",
-            r, r, start, count);
+    yaz_log(log_api, "%p ZOOM_resultset_records r=%p start=%ld count=%ld",
+            r, r, (long) start, (long) count);
     if (count && recs)
         force_present = 1;
     ZOOM_resultset_retrieve (r, force_present, start, count);
@@ -1129,7 +1150,7 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c)
         ZOOM_options_get(c->options, "implementationName"),
         odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName));
 
-    version = odr_strdup(c->odr_out, "$Revision: 1.63 $");
+    version = odr_strdup(c->odr_out, "$Revision: 1.70 $");
     if (strlen(version) > 10)   /* check for unexpanded CVS strings */
         version[strlen(version)-2] = '\0';
     ireq->implementationVersion = odr_prepend(c->odr_out,
@@ -1196,26 +1217,11 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c)
         
         if ((oi_unit = yaz_oi_update(oi, c->odr_out, NULL, 0, 0)))
         {
-            char **charsets_addresses = 0;
-            char **langs_addresses = 0;
-            int charsets_count = 0;
-            int langs_count = 0;
-           
-            if (c->charset)
-                nmem_strsplit_blank(c->odr_out->mem, c->charset,
-                                    &charsets_addresses, &charsets_count);
-            if (c->lang)
-                nmem_strsplit_blank(c->odr_out->mem, c->lang,
-                                    &langs_addresses, &langs_count);
             ODR_MASK_SET(ireq->options, Z_Options_negotiationModel);
             oi_unit->which = Z_OtherInfo_externallyDefinedInfo;
             oi_unit->information.externallyDefinedInfo =
-                yaz_set_proposal_charneg(c->odr_out,
-                                         (const char **) charsets_addresses,
-                                         charsets_count,
-                                         (const char **) langs_addresses,
-                                         langs_count, 
-                                         1);
+                yaz_set_proposal_charneg_list(c->odr_out, " ",
+                                              c->charset, c->lang, 1);
         }
     }
     assert (apdu);
@@ -1225,7 +1231,6 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c)
 #if HAVE_XML2
 static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
 {
-    char ctype[50];
     Z_SOAP_Handler h[2] = {
         {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec},
         {0, 0, 0}
@@ -1262,34 +1267,40 @@ static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
         }
     }
 
-    strcpy(ctype, "text/xml");
-    if (c->charset && strlen(c->charset) < 20)
+    if (c->sru_mode == zoom_sru_get)
     {
-        strcat(ctype, "; charset=");
-        strcat(ctype, c->charset);
+        yaz_sru_get_encode(gdu->u.HTTP_Request, sr, c->odr_out, c->charset);
     }
-    z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
-                      "Content-Type", ctype);
-    z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
-                      "SOAPAction", "\"\"");
-    p->which = Z_SOAP_generic;
-    p->u.generic = (Z_SOAP_Generic *) odr_malloc(o, sizeof(*p->u.generic));
-    p->u.generic->no = 0;
-    p->u.generic->ns = 0;
-    p->u.generic->p = sr;
-    p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
+    else if (c->sru_mode == zoom_sru_post)
+    {
+        yaz_sru_post_encode(gdu->u.HTTP_Request, sr, c->odr_out, c->charset);
+    }
+    else if (c->sru_mode == zoom_sru_soap)
+    {
+        z_HTTP_header_add_content_type(c->odr_out,
+                                       &gdu->u.HTTP_Request->headers,
+                                       "text/xml", c->charset);
 
-    ret = z_soap_codec_enc(o, &p,
-                           &gdu->u.HTTP_Request->content_buf,
-                           &gdu->u.HTTP_Request->content_len, h,
-                           c->charset);
+        z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
+                          "SOAPAction", "\"\"");
+        p->which = Z_SOAP_generic;
+        p->u.generic = (Z_SOAP_Generic *) odr_malloc(o, sizeof(*p->u.generic));
+        p->u.generic->no = 0;
+        p->u.generic->ns = 0;
+        p->u.generic->p = sr;
+        p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
+        
+        ret = z_soap_codec_enc(o, &p,
+                               &gdu->u.HTTP_Request->content_buf,
+                               &gdu->u.HTTP_Request->content_len, h,
+                               c->charset);
 
+    }
     if (!z_GDU(c->odr_out, &gdu, 0, 0))
         return zoom_complete;
     c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
-
     odr_destroy(o);
-
+        
     event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
     ZOOM_connection_put_event (c, event);
     odr_reset(c->odr_out);
@@ -1854,7 +1865,7 @@ ZOOM_record_get (ZOOM_record rec, const char *type_spec, int *len)
         }
         return 0;
     }
-    else if (!strcmp (type, "xml") || !strcmp(type, "oai"))
+    else if (!strcmp (type, "xml"))
     {
         Z_External *r = (Z_External *) npr->u.databaseRecord;
         oident *ent = oid_getentbyoid(r->direct_reference);
@@ -1878,8 +1889,6 @@ ZOOM_record_get (ZOOM_record rec, const char *type_spec, int *len)
             const char *ret_buf;
             int marc_decode_type = YAZ_MARC_MARCXML;
 
-            if (!strcmp(type, "oai"))
-                marc_decode_type = YAZ_MARC_OAIMARC;
             switch (ent->value)
             {
             case VAL_SOIF:
@@ -2363,9 +2372,10 @@ static zoom_ret send_present(ZOOM_connection c)
     *req->resultSetStartPoint = resultset->start + 1;
     *req->numberOfRecordsRequested = resultset->step>0 ?
         resultset->step : resultset->count;
+    if (*req->numberOfRecordsRequested + resultset->start > resultset->size)
+        *req->numberOfRecordsRequested = resultset->size -  resultset->start;
     assert (*req->numberOfRecordsRequested > 0);
 
-
     if (syntax && *syntax)
         req->preferredRecordSyntax =
             yaz_str_to_z3950oid (c->odr_out, CLASS_RECSYN, syntax);