X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-ir-assoc.cpp;h=5f5d00c441ae0ef349c68b273e6c86e6ec2cf4cf;hb=da1f67a7cfc946f75fc80659b146898f3361f9c8;hp=d277643285c9f12c1f11fceb95533beb9d095215;hpb=97118338f9ac93e767e5589d449d3f9abacb3190;p=yazpp-moved-to-github.git diff --git a/src/yaz-ir-assoc.cpp b/src/yaz-ir-assoc.cpp index d277643..5f5d00c 100644 --- a/src/yaz-ir-assoc.cpp +++ b/src/yaz-ir-assoc.cpp @@ -1,109 +1,453 @@ /* - * 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.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++. - * + * $Id: yaz-ir-assoc.cpp,v 1.27 2006-03-29 13:14:15 adam Exp $ */ -#include -#include +#include -Yaz_IR_Assoc::Yaz_IR_Assoc(IYaz_PDU_Observable *the_PDU_Observable) +#include +#include + +using namespace yazpp_1; + +IR_Assoc::IR_Assoc(IPDU_Observable *the_PDU_Observable) + : Z_Assoc(the_PDU_Observable) +{ + m_num_databaseNames = 0; + m_databaseNames = 0; + m_preferredRecordSyntax = VAL_NONE; + 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); +} + +IR_Assoc::~IR_Assoc() +{ + if (m_elementSetNames) + delete [] m_elementSetNames->u.generic; + delete [] m_elementSetNames; + delete [] m_host; + delete [] m_proxy; + delete [] m_cookie; +} + +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; + *value = m_preferredRecordSyntax; } -Z_APDU *Yaz_IR_Assoc::decode_Z_PDU(const char *buf, int len) +void IR_Assoc::get_preferredRecordSyntax (const char **dst) { - Z_APDU *apdu; + struct oident ent; + ent.proto = PROTO_Z3950; + ent.oclass = CLASS_RECSYN; + ent.value = (enum oid_value) m_preferredRecordSyntax; - odr_reset (m_odr_in); - odr_setbuf (m_odr_in, (char*) buf, len, 0); + int oid[OID_SIZE]; + oid_ent_to_oid (&ent, oid); + struct oident *entp = oid_getentbyoid (oid); + + *dst = entp ? entp->desc : ""; +} - if (!z_APDU(m_odr_in, &apdu, 0)) +void IR_Assoc::set_elementSetName (const char *elementSetName) +{ + if (m_elementSetNames) + delete [] m_elementSetNames->u.generic; + delete m_elementSetNames; + m_elementSetNames = 0; + if (elementSetName && *elementSetName) { - 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; + 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); } - else +} + +void IR_Assoc::get_elementSetName (Z_ElementSetNames **elementSetNames) +{ + *elementSetNames = m_elementSetNames; +} + +void IR_Assoc::get_elementSetName (const char **elementSetName) +{ + if (!m_elementSetNames || + m_elementSetNames->which != Z_ElementSetNames_generic) + { + *elementSetName = 0; + return; + } + *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; + int recordSyntax; + + 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); + int oid_syntax[OID_SIZE]; + oident prefsyn; + get_preferredRecordSyntax(&recordSyntax); + if (recordSyntax != VAL_NONE) + { + prefsyn.proto = PROTO_Z3950; + prefsyn.oclass = CLASS_RECSYN; + prefsyn.value = (enum oid_value) recordSyntax; + oid_ent_to_oid(&prefsyn, oid_syntax); + req->preferredRecordSyntax = oid_syntax; + } + yaz_log (m_log, "send_searchRequest"); + assert (req->otherInfo == 0); + if (m_cookie) + { + set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie); + assert (req->otherInfo); + } + + if ( pRefId ) + { + req->referenceId = getRefID(pRefId); + } + + if ( pResultSetId ) + { + req->resultSetName = pResultSetId; + } + + return send_Z_PDU(apdu, 0); +} + +int 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; + + req->resultSetStartPoint = &start; + req->numberOfRecordsRequested = &number; + + int oid_syntax[OID_SIZE]; + oident prefsyn; + int recordSyntax; + get_preferredRecordSyntax (&recordSyntax); + if (recordSyntax != VAL_NONE) + { + prefsyn.proto = PROTO_Z3950; + prefsyn.oclass = CLASS_RECSYN; + prefsyn.value = (enum oid_value) recordSyntax; + oid_ent_to_oid(&prefsyn, oid_syntax); + req->preferredRecordSyntax = oid_syntax; + } + 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, VAL_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); + } +} + +const char *IR_Assoc::get_cookie() +{ + return m_cookie; +} + +void IR_Assoc::client(const char *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); +} + +const char *IR_Assoc::get_proxy() +{ + 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 Yaz_IR_Assoc::connectNotify() +void IR_Assoc::recv_extendedServicesResponse(Z_ExtendedServicesResponse *ExtendedServicesResponse) { - logf (LOG_LOG, "connectNotify"); } -void Yaz_IR_Assoc::failNotify() +int IR_Assoc::get_lastReceived() { - logf (LOG_LOG, "failNotify"); + return m_lastReceived; } -void Yaz_IR_Assoc::client(const char *addr) +void IR_Assoc::set_lastReceived(int lastReceived) { - m_PDU_Observable->connect (this, addr); + m_lastReceived = lastReceived; } -void Yaz_IR_Assoc::server(const char *addr) +int IR_Assoc::send_initRequest(char* pRefId) { - m_PDU_Observable->listen (this, addr); + 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, VAL_PROXY, 1, m_host); + if (m_cookie) + set_otherInformationString(&req->otherInfo, VAL_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, VAL_PROXY, 1, m_host); + if (m_cookie) + set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie); + + return send_Z_PDU(apdu, 0); +} + + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +