root/main/trunk/greenstone2/runtime-src/src/recpt/configaction.cpp @ 22822

Revision 22822, 5.6 KB (checked in by ak19, 10 years ago)

Further changes for ticket 152 (movable collectdir), to get server.exe to load all the collections in a non-standard collectdirectory. Previously the code read in collections in any collecthome property listed in a section OTHER THAN the default [gsdl] section of gli/llssite.cfg. Adjusted the code to handle a non-standard collecthome value specified in the [gsdl] section itself.

  • Property svn:keywords set to Author Date Id Revision
Line 
1/**********************************************************************
2 *
3 * configaction.cpp --
4 * Copyright (C) 2003 DL Consulting Ltd
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#include "configaction.h"
28
29#ifdef GSDL_LOCAL_LIBRARY
30// for PostMessage()
31#  include <windows.h>
32#endif
33
34// constant for restart/reconfigure windows message (same as in w32server/fnord)
35// http://msdn.microsoft.com/en-us/library/ms644931%28v=VS.85%29.aspx on WM_USER
36// (also RegisterWindowMessage Function at http://msdn.microsoft.com/en-us/library/ms644947%28v=VS.85%29.aspx
37// http://msdn.microsoft.com/en-us/library/ms644927%28v=VS.85%29.aspx)
38#define WM_RESTART WM_USER+1
39
40configaction::configaction () {
41
42  recpt = NULL;
43
44  cgiarginfo arg_ainfo;
45  arg_ainfo.shortname = "a";
46  arg_ainfo.longname = "action";
47  arg_ainfo.multiplechar = true;
48  arg_ainfo.defaultstatus = cgiarginfo::weak;
49  arg_ainfo.argdefault = "config";
50  arg_ainfo.savedarginfo = cgiarginfo::must;
51  argsinfo.addarginfo (NULL, arg_ainfo);
52
53  /*
54     The cmd argument may be one of the following:
55     -- release-collection - release the collection specified by the "c"
56        argument
57     -- add-collection - add and configure a collection server for the
58        collection specified by the "c" argument
59     -- kill - if running as the local library this will kill the server
60  */
61  arg_ainfo.shortname = "cmd";
62  arg_ainfo.longname = "config command";
63  arg_ainfo.multiplechar = true;
64  arg_ainfo.defaultstatus = cgiarginfo::weak;
65  arg_ainfo.argdefault = g_EmptyText;
66  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
67  argsinfo.addarginfo (NULL, arg_ainfo);
68}
69
70configaction::~configaction () {
71}
72
73void configaction::get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
74                     response_t &response, text_t &response_data,
75                     ostream &logout) {
76  response = content;
77  response_data = "text/html";
78}
79
80bool configaction::do_action (cgiargsclass &args, recptprotolistclass *protos,
81                  browsermapclass *browsers, displayclass &disp,
82                  outconvertclass &outconvert, ostream &textout,
83                  ostream &logout) {
84
85  if (recpt == NULL) return false;
86
87  if ((args["cmd"] == "add-collection") && (!args["c"].empty())) {
88    create_colservr(args["c"], logout);
89    textout << "configured add-collection\n";
90
91  } else if ((args["cmd"] == "release-collection") && (!args["c"].empty())) {
92    remove_colservr(args["c"], logout);
93    textout << "configured release-collection\n";
94
95  } else if ((args["cmd"] == "restart")) { 
96    textout << "configured for restart\n";
97#ifdef GSDL_LOCAL_LIBRARY
98    HWND gw = FindWindow("Greenstone Digital Library Software",
99             "Greenstone Digital Library Software");
100    PostMessage(gw, WM_RESTART, 0, 0);
101#endif
102  } else if (args["cmd"] == "kill") {
103    textout << "killed\n";
104#ifdef GSDL_LOCAL_LIBRARY
105    HWND gw = FindWindow("Greenstone Digital Library Software",
106             "Greenstone Digital Library Software");
107    PostMessage(gw, WM_DESTROY, 0, 0);
108#endif
109  }
110
111  return true;
112}
113
114
115// create and initialize a new collection server and
116// add it to the null protocol.
117void configaction::create_colservr (const text_t &collection, ostream &logout) {
118
119  // just in case we're adding a collection that already exists
120  recpt->uncache_collection(collection);
121
122  recptprotolistclass *protos = recpt->get_recptprotolist_ptr();
123  recptprotolistclass::iterator rprotolist_here = protos->begin();
124  recptprotolistclass::iterator rprotolist_end = protos->end();
125  while (rprotolist_here != rprotolist_end) {
126    comerror_t err = noError;
127    if ((*rprotolist_here).p != NULL) {
128      if ((*rprotolist_here).p->get_protocol_name(err) == "nullproto") {
129    // create collection server and add it to nullproto
130    (*rprotolist_here).p->add_collection(collection, recpt, gsdlhome, collecthome, gsdlhome);
131    // re-initialize the null protocol
132    if (!(*rprotolist_here).p->init(err, logout)) {
133      logout << "configaction::create_colservr: nullproto init failed\n";
134    }
135    return;
136      }
137    }
138    ++rprotolist_here;
139  }
140
141  logout << "configaction::create_colservr: no valid nullproto found\n";
142}
143
144// delete a collection server from the null protocol
145void configaction::remove_colservr (const text_t &collection, ostream &logout) {
146
147  recpt->uncache_collection(collection);
148
149  recptprotolistclass *protos = recpt->get_recptprotolist_ptr();
150  recptprotolistclass::iterator rprotolist_here = protos->begin();
151  recptprotolistclass::iterator rprotolist_end = protos->end();
152  while (rprotolist_here != rprotolist_end) {
153    comerror_t err = noError;
154    if ((*rprotolist_here).p != NULL) {
155      if ((*rprotolist_here).p->get_protocol_name(err) == "nullproto") {
156    (*rprotolist_here).p->remove_collection(collection, logout);
157    return;
158      }
159    }
160    ++rprotolist_here;
161  }
162
163  logout << "configaction::create_colserver: no valid nullproto found\n";
164}
Note: See TracBrowser for help on using the browser.