source: gsdl/trunk/src/recpt/action.h@ 16310

Last change on this file since 16310 was 16310, checked in by davidb, 16 years ago

Introduction of 'collecthome' which parallels 'gsdlhome' to allow the toplevel collect folder to be outside of the gsdlhome area

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 6.5 KB
Line 
1/**********************************************************************
2 *
3 * action.h --
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 ACTION_H
28#define ACTION_H
29
30#include "gsdlconf.h"
31#include "text_t.h"
32#include "cgiargs.h"
33#include "display.h"
34#include "recptproto.h"
35#include "browserclass.h"
36
37#if defined(GSDL_USE_OBJECTSPACE)
38# include <ospace\std\iostream>
39#elif defined(GSDL_USE_IOS_H)
40# include <iostream.h>
41#else
42# include <iostream>
43#endif
44
45
46class action {
47protected:
48 cgiargsinfoclass argsinfo;
49 text_t gsdlhome;
50 text_t collecthome;
51 text_t dbhome;
52
53public:
54 action ();
55 virtual ~action ();
56
57 // configure should be called once for each configuration line
58 virtual void configure (const text_t &key, const text_tarray &cfgline);
59
60 // init should be called after all the configuration is done but
61 // before any other methods are called
62 virtual bool init (ostream &logout);
63
64 // returns the "a" argument value that will specify this action
65 // this name should be short but does not have to be one character
66 // long
67 virtual text_t get_action_name ();
68
69 // check_cgiargs should be called before get_cgihead_info,
70 // define_external_macros, and do_action. If an error is found
71 // a message will be written to logout, if the error is severe
72 // then the function will return false and no page content
73 // should be produced based on the arguments.
74 virtual bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args,
75 recptprotolistclass *protos, ostream &logout);
76
77 // check_external_cgiargs should be called after check_cgiargs
78 // for all actions. It should only be used to override some other
79 // normal behaviour, for example, producing a login page when
80 // the requested page needs authentication.
81 virtual bool check_external_cgiargs (cgiargsinfoclass &argsinfo,
82 cgiargsclass &args,
83 outconvertclass &outconvert,
84 const text_t &saveconf,
85 ostream &logout);
86
87 // get_cgihead_info determines the cgi header information for
88 // a set of cgi arguments. If response contains location then
89 // response_data contains the redirect address. If reponse
90 // contains content then reponse_data contains the content-type.
91 // Note that images can now be produced by the receptionist.
92 virtual void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
93 response_t &response, text_t &response_data,
94 ostream &logout);
95
96 // uses_display should return true if the receptionist should return
97 // true if the display class is needed to output the page content.
98 // The default is to return true.
99 virtual bool uses_display (cgiargsclass &args);
100
101 // define all the macros which are related to pages generated
102 // by this action
103 virtual void define_internal_macros (displayclass &disp, cgiargsclass &args,
104 recptprotolistclass *protos, ostream &logout);
105
106 // define all the macros which might be used by other actions
107 // to produce pages. These macros should be well documented.
108 virtual void define_external_macros (displayclass &disp, cgiargsclass &args,
109 recptprotolistclass *protos, ostream &logout);
110
111 // returns false if there was an error which prevented the action
112 // from outputing anything.
113 virtual bool do_action (cgiargsclass &args, recptprotolistclass *protos,
114 browsermapclass *browsers, displayclass &disp,
115 outconvertclass &outconvert, ostream &textout,
116 ostream &logout);
117
118 // return true if the specified top classifier is handled by this action
119 virtual bool is_my_classifier(const text_t& topcl) { return false; }
120
121 // getargsinfo should be called after all configuration files
122 // have been read
123 cgiargsinfoclass *getargsinfo() {return &argsinfo;};
124};
125
126
127// The actionptr function does not 'own' the action. The
128// action should be deleted by the code which created it.
129class actionptr {
130public:
131 action *a;
132
133 actionptr () {a=NULL;}
134};
135
136bool operator==(const actionptr &x, const actionptr &y);
137bool operator<(const actionptr &x, const actionptr &y);
138
139typedef map<text_t, actionptr, lttext_t> actionptrmap;
140
141// contains a list of actions indexed by their name
142class actionmapclass {
143protected:
144 actionptrmap actionptrs;
145
146public:
147 // type support for actionptrmap
148 typedef actionptrmap::iterator iterator;
149 typedef actionptrmap::const_iterator const_iterator;
150 typedef actionptrmap::reference reference;
151 typedef actionptrmap::const_reference const_reference;
152 typedef actionptrmap::size_type size_type;
153
154 typedef actionptrmap::difference_type difference_type;
155 typedef actionptrmap::const_reverse_iterator const_reverse_iterator;
156 typedef actionptrmap::reverse_iterator reverse_iterator;
157
158 // basic container support
159 iterator begin () {return actionptrs.begin();}
160 const_iterator begin () const {return actionptrs.begin();}
161 iterator end () {return actionptrs.end();}
162 const_iterator end () const {return actionptrs.end();}
163
164 void erase(iterator pos) {actionptrs.erase(pos);}
165 void erase(iterator first, iterator last) {actionptrs.erase(first, last);}
166 actionmapclass &operator=(const actionmapclass &x) {actionptrs=x.actionptrs;return *this;}
167
168 bool empty () const {return actionptrs.empty();}
169 size_type size() const {return actionptrs.size();}
170
171
172 // added functionality
173 void clear () {actionptrs.erase(actionptrs.begin(),actionptrs.end());}
174
175 // theaction remains the property of the calling code but
176 // should not be deleted until it is removed from this list.
177 void addaction (action *theaction);
178
179 // getaction will return NULL if the action could not be found
180 action *getaction (const text_t &key);
181};
182
183
184#endif
Note: See TracBrowser for help on using the repository browser.