X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-ir-assoc.cpp;h=a6eac26505ef38c8eef1f1a727cf3141def1d7d7;hb=66767801433aba6cd2ac9fc744a1057867df7fa9;hp=4217bcdb6b656ff3ecc19858260a59b02aae0dce;hpb=c6e5ad789740135af3558298f6e2014ae99ee7dd;p=yazpp-moved-to-github.git diff --git a/src/yaz-ir-assoc.cpp b/src/yaz-ir-assoc.cpp index 4217bcd..a6eac26 100644 --- a/src/yaz-ir-assoc.cpp +++ b/src/yaz-ir-assoc.cpp @@ -4,9 +4,26 @@ * 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. + * Revision 1.10 1999-04-29 07:33:28 adam + * Changed setting of host in connect/proxy setting. YAZ' strtoaddr now + * ignores database part of host. + * + * Revision 1.9 1999/04/28 13:29:14 adam + * Yet another fix regarding database settings. + * + * Revision 1.8 1999/04/28 13:04:03 adam + * Fixed setting of proxy otherInfo so that database(s) are removed. * + * Revision 1.7 1999/04/21 12:09:01 adam + * Many improvements. Modified to proxy server to work with "sessions" + * based on cookies. + * + * 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. */ #include @@ -24,7 +41,7 @@ Yaz_IR_Assoc::Yaz_IR_Assoc(IYaz_PDU_Observable *the_PDU_Observable) m_lastReceived = 0; m_host = 0; m_proxy = 0; - + m_cookie = 0; const char *db = "Default"; set_databaseNames(1, &db); } @@ -33,7 +50,10 @@ Yaz_IR_Assoc::~Yaz_IR_Assoc() { if (m_elementSetNames) delete [] m_elementSetNames->u.generic; - delete m_elementSetNames; + delete [] m_elementSetNames; + delete [] m_host; + delete [] m_proxy; + delete [] m_cookie; } void Yaz_IR_Assoc::get_databaseNames (int *num, char ***list) @@ -147,74 +167,6 @@ void Yaz_IR_Assoc::get_elementSetName (const char **elementSetName) *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) -{ - 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]; -} - void Yaz_IR_Assoc::recv_Z_PDU(Z_APDU *apdu) { logf (LOG_LOG, "recv_Z_PDU"); @@ -258,8 +210,6 @@ int Yaz_IR_Assoc::send_searchRequest(Yaz_Z_Query *query) if (!req->query) 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; get_preferredRecordSyntax(&recordSyntax); @@ -272,6 +222,12 @@ int Yaz_IR_Assoc::send_searchRequest(Yaz_Z_Query *query) req->preferredRecordSyntax = oid_syntax; } logf (LOG_LOG, "send_searchRequest"); + assert (req->otherInfo == 0); + if (m_cookie) + { + set_otherInformationString(&req->otherInfo, VAL_COOKIE, 1, m_cookie); + assert (req->otherInfo); + } return send_Z_PDU(apdu); } @@ -304,14 +260,36 @@ 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); } 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 = 0; + if (str) + { + m_cookie = new char[strlen(str)+1]; + strcpy(m_cookie, str); + } +} + +const char *Yaz_IR_Assoc::get_cookie() +{ + return m_cookie; } void Yaz_IR_Assoc::client(const char *addr) @@ -319,17 +297,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() @@ -384,7 +355,6 @@ void Yaz_IR_Assoc::set_lastReceived(int lastReceived) int Yaz_IR_Assoc::send_initRequest() { - Z_APDU *apdu = create_Z_PDU(Z_APDU_initRequest); Z_InitRequest *req = apdu->u.initRequest; @@ -402,16 +372,9 @@ int Yaz_IR_Assoc::send_initRequest() ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3); if (m_proxy && m_host) - { - 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); - } + 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); }