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=4217bcdb6b656ff3ecc19858260a59b02aae0dce;hb=d62e0baee8ee3cccced41746ef09fc3e01f401d5;hpb=c6e5ad789740135af3558298f6e2014ae99ee7dd diff --git a/src/yaz-ir-assoc.cpp b/src/yaz-ir-assoc.cpp index 4217bcd..0978e06 100644 --- a/src/yaz-ir-assoc.cpp +++ b/src/yaz-ir-assoc.cpp @@ -1,281 +1,233 @@ -/* - * 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.5 1999-04-09 11:46:57 adam - * Added object Yaz_Z_Assoc. Much more functional client. - * */ +#if HAVE_CONFIG_H +#include +#endif #include -#include -#include +#include +#include +#include + +using namespace yazpp_1; -Yaz_IR_Assoc::Yaz_IR_Assoc(IYaz_PDU_Observable *the_PDU_Observable) - : Yaz_Z_Assoc(the_PDU_Observable) +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_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); } -Yaz_IR_Assoc::~Yaz_IR_Assoc() +IR_Assoc::~IR_Assoc() { + xfree(m_preferredRecordSyntax); if (m_elementSetNames) - delete [] m_elementSetNames->u.generic; - delete m_elementSetNames; + delete [] m_elementSetNames->u.generic; + delete [] m_elementSetNames; + delete [] m_host; + delete [] m_proxy; + delete [] m_cookie; } -void Yaz_IR_Assoc::get_databaseNames (int *num, char ***list) +void IR_Assoc::get_databaseNames (int *num, char ***list) { *num = m_num_databaseNames; *list = m_databaseNames; } -void Yaz_IR_Assoc::set_databaseNames (int num, const char **list) +typedef char *charp; +void 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, "IR_Assoc::set_databaseNames num=%d", num); for (i = 0; idesc : ""; + if (m_preferredRecordSyntax) + *dst = m_preferredRecordSyntax; + else + *dst = ""; } -void Yaz_IR_Assoc::set_elementSetName (const char *elementSetName) +void IR_Assoc::set_elementSetName (const char *elementSetName) { if (m_elementSetNames) - delete [] m_elementSetNames->u.generic; + 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); + 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); } } -void Yaz_IR_Assoc::get_elementSetName (Z_ElementSetNames **elementSetNames) +void IR_Assoc::get_elementSetName (Z_ElementSetNames **elementSetNames) { *elementSetNames = m_elementSetNames; } -void Yaz_IR_Assoc::get_elementSetName (const char **elementSetName) +void IR_Assoc::get_elementSetName (const char **elementSetName) { if (!m_elementSetNames || - m_elementSetNames->which != Z_ElementSetNames_generic) + m_elementSetNames->which != Z_ElementSetNames_generic) { - *elementSetName = 0; - return; + *elementSetName = 0; + return; } *elementSetName = m_elementSetNames->u.generic; } -void Yaz_IR_Assoc::set_otherInformationString ( - Z_OtherInformation **otherInformation, - int *oid, int categoryValue, - const char *str) -{ - Z_OtherInformationUnit *oi = - set_otherInformation(otherInformation, oid, categoryValue); - if (!oi) - return; - oi->information.characterInfo = odr_strdup (odr_encode(), str); -} -Z_OtherInformationUnit *Yaz_IR_Assoc::set_otherInformation ( - Z_OtherInformation **otherInformationP, - int *oid, int categoryValue) +void IR_Assoc::recv_GDU(Z_GDU *apdu, int len) { - int i; - Z_OtherInformation *otherInformation = *otherInformationP; - if (!otherInformation) - { - otherInformation = *otherInformationP = (Z_OtherInformation *) - odr_malloc (odr_encode(), sizeof(*otherInformation)); - otherInformation->num_elements = 0; - otherInformation->list = (Z_OtherInformationUnit **) - odr_malloc (odr_encode(), 8*sizeof(*otherInformation)); - for (i = 0; i<8; i++) - otherInformation->list[i] = 0; - } - for (i = 0; inum_elements; i++) - { - assert (otherInformation->list[i]); - if (!oid) - { - if (!otherInformation->list[i]->category) - return otherInformation->list[i]; - } - else - { - if (otherInformation->list[i]->category && - categoryValue == - *otherInformation->list[i]->category->categoryValue && - !oid_oidcmp (oid, otherInformation->list[i]->category-> - categoryTypeId)) - return otherInformation->list[i]; - } - } - otherInformation->list[i] = (Z_OtherInformationUnit*) - odr_malloc (odr_encode(), sizeof(Z_OtherInformationUnit)); - if (oid) - { - otherInformation->list[i]->category = (Z_InfoCategory*) - odr_malloc (odr_encode(), sizeof(Z_InfoCategory)); - otherInformation->list[i]->category->categoryTypeId = (int*) - odr_oiddup (odr_encode(), oid); - otherInformation->list[i]->category->categoryValue = (int*) - odr_malloc (odr_encode(), sizeof(int)); - *otherInformation->list[i]->category->categoryValue = - categoryValue; - } - else - otherInformation->list[i]->category = 0; - otherInformation->list[i]->which = Z_OtherInfo_characterInfo; - otherInformation->list[i]->information.characterInfo = 0; - - otherInformation->num_elements = i+1; - return otherInformation->list[i]; + if (apdu->which == Z_GDU_Z3950) + recv_Z_PDU(apdu->u.z3950, len); } -void Yaz_IR_Assoc::recv_Z_PDU(Z_APDU *apdu) +void 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"); - recv_initResponse(apdu->u.initResponse); - break; + yaz_log (m_log, "recv InitResponse"); + recv_initResponse(apdu->u.initResponse); + break; case Z_APDU_initRequest: - logf (LOG_LOG, "recv InitRequest"); - recv_initRequest(apdu->u.initRequest); + yaz_log (m_log, "recv InitRequest"); + recv_initRequest(apdu->u.initRequest); break; case Z_APDU_searchRequest: - logf (LOG_LOG, "recv searchRequest"); - recv_searchRequest(apdu->u.searchRequest); + yaz_log (m_log, "recv searchRequest"); + recv_searchRequest(apdu->u.searchRequest); break; case Z_APDU_searchResponse: - logf (LOG_LOG, "recv searchResponse"); - recv_searchResponse(apdu->u.searchResponse); - break; + yaz_log (m_log, "recv searchResponse"); + recv_searchResponse(apdu->u.searchResponse); + break; case Z_APDU_presentRequest: - logf (LOG_LOG, "recv presentRequest"); - recv_presentRequest(apdu->u.presentRequest); + yaz_log (m_log, "recv presentRequest"); + recv_presentRequest(apdu->u.presentRequest); break; case Z_APDU_presentResponse: - logf (LOG_LOG, "recv presentResponse"); - recv_presentResponse(apdu->u.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 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; - int recordSyntax; req->query = query->get_Z_Query(); if (!req->query) - return -1; + return -1; get_databaseNames (&req->num_databaseNames, &req->databaseNames); - for (int i = 0; inum_databaseNames; i++) - logf (LOG_LOG, "Database %s", req->databaseNames[i]); - int oid_syntax[OID_SIZE]; - oident prefsyn; + const char *recordSyntax; get_preferredRecordSyntax(&recordSyntax); - if (recordSyntax != VAL_NONE) + 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 ) { - 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; + req->referenceId = getRefID(pRefId); } - logf (LOG_LOG, "send_searchRequest"); - return send_Z_PDU(apdu); + + if ( pResultSetId ) + { + req->resultSetName = pResultSetId; + } + + return send_Z_PDU(apdu, 0); } -int Yaz_IR_Assoc::send_presentRequest(int start, int number) +int IR_Assoc::send_presentRequest(Odr_int start, + Odr_int number, + char* pResultSetId, + char* pRefId) { Z_APDU *apdu = create_Z_PDU(Z_APDU_presentRequest); Z_PresentRequest *req = apdu->u.presentRequest; @@ -283,111 +235,138 @@ int Yaz_IR_Assoc::send_presentRequest(int start, int number) req->resultSetStartPoint = &start; req->numberOfRecordsRequested = &number; - int oid_syntax[OID_SIZE]; - oident prefsyn; - int recordSyntax; + const char *recordSyntax; get_preferredRecordSyntax (&recordSyntax); - if (recordSyntax != VAL_NONE) + if (recordSyntax && *recordSyntax) { - 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; + 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; + req->recordComposition = &compo; compo.which = Z_RecordComp_simple; compo.u.simple = elementSetNames; } - return send_Z_PDU(apdu); + + 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 Yaz_IR_Assoc::set_proxy(const char *str) +void 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::client(const char *addr) +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 *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; + set_databaseNames (dbpart+1, "+ "); + Z_Assoc::client(m_proxy ? m_proxy : m_host); } -const char *Yaz_IR_Assoc::get_proxy() +const char *IR_Assoc::get_proxy() { return m_proxy; } -const char *Yaz_IR_Assoc::get_host() +const char *IR_Assoc::get_host() { return m_host; } -void Yaz_IR_Assoc::recv_searchRequest(Z_SearchRequest *searchRequest) +void 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) +void 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) +void 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 IR_Assoc::recv_searchResponse (Z_SearchResponse *searchResponse) +{ } -void Yaz_IR_Assoc::recv_searchResponse (Z_SearchResponse *searchResponse) +void IR_Assoc::recv_presentResponse (Z_PresentResponse *presentResponse) { } -void Yaz_IR_Assoc::recv_presentResponse (Z_PresentResponse *presentResponse) +void IR_Assoc::recv_initResponse(Z_InitResponse *initResponse) { } -void Yaz_IR_Assoc::recv_initResponse(Z_InitResponse *initResponse) +void IR_Assoc::recv_extendedServicesResponse(Z_ExtendedServicesResponse *ExtendedServicesResponse) { } -int Yaz_IR_Assoc::get_lastReceived() +int IR_Assoc::get_lastReceived() { return m_lastReceived; } -void Yaz_IR_Assoc::set_lastReceived(int lastReceived) +void IR_Assoc::set_lastReceived(int lastReceived) { m_lastReceived = lastReceived; } -int Yaz_IR_Assoc::send_initRequest() +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); @@ -401,17 +380,61 @@ 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, 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 { - int oid[OID_SIZE]; - struct oident ent; - ent.proto = PROTO_Z3950; - ent.oclass = CLASS_USERINFO; - ent.value = VAL_PROXY; - oid_ent_to_oid (&ent, oid); - logf (LOG_LOG, "proxy host %s", m_host); - set_otherInformationString(&req->otherInfo, oid, 1, m_host); + *req->deleteFunction = Z_DeleteResultSetRequest_all; } - return send_Z_PDU(apdu); + + 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 + */ +