1 /* This file is part of Metaproxy.
2 Copyright (C) 2005-2010 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>
29 namespace mp = metaproxy_1;
31 // Doxygen doesn't like mp::gdu, so we use this instead
32 namespace mp_util = metaproxy_1::util;
37 std::ostream& std::operator<<(std::ostream& os, Z_GDU& zgdu)
39 if (zgdu.which == Z_GDU_Z3950)
43 os << *(zgdu.u.z3950);
45 else if (zgdu.which == Z_GDU_HTTP_Request)
48 if (zgdu.u.HTTP_Request)
49 os << " " << *(zgdu.u.HTTP_Request);
51 else if (zgdu.which == Z_GDU_HTTP_Response)
53 os << "HTTP_Response";
54 if (zgdu.u.HTTP_Response)
55 os << " " << *(zgdu.u.HTTP_Response);
62 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Request& httpreq)
64 os << httpreq.method << " ";
70 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Response& httpres)
72 os << httpres.code << " ";
73 os << httpres.content_len;
77 std::ostream& std::operator<<(std::ostream& os, Z_Records & rs)
80 case Z_Records_DBOSD :
83 if (rs.u.nonSurrogateDiagnostic)
84 os << *(rs.u.nonSurrogateDiagnostic);
86 case Z_Records_multipleNSD:
87 os << "Z_Records_multipleNSD";
88 //os << *(rs.u.multipleNonSurDiagnostics);
97 std::ostream& std::operator<<(std::ostream& os, Z_DiagRec& dr)
100 case Z_DiagRec_defaultFormat:
101 if (dr.u.defaultFormat)
102 os << *(dr.u.defaultFormat);
104 case Z_DiagRec_externallyDefined :
105 os << "Z_DiagRec_externallyDefined";
114 std::ostream& std::operator<<(std::ostream& os, Z_DefaultDiagFormat& ddf)
117 os << *(ddf.condition) << " ";
120 case Z_DefaultDiagFormat_v2Addinfo:
121 os << ddf.u.v2Addinfo;
123 case Z_DefaultDiagFormat_v3Addinfo:
124 os << ddf.u.v3Addinfo;
127 os << "Z_DefaultDiagFormat" ;
133 static void dump_opt_string(std::ostream& os, const char *s)
142 static void dump_opt_int(std::ostream& os, const Odr_int *i)
151 std::ostream& std::operator<<(std::ostream& os, Z_APDU& zapdu)
153 switch(zapdu.which) {
155 case Z_APDU_initRequest:
156 os << " " << "initRequest";
160 = zapdu.u.initRequest;
162 Z_IdAuthentication *a = ir->idAuthentication;
163 if (a && a->which == Z_IdAuthentication_idPass)
164 dump_opt_string(os, a->u.idPass->userId);
165 else if (a && a->which == Z_IdAuthentication_open)
166 dump_opt_string(os, a->u.open);
168 dump_opt_string(os, 0);
171 std::list<std::string> vhosts;
172 mp::util::get_vhost_otherinfo(ir->otherInfo, vhosts);
174 copy(vhosts.begin(), vhosts.end(),
175 ostream_iterator<string>(os, " "));
180 dump_opt_string(os, ir->implementationId);
181 dump_opt_string(os, ir->implementationName);
182 dump_opt_string(os, ir->implementationVersion);
185 case Z_APDU_initResponse:
186 os << " " << "initResponse ";
189 = zapdu.u.initResponse;
190 if (ir->result && *(ir->result))
198 dump_opt_string(os, ir->implementationId);
199 dump_opt_string(os, ir->implementationName);
200 dump_opt_string(os, ir->implementationVersion);
203 case Z_APDU_searchRequest:
204 os << " " << "searchRequest" << " ";
207 = zapdu.u.searchRequest;
209 for (int i = 0; i < sr->num_databaseNames; i++)
211 os << sr->databaseNames[i];
212 if (i+1 != sr->num_databaseNames)
216 dump_opt_string(os, sr->resultSetName);
219 if (sr->preferredRecordSyntax)
221 char oid_name_str[OID_STR_MAX];
222 const char *oid_name = yaz_oid_to_string_buf(
223 sr->preferredRecordSyntax, 0, oid_name_str);
231 WRBUF wr = wrbuf_alloc();
232 yaz_query_to_wrbuf(wr, sr->query);
233 os << wrbuf_cstr(wr);
237 case Z_APDU_searchResponse:
238 os << " " << "searchResponse ";
241 = zapdu.u.searchResponse;
242 if (sr->searchStatus && *(sr->searchStatus))
245 dump_opt_int(os, sr->resultCount);
246 dump_opt_int(os, sr->numberOfRecordsReturned);
247 dump_opt_int(os, sr->nextResultSetPosition);
251 os << "DIAG " << *(sr->records);
256 case Z_APDU_presentRequest:
257 os << " " << "presentRequest";
259 Z_PresentRequest *pr = zapdu.u.presentRequest;
260 dump_opt_string(os, pr->resultSetId);
261 dump_opt_int(os, pr->resultSetStartPoint);
262 dump_opt_int(os, pr->numberOfRecordsRequested);
263 if (pr->preferredRecordSyntax)
265 char oid_name_str[OID_STR_MAX];
266 const char *oid_name = yaz_oid_to_string_buf(
267 pr->preferredRecordSyntax, 0, oid_name_str);
269 os << " " << oid_name;
273 const char * msg = 0;
274 if (pr->recordComposition)
275 msg = mp_util::record_composition_to_esn(pr->recordComposition);
276 dump_opt_string(os, msg);
279 case Z_APDU_presentResponse:
280 os << " " << "presentResponse" << " ";
282 Z_PresentResponse *pr
283 = zapdu.u.presentResponse;
284 if (pr->presentStatus &&
285 *pr->presentStatus != Z_PresentStatus_failure)
287 switch (*pr->presentStatus)
289 case Z_PresentStatus_success:
291 case Z_PresentStatus_partial_1:
292 os << "Partial-1"; break;
293 case Z_PresentStatus_partial_2:
294 os << "Partial-2"; break;
295 case Z_PresentStatus_partial_3:
296 os << "Partial-3"; break;
297 case Z_PresentStatus_partial_4:
298 os << "Partial-4"; break;
300 os << "Unknown"; break;
302 //<< pr->referenceId << " "
303 if (pr->numberOfRecordsReturned)
304 os << " " << *(pr->numberOfRecordsReturned);
307 if (pr->nextResultSetPosition)
308 os << " " << *(pr->nextResultSetPosition);
314 os << "DIAG " << *(pr->records);
318 //os << "DIAG" << " "
320 //<< pr->referenceId << " "
321 //<< *(pr->numberOfRecordsReturned) << " "
322 //<< *(pr->nextResultSetPosition);
325 case Z_APDU_deleteResultSetRequest:
326 os << " " << "deleteResultSetRequest";
328 case Z_APDU_deleteResultSetResponse:
329 os << " " << "deleteResultSetResponse";
331 case Z_APDU_accessControlRequest:
332 os << " " << "accessControlRequest";
334 case Z_APDU_accessControlResponse:
335 os << " " << "accessControlResponse";
337 case Z_APDU_resourceControlRequest:
338 os << " " << "resourceControlRequest";
340 case Z_APDU_resourceControlResponse:
341 os << " " << "resourceControlResponse";
343 case Z_APDU_triggerResourceControlRequest:
344 os << " " << "triggerResourceControlRequest";
346 case Z_APDU_resourceReportRequest:
347 os << " " << "resourceReportRequest";
349 case Z_APDU_resourceReportResponse:
350 os << " " << "resourceReportResponse";
352 case Z_APDU_scanRequest:
353 os << " " << "scanRequest" << " ";
356 = zapdu.u.scanRequest;
360 for (int i = 0; i < sr->num_databaseNames; i++)
362 os << sr->databaseNames[i];
363 if (i+1 != sr->num_databaseNames)
366 dump_opt_int(os, sr->numberOfTermsRequested);
367 dump_opt_int(os, sr->preferredPositionInResponse);
368 dump_opt_int(os, sr->stepSize);
371 if (sr->termListAndStartPoint)
373 WRBUF wr = wrbuf_alloc();
374 yaz_scan_to_wrbuf(wr, sr->termListAndStartPoint,
376 os << wrbuf_cstr(wr);
384 case Z_APDU_scanResponse:
385 os << " " << "scanResponse" << " ";
388 = zapdu.u.scanResponse;
397 switch (*(sr->scanStatus)){
401 case Z_Scan_partial_1:
404 case Z_Scan_partial_2:
407 case Z_Scan_partial_3:
410 case Z_Scan_partial_4:
413 case Z_Scan_partial_5:
423 dump_opt_int(os, sr->numberOfEntriesReturned);
424 dump_opt_int(os, sr->positionOfTerm);
425 dump_opt_int(os, sr->stepSize);
429 case Z_APDU_sortRequest:
430 os << " " << "sortRequest" << " ";
432 case Z_APDU_sortResponse:
433 os << " " << "sortResponse" << " ";
435 case Z_APDU_segmentRequest:
436 os << " " << "segmentRequest" << " ";
438 case Z_APDU_extendedServicesRequest:
439 os << " " << "extendedServicesRequest";
441 Z_ExtendedServicesRequest *er
442 = zapdu.u.extendedServicesRequest;
448 switch(*(er->function))
450 case Z_ExtendedServicesRequest_create:
453 case Z_ExtendedServicesRequest_delete:
456 case Z_ExtendedServicesRequest_modify:
468 os << " " << er->userId ;
473 os << " " << er->packageName;
478 os << " " << er->description;
484 case Z_APDU_extendedServicesResponse:
485 os << " " << "extendedServicesResponse";
487 Z_ExtendedServicesResponse *er
488 = zapdu.u.extendedServicesResponse;
491 if (er->operationStatus)
494 switch (*(er->operationStatus)){
495 case Z_ExtendedServicesResponse_done:
498 case Z_ExtendedServicesResponse_accepted:
501 case Z_ExtendedServicesResponse_failure:
502 if (er->num_diagnostics)
503 os << "DIAG " << **(er->diagnostics);
517 os << " " << "close" << " ";
525 os << *(c->closeReason) << " ";
527 switch (*(c->closeReason)) {
528 case Z_Close_finished:
531 case Z_Close_shutdown:
534 case Z_Close_systemProblem:
535 os << "systemProblem";
537 case Z_Close_costLimit:
540 case Z_Close_resources:
543 case Z_Close_securityViolation:
544 os << "securityViolation";
546 case Z_Close_protocolError:
547 os << "protocolError";
549 case Z_Close_lackOfActivity:
550 os << "lackOfActivity";
552 case Z_Close_peerAbort:
555 case Z_Close_unspecified:
563 if (c->diagnosticInformation)
564 os << " " << c->diagnosticInformation;
568 case Z_APDU_duplicateDetectionRequest:
569 os << " " << "duplicateDetectionRequest";
571 case Z_APDU_duplicateDetectionResponse:
572 os << " " << "duplicateDetectionResponse";
575 os << " " << "Z_APDU " << "UNKNOWN";
587 * c-file-style: "Stroustrup"
588 * indent-tabs-mode: nil
590 * vim: shiftwidth=4 tabstop=8 expandtab