X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-ir-assoc.cpp;h=edb8a1b4c8014e898ac8d0348649cfe3f7861675;hb=5e3f7e1a720a08d30c407049c94c6ca825a5ed27;hp=ad24cb262f915fa508df746d5225f8fdb64bbdbc;hpb=3109185a2036377894be1dd303d899a305b44281;p=yazpp-moved-to-github.git diff --git a/src/yaz-ir-assoc.cpp b/src/yaz-ir-assoc.cpp index ad24cb2..edb8a1b 100644 --- a/src/yaz-ir-assoc.cpp +++ b/src/yaz-ir-assoc.cpp @@ -1,21 +1,14 @@ /* - * Copyright (c) 1998-1999, Index Data. + * Copyright (c) 1998-2003, Index Data. * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss * - * $Log: yaz-ir-assoc.cpp,v $ - * Revision 1.6 1999-04-20 10:30:05 adam - * Implemented various stuff for client and proxy. Updated calls - * to ODR to reflect new name parameter. - * - * Revision 1.5 1999/04/09 11:46:57 adam - * Added object Yaz_Z_Assoc. Much more functional client. + * $Id: yaz-ir-assoc.cpp,v 1.23 2004-12-13 20:50:54 adam Exp $ */ #include -#include -#include +#include +#include Yaz_IR_Assoc::Yaz_IR_Assoc(IYaz_PDU_Observable *the_PDU_Observable) : Yaz_Z_Assoc(the_PDU_Observable) @@ -28,6 +21,7 @@ Yaz_IR_Assoc::Yaz_IR_Assoc(IYaz_PDU_Observable *the_PDU_Observable) m_host = 0; m_proxy = 0; m_cookie = 0; + m_log = YLOG_DEBUG; const char *db = "Default"; set_databaseNames(1, &db); } @@ -48,15 +42,17 @@ void Yaz_IR_Assoc::get_databaseNames (int *num, char ***list) *list = m_databaseNames; } +typedef char *charp; void Yaz_IR_Assoc::set_databaseNames (int num, const char **list) { int i; - logf (LOG_LOG, "Yaz_IR_Assoc::set_databaseNames num=%d", num); + yaz_log (m_log, "Yaz_IR_Assoc::set_databaseNames num=%d", num); for (i = 0; iu.generic; } -void Yaz_IR_Assoc::set_otherInformationString ( - Z_OtherInformation **otherInformation, - int oidval, int categoryValue, - const char *str) -{ - int oid[OID_SIZE]; - struct oident ent; - ent.proto = PROTO_Z3950; - ent.oclass = CLASS_USERINFO; - ent.value = (oid_value) oidval; - if (!oid_ent_to_oid (&ent, oid)) - return ; - set_otherInformationString(otherInformation, oid, categoryValue, str); -} -void Yaz_IR_Assoc::set_otherInformationString ( - Z_OtherInformation **otherInformation, - int *oid, int categoryValue, - const char *str) +void Yaz_IR_Assoc::recv_GDU(Z_GDU *apdu, int len) { - Z_OtherInformationUnit *oi = - update_otherInformation(otherInformation, 1, oid, categoryValue); - if (!oi) - return; - oi->information.characterInfo = odr_strdup (odr_encode(), str); + if (apdu->which == Z_GDU_Z3950) + recv_Z_PDU(apdu->u.z3950, len); } -void Yaz_IR_Assoc::recv_Z_PDU(Z_APDU *apdu) +void Yaz_IR_Assoc::recv_Z_PDU(Z_APDU *apdu, int len) { - logf (LOG_LOG, "recv_Z_PDU"); + yaz_log (m_log, "recv_Z_PDU %d bytes", len); m_lastReceived = apdu->which; switch (apdu->which) { case Z_APDU_initResponse: - logf (LOG_LOG, "recv InitResponse"); + yaz_log (m_log, "recv InitResponse"); recv_initResponse(apdu->u.initResponse); break; case Z_APDU_initRequest: - logf (LOG_LOG, "recv InitRequest"); + yaz_log (m_log, "recv InitRequest"); recv_initRequest(apdu->u.initRequest); break; case Z_APDU_searchRequest: - logf (LOG_LOG, "recv searchRequest"); + yaz_log (m_log, "recv searchRequest"); recv_searchRequest(apdu->u.searchRequest); break; case Z_APDU_searchResponse: - logf (LOG_LOG, "recv searchResponse"); + yaz_log (m_log, "recv searchResponse"); recv_searchResponse(apdu->u.searchResponse); break; case Z_APDU_presentRequest: - logf (LOG_LOG, "recv presentRequest"); + yaz_log (m_log, "recv presentRequest"); recv_presentRequest(apdu->u.presentRequest); break; case Z_APDU_presentResponse: - logf (LOG_LOG, "recv presentResponse"); + yaz_log (m_log, "recv presentResponse"); recv_presentResponse(apdu->u.presentResponse); break; + case Z_APDU_extendedServicesResponse: + yaz_log (m_log, "recv extendedServiceResponse"); + recv_extendedServicesResponse(apdu->u.extendedServicesResponse); + break; } } -int Yaz_IR_Assoc::send_searchRequest(Yaz_Z_Query *query) +int Yaz_IR_Assoc::send_searchRequest(Yaz_Z_Query *query, + char* pResultSetId, + char* pRefId) { Z_APDU *apdu = create_Z_PDU(Z_APDU_searchRequest); Z_SearchRequest *req = apdu->u.searchRequest; @@ -234,14 +216,31 @@ int Yaz_IR_Assoc::send_searchRequest(Yaz_Z_Query *query) oid_ent_to_oid(&prefsyn, oid_syntax); req->preferredRecordSyntax = oid_syntax; } - logf (LOG_LOG, "send_searchRequest"); + yaz_log (m_log, "send_searchRequest"); assert (req->otherInfo == 0); if (m_cookie) + { set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie); - return send_Z_PDU(apdu); + assert (req->otherInfo); + } + + if ( pRefId ) + { + req->referenceId = getRefID(pRefId); + } + + if ( pResultSetId ) + { + req->resultSetName = pResultSetId; + } + + return send_Z_PDU(apdu, 0); } -int Yaz_IR_Assoc::send_presentRequest(int start, int number) +int Yaz_IR_Assoc::send_presentRequest(int start, + int number, + char* pResultSetId, + char* pRefId) { Z_APDU *apdu = create_Z_PDU(Z_APDU_presentRequest); Z_PresentRequest *req = apdu->u.presentRequest; @@ -270,23 +269,43 @@ int Yaz_IR_Assoc::send_presentRequest(int start, int number) compo.which = Z_RecordComp_simple; compo.u.simple = elementSetNames; } + if (m_cookie) set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie); - return send_Z_PDU(apdu); + + if ( pRefId ) + { + req->referenceId = getRefID(pRefId); + } + + if ( pResultSetId ) + { + req->resultSetId = pResultSetId; + } + + return send_Z_PDU(apdu, 0); } void Yaz_IR_Assoc::set_proxy(const char *str) { - delete m_proxy; - m_proxy = new char[strlen(str)+1]; - strcpy (m_proxy, str); + delete [] m_proxy; + m_proxy = 0; + if (str) + { + m_proxy = new char[strlen(str)+1]; + strcpy (m_proxy, str); + } } void Yaz_IR_Assoc::set_cookie(const char *str) { - delete m_cookie; - m_cookie = new char[strlen(str)+1]; - strcpy(m_cookie, str); + delete [] m_cookie; + m_cookie = 0; + if (str) + { + m_cookie = new char[strlen(str)+1]; + strcpy(m_cookie, str); + } } const char *Yaz_IR_Assoc::get_cookie() @@ -299,17 +318,10 @@ void Yaz_IR_Assoc::client(const char *addr) delete [] m_host; m_host = new char[strlen(addr)+1]; strcpy(m_host, addr); - const char *zurl_p = (m_proxy ? m_proxy : m_host); - char *zurl = new char[strlen(zurl_p)+1]; - strcpy(zurl, zurl_p); - char *dbpart = strchr(zurl, '/'); + const char *dbpart = strchr(m_host, '/'); if (dbpart) - { set_databaseNames (dbpart+1, "+ "); - *dbpart = '\0'; - } - Yaz_Z_Assoc::client(zurl); - delete [] zurl; + Yaz_Z_Assoc::client(m_proxy ? m_proxy : m_host); } const char *Yaz_IR_Assoc::get_proxy() @@ -325,19 +337,19 @@ const char *Yaz_IR_Assoc::get_host() void Yaz_IR_Assoc::recv_searchRequest(Z_SearchRequest *searchRequest) { Z_APDU *apdu = create_Z_PDU(Z_APDU_searchResponse); - send_Z_PDU(apdu); + send_Z_PDU(apdu, 0); } void Yaz_IR_Assoc::recv_presentRequest(Z_PresentRequest *presentRequest) { Z_APDU *apdu = create_Z_PDU(Z_APDU_presentResponse); - send_Z_PDU(apdu); + send_Z_PDU(apdu, 0); } void Yaz_IR_Assoc::recv_initRequest(Z_InitRequest *initRequest) { Z_APDU *apdu = create_Z_PDU(Z_APDU_initResponse); - send_Z_PDU(apdu); + send_Z_PDU(apdu, 0); } void Yaz_IR_Assoc::recv_searchResponse (Z_SearchResponse *searchResponse) @@ -352,6 +364,10 @@ void Yaz_IR_Assoc::recv_initResponse(Z_InitResponse *initResponse) { } +void Yaz_IR_Assoc::recv_extendedServicesResponse(Z_ExtendedServicesResponse *ExtendedServicesResponse) +{ +} + int Yaz_IR_Assoc::get_lastReceived() { return m_lastReceived; @@ -362,7 +378,7 @@ void Yaz_IR_Assoc::set_lastReceived(int lastReceived) m_lastReceived = lastReceived; } -int Yaz_IR_Assoc::send_initRequest() +int Yaz_IR_Assoc::send_initRequest(char* pRefId) { Z_APDU *apdu = create_Z_PDU(Z_APDU_initRequest); Z_InitRequest *req = apdu->u.initRequest; @@ -380,10 +396,48 @@ int Yaz_IR_Assoc::send_initRequest() ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2); ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3); + if ( pRefId ) + { + req->referenceId = getRefID(pRefId); + } + if (m_proxy && m_host) set_otherInformationString(&req->otherInfo, VAL_PROXY, 1, m_host); if (m_cookie) set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie); - return send_Z_PDU(apdu); + return send_Z_PDU(apdu, 0); } +int Yaz_IR_Assoc::send_deleteResultSetRequest(char* pResultSetId, char* pRefId) +{ + char* ResultSetIds[1]; + + Z_APDU *apdu = create_Z_PDU(Z_APDU_deleteResultSetRequest); + Z_DeleteResultSetRequest *req = apdu->u.deleteResultSetRequest; + + if ( pResultSetId ) + { + *req->deleteFunction = Z_DeleteResultSetRequest_list; + req->num_resultSetList = 1; + ResultSetIds[0] = pResultSetId; + req->resultSetList = ResultSetIds; + } + else + { + *req->deleteFunction = Z_DeleteResultSetRequest_all; + } + + if ( pRefId ) + { + req->referenceId = getRefID(pRefId); + } + + if (m_proxy && m_host) + set_otherInformationString(&req->otherInfo, VAL_PROXY, 1, m_host); + if (m_cookie) + set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie); + + return send_Z_PDU(apdu, 0); +} + +