X-Git-Url: http://git.indexdata.com/?p=yazpp-moved-to-github.git;a=blobdiff_plain;f=src%2Fyaz-ir-assoc.cpp;h=0978e060c521bd5f3f74f5e85ed53299b1e37d8d;hp=f5dcb5082ccd0a2ee5563bcb1b920bbe7207b7ba;hb=d62e0baee8ee3cccced41746ef09fc3e01f401d5;hpb=cc44793fb69db2885c570cc5de05fda796993bba diff --git a/src/yaz-ir-assoc.cpp b/src/yaz-ir-assoc.cpp index f5dcb50..0978e06 100644 --- a/src/yaz-ir-assoc.cpp +++ b/src/yaz-ir-assoc.cpp @@ -1,122 +1,440 @@ -/* - * Copyright (c) 1998-1999, Index Data. +/* This file is part of the yazpp toolkit. + * Copyright (C) Index Data and Mike Taylor * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: yaz-ir-assoc.cpp,v $ - * Revision 1.3 1999-02-02 14:01:19 adam - * First WIN32 port of YAZ++. - * - * Revision 1.2 1999/01/28 13:08:43 adam - * Yaz_PDU_Assoc better encapsulated. Memory leak fix in - * yaz-socket-manager.cc. - * - * Revision 1.1.1.1 1999/01/28 09:41:07 adam - * First implementation of YAZ++. - * */ -#include -#include +#if HAVE_CONFIG_H +#include +#endif +#include + +#include +#include +#include -int Yaz_IR_Assoc::yaz_init_func() +using namespace yazpp_1; + +IR_Assoc::IR_Assoc(IPDU_Observable *the_PDU_Observable) + : Z_Assoc(the_PDU_Observable) { - logf (LOG_LOG, "nmem_init"); - nmem_init(); - logf (LOG_LOG, "done"); - return 1; + m_num_databaseNames = 0; + m_databaseNames = 0; + m_preferredRecordSyntax = 0; + m_elementSetNames = 0; + m_lastReceived = 0; + m_host = 0; + m_proxy = 0; + m_cookie = 0; + m_log = YLOG_DEBUG; + const char *db = "Default"; + set_databaseNames(1, &db); } -int Yaz_IR_Assoc::yaz_init_flag = Yaz_IR_Assoc::yaz_init_func(); +IR_Assoc::~IR_Assoc() +{ + xfree(m_preferredRecordSyntax); + if (m_elementSetNames) + delete [] m_elementSetNames->u.generic; + delete [] m_elementSetNames; + delete [] m_host; + delete [] m_proxy; + delete [] m_cookie; +} -Yaz_IR_Assoc::Yaz_IR_Assoc(IYaz_PDU_Observable *the_PDU_Observable) +void IR_Assoc::get_databaseNames (int *num, char ***list) { - m_PDU_Observable = the_PDU_Observable; - m_odr_in = odr_createmem (ODR_DECODE); - m_odr_out = odr_createmem (ODR_ENCODE); - m_odr_print = odr_createmem (ODR_PRINT); + *num = m_num_databaseNames; + *list = m_databaseNames; } -Yaz_IR_Assoc::~Yaz_IR_Assoc() +typedef char *charp; +void IR_Assoc::set_databaseNames (int num, const char **list) { - m_PDU_Observable->destroy(); - delete m_PDU_Observable; - odr_destroy (m_odr_print); - odr_destroy (m_odr_out); - odr_destroy (m_odr_in); + int i; + yaz_log (m_log, "IR_Assoc::set_databaseNames num=%d", num); + for (i = 0; i 0) - return m_PDU_Observable->send_PDU(buf, len); - return -1; + if (m_preferredRecordSyntax) + *dst = m_preferredRecordSyntax; + else + *dst = ""; } -Z_APDU *Yaz_IR_Assoc::decode_Z_PDU(const char *buf, int len) +void IR_Assoc::set_elementSetName (const char *elementSetName) { - Z_APDU *apdu; + if (m_elementSetNames) + delete [] m_elementSetNames->u.generic; + delete m_elementSetNames; + m_elementSetNames = 0; + if (elementSetName && *elementSetName) + { + m_elementSetNames = new Z_ElementSetNames; + m_elementSetNames->which = Z_ElementSetNames_generic; + m_elementSetNames->u.generic = new char[strlen(elementSetName)+1]; + strcpy (m_elementSetNames->u.generic, elementSetName); + } +} - odr_reset (m_odr_in); - odr_setbuf (m_odr_in, (char*) buf, len, 0); +void IR_Assoc::get_elementSetName (Z_ElementSetNames **elementSetNames) +{ + *elementSetNames = m_elementSetNames; +} - if (!z_APDU(m_odr_in, &apdu, 0)) +void IR_Assoc::get_elementSetName (const char **elementSetName) +{ + if (!m_elementSetNames || + m_elementSetNames->which != Z_ElementSetNames_generic) { - logf(LOG_LOG, "ODR error on incoming PDU: %s [near byte %d] ", - odr_errmsg(odr_geterror(m_odr_in)), - odr_offset(m_odr_in)); - logf(LOG_LOG, "PDU dump:"); - odr_dumpBER(log_file(), buf, len); - return 0; + *elementSetName = 0; + return; } - else + *elementSetName = m_elementSetNames->u.generic; +} + + +void IR_Assoc::recv_GDU(Z_GDU *apdu, int len) +{ + if (apdu->which == Z_GDU_Z3950) + recv_Z_PDU(apdu->u.z3950, len); +} + +void IR_Assoc::recv_Z_PDU(Z_APDU *apdu, int len) +{ + yaz_log (m_log, "recv_Z_PDU %d bytes", len); + m_lastReceived = apdu->which; + switch (apdu->which) { - logf (LOG_LOG, "decoded ok"); - return apdu; + case Z_APDU_initResponse: + yaz_log (m_log, "recv InitResponse"); + recv_initResponse(apdu->u.initResponse); + break; + case Z_APDU_initRequest: + yaz_log (m_log, "recv InitRequest"); + recv_initRequest(apdu->u.initRequest); + break; + case Z_APDU_searchRequest: + yaz_log (m_log, "recv searchRequest"); + recv_searchRequest(apdu->u.searchRequest); + break; + case Z_APDU_searchResponse: + yaz_log (m_log, "recv searchResponse"); + recv_searchResponse(apdu->u.searchResponse); + break; + case Z_APDU_presentRequest: + yaz_log (m_log, "recv presentRequest"); + recv_presentRequest(apdu->u.presentRequest); + break; + case Z_APDU_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::encode_Z_PDU(Z_APDU *apdu, char **buf, int *len) +int IR_Assoc::send_searchRequest(Yaz_Z_Query *query, + char* pResultSetId, + char* pRefId) { - if (!z_APDU(m_odr_out, &apdu, 0)) + Z_APDU *apdu = create_Z_PDU(Z_APDU_searchRequest); + Z_SearchRequest *req = apdu->u.searchRequest; + + req->query = query->get_Z_Query(); + if (!req->query) return -1; - *buf = odr_getbuf (m_odr_out, len, 0); - odr_reset (m_odr_out); - return *len; + get_databaseNames (&req->num_databaseNames, &req->databaseNames); + const char *recordSyntax; + get_preferredRecordSyntax(&recordSyntax); + if (recordSyntax && *recordSyntax) + { + req->preferredRecordSyntax + = yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN, recordSyntax, + odr_encode()); + } + yaz_log (m_log, "send_searchRequest"); + assert (req->otherInfo == 0); + if (m_cookie) + { + set_otherInformationString(&req->otherInfo, yaz_oid_userinfo_cookie, + 1, m_cookie); + assert (req->otherInfo); + } + + if ( pRefId ) + { + req->referenceId = getRefID(pRefId); + } + + if ( pResultSetId ) + { + req->resultSetName = pResultSetId; + } + + return send_Z_PDU(apdu, 0); } -void Yaz_IR_Assoc::connectNotify() +int IR_Assoc::send_presentRequest(Odr_int start, + Odr_int number, + char* pResultSetId, + char* pRefId) { - logf (LOG_LOG, "connectNotify"); + Z_APDU *apdu = create_Z_PDU(Z_APDU_presentRequest); + Z_PresentRequest *req = apdu->u.presentRequest; + + req->resultSetStartPoint = &start; + req->numberOfRecordsRequested = &number; + + const char *recordSyntax; + get_preferredRecordSyntax (&recordSyntax); + if (recordSyntax && *recordSyntax) + { + req->preferredRecordSyntax = + yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN, recordSyntax, + odr_encode()); + } + Z_RecordComposition compo; + Z_ElementSetNames *elementSetNames; + get_elementSetName (&elementSetNames); + if (elementSetNames) + { + req->recordComposition = &compo; + compo.which = Z_RecordComp_simple; + compo.u.simple = elementSetNames; + } + + if (m_cookie) + set_otherInformationString(&req->otherInfo, yaz_oid_userinfo_cookie, + 1, m_cookie); + + if ( pRefId ) + { + req->referenceId = getRefID(pRefId); + } + + if ( pResultSetId ) + { + req->resultSetId = pResultSetId; + } + + return send_Z_PDU(apdu, 0); +} + +void IR_Assoc::set_proxy(const char *str) +{ + delete [] m_proxy; + m_proxy = 0; + if (str) + { + m_proxy = new char[strlen(str)+1]; + strcpy (m_proxy, str); + } +} + +void IR_Assoc::set_cookie(const char *str) +{ + delete [] m_cookie; + m_cookie = 0; + if (str) + { + m_cookie = new char[strlen(str)+1]; + strcpy(m_cookie, str); + } } -void Yaz_IR_Assoc::failNotify() +const char *IR_Assoc::get_cookie() { - logf (LOG_LOG, "failNotify"); + return m_cookie; } -void Yaz_IR_Assoc::client(const char *addr) +void IR_Assoc::client(const char *addr) { - m_PDU_Observable->connect (this, addr); + delete [] m_host; + m_host = new char[strlen(addr)+1]; + strcpy(m_host, addr); + const char *dbpart = strchr(m_host, '/'); + if (dbpart) + set_databaseNames (dbpart+1, "+ "); + Z_Assoc::client(m_proxy ? m_proxy : m_host); } -void Yaz_IR_Assoc::server(const char *addr) +const char *IR_Assoc::get_proxy() { - m_PDU_Observable->listen (this, addr); + return m_proxy; } +const char *IR_Assoc::get_host() +{ + return m_host; +} + +void IR_Assoc::recv_searchRequest(Z_SearchRequest *searchRequest) +{ + Z_APDU *apdu = create_Z_PDU(Z_APDU_searchResponse); + send_Z_PDU(apdu, 0); +} + +void IR_Assoc::recv_presentRequest(Z_PresentRequest *presentRequest) +{ + Z_APDU *apdu = create_Z_PDU(Z_APDU_presentResponse); + send_Z_PDU(apdu, 0); +} + +void IR_Assoc::recv_initRequest(Z_InitRequest *initRequest) +{ + Z_APDU *apdu = create_Z_PDU(Z_APDU_initResponse); + send_Z_PDU(apdu, 0); +} + +void IR_Assoc::recv_searchResponse (Z_SearchResponse *searchResponse) +{ +} + +void IR_Assoc::recv_presentResponse (Z_PresentResponse *presentResponse) +{ +} + +void IR_Assoc::recv_initResponse(Z_InitResponse *initResponse) +{ +} + +void IR_Assoc::recv_extendedServicesResponse(Z_ExtendedServicesResponse *ExtendedServicesResponse) +{ +} + +int IR_Assoc::get_lastReceived() +{ + return m_lastReceived; +} + +void IR_Assoc::set_lastReceived(int lastReceived) +{ + m_lastReceived = lastReceived; +} + +int IR_Assoc::send_initRequest(char* pRefId) +{ + Z_APDU *apdu = create_Z_PDU(Z_APDU_initRequest); + Z_InitRequest *req = apdu->u.initRequest; + + ODR_MASK_SET(req->options, Z_Options_search); + ODR_MASK_SET(req->options, Z_Options_present); + ODR_MASK_SET(req->options, Z_Options_namedResultSets); + ODR_MASK_SET(req->options, Z_Options_triggerResourceCtrl); + ODR_MASK_SET(req->options, Z_Options_scan); + ODR_MASK_SET(req->options, Z_Options_sort); + ODR_MASK_SET(req->options, Z_Options_extendedServices); + ODR_MASK_SET(req->options, Z_Options_delSet); + + ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_1); + 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, yaz_oid_userinfo_proxy, + 1, m_host); + if (m_cookie) + set_otherInformationString(&req->otherInfo, yaz_oid_userinfo_cookie, + 1, m_cookie); + return send_Z_PDU(apdu, 0); +} + +int 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, yaz_oid_userinfo_proxy, + 1, m_host); + if (m_cookie) + set_otherInformationString(&req->otherInfo, yaz_oid_userinfo_cookie, + 1, m_cookie); + + return send_Z_PDU(apdu, 0); +} + + +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +