added xml ressources - most notably the LOC marc21-toXYZ stylesheets
[metaproxy-moved-to-github.git] / src / gduutil.cpp
1 /* $Id: gduutil.cpp,v 1.14 2006-10-04 11:21:47 marc Exp $
2    Copyright (c) 2005-2006, Index Data.
3
4    See the LICENSE file for details
5 */
6
7 #include "gduutil.hpp"
8 #include "util.hpp"
9
10 #include <yaz/wrbuf.h>
11 #include <yaz/querytowrbuf.h>
12
13 #include <iostream>
14 #include <list>
15
16 namespace mp = metaproxy_1;
17
18 // Doxygen doesn't like mp::gdu, so we use this instead
19 namespace mp_gdu = metaproxy_1::gdu;
20
21 std::ostream& std::operator<<(std::ostream& os,  Z_GDU& zgdu)
22 {
23     if (zgdu.which == Z_GDU_Z3950)
24     {
25         os << "Z3950";
26         if (zgdu.u.z3950)
27             os << *(zgdu.u.z3950);
28     }
29     else if (zgdu.which == Z_GDU_HTTP_Request)
30     {
31         os << "HTTP_Request";
32         if (zgdu.u.HTTP_Request)
33             os << " " << *(zgdu.u.HTTP_Request);
34     }
35     else if (zgdu.which == Z_GDU_HTTP_Response)
36     {
37         os << "HTTP_Response";
38         if (zgdu.u.HTTP_Response)
39             os << " " << *(zgdu.u.HTTP_Response);
40     }
41     else
42         os << "Z_GDU";
43     return os;
44 }
45
46 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Request& httpreq)
47 {
48     os << httpreq.method << " ";
49     os << httpreq.path;    
50     return os;
51 }
52
53
54 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Response& httpres)
55 {
56     os << httpres.code << " ";
57     os << httpres.content_len;   
58     return os;
59 }
60
61 std::ostream& std::operator<<(std::ostream& os, Z_Records & rs)
62 {
63     switch(rs.which) {
64     case Z_Records_DBOSD :
65         break;
66     case Z_Records_NSD:
67         if (rs.u.nonSurrogateDiagnostic)
68             os << *(rs.u.nonSurrogateDiagnostic);
69         break;
70     case Z_Records_multipleNSD:
71         os << "Z_Records_multipleNSD";
72         //os << *(rs.u.multipleNonSurDiagnostics);
73         break;
74     default:
75         os << "Z_Records" ;
76     }
77     
78     return os;
79 }
80
81 std::ostream& std::operator<<(std::ostream& os, Z_DiagRec& dr)
82 {
83     switch(dr.which) {
84     case Z_DiagRec_defaultFormat:
85         if (dr.u.defaultFormat)
86             os << *(dr.u.defaultFormat);
87         break;
88     case Z_DiagRec_externallyDefined :
89         os << "Z_DiagRec_externallyDefined";
90         break;
91     default:
92         os << "Z_DiagRec" ;
93     }
94     
95     return os;
96 }
97
98 std::ostream& std::operator<<(std::ostream& os, Z_DefaultDiagFormat& ddf)
99 {
100     if (ddf.condition)
101         os << *(ddf.condition) << " ";
102
103     switch(ddf.which) {
104     case Z_DefaultDiagFormat_v2Addinfo:
105         os << ddf.u.v2Addinfo;
106         break;
107     case Z_DefaultDiagFormat_v3Addinfo:
108         os << ddf.u.v3Addinfo;
109         break;
110     default:
111         os << "Z_DefaultDiagFormat" ;
112     }
113     
114     return os;
115 }
116
117 std::ostream& std::operator<<(std::ostream& os,  Z_APDU& zapdu)
118 {
119     switch(zapdu.which) {
120
121     case Z_APDU_initRequest:
122         os << " " << "initRequest" << " ";
123                         
124         {
125             Z_InitRequest *ir 
126                 = zapdu.u.initRequest;
127
128             Z_IdAuthentication *a = ir->idAuthentication;
129             if (a && a->which == Z_IdAuthentication_idPass )
130                 os << a->u.idPass->userId << " ";
131             //<< ":" << a->u.idPass->groupId << " ";
132             else
133                 os << "-" << " ";
134
135             std::list<std::string> vhosts;
136             mp::util::get_vhost_otherinfo(ir->otherInfo, vhosts);
137             if (vhosts.size()){
138                 copy(vhosts.begin(), vhosts.end(), 
139                      ostream_iterator<string>(os, " "));
140             }
141                 else
142                     os << "-" << " " ;
143
144             os << (ir->implementationId) << " "
145                 //<< ir->referenceId << " "
146                << (ir->implementationName) << " "
147                << (ir->implementationVersion);
148         }
149         break;
150     case Z_APDU_initResponse:
151         os << " " << "initResponse" << " ";
152         {
153             Z_InitResponse *ir 
154                 = zapdu.u.initResponse;
155             if (ir->result && *(ir->result))
156                 os << "OK" << " "
157                    << (ir->implementationId) << " "
158                     //<< ir->referenceId << " "
159                    << (ir->implementationName) << " "
160                    << (ir->implementationVersion) << " ";
161             else
162                 os << "DIAG";
163         }
164         break;
165     case Z_APDU_searchRequest:
166         os << " " << "searchRequest" << " ";
167         { 
168             Z_SearchRequest *sr 
169                 = zapdu.u.searchRequest;
170                             
171             for (int i = 0; i < sr->num_databaseNames; i++)
172             {
173                 os << sr->databaseNames[i];
174                 if (i+1 ==  sr->num_databaseNames)
175                     os << " ";
176                 else
177                     os << "+";
178             }
179                          
180             WRBUF wr = wrbuf_alloc();
181             yaz_query_to_wrbuf(wr, sr->query);
182             os << wrbuf_buf(wr);
183             wrbuf_free(wr, 1);
184         }
185         break;
186     case Z_APDU_searchResponse:
187         os << " " << "searchResponse" << " ";
188         {
189             Z_SearchResponse *sr 
190                 = zapdu.u.searchResponse;
191             if (sr->searchStatus && *(sr->searchStatus))
192             {
193                 os << "OK";
194                 if (sr->resultCount)
195                     os << " " << *(sr->resultCount);
196                 else
197                     os << " -";
198                 //<< sr->referenceId << " "
199                 if (sr->numberOfRecordsReturned)
200                     os << " " << *(sr->numberOfRecordsReturned);
201                 else
202                     os << " -";
203                 if (sr->nextResultSetPosition)
204                     os << " " << *(sr->nextResultSetPosition);
205                 else
206                     os << " -";
207             }
208             else 
209                 if (sr->records)
210                     os << "DIAG " << *(sr->records);
211                 else
212                     os << "ERROR";
213         }
214         break;
215     case Z_APDU_presentRequest:
216         os << " " << "presentRequest";
217         {
218             Z_PresentRequest *pr = zapdu.u.presentRequest;
219             if (pr->resultSetId)
220                 os << " " << (pr->resultSetId);
221             else
222                 os << " -";
223             //<< pr->referenceId << " "
224             if (pr->resultSetStartPoint)
225                 os << " " << *(pr->resultSetStartPoint);
226             else
227                 os << " -";
228             if (pr->numberOfRecordsRequested)
229                 os << " " << *(pr->numberOfRecordsRequested);
230             else
231                 os << " -";
232             if (pr->preferredRecordSyntax)
233                 //os << " " << pr->preferredRecordSyntax;
234                 os << " " <<(oid_getentbyoid(pr->preferredRecordSyntax))->desc;
235             else
236                 os << " -";
237             //elements
238             //if (pr->)
239             //    os << " " << *(pr->);
240             //else
241             //    os << " -";
242         }
243         break;
244     case Z_APDU_presentResponse:
245         os << " " << "presentResponse" << " ";
246         {
247             Z_PresentResponse *pr 
248                 = zapdu.u.presentResponse;
249             if ((pr->presentStatus) && !*(pr->presentStatus))
250             {
251                 os << "OK";
252                 //<< pr->referenceId << " "
253                 if (pr->numberOfRecordsReturned)
254                     os << " " << *(pr->numberOfRecordsReturned);
255                 else
256                     os << " -";
257                 if (pr->nextResultSetPosition)
258                     os << " " << *(pr->nextResultSetPosition);
259                 else
260                     os << " -";
261             }
262             else
263                 if (pr->records)
264                     os << "DIAG " << *(pr->records);
265                 else
266                     os << "ERROR";
267
268             //os << "DIAG" << " "
269             //<< "-" << " "
270             //<< pr->referenceId << " "
271             //<< *(pr->numberOfRecordsReturned) << " "
272             //<< *(pr->nextResultSetPosition);
273         }
274         break;
275     case Z_APDU_deleteResultSetRequest:
276         os << " " << "deleteResultSetRequest";
277         break;
278     case Z_APDU_deleteResultSetResponse:
279         os << " " << "deleteResultSetResponse";
280         break;
281     case Z_APDU_accessControlRequest:
282         os << " " << "accessControlRequest";
283         break;
284     case Z_APDU_accessControlResponse:
285         os << " " << "accessControlResponse";
286         break;
287     case Z_APDU_resourceControlRequest:
288         os << " " << "resourceControlRequest";
289         break;
290     case Z_APDU_resourceControlResponse:
291         os << " " << "resourceControlResponse";
292         break;
293     case Z_APDU_triggerResourceControlRequest:
294         os << " " << "triggerResourceControlRequest";
295         break;
296     case Z_APDU_resourceReportRequest:
297         os << " " << "resourceReportRequest";
298         break;
299     case Z_APDU_resourceReportResponse:
300         os << " " << "resourceReportResponse";
301         break;
302     case Z_APDU_scanRequest:
303         os << " " << "scanRequest" << " ";
304         { 
305             Z_ScanRequest *sr 
306                 = zapdu.u.scanRequest;
307                         
308             if (sr)
309             {
310                 for (int i = 0; i < sr->num_databaseNames; i++)
311                 {
312                     os << sr->databaseNames[i];
313                     if (i+1 ==  sr->num_databaseNames)
314                         os << " ";
315                     else
316                     os << "+";
317                 }
318                 if (sr->numberOfTermsRequested)
319                     os << " " << *(sr->numberOfTermsRequested);
320                 else
321                      os << " -";
322                 if (sr->preferredPositionInResponse)
323                     os << " " << *(sr->preferredPositionInResponse);
324                 else
325                     os << " -";
326                 if (sr->stepSize)
327                     os << " " << *(sr->stepSize);
328                 else
329                     os << " -";
330                 
331                 if (sr->termListAndStartPoint)
332                 {
333                     WRBUF wr = wrbuf_alloc();
334                     yaz_scan_to_wrbuf(wr, sr->termListAndStartPoint, VAL_NONE);
335                     os << wrbuf_buf(wr);
336                     wrbuf_free(wr, 1);
337                 }
338                 else
339                     os << " -";
340             }
341         }
342         break;
343     case Z_APDU_scanResponse:
344         os << " " << "scanResponse" << " ";
345         {
346             Z_ScanResponse *sr 
347                 = zapdu.u.scanResponse;
348             if (sr)
349             {
350                 if ((sr->scanStatus) && !*(sr->scanStatus))
351                 {
352                     os << "OK";
353                     //<< *(sr->scanStatus) << " "
354                     if (sr->numberOfEntriesReturned)
355                         os << " " << *(sr->numberOfEntriesReturned);
356                     else
357                         os << " -";
358                     //<< sr->referenceId << " "
359                     if (sr->positionOfTerm)
360                         os << " " << *(sr->positionOfTerm);
361                     else
362                         os << " -";
363                     if (sr->stepSize)
364                         os << " " << *(sr->stepSize);
365                      else
366                         os << " -";                  
367                 }
368                 else {
369                     os << "ERROR";
370                     if (sr->scanStatus)
371                     {
372                         os << " " << *(sr->scanStatus) << " ";
373                     
374                         switch (*(sr->scanStatus)){
375                         case Z_Scan_success:
376                             os << "success ";
377                             break;
378                         case Z_Scan_partial_1:
379                             os << "partial_1";
380                             break;
381                         case Z_Scan_partial_2:
382                             os << "partial_2";
383                             break;
384                         case Z_Scan_partial_3:
385                             os << "partial_3";
386                             break;
387                         case Z_Scan_partial_4:
388                             os << "partial_4";
389                             break;
390                         case Z_Scan_partial_5:
391                             os << "partial_5";
392                             break;
393                         case Z_Scan_failure:
394                             os << "failure";
395                             break;
396                         default:
397                             os << "unknown";
398                         }
399                     }
400                     if (sr->numberOfEntriesReturned)
401                         os << " " << *(sr->numberOfEntriesReturned);
402                     else
403                         os << " -";
404                 }
405             }
406         }
407         break;
408     case Z_APDU_sortRequest:
409         os << " " << "sortRequest" << " ";
410         break;
411     case Z_APDU_sortResponse:
412         os << " " << "sortResponse" << " ";
413         break;
414     case Z_APDU_segmentRequest:
415         os << " " << "segmentRequest" << " ";
416         break;
417     case Z_APDU_extendedServicesRequest:
418         os << " " << "extendedServicesRequest";
419         { 
420             Z_ExtendedServicesRequest *er 
421                 = zapdu.u.extendedServicesRequest;
422             if (er)
423             {
424                 if (er->function)
425                 {
426                     os << " ";
427                     switch(*(er->function))
428                     {
429                     case Z_ExtendedServicesRequest_create:
430                         os << "create";
431                         break;
432                     case Z_ExtendedServicesRequest_delete:
433                         os << "delete";
434                         break;
435                     case Z_ExtendedServicesRequest_modify:
436                         os << "modify";
437                         break;
438                     default:
439                         os << "unknown";
440                     }
441                 }
442                 else
443                     os << " -";
444                     
445                 
446                 if (er->userId)
447                     os << " " << er->userId ;
448                 else
449                     os << " -";
450                 
451                 if (er->packageName)
452                     os << " " << er->packageName;
453                 else
454                     os << " -";
455                 
456                 if (er->description)
457                     os << " " << er->description;
458                 else
459                     os << " -";
460             }
461         }
462         break;
463     case Z_APDU_extendedServicesResponse:
464         os << " " << "extendedServicesResponse";
465          { 
466              Z_ExtendedServicesResponse *er 
467                  = zapdu.u.extendedServicesResponse;
468              if (er)
469              {
470                  if (er->operationStatus)
471                  {
472                      os << " ";
473                      switch (*(er->operationStatus)){
474                      case Z_ExtendedServicesResponse_done:
475                          os << "OK";
476                          break;
477                      case Z_ExtendedServicesResponse_accepted:
478                          os << "ACCEPT";
479                          break;
480                      case Z_ExtendedServicesResponse_failure:
481                          if (er->num_diagnostics)
482                              os << "DIAG " << **(er->diagnostics);
483                          else
484                              os << "ERROR";
485                          break;
486                      default:
487                          os << "unknown";
488                      }
489                  }
490                  else
491                      os << " -";
492              }
493          }
494         break;
495     case Z_APDU_close:
496         os  << " " << "close" << " ";
497         { 
498             Z_Close  *c 
499                 = zapdu.u.close;
500             if (c)
501             {
502                 if (c->closeReason)
503                 {
504                     os << *(c->closeReason) << " ";
505
506                     switch (*(c->closeReason)) {
507                     case Z_Close_finished:
508                         os << "finished";
509                         break;
510                     case Z_Close_shutdown:
511                         os << "shutdown";
512                         break;
513                     case Z_Close_systemProblem:
514                         os << "systemProblem";
515                         break;
516                     case Z_Close_costLimit:
517                         os << "costLimit";
518                         break;
519                     case Z_Close_resources:
520                         os << "resources";
521                         break;
522                     case Z_Close_securityViolation:
523                         os << "securityViolation";
524                         break;
525                     case Z_Close_protocolError:
526                         os << "protocolError";
527                         break;
528                     case Z_Close_lackOfActivity:
529                         os << "lackOfActivity";
530                         break;
531                     case Z_Close_peerAbort:
532                         os << "peerAbort";
533                         break;
534                     case Z_Close_unspecified:
535                         os << "unspecified";
536                         break;
537                     default:
538                         os << "unknown";
539                     }
540                 }
541                 
542                 if (c->diagnosticInformation)
543                     os << " " << c->diagnosticInformation;
544             }
545         }
546         break;
547     case Z_APDU_duplicateDetectionRequest:
548         os << " " << "duplicateDetectionRequest";
549         break;
550     case Z_APDU_duplicateDetectionResponse:
551         os << " " << "duplicateDetectionResponse";
552         break;
553     default: 
554         os << " " << "Z_APDU " << "UNKNOWN";
555     }
556
557     return os;
558 }
559
560
561
562
563 /*
564  * Local variables:
565  * c-basic-offset: 4
566  * indent-tabs-mode: nil
567  * c-file-style: "stroustrup"
568  * End:
569  * vim: shiftwidth=4 tabstop=8 expandtab
570  */