X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fotherinfo.c;h=f7a8e5fb503099afd7acce8c5bd2a76db5c6eb0c;hp=580c610d8ed099a1d3b3f6b45841172d0e9ff6ee;hb=8cb8947e3a7bff4dbf8f124871cb4905df1adce7;hpb=4c176312acdc3444c9afc820f76a393e64668e52 diff --git a/src/otherinfo.c b/src/otherinfo.c index 580c610..f7a8e5f 100644 --- a/src/otherinfo.c +++ b/src/otherinfo.c @@ -1,13 +1,15 @@ -/* - * Copyright (C) 1995-2005, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: otherinfo.c,v 1.3 2005-01-15 19:47:14 adam Exp $ */ /** * \file otherinfo.c * \brief Implements Z39.50 OtherInfo utilities */ +#if HAVE_CONFIG_H +#include +#endif + #include #include @@ -18,62 +20,62 @@ void yaz_oi_APDU(Z_APDU *apdu, Z_OtherInformation ***oip) switch (apdu->which) { case Z_APDU_initRequest: - *oip = &apdu->u.initRequest->otherInfo; - break; + *oip = &apdu->u.initRequest->otherInfo; + break; case Z_APDU_searchRequest: - *oip = &apdu->u.searchRequest->otherInfo; - break; + *oip = &apdu->u.searchRequest->otherInfo; + break; case Z_APDU_presentRequest: - *oip = &apdu->u.presentRequest->otherInfo; - break; + *oip = &apdu->u.presentRequest->otherInfo; + break; case Z_APDU_sortRequest: - *oip = &apdu->u.sortRequest->otherInfo; - break; + *oip = &apdu->u.sortRequest->otherInfo; + break; case Z_APDU_scanRequest: - *oip = &apdu->u.scanRequest->otherInfo; - break; + *oip = &apdu->u.scanRequest->otherInfo; + break; case Z_APDU_extendedServicesRequest: - *oip = &apdu->u.extendedServicesRequest->otherInfo; - break; + *oip = &apdu->u.extendedServicesRequest->otherInfo; + break; case Z_APDU_deleteResultSetRequest: - *oip = &apdu->u.deleteResultSetRequest->otherInfo; - break; + *oip = &apdu->u.deleteResultSetRequest->otherInfo; + break; case Z_APDU_initResponse: - *oip = &apdu->u.initResponse->otherInfo; - break; + *oip = &apdu->u.initResponse->otherInfo; + break; case Z_APDU_searchResponse: - *oip = &apdu->u.searchResponse->otherInfo; - break; + *oip = &apdu->u.searchResponse->otherInfo; + break; case Z_APDU_presentResponse: - *oip = &apdu->u.presentResponse->otherInfo; - break; + *oip = &apdu->u.presentResponse->otherInfo; + break; case Z_APDU_sortResponse: - *oip = &apdu->u.sortResponse->otherInfo; - break; + *oip = &apdu->u.sortResponse->otherInfo; + break; case Z_APDU_scanResponse: - *oip = &apdu->u.scanResponse->otherInfo; - break; + *oip = &apdu->u.scanResponse->otherInfo; + break; case Z_APDU_extendedServicesResponse: - *oip = &apdu->u.extendedServicesResponse->otherInfo; - break; + *oip = &apdu->u.extendedServicesResponse->otherInfo; + break; case Z_APDU_deleteResultSetResponse: - *oip = &apdu->u.deleteResultSetResponse->otherInfo; - break; + *oip = &apdu->u.deleteResultSetResponse->otherInfo; + break; case Z_APDU_duplicateDetectionRequest: - *oip = &apdu->u.duplicateDetectionRequest->otherInfo; - break; + *oip = &apdu->u.duplicateDetectionRequest->otherInfo; + break; case Z_APDU_duplicateDetectionResponse: - *oip = &apdu->u.duplicateDetectionResponse->otherInfo; - break; + *oip = &apdu->u.duplicateDetectionResponse->otherInfo; + break; default: - *oip = 0; - break; + *oip = 0; + break; } } -Z_OtherInformationUnit *yaz_oi_update ( +Z_OtherInformationUnit *yaz_oi_update( Z_OtherInformation **otherInformationP, ODR odr, - int *oid, int categoryValue, int delete_flag) + const Odr_oid *oid, int categoryValue, int delete_flag) { int i; Z_OtherInformation *otherInformation; @@ -83,131 +85,110 @@ Z_OtherInformationUnit *yaz_oi_update ( otherInformation = *otherInformationP; if (!otherInformation) { - if (!odr) - return 0; - otherInformation = *otherInformationP = (Z_OtherInformation *) - odr_malloc (odr, sizeof(*otherInformation)); - otherInformation->num_elements = 0; - otherInformation->list = 0; + if (!odr) + return 0; + otherInformation = *otherInformationP = (Z_OtherInformation *) + odr_malloc (odr, sizeof(*otherInformation)); + otherInformation->num_elements = 0; + otherInformation->list = 0; } for (i = 0; inum_elements; 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)) - { - Z_OtherInformationUnit *this_list = otherInformation->list[i]; + if (!oid) + { + /* DS: Want does this do? Returns the first element without a category */ + 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)) + { + Z_OtherInformationUnit *this_list = otherInformation->list[i]; - if (delete_flag) - { - (otherInformation->num_elements)--; - while (i < otherInformation->num_elements) - { - otherInformation->list[i] = - otherInformation->list[i+1]; - i++; - } - } - return this_list; - } - } + if (delete_flag) + { + (otherInformation->num_elements)--; + while (i < otherInformation->num_elements) + { + otherInformation->list[i] = + otherInformation->list[i+1]; + i++; + } + } + return this_list; + } + } } if (!odr) - return 0; + return 0; else { - Z_OtherInformationUnit **newlist = (Z_OtherInformationUnit**) - odr_malloc(odr, (otherInformation->num_elements+1) * - sizeof(*newlist)); - for (i = 0; inum_elements; i++) - newlist[i] = otherInformation->list[i]; - otherInformation->list = newlist; - - otherInformation->list[i] = (Z_OtherInformationUnit*) - odr_malloc (odr, sizeof(Z_OtherInformationUnit)); - if (oid) - { - otherInformation->list[i]->category = (Z_InfoCategory*) - odr_malloc (odr, sizeof(Z_InfoCategory)); - otherInformation->list[i]->category->categoryTypeId = (int*) - odr_oiddup (odr, oid); - otherInformation->list[i]->category->categoryValue = (int*) - odr_malloc (odr, 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]; + Z_OtherInformationUnit **newlist = (Z_OtherInformationUnit**) + odr_malloc(odr, (otherInformation->num_elements+1) * + sizeof(*newlist)); + for (i = 0; inum_elements; i++) + newlist[i] = otherInformation->list[i]; + otherInformation->list = newlist; + + otherInformation->list[i] = (Z_OtherInformationUnit*) + odr_malloc (odr, sizeof(Z_OtherInformationUnit)); + if (oid) + { + otherInformation->list[i]->category = (Z_InfoCategory*) + odr_malloc (odr, sizeof(Z_InfoCategory)); + otherInformation->list[i]->category->categoryTypeId = (Odr_oid*) + odr_oiddup (odr, oid); + otherInformation->list[i]->category->categoryValue = + odr_intdup(odr, 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_oi_set_string_oid ( Z_OtherInformation **otherInformation, ODR odr, - int *oid, int categoryValue, + const Odr_oid *oid, int categoryValue, const char *str) { Z_OtherInformationUnit *oi = - yaz_oi_update(otherInformation, odr, oid, categoryValue, 0); + yaz_oi_update(otherInformation, odr, oid, categoryValue, 0); if (!oi) - return; + return; oi->which = Z_OtherInfo_characterInfo; oi->information.characterInfo = odr_strdup (odr, str); } -void yaz_oi_set_string_oidval ( - Z_OtherInformation **otherInformation, ODR odr, - 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 ; - yaz_oi_set_string_oid(otherInformation, - odr, oid, categoryValue, str); -} - char *yaz_oi_get_string_oid ( Z_OtherInformation **otherInformation, - int *oid, int categoryValue, int delete_flag) + const Odr_oid *oid, int categoryValue, int delete_flag) { Z_OtherInformationUnit *oi; - - if ((oi = yaz_oi_update(otherInformation, 0, oid, 1, delete_flag)) && - oi->which == Z_OtherInfo_characterInfo) - return oi->information.characterInfo; + + if ((oi = yaz_oi_update(otherInformation, 0, oid, categoryValue, + delete_flag)) && + oi->which == Z_OtherInfo_characterInfo) + return oi->information.characterInfo; return 0; } -char *yaz_oi_get_string_oidval(Z_OtherInformation **otherInformation, - int oidval, int categoryValue, int delete_flag) -{ - 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 0; - return yaz_oi_get_string_oid (otherInformation, oid, categoryValue, - delete_flag); -} +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */