source: trunk/gsdl/src/recpt/receptionist.h@ 12509

Last change on this file since 12509 was 12509, checked in by kjdon, 14 years ago

Added Stefan's fileupload code to replace use of cgicc by depositor. action.getargsinfo changed, parse_cgi_args now has a fileuploads argument

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 10.3 KB
Line 
1/**********************************************************************
2 *
3 * receptionist.h -- a web interface for the gsdl
4 * Copyright (C) 1999 The New Zealand Digital Library Project
5 *
6 * A component of the Greenstone digital library software
7 * from the New Zealand Digital Library Project at the
8 * University of Waikato, New Zealand.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 *
24 *********************************************************************/
25
26
27#ifndef RECEPTIONIST_H
28#define RECEPTIONIST_H
29
30#include "gsdlconf.h"
31#include "text_t.h"
32#include "cgiargs.h"
33#include "display.h"
34#include "browserclass.h"
35#include "recptproto.h"
36#include "converter.h"
37#include "cfgread.h"
38#include "action.h"
39#include "cnfgable.h"
40
41// the MACROPRECEDENCE macro is used as a default. override
42// it using something like:
43//
44// macroprecedence c,l
45//
46// in your configuration file
47#ifndef MACROPRECEDENCE
48#define MACROPRECEDENCE "c,l"
49#endif
50
51
52struct collectioninfo_t {
53 void clear ();
54 collectioninfo_t () {clear();}
55
56 text_t gsdl_gsdlhome;
57 text_t gsdl_gdbmhome;
58
59 bool info_loaded;
60 ColInfoResponse_t info;
61};
62
63struct languageinfo_t {
64 void clear();
65 languageinfo_t () {clear();}
66
67 text_t longname;
68 text_t defaultencoding;
69};
70
71typedef map<text_t, collectioninfo_t, lttext_t> colinfo_tmap;
72typedef map<text_t, languageinfo_t, lttext_t> languageinfo_tmap;
73
74enum events_t {Disabled, CollectorEvents, AllEvents};
75enum ldformat_t {LocalTime, UTCTime, Absolute};
76
77struct recptconf {
78 text_t gsdlhome;
79 text_t gdbmhome; // will equal gsdlhome if not set
80 text_t collection; // will equal "" in 'general' mode
81 text_t collectdir; // will equal gsdlhome in 'general' mode
82 colinfo_tmap collectinfo;
83 text_t httpprefix;
84 text_t httpimg; // will equal /images if not set
85 text_t gwcgi;
86 text_tset macrofiles;
87 text_t saveconf;
88 bool usecookies; // true if we want cookies set
89 bool logcgiargs; // true if we want to log cgi arguments
90
91 ldformat_t LogDateFormat;
92
93 text_t maintainer; // email address of maintainer
94 text_t MailServer; // SMTP mail server to use when sending event messages by email
95 // defaults to mail.maintainer-domain
96 events_t LogEvents;
97 events_t EmailEvents;
98 bool EmailUserEvents;
99
100 bool site_auth; // Complete site authentication, useful to lockout site for example.
101 text_t site_group; // Similar to the auth_groups functionality, infact exactly the same
102
103 text_t HomePageType;
104 int HomePageCols;
105
106 text_tmap pageparams;
107 text_t macroprecedence;
108
109 languageinfo_tmap languages;
110
111 // encodings is just a simple mapping from encoding longnames to
112 // shortnames. It's useful for now for creating the pulldown menu of
113 // encodings on the preferences page but isn't intended to be permanent.
114 text_tmap encodings;
115
116 void clear ();
117 recptconf () {clear();}
118};
119
120class receptionist : public configurable {
121protected:
122
123 recptconf configinfo;
124
125 cgiargsinfoclass argsinfo;
126 actionmapclass actions;
127 browsermapclass browsers;
128 recptprotolistclass protocols;
129 displayclass disp;
130 convertinfoclass converters;
131 ColInfoResponse_t collectinfo;
132
133 // prepare_page sets up page parameters, sets display macros
134 // and opens the page ready for output
135 virtual void prepare_page (action *a, cgiargsclass &args,
136 outconvertclass &outconvert,
137 ostream &logout);
138
139 virtual void translate_OIDs (cgiargsclass &args, recptproto *collectproto,
140 ostream &logout);
141
142 bool get_cookie (text_t &cookie, text_tmap &fcgienv);
143 bool get_cookie (text_tmap &fcgienv);
144
145 // get the default encoding for the given language - if it fails for any
146 // reason, return ""
147 text_t get_default_encoding (const text_t &language);
148
149 virtual void define_general_macros (cgiargsclass &args, outconvertclass &outconvert,
150 ostream &logout);
151
152 virtual bool append_logstr (const text_t &filename, const text_t &logstr,
153 ostream &logout);
154
155 virtual void configure_encoding (const text_tarray &cfgline);
156
157 public:
158 receptionist ();
159 virtual ~receptionist() {}
160
161#ifdef _APACHE_MOD
162 bool loaded;
163#endif
164 // add_action makes another action available to the receptionist
165 // the action remains the property of the calling code and that
166 // code should destroy the action after the recptionist has been
167 // destroyed.
168 void add_action (action *theaction);
169 actionmapclass *get_actionmap_ptr () {return &actions;}
170
171 // add_browser makes another browser available to the receptionist
172 // the browser remains the property of the calling code and that
173 // code should destroy it after the recptionist has been
174 // destroyed.
175 void add_browser (browserclass *thebrowser);
176 browsermapclass *get_browsermap_ptr () {return &browsers;}
177 void setdefaultbrowser (const text_t &browsername);
178
179 // add_protocol makes another protocol available to the receptionist
180 // without any protocols, no collections will be available. The
181 // protocols remain the property of the calling code.
182 void add_protocol (recptproto *theprotocol) {protocols.addrecptproto(theprotocol);}
183 recptprotolistclass *get_recptprotolist_ptr () {return &protocols;}
184
185 // add_converter makes another converter available to the receptionist.
186 // Converters are needed to display pages using different encodings.
187 // The converters remain the property of the calling code.
188 void add_converter (const text_t &name, inconvertclass *inconverter,
189 rzwsoutconvertclass *outconverter) {
190 converters.add_converter(name, inconverter, outconverter);}
191 convertinfoclass *get_convertinfo_ptr () {return &converters;}
192
193
194 // configure should be called for each line in the
195 // configuration files to configure the receptionist and everything
196 // it contains. The configuration should take place after everything
197 // has been added but before the initialisation.
198 virtual void configure (const text_t &key, const text_tarray &cfgline);
199 virtual void configure (const text_t &key, const text_t &value);
200 const recptconf &get_configinfo () const {return configinfo;}
201 cgiargsinfoclass *get_cgiargsinfo_ptr () {return &argsinfo;}
202
203
204 // init should be called after all the actions, protocols, and
205 // converters have been added to the receptionist and after everything
206 // has been configured but before any pages are created.
207 // It returns true on success and false on failure. If false is
208 // returned getpage should not be called (without producing
209 // meaningless output), instead an error page should be
210 // produced by the calling code.
211 virtual bool init (ostream &logout);
212
213 // There are two ways to produce a page. You can either call parse_cgi_args,
214 // get_cgihead_info, and produce_content or you can just call parse_cgi_args and
215 // produce_cgi_page (which will be satisfactory in most cases). You might want to call
216 // parse_cgi_args, get_cgihead_info, and produce_content when you want to
217 // interface directly with a web server for which the standard header is inappropriate.
218
219 // parse_cgi_args parses cgi arguments into an argument class.
220 // This function should be called for each page request. It returns false
221 // if there was a major problem with the cgi arguments.
222 virtual bool parse_cgi_args (const text_t &argstr,
223 fileupload_tmap &fileuploads,
224 cgiargsclass &args,
225 ostream &logout, text_tmap &fcgienv);
226
227 virtual bool log_cgi_args (cgiargsclass &args, ostream &logout, text_tmap &fcgienv);
228
229 text_t expandmacros (const text_t &astring, cgiargsclass &args,
230 ostream &logout);
231
232 // produce_cgi_page will call get_cgihead_info and
233 // produce_content in the appropriate way to output a cgi header and
234 // the page content (if needed). If a page could not be created it
235 // will return false
236 virtual bool produce_cgi_page (cgiargsclass &args, ostream &contentout,
237 ostream &logout, text_tmap &fcgienv);
238
239 // get_cgihead_info determines the cgi header information for
240 // a set of cgi arguments. If response contains location then
241 // response_data contains the redirect address. If reponse
242 // contains content then reponse_data contains the content-type.
243 // Note that images can now be produced by the receptionist.
244 virtual void get_cgihead_info (cgiargsclass &args, response_t &response,
245 text_t &response_data, ostream &logout,
246 text_tmap &fcgienv);
247 virtual void get_cgihead_info (cgiargsclass &args, text_tmap &headers,
248 ostream &logout, text_tmap &fcgienv);
249
250 // produce the page content
251 virtual bool produce_content (cgiargsclass &args, ostream &contentout,
252 ostream &logout);
253
254 // returns the compressed argument ("e") corresponding to the argument
255 // list. This can be used to save preferences between sessions.
256 virtual text_t get_compressed_arg (cgiargsclass &args, ostream &logout);
257
258 // gets collection info from cache if found or
259 // calls collection server (and updates cache)
260 // returns NULL if there's an error
261 ColInfoResponse_t *get_collectinfo_ptr (recptproto *collectproto,
262 const text_t &collection,
263 ostream &logout);
264
265 void uncache_collection (const text_t &collection);
266
267protected:
268 // will read in all the macro files. If one is not found an
269 // error message will be written to logout and the method will
270 // return false.
271 virtual bool read_macrofiles (ostream &logout);
272
273 virtual void read_collection_macrofiles (const text_t& collection, ostream &logout);
274
275 // check_mainargs will check all the main arguments. If a major
276 // error is found it will return false and no cgi page should
277 // be created using the arguments.
278 virtual bool check_mainargs (cgiargsclass &args, ostream &logout);
279};
280
281
282#endif
Note: See TracBrowser for help on using the repository browser.