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