X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Futil.cpp;h=26f1edb149575fd45e987fc3f816f0d18161f8aa;hb=574ad8ce17a312c7396603e3ba3604ce52e75fb2;hp=da9eb539ee20f8afecd3d2614df5c8c0b5eac33d;hpb=63dda9fef8b647d491dd2baef8ec4f4f88ee1b11;p=metaproxy-moved-to-github.git diff --git a/src/util.cpp b/src/util.cpp index da9eb53..26f1edb 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,4 +1,4 @@ -/* $Id: util.cpp,v 1.5 2006-01-16 15:51:56 adam Exp $ +/* $Id: util.cpp,v 1.7 2006-01-17 16:43:22 adam Exp $ Copyright (c) 2005, Index Data. %LICENSE% @@ -8,6 +8,7 @@ #include #include +#include #include "util.hpp" @@ -29,42 +30,120 @@ bool yp2::util::pqf(ODR odr, Z_APDU *apdu, const std::string &q) { return true; } +void yp2::util::get_default_diag(Z_DefaultDiagFormat *r, + int &error_code, std::string &addinfo) +{ + error_code = *r->condition; + switch (r->which) + { + case Z_DefaultDiagFormat_v2Addinfo: + addinfo = std::string(r->u.v2Addinfo); + break; + case Z_DefaultDiagFormat_v3Addinfo: + addinfo = r->u.v3Addinfo; + break; + } +} -bool yp2::util::set_databases_from_zurl(ODR odr, std::string zurl, - int *db_num, char ***db_strings) +void yp2::util::get_init_diagnostics(Z_InitResponse *initrs, + int &error_code, std::string &addinfo) { - const char *sep = strchr(zurl.c_str(), '/'); - if (!sep) - return false; + Z_External *uif = initrs->userInformationField; + + if (uif && uif->which == Z_External_userInfo1) + { + Z_OtherInformation *ui = uif->u.userInfo1; + int i; + for (i = 0; i < ui->num_elements; i++) + { + Z_OtherInformationUnit *unit = ui->list[i]; + if (unit->which == Z_OtherInfo_externallyDefinedInfo && + unit->information.externallyDefinedInfo && + unit->information.externallyDefinedInfo->which == + Z_External_diag1) + { + Z_DiagnosticFormat *diag = + unit->information.externallyDefinedInfo->u.diag1; + + if (diag->num > 0) + { + Z_DiagnosticFormat_s *ds = diag->elements[0]; + if (ds->which == Z_DiagnosticFormat_s_defaultDiagRec) + yp2::util::get_default_diag(ds->u.defaultDiagRec, + error_code, addinfo); + } + } + } + } +} - int num = 0; - const char *cp1 = sep+1; - while(1) +int yp2::util::get_vhost_otherinfo(Z_OtherInformation **otherInformation, + bool remove_flag, + std::list &vhosts) +{ + int cat; + for (cat = 1; ; cat++) { - const char *cp2 = strchr(cp1, '+'); - if (!cp2) + // check virtual host + const char *vhost = + yaz_oi_get_string_oidval(otherInformation, + VAL_PROXY, + cat /* categoryValue */, + remove_flag /* delete flag */); + if (!vhost) break; - cp1 = cp2+1; - num++; + vhosts.push_back(std::string(vhost)); } - *db_num = num+1; - *db_strings = (char **) odr_malloc(odr, sizeof(char*) * (*db_num)); + --cat; + return cat; +} - num = 0; - cp1 = sep+1; - while(1) +void yp2::util::split_zurl(std::string zurl, std::string &host, + std::list &db) +{ + const char *zurl_cstr = zurl.c_str(); + const char *sep = strchr(zurl_cstr, '/'); + + if (sep) { - const char *cp2 = strchr(cp1, '+'); - if (cp2) - (*db_strings)[num] = odr_strdupn(odr, cp1, cp2-cp1-1); - else + host = std::string(zurl_cstr, sep - zurl_cstr); + + const char *cp1 = sep+1; + while(1) { - (*db_strings)[num] = odr_strdup(odr, cp1); - break; + const char *cp2 = strchr(cp1, '+'); + if (cp2) + db.push_back(std::string(cp1, cp2 - cp1)); + else + { + db.push_back(std::string(cp1)); + break; + } + cp1 = cp2+1; } - cp1 = cp2+1; - num++; } + else + { + host = zurl; + } +} + +bool yp2::util::set_databases_from_zurl(ODR odr, std::string zurl, + int *db_num, char ***db_strings) +{ + std::string host; + std::list dblist; + + split_zurl(zurl, host, dblist); + + if (dblist.size() == 0) + return false; + *db_num = dblist.size(); + *db_strings = (char **) odr_malloc(odr, sizeof(char*) * (*db_num)); + + std::list::const_iterator it = dblist.begin(); + for (int i = 0; it != dblist.end(); it++, i++) + (*db_strings)[i] = odr_strdup(odr, it->c_str()); return true; }