1 /* This file is part of Metaproxy.
2 Copyright (C) 2005-2012 Index Data
4 Metaproxy is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
9 Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 #include "gduutil.hpp"
20 #include <metaproxy/util.hpp>
22 #include <yaz/wrbuf.h>
23 #include <yaz/oid_db.h>
24 #include <yaz/querytowrbuf.h>
28 namespace mp = metaproxy_1;
30 // Doxygen doesn't like mp::gdu, so we use this instead
31 namespace mp_util = metaproxy_1::util;
33 std::ostream& std::operator<<(std::ostream& os, Z_GDU& zgdu)
35 if (zgdu.which == Z_GDU_Z3950)
39 os << *(zgdu.u.z3950);
41 else if (zgdu.which == Z_GDU_HTTP_Request)
44 if (zgdu.u.HTTP_Request)
45 os << " " << *(zgdu.u.HTTP_Request);
47 else if (zgdu.which == Z_GDU_HTTP_Response)
49 os << "HTTP_Response";
50 if (zgdu.u.HTTP_Response)
51 os << " " << *(zgdu.u.HTTP_Response);
58 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Request& httpreq)
60 os << httpreq.method << " ";
65 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Response& httpres)
67 os << httpres.code << " ";
68 os << httpres.content_len;
72 std::ostream& std::operator<<(std::ostream& os, Z_Records & rs)
76 case Z_Records_DBOSD :
79 if (rs.u.nonSurrogateDiagnostic)
80 os << *(rs.u.nonSurrogateDiagnostic);
82 case Z_Records_multipleNSD:
83 os << "Z_Records_multipleNSD";
84 //os << *(rs.u.multipleNonSurDiagnostics);
93 std::ostream& std::operator<<(std::ostream& os, Z_DiagRec& dr)
97 case Z_DiagRec_defaultFormat:
98 if (dr.u.defaultFormat)
99 os << *(dr.u.defaultFormat);
101 case Z_DiagRec_externallyDefined :
102 os << "Z_DiagRec_externallyDefined";
111 std::ostream& std::operator<<(std::ostream& os, Z_DefaultDiagFormat& ddf)
114 os << *(ddf.condition) << " ";
118 case Z_DefaultDiagFormat_v2Addinfo:
120 os << ddf.u.v2Addinfo;
123 case Z_DefaultDiagFormat_v3Addinfo:
125 os << ddf.u.v3Addinfo;
135 static void dump_opt_string(std::ostream& os, const char *s)
144 static void dump_opt_int_l(std::ostream& os, const Odr_int *i, const char *lead)
153 static void dump_opt_int(std::ostream& os, const Odr_int *i)
155 dump_opt_int_l(os, i, " ");
158 std::ostream& std::operator<<(std::ostream& os, Z_APDU& zapdu)
160 switch(zapdu.which) {
162 case Z_APDU_initRequest:
163 os << " " << "initRequest";
167 = zapdu.u.initRequest;
169 Z_IdAuthentication *a = ir->idAuthentication;
170 if (a && a->which == Z_IdAuthentication_idPass)
171 dump_opt_string(os, a->u.idPass->userId);
172 else if (a && a->which == Z_IdAuthentication_open)
173 dump_opt_string(os, a->u.open);
175 dump_opt_string(os, 0);
178 std::list<std::string> vhosts;
179 mp::util::get_vhost_otherinfo(ir->otherInfo, vhosts);
181 copy(vhosts.begin(), vhosts.end(),
182 ostream_iterator<string>(os, " "));
187 dump_opt_string(os, ir->implementationId);
188 dump_opt_string(os, ir->implementationName);
189 dump_opt_string(os, ir->implementationVersion);
192 case Z_APDU_initResponse:
193 os << " " << "initResponse ";
196 = zapdu.u.initResponse;
197 if (ir->result && *(ir->result))
205 dump_opt_string(os, ir->implementationId);
206 dump_opt_string(os, ir->implementationName);
207 dump_opt_string(os, ir->implementationVersion);
210 case Z_APDU_searchRequest:
211 os << " " << "searchRequest" << " ";
214 = zapdu.u.searchRequest;
216 for (int i = 0; i < sr->num_databaseNames; i++)
218 os << sr->databaseNames[i];
219 if (i+1 != sr->num_databaseNames)
223 dump_opt_string(os, sr->resultSetName);
226 if (sr->preferredRecordSyntax)
228 char oid_name_str[OID_STR_MAX];
229 os << yaz_oid_to_string_buf(
230 sr->preferredRecordSyntax, 0, oid_name_str);
237 yaz_query_to_wrbuf(wr, sr->query);
238 os << wrbuf_cstr(wr);
241 case Z_APDU_searchResponse:
242 os << " " << "searchResponse ";
244 Z_SearchResponse *sr = zapdu.u.searchResponse;
245 if (!sr->searchStatus)
247 else if (*sr->searchStatus)
251 if (sr->records && sr->records->which != Z_Records_DBOSD)
253 os << " DIAG " << *sr->records;
257 dump_opt_int(os, sr->resultCount);
258 dump_opt_int_l(os, sr->numberOfRecordsReturned, " 1+");
259 dump_opt_int(os, sr->nextResultSetPosition);
263 case Z_APDU_presentRequest:
264 os << " " << "presentRequest";
266 Z_PresentRequest *pr = zapdu.u.presentRequest;
267 dump_opt_string(os, pr->resultSetId);
268 dump_opt_int(os, pr->resultSetStartPoint);
269 dump_opt_int_l(os, pr->numberOfRecordsRequested, "+");
270 if (pr->preferredRecordSyntax)
272 char oid_name_str[OID_STR_MAX];
273 const char *oid_name = yaz_oid_to_string_buf(
274 pr->preferredRecordSyntax, 0, oid_name_str);
276 os << " " << oid_name;
280 const char * msg = 0;
281 if (pr->recordComposition)
282 msg = mp_util::record_composition_to_esn(pr->recordComposition);
283 dump_opt_string(os, msg);
286 case Z_APDU_presentResponse:
287 os << " " << "presentResponse" << " ";
289 Z_PresentResponse *pr
290 = zapdu.u.presentResponse;
291 if (!pr->presentStatus)
295 switch (*pr->presentStatus)
297 case Z_PresentStatus_success:
299 case Z_PresentStatus_partial_1:
300 os << "Partial-1"; break;
301 case Z_PresentStatus_partial_2:
302 os << "Partial-2"; break;
303 case Z_PresentStatus_partial_3:
304 os << "Partial-3"; break;
305 case Z_PresentStatus_partial_4:
306 os << "Partial-4"; break;
307 case Z_PresentStatus_failure:
308 os << "Failure"; break;
310 os << "Unknown"; break;
313 if (pr->records && pr->records->which != Z_Records_DBOSD)
314 os << " DIAG " << *pr->records;
317 dump_opt_int(os, pr->numberOfRecordsReturned);
318 dump_opt_int(os, pr->nextResultSetPosition);
322 case Z_APDU_deleteResultSetRequest:
323 os << " " << "deleteResultSetRequest";
325 case Z_APDU_deleteResultSetResponse:
326 os << " " << "deleteResultSetResponse";
328 case Z_APDU_accessControlRequest:
329 os << " " << "accessControlRequest";
331 case Z_APDU_accessControlResponse:
332 os << " " << "accessControlResponse";
334 case Z_APDU_resourceControlRequest:
335 os << " " << "resourceControlRequest";
337 case Z_APDU_resourceControlResponse:
338 os << " " << "resourceControlResponse";
340 case Z_APDU_triggerResourceControlRequest:
341 os << " " << "triggerResourceControlRequest";
343 case Z_APDU_resourceReportRequest:
344 os << " " << "resourceReportRequest";
346 case Z_APDU_resourceReportResponse:
347 os << " " << "resourceReportResponse";
349 case Z_APDU_scanRequest:
350 os << " " << "scanRequest" << " ";
352 Z_ScanRequest *sr = zapdu.u.scanRequest;
356 for (int i = 0; i < sr->num_databaseNames; i++)
358 os << sr->databaseNames[i];
359 if (i+1 != sr->num_databaseNames)
362 dump_opt_int(os, sr->numberOfTermsRequested);
363 dump_opt_int(os, sr->preferredPositionInResponse);
364 dump_opt_int(os, sr->stepSize);
367 if (sr->termListAndStartPoint)
370 yaz_scan_to_wrbuf(wr, sr->termListAndStartPoint,
372 os << wrbuf_cstr(wr);
379 case Z_APDU_scanResponse:
380 os << " " << "scanResponse" << " ";
382 Z_ScanResponse *sr = zapdu.u.scanResponse;
389 switch (*sr->scanStatus)
394 case Z_Scan_partial_1:
397 case Z_Scan_partial_2:
400 case Z_Scan_partial_3:
403 case Z_Scan_partial_4:
406 case Z_Scan_partial_5:
416 dump_opt_int(os, sr->numberOfEntriesReturned);
417 dump_opt_int(os, sr->positionOfTerm);
418 dump_opt_int(os, sr->stepSize);
422 case Z_APDU_sortRequest:
423 os << " " << "sortRequest" << " ";
425 case Z_APDU_sortResponse:
426 os << " " << "sortResponse" << " ";
428 case Z_APDU_segmentRequest:
429 os << " " << "segmentRequest" << " ";
431 case Z_APDU_extendedServicesRequest:
432 os << " " << "extendedServicesRequest";
434 Z_ExtendedServicesRequest *er
435 = zapdu.u.extendedServicesRequest;
441 switch(*(er->function))
443 case Z_ExtendedServicesRequest_create:
446 case Z_ExtendedServicesRequest_delete:
449 case Z_ExtendedServicesRequest_modify:
461 os << " " << er->userId ;
466 os << " " << er->packageName;
471 os << " " << er->description;
477 case Z_APDU_extendedServicesResponse:
478 os << " " << "extendedServicesResponse";
480 Z_ExtendedServicesResponse *er
481 = zapdu.u.extendedServicesResponse;
484 if (er->operationStatus)
487 switch (*er->operationStatus)
489 case Z_ExtendedServicesResponse_done:
492 case Z_ExtendedServicesResponse_accepted:
495 case Z_ExtendedServicesResponse_failure:
496 if (er->num_diagnostics)
497 os << "DIAG " << **(er->diagnostics);
511 os << " " << "close" << " ";
513 Z_Close *c = zapdu.u.close;
518 os << *(c->closeReason) << " ";
520 switch (*c->closeReason)
522 case Z_Close_finished:
525 case Z_Close_shutdown:
528 case Z_Close_systemProblem:
529 os << "systemProblem";
531 case Z_Close_costLimit:
534 case Z_Close_resources:
537 case Z_Close_securityViolation:
538 os << "securityViolation";
540 case Z_Close_protocolError:
541 os << "protocolError";
543 case Z_Close_lackOfActivity:
544 os << "lackOfActivity";
546 case Z_Close_peerAbort:
549 case Z_Close_unspecified:
557 if (c->diagnosticInformation)
558 os << " " << c->diagnosticInformation;
562 case Z_APDU_duplicateDetectionRequest:
563 os << " " << "duplicateDetectionRequest";
565 case Z_APDU_duplicateDetectionResponse:
566 os << " " << "duplicateDetectionResponse";
569 os << " " << "Z_APDU " << "UNKNOWN";
581 * c-file-style: "Stroustrup"
582 * indent-tabs-mode: nil
584 * vim: shiftwidth=4 tabstop=8 expandtab