better ursula request (doesn't crash)
[yazpp-moved-to-github.git] / src / yaz-my-client.cpp
index 5ac5307..c655184 100644 (file)
@@ -3,7 +3,28 @@
  * See the file LICENSE for details.
  * 
  * $Log: yaz-my-client.cpp,v $
- * Revision 1.2  2001-04-04 14:02:49  adam
+ * Revision 1.9  2001-04-26 17:51:56  heikki
+ * better ursula request (doesn't crash)
+ *
+ * Revision 1.8  2001/04/26 17:30:07  heikki
+ * Ursularequest got more default data
+ *
+ * Revision 1.7  2001/04/26 12:17:49  heikki
+ * Ursula stuff, mostly in the test client
+ *
+ * Revision 1.6  2001/04/17 16:21:21  heikki
+ * Working on UrsulaRenewal, Request, and Update
+ *
+ * Revision 1.5  2001/04/10 10:48:08  adam
+ * Fixed problem where proxy could cash bad result sets.
+ *
+ * Revision 1.4  2001/04/05 15:12:24  adam
+ * WIN32 updates.
+ *
+ * Revision 1.3  2001/04/05 13:09:44  adam
+ * Removed ursula dependancy.
+ *
+ * Revision 1.2  2001/04/04 14:02:49  adam
  * URSULA / Z-ruth service.
  *
  * Revision 1.1  2001/03/27 14:47:45  adam
 #include <yaz++/yaz-ir-assoc.h>
 #include <yaz++/yaz-pdu-assoc.h>
 #include <yaz++/yaz-socket-manager.h>
+
+#if HAVE_YAZ_URSULA_H
 #include <yaz/zes-ursula.h>
+#endif
 
 extern "C" {
 #if HAVE_READLINE_READLINE_H
@@ -111,6 +135,9 @@ public:
                     const char *databaseName);
     void recv_textRecord(int type, const char *buf, size_t len);
     void recv_genericRecord(Z_GenericRecord *r);
+#if HAVE_YAZ_URSULA_H
+    void recv_extendedServicesResponse(Z_ExtendedServicesResponse *extendedServicesResponse);
+#endif
     void display_genericRecord(Z_GenericRecord *r, int level);
     void display_variant(Z_Variant *v, int level);
     void connectNotify();
@@ -129,7 +156,10 @@ public:
     int cmd_init(char *args);
     int cmd_format(char *args);
     int cmd_proxy(char *args);
+#if HAVE_YAZ_URSULA_H
     int cmd_ursula(char *args);
+    int cmd_ursula_renew(char *args);
+#endif
 };
 
 
@@ -413,7 +443,7 @@ void MyClient::recv_record(Z_DatabaseRecord *record, int offset,
        case VAL_SIGLEMARC:
        case VAL_ISDSMARC:
        case VAL_RUSMARC:
-           marc_display((char*) record->u.octet_aligned->buf,stdout);
+           marc_display((char*) record->u.octet_aligned->buf,0);
            break;
        default:
            recv_textRecord((int) ent->value,
@@ -485,10 +515,12 @@ void MyClient::recv_searchResponse(Z_SearchResponse *searchResponse)
     if (!*searchResponse->searchStatus)
     {
        printf ("Fail\n");
-       return;
     }
-    printf ("Ok\n");
-    printf ("Hits: %d\n", *searchResponse->resultCount);
+    else
+    {
+       printf ("Ok\n");
+       printf ("Hits: %d\n", *searchResponse->resultCount);
+    }
     recv_records (searchResponse->records);
 }
 
@@ -498,6 +530,19 @@ void MyClient::recv_presentResponse(Z_PresentResponse *presentResponse)
     recv_records (presentResponse->records);
 }
 
+#if HAVE_YAZ_URSULA_H
+void MyClient::recv_extendedServicesResponse(Z_ExtendedServicesResponse *extendedServicesResponse)
+{
+    printf("Got ESresponse\n");
+    printf(" OperationStatus=%d with %d diagnostics:\n", 
+        *extendedServicesResponse->operationStatus,
+         extendedServicesResponse->num_diagnostics);
+    recv_diagrecs(extendedServicesResponse->diagnostics,
+                  extendedServicesResponse->num_diagnostics);
+    //TODO: Add more info !
+}
+#endif
+
 int MyClient::wait()
 {
     set_lastReceived(0);
@@ -509,6 +554,7 @@ int MyClient::wait()
     return 0;
 }
 
+
 #define C_PROMPT "Z>"
 
 int MyClient::cmd_connect(char *host)
@@ -598,12 +644,14 @@ int MyClient::cmd_proxy(char *args)
     return 1;
 }
 
+#if HAVE_YAZ_URSULA_H
 int MyClient::cmd_ursula(char *args)
 {
     Z_APDU *apdu = create_Z_PDU(Z_APDU_extendedServicesRequest);
     Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
 
     req->packageType = odr_getoidbystr(odr_encode(), "1.2.840.10003");
+//  req->packageType = odr_getoidbystr(odr_encode(), "1.2.840.10003.9.1000.105.3");
     
     Z_External *ext = (Z_External *) odr_malloc(odr_encode(), sizeof(*ext));
     req->taskSpecificParameters = ext;
@@ -613,22 +661,83 @@ int MyClient::cmd_ursula(char *args)
     
     ext->which = Z_External_octet;
     ext->u.single_ASN1_type = (Odr_oct *)
-       odr_malloc (odr_encode(), sizeof(Odr_oct));
+       odr_malloc (odr_encode(), sizeof(Odr_oct));
 
     Z_UrsPDU *pdu = (Z_UrsPDU *) odr_malloc (odr_encode(), sizeof(*pdu));
     pdu->which = Z_UrsPDU_request;
     pdu->u.request = (Z_UrsRequest *)
-       odr_malloc (odr_encode(), sizeof(*pdu->u.request));
+       odr_malloc (odr_encode(), sizeof(*pdu->u.request));
     pdu->u.request->libraryNo = odr_strdup(odr_encode(), "000200");
-    pdu->u.request->borrowerTickerNo = 0;
+    pdu->u.request->borrowerTickerNo = odr_strdup(odr_encode(),"1234567973");
     pdu->u.request->disposalType = 0;
-    pdu->u.request->lastUseDate = 0;
+    pdu->u.request->lastUseDate = odr_strdup(odr_encode(),"20011224");
+#ifdef SKIPTHIS
     pdu->u.request->num_items = 0;
     pdu->u.request->items = (Z_UrsRequestItem **) odr_nullval();
-    pdu->u.request->counter = 0;
+#else
+    pdu->u.request->num_items = 1;
+    pdu->u.request->items = (Z_UrsRequestItem **) 
+                odr_malloc(odr_encode(), 1 * sizeof(Z_UrsRequestItem*) );
+    pdu->u.request->items[0] = (Z_UrsRequestItem*)
+                odr_malloc(odr_encode(), sizeof(Z_UrsRequestItem) );
+    pdu->u.request->items[0]->id = odr_strdup(odr_encode(),"002231336x");
+    pdu->u.request->items[0]->titlePartNo=odr_strdup(odr_encode(),"31");
+#endif
+    
+    pdu->u.request->counter = odr_strdup(odr_encode(),"HB");
     pdu->u.request->priority = 0;
     pdu->u.request->disposalNote = 0;
-    pdu->u.request->overrule = 0;
+    pdu->u.request->overrule=(bool_t*)odr_malloc(odr_encode(),sizeof(bool_t));
+    *pdu->u.request->overrule = false;
+
+    if (!z_UrsPDU (odr_encode(), &pdu, 0, ""))
+    {
+        yaz_log (LOG_LOG, "ursula encoding failed");
+        return 1;
+    }
+    char *buf = 
+           odr_getbuf (odr_encode(), &ext->u.single_ASN1_type->len, 0);
+    
+    ext->u.single_ASN1_type->buf = (unsigned char*)
+       odr_malloc (odr_encode(), ext->u.single_ASN1_type->len);
+    memcpy (ext->u.single_ASN1_type->buf, buf, ext->u.single_ASN1_type->len);
+    ext->u.single_ASN1_type->size = ext->u.single_ASN1_type->len;
+    
+    if (send_Z_PDU(apdu) >= 0)
+       wait();
+    return 1;
+}
+
+int MyClient::cmd_ursula_renew(char *args)
+{
+    Z_APDU *apdu = create_Z_PDU(Z_APDU_extendedServicesRequest);
+    Z_ExtendedServicesRequest *req = apdu->u.extendedServicesRequest;
+
+    req->packageType = odr_getoidbystr(odr_encode(), "1.2.840.10003");
+    
+    Z_External *ext = (Z_External *) odr_malloc(odr_encode(), sizeof(*ext));
+    req->taskSpecificParameters = ext;
+    ext->direct_reference = req->packageType;
+    ext->descriptor = 0;
+    ext->indirect_reference = 0;
+    
+    ext->which = Z_External_octet;
+    ext->u.single_ASN1_type = (Odr_oct *)
+       odr_malloc (odr_encode(), sizeof(Odr_oct));
+
+    Z_UrsPDU *pdu = (Z_UrsPDU *) odr_malloc (odr_encode(), sizeof(*pdu));
+    pdu->which = Z_UrsPDU_renewal;
+    pdu->u.renewal = (Z_UrsRenewal *)
+          odr_malloc (odr_encode(), sizeof(*pdu->u.renewal));
+    pdu->u.renewal->libraryNo = odr_strdup(odr_encode(), "000200");
+    pdu->u.renewal->borrowerTicketNo = odr_strdup(odr_encode(),"1234567973");
+    pdu->u.renewal->num_copies=1;
+    pdu->u.renewal->copies = (Z_InternationalString **)
+            odr_malloc(odr_encode(),1* sizeof(Z_InternationalString *) );
+    pdu->u.renewal->copies[0]= odr_strdup(odr_encode(), "000035238");
+    pdu->u.renewal->newReturnDate=odr_strdup(odr_encode(), "20011224");
+    pdu->u.renewal->overrule=(bool_t*)odr_malloc(odr_encode(),sizeof(bool_t));
+    *pdu->u.renewal->overrule=false;
 
     if (!z_UrsPDU (odr_encode(), &pdu, 0, ""))
     {
@@ -648,6 +757,9 @@ int MyClient::cmd_ursula(char *args)
     return 1;
 }
 
+
+#endif
+
 int MyClient::processCommand(const char *commandLine)
 {
     char cmdStr[1024], cmdArgs[1024];
@@ -668,7 +780,13 @@ int MyClient::processCommand(const char *commandLine)
        {"init", &MyClient::cmd_init, ""},
        {"format", &MyClient::cmd_format, "<record-syntax>"},
        {"proxy", &MyClient::cmd_proxy, "<host>:[':'<port>]"},
+#if HAVE_YAZ_URSULA_H
        {"ursula", &MyClient::cmd_ursula, ""},
+       {"ursula_request", &MyClient::cmd_ursula, ""},
+       {"ursreq", &MyClient::cmd_ursula, ""},
+       {"ursnew", &MyClient::cmd_ursula_renew, ""},
+       {"ursula_renew", &MyClient::cmd_ursula_renew, ""},
+#endif
        {0,0,0}
     };