protecting dereferencing of void pointer by if statement
[metaproxy-moved-to-github.git] / src / gduutil.cpp
1 /* $Id: gduutil.cpp,v 1.19 2007-04-10 11:28:51 marc 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                 &&  a->u.idPass->userId)
134                 os << a->u.idPass->userId << " ";
135             //<< ":" << a->u.idPass->groupId << " ";
136             else
137                 os << "-" << " ";
138
139             std::list<std::string> vhosts;
140             mp::util::get_vhost_otherinfo(ir->otherInfo, vhosts);
141             if (vhosts.size()){
142                 copy(vhosts.begin(), vhosts.end(), 
143                      ostream_iterator<string>(os, " "));
144             }
145                 else
146                     os << "-" << " " ;
147
148             if (ir->implementationId)
149                 os << (ir->implementationId) << " ";
150             //<< ir->referenceId << " "
151             if (ir->implementationName)
152                 os<< (ir->implementationName) << " ";
153             if (ir->implementationVersion)
154                 os << (ir->implementationVersion) << " ";
155         }
156         break;
157     case Z_APDU_initResponse:
158         os << " " << "initResponse" << " ";
159         {
160             Z_InitResponse *ir 
161                 = zapdu.u.initResponse;
162             if (ir->result && *(ir->result)){
163                 os << "OK" << " ";
164                 if (ir->implementationId)
165                      os << (ir->implementationId) << " ";
166                     //<< ir->referenceId << " "
167                 if (ir->implementationName)
168                       os<< (ir->implementationName) << " ";
169                 if (ir->implementationVersion)
170                      os << (ir->implementationVersion) << " ";
171             }
172             else
173                 os << "DIAG";
174         }
175         break;
176     case Z_APDU_searchRequest:
177         os << " " << "searchRequest" << " ";
178         { 
179             Z_SearchRequest *sr 
180                 = zapdu.u.searchRequest;
181                             
182             for (int i = 0; i < sr->num_databaseNames; i++)
183             {
184                 os << sr->databaseNames[i];
185                 if (i+1 ==  sr->num_databaseNames)
186                     os << " ";
187                 else
188                     os << "+";
189             }
190                          
191             WRBUF wr = wrbuf_alloc();
192             yaz_query_to_wrbuf(wr, sr->query);
193             os << wrbuf_cstr(wr);
194             wrbuf_destroy(wr);
195         }
196         break;
197     case Z_APDU_searchResponse:
198         os << " " << "searchResponse" << " ";
199         {
200             Z_SearchResponse *sr 
201                 = zapdu.u.searchResponse;
202             if (sr->searchStatus && *(sr->searchStatus))
203             {
204                 os << "OK";
205                 if (sr->resultCount)
206                     os << " " << *(sr->resultCount);
207                 else
208                     os << " -";
209                 //<< sr->referenceId << " "
210                 if (sr->numberOfRecordsReturned)
211                     os << " " << *(sr->numberOfRecordsReturned);
212                 else
213                     os << " -";
214                 if (sr->nextResultSetPosition)
215                     os << " " << *(sr->nextResultSetPosition);
216                 else
217                     os << " -";
218             }
219             else 
220                 if (sr->records)
221                     os << "DIAG " << *(sr->records);
222                 else
223                     os << "ERROR";
224         }
225         break;
226     case Z_APDU_presentRequest:
227         os << " " << "presentRequest";
228         {
229             Z_PresentRequest *pr = zapdu.u.presentRequest;
230             if (pr->resultSetId)
231                 os << " " << (pr->resultSetId);
232             else
233                 os << " -";
234             //<< pr->referenceId << " "
235             if (pr->resultSetStartPoint)
236                 os << " " << *(pr->resultSetStartPoint);
237             else
238                 os << " -";
239             if (pr->numberOfRecordsRequested)
240                 os << " " << *(pr->numberOfRecordsRequested);
241             else
242                 os << " -";
243             if (pr->preferredRecordSyntax)
244                 //os << " " << pr->preferredRecordSyntax;
245                 os << " " <<(oid_getentbyoid(pr->preferredRecordSyntax))->desc;
246             else
247                 os << " -";
248             const char * msg = 0;
249             if (pr->recordComposition 
250                 && (msg = mp_util::record_composition_to_esn(pr->recordComposition)))
251                 os << " " << msg;
252             else
253                 os << " -";
254         }
255         break;
256     case Z_APDU_presentResponse:
257         os << " " << "presentResponse" << " ";
258         {
259             Z_PresentResponse *pr 
260                 = zapdu.u.presentResponse;
261             if ((pr->presentStatus) && !*(pr->presentStatus))
262             {
263                 os << "OK";
264                 //<< pr->referenceId << " "
265                 if (pr->numberOfRecordsReturned)
266                     os << " " << *(pr->numberOfRecordsReturned);
267                 else
268                     os << " -";
269                 if (pr->nextResultSetPosition)
270                     os << " " << *(pr->nextResultSetPosition);
271                 else
272                     os << " -";
273             }
274             else
275                 if (pr->records)
276                     os << "DIAG " << *(pr->records);
277                 else
278                     os << "ERROR";
279
280             //os << "DIAG" << " "
281             //<< "-" << " "
282             //<< pr->referenceId << " "
283             //<< *(pr->numberOfRecordsReturned) << " "
284             //<< *(pr->nextResultSetPosition);
285         }
286         break;
287     case Z_APDU_deleteResultSetRequest:
288         os << " " << "deleteResultSetRequest";
289         break;
290     case Z_APDU_deleteResultSetResponse:
291         os << " " << "deleteResultSetResponse";
292         break;
293     case Z_APDU_accessControlRequest:
294         os << " " << "accessControlRequest";
295         break;
296     case Z_APDU_accessControlResponse:
297         os << " " << "accessControlResponse";
298         break;
299     case Z_APDU_resourceControlRequest:
300         os << " " << "resourceControlRequest";
301         break;
302     case Z_APDU_resourceControlResponse:
303         os << " " << "resourceControlResponse";
304         break;
305     case Z_APDU_triggerResourceControlRequest:
306         os << " " << "triggerResourceControlRequest";
307         break;
308     case Z_APDU_resourceReportRequest:
309         os << " " << "resourceReportRequest";
310         break;
311     case Z_APDU_resourceReportResponse:
312         os << " " << "resourceReportResponse";
313         break;
314     case Z_APDU_scanRequest:
315         os << " " << "scanRequest" << " ";
316         { 
317             Z_ScanRequest *sr 
318                 = zapdu.u.scanRequest;
319                         
320             if (sr)
321             {
322                 for (int i = 0; i < sr->num_databaseNames; i++)
323                 {
324                     os << sr->databaseNames[i];
325                     if (i+1 ==  sr->num_databaseNames)
326                         os << " ";
327                     else
328                     os << "+";
329                 }
330                 if (sr->numberOfTermsRequested)
331                     os << " " << *(sr->numberOfTermsRequested);
332                 else
333                      os << " -";
334                 if (sr->preferredPositionInResponse)
335                     os << " " << *(sr->preferredPositionInResponse);
336                 else
337                     os << " -";
338                 if (sr->stepSize)
339                     os << " " << *(sr->stepSize);
340                 else
341                     os << " -";
342                 
343                 if (sr->termListAndStartPoint)
344                 {
345                     WRBUF wr = wrbuf_alloc();
346                     yaz_scan_to_wrbuf(wr, sr->termListAndStartPoint, VAL_NONE);
347                     os << wrbuf_cstr(wr);
348                     wrbuf_destroy(wr);
349                 }
350                 else
351                     os << " -";
352             }
353         }
354         break;
355     case Z_APDU_scanResponse:
356         os << " " << "scanResponse" << " ";
357         {
358             Z_ScanResponse *sr 
359                 = zapdu.u.scanResponse;
360             if (sr)
361             {
362                 if ((sr->scanStatus) && !*(sr->scanStatus))
363                 {
364                     os << "OK";
365                     //<< *(sr->scanStatus) << " "
366                     if (sr->numberOfEntriesReturned)
367                         os << " " << *(sr->numberOfEntriesReturned);
368                     else
369                         os << " -";
370                     //<< sr->referenceId << " "
371                     if (sr->positionOfTerm)
372                         os << " " << *(sr->positionOfTerm);
373                     else
374                         os << " -";
375                     if (sr->stepSize)
376                         os << " " << *(sr->stepSize);
377                      else
378                         os << " -";                  
379                 }
380                 else {
381                     os << "ERROR";
382                     if (sr->scanStatus)
383                     {
384                         os << " " << *(sr->scanStatus) << " ";
385                     
386                         switch (*(sr->scanStatus)){
387                         case Z_Scan_success:
388                             os << "success ";
389                             break;
390                         case Z_Scan_partial_1:
391                             os << "partial_1";
392                             break;
393                         case Z_Scan_partial_2:
394                             os << "partial_2";
395                             break;
396                         case Z_Scan_partial_3:
397                             os << "partial_3";
398                             break;
399                         case Z_Scan_partial_4:
400                             os << "partial_4";
401                             break;
402                         case Z_Scan_partial_5:
403                             os << "partial_5";
404                             break;
405                         case Z_Scan_failure:
406                             os << "failure";
407                             break;
408                         default:
409                             os << "unknown";
410                         }
411                     }
412                     if (sr->numberOfEntriesReturned)
413                         os << " " << *(sr->numberOfEntriesReturned);
414                     else
415                         os << " -";
416                 }
417             }
418         }
419         break;
420     case Z_APDU_sortRequest:
421         os << " " << "sortRequest" << " ";
422         break;
423     case Z_APDU_sortResponse:
424         os << " " << "sortResponse" << " ";
425         break;
426     case Z_APDU_segmentRequest:
427         os << " " << "segmentRequest" << " ";
428         break;
429     case Z_APDU_extendedServicesRequest:
430         os << " " << "extendedServicesRequest";
431         { 
432             Z_ExtendedServicesRequest *er 
433                 = zapdu.u.extendedServicesRequest;
434             if (er)
435             {
436                 if (er->function)
437                 {
438                     os << " ";
439                     switch(*(er->function))
440                     {
441                     case Z_ExtendedServicesRequest_create:
442                         os << "create";
443                         break;
444                     case Z_ExtendedServicesRequest_delete:
445                         os << "delete";
446                         break;
447                     case Z_ExtendedServicesRequest_modify:
448                         os << "modify";
449                         break;
450                     default:
451                         os << "unknown";
452                     }
453                 }
454                 else
455                     os << " -";
456                     
457                 
458                 if (er->userId)
459                     os << " " << er->userId ;
460                 else
461                     os << " -";
462                 
463                 if (er->packageName)
464                     os << " " << er->packageName;
465                 else
466                     os << " -";
467                 
468                 if (er->description)
469                     os << " " << er->description;
470                 else
471                     os << " -";
472             }
473         }
474         break;
475     case Z_APDU_extendedServicesResponse:
476         os << " " << "extendedServicesResponse";
477          { 
478              Z_ExtendedServicesResponse *er 
479                  = zapdu.u.extendedServicesResponse;
480              if (er)
481              {
482                  if (er->operationStatus)
483                  {
484                      os << " ";
485                      switch (*(er->operationStatus)){
486                      case Z_ExtendedServicesResponse_done:
487                          os << "OK";
488                          break;
489                      case Z_ExtendedServicesResponse_accepted:
490                          os << "ACCEPT";
491                          break;
492                      case Z_ExtendedServicesResponse_failure:
493                          if (er->num_diagnostics)
494                              os << "DIAG " << **(er->diagnostics);
495                          else
496                              os << "ERROR";
497                          break;
498                      default:
499                          os << "unknown";
500                      }
501                  }
502                  else
503                      os << " -";
504              }
505          }
506         break;
507     case Z_APDU_close:
508         os  << " " << "close" << " ";
509         { 
510             Z_Close  *c 
511                 = zapdu.u.close;
512             if (c)
513             {
514                 if (c->closeReason)
515                 {
516                     os << *(c->closeReason) << " ";
517
518                     switch (*(c->closeReason)) {
519                     case Z_Close_finished:
520                         os << "finished";
521                         break;
522                     case Z_Close_shutdown:
523                         os << "shutdown";
524                         break;
525                     case Z_Close_systemProblem:
526                         os << "systemProblem";
527                         break;
528                     case Z_Close_costLimit:
529                         os << "costLimit";
530                         break;
531                     case Z_Close_resources:
532                         os << "resources";
533                         break;
534                     case Z_Close_securityViolation:
535                         os << "securityViolation";
536                         break;
537                     case Z_Close_protocolError:
538                         os << "protocolError";
539                         break;
540                     case Z_Close_lackOfActivity:
541                         os << "lackOfActivity";
542                         break;
543                     case Z_Close_peerAbort:
544                         os << "peerAbort";
545                         break;
546                     case Z_Close_unspecified:
547                         os << "unspecified";
548                         break;
549                     default:
550                         os << "unknown";
551                     }
552                 }
553                 
554                 if (c->diagnosticInformation)
555                     os << " " << c->diagnosticInformation;
556             }
557         }
558         break;
559     case Z_APDU_duplicateDetectionRequest:
560         os << " " << "duplicateDetectionRequest";
561         break;
562     case Z_APDU_duplicateDetectionResponse:
563         os << " " << "duplicateDetectionResponse";
564         break;
565     default: 
566         os << " " << "Z_APDU " << "UNKNOWN";
567     }
568
569     return os;
570 }
571
572
573
574
575 /*
576  * Local variables:
577  * c-basic-offset: 4
578  * indent-tabs-mode: nil
579  * c-file-style: "stroustrup"
580  * End:
581  * vim: shiftwidth=4 tabstop=8 expandtab
582  */