more work on zeerex explain filter, to be continued
[metaproxy-moved-to-github.git] / src / filter_zeerex_explain.cpp
1 /* $Id: filter_zeerex_explain.cpp,v 1.2 2007-01-05 12:26:50 marc Exp $
2    Copyright (c) 2005-2006, Index Data.
3
4    See the LICENSE file for details
5  */
6
7 #include "config.hpp"
8 #include "filter.hpp"
9 #include "package.hpp"
10 #include "util.hpp"
11 #include "gduutil.hpp"
12 #include "sru_util.hpp"
13 #include "filter_zeerex_explain.hpp"
14
15 #include <yaz/zgdu.h>
16 #include <yaz/z-core.h>
17 #include <yaz/srw.h>
18 #include <yaz/pquery.h>
19
20 #include <boost/thread/mutex.hpp>
21
22 #include <iostream>
23 #include <sstream>
24 #include <string>
25 #include <algorithm>
26
27 namespace mp = metaproxy_1;
28 namespace mp_util = metaproxy_1::util;
29 namespace yf = mp::filter;
30
31
32 namespace metaproxy_1 {
33     namespace filter {
34         class ZeeRexExplain::Impl {
35         public:
36             void configure(const xmlNode *xmlnode);
37             void process(metaproxy_1::Package &package) const;
38         private:
39         };
40     }
41 }
42
43 yf::ZeeRexExplain::ZeeRexExplain() : m_p(new Impl)
44 {
45 }
46
47 yf::ZeeRexExplain::~ZeeRexExplain()
48 {  // must have a destructor because of boost::scoped_ptr
49 }
50
51 void yf::ZeeRexExplain::configure(const xmlNode *xmlnode)
52 {
53     m_p->configure(xmlnode);
54 }
55
56 void yf::ZeeRexExplain::process(mp::Package &package) const
57 {
58     m_p->process(package);
59 }
60
61 void yf::ZeeRexExplain::Impl::configure(const xmlNode *xmlnode)
62 {
63 }
64
65 void yf::ZeeRexExplain::Impl::process(mp::Package &package) const
66 {
67     Z_GDU *zgdu_req = package.request().get();
68
69     // ignoring all non HTTP_Request packages
70     if (!zgdu_req || !(zgdu_req->which == Z_GDU_HTTP_Request)){
71         package.move();
72         return;
73     }
74     
75     // only working on  HTTP_Request packages now
76
77     mp::odr odr_de(ODR_DECODE);
78     Z_SRW_PDU *sru_pdu_req = 0;
79
80     mp::odr odr_en(ODR_ENCODE);
81     //Z_SRW_PDU *sru_pdu_res = 0;
82     Z_SRW_PDU *sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_explain_response);
83
84     Z_SOAP *soap = 0;
85     char *charset = 0;
86     char *stylesheet = 0;
87
88
89     // if SRU package could not be decoded, send minimal explain and
90     // close connection
91     if (! (sru_pdu_req = mp_util::decode_sru_request(package, odr_de, odr_en, 
92                                             sru_pdu_res, soap,
93                                             charset, stylesheet)))
94     {
95         mp_util::build_simple_explain(package, odr_en, sru_pdu_res, 0);
96         mp_util::build_sru_response(package, odr_en, soap, 
97                            sru_pdu_res, charset, stylesheet);
98         package.session().close();
99         return;
100     }
101     
102
103     if (sru_pdu_req->which != Z_SRW_explain_request){
104     // Let pass all other SRU actions
105         package.move();
106         return;
107     }
108     // except valid SRU explain request, construct ZeeRex Explain response
109     else {
110         Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request;
111
112         mp_util::build_simple_explain(package, odr_en, sru_pdu_res, er_req);
113
114         mp_util::build_sru_response(package, odr_en, soap, 
115                                     sru_pdu_res, charset, stylesheet);
116
117         return;
118     }
119
120     // should never arrive here
121     package.session().close();
122     return;   
123 }
124
125
126
127 static mp::filter::Base* filter_creator()
128 {
129     return new mp::filter::ZeeRexExplain;
130 }
131
132 extern "C" {
133     struct metaproxy_1_filter_struct metaproxy_1_filter_zeerex_explain = {
134         0,
135         "zeerex_explain",
136         filter_creator
137     };
138 }
139
140
141 /*
142  * Local variables:
143  * c-basic-offset: 4
144  * indent-tabs-mode: nil
145  * c-file-style: "stroustrup"
146  * End:
147  * vim: shiftwidth=4 tabstop=8 expandtab
148  */