Changeset 1425 for trunk/gsdl/src/recpt
- Timestamp:
- 2000-08-18T17:40:07+12:00 (24 years ago)
- Location:
- trunk/gsdl/src/recpt
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gsdl/src/recpt/collectoraction.cpp
r1419 r1425 24 24 *********************************************************************/ 25 25 26 // note that the collectoraction relies on having direct access to a 27 // collections configuration file. this breaks the separation between 28 // receptionist and collection server and so is not suitable (at least 29 // in its current form) for use when collection servers are separate 30 // from the receptionist (e.g. when using the CORBA protocol). 31 26 32 #include "collectoraction.h" 27 33 #include "OIDtools.h" 28 34 #include "fileutil.h" 35 #include "cfgread.h" 29 36 30 37 #if !defined (__WIN32__) … … 55 62 argsinfo.addarginfo (NULL, arg_ainfo); 56 63 57 arg_ainfo.shortname = "pcp"; 58 arg_ainfo.longname = "previous collector page"; 59 arg_ainfo.multiplechar = true; 60 arg_ainfo.defaultstatus = cgiarginfo::weak; 61 arg_ainfo.argdefault = ""; 64 arg_ainfo.shortname = "bc1fullname"; 65 arg_ainfo.longname = "collector specific"; 66 arg_ainfo.multiplechar = true; 67 arg_ainfo.defaultstatus = cgiarginfo::weak; 68 arg_ainfo.argdefault = ""; 69 arg_ainfo.savedarginfo = cgiarginfo::must; 70 argsinfo.addarginfo (NULL, arg_ainfo); 71 72 arg_ainfo.shortname = "bc1dirname"; 73 arg_ainfo.longname = "collector specific"; 74 arg_ainfo.multiplechar = true; 75 arg_ainfo.defaultstatus = cgiarginfo::weak; 76 arg_ainfo.argdefault = ""; 77 arg_ainfo.savedarginfo = cgiarginfo::must; 78 argsinfo.addarginfo (NULL, arg_ainfo); 79 80 arg_ainfo.shortname = "bc1contactemail"; 81 arg_ainfo.longname = "collector specific"; 82 arg_ainfo.multiplechar = true; 83 arg_ainfo.defaultstatus = cgiarginfo::weak; 84 arg_ainfo.argdefault = ""; 85 arg_ainfo.savedarginfo = cgiarginfo::must; 86 argsinfo.addarginfo (NULL, arg_ainfo); 87 88 arg_ainfo.shortname = "bc1aboutdesc"; 89 arg_ainfo.longname = "collector specific"; 90 arg_ainfo.multiplechar = true; 91 arg_ainfo.defaultstatus = cgiarginfo::weak; 92 arg_ainfo.argdefault = ""; 93 arg_ainfo.savedarginfo = cgiarginfo::must; 94 argsinfo.addarginfo (NULL, arg_ainfo); 95 96 arg_ainfo.shortname = "bc1clone"; 97 arg_ainfo.longname = "collector specific"; 98 arg_ainfo.multiplechar = false; 99 arg_ainfo.defaultstatus = cgiarginfo::weak; 100 arg_ainfo.argdefault = "0"; 101 arg_ainfo.savedarginfo = cgiarginfo::must; 102 argsinfo.addarginfo (NULL, arg_ainfo); 103 104 arg_ainfo.shortname = "bc1clonecol"; 105 arg_ainfo.longname = "collector specific"; 106 arg_ainfo.multiplechar = true; 107 arg_ainfo.defaultstatus = cgiarginfo::weak; 108 arg_ainfo.argdefault = ""; 109 arg_ainfo.savedarginfo = cgiarginfo::must; 110 argsinfo.addarginfo (NULL, arg_ainfo); 111 112 arg_ainfo.shortname = "bc1inputdir1"; 113 arg_ainfo.longname = "collector specific"; 114 arg_ainfo.multiplechar = true; 115 arg_ainfo.defaultstatus = cgiarginfo::weak; 116 arg_ainfo.argdefault = ""; 117 arg_ainfo.savedarginfo = cgiarginfo::must; 118 argsinfo.addarginfo (NULL, arg_ainfo); 119 120 arg_ainfo.shortname = "bc1inputdir2"; 121 arg_ainfo.longname = "collector specific"; 122 arg_ainfo.multiplechar = true; 123 arg_ainfo.defaultstatus = cgiarginfo::weak; 124 arg_ainfo.argdefault = ""; 125 arg_ainfo.savedarginfo = cgiarginfo::must; 126 argsinfo.addarginfo (NULL, arg_ainfo); 127 128 arg_ainfo.shortname = "bc1inputdir3"; 129 arg_ainfo.longname = "collector specific"; 130 arg_ainfo.multiplechar = true; 131 arg_ainfo.defaultstatus = cgiarginfo::weak; 132 arg_ainfo.argdefault = ""; 133 arg_ainfo.savedarginfo = cgiarginfo::must; 134 argsinfo.addarginfo (NULL, arg_ainfo); 135 136 arg_ainfo.shortname = "bc1inputdir4"; 137 arg_ainfo.longname = "collector specific"; 138 arg_ainfo.multiplechar = true; 139 arg_ainfo.defaultstatus = cgiarginfo::weak; 140 arg_ainfo.argdefault = ""; 141 arg_ainfo.savedarginfo = cgiarginfo::must; 142 argsinfo.addarginfo (NULL, arg_ainfo); 143 144 // only set when one of the fields was changed in 145 // the "collection info" page 146 arg_ainfo.shortname = "bc1infochanged"; 147 arg_ainfo.longname = "collector specific"; 148 arg_ainfo.multiplechar = false; 149 arg_ainfo.defaultstatus = cgiarginfo::weak; 150 arg_ainfo.argdefault = "0"; 62 151 arg_ainfo.savedarginfo = cgiarginfo::mustnot; 63 152 argsinfo.addarginfo (NULL, arg_ainfo); 64 153 65 arg_ainfo.shortname = "bc1fullname"; 66 arg_ainfo.longname = "collector specific"; 67 arg_ainfo.multiplechar = true; 68 arg_ainfo.defaultstatus = cgiarginfo::weak; 69 arg_ainfo.argdefault = ""; 70 arg_ainfo.savedarginfo = cgiarginfo::must; 71 argsinfo.addarginfo (NULL, arg_ainfo); 72 73 arg_ainfo.shortname = "bc1dirname"; 74 arg_ainfo.longname = "collector specific"; 75 arg_ainfo.multiplechar = true; 76 arg_ainfo.defaultstatus = cgiarginfo::weak; 77 arg_ainfo.argdefault = ""; 78 arg_ainfo.savedarginfo = cgiarginfo::must; 79 argsinfo.addarginfo (NULL, arg_ainfo); 80 81 arg_ainfo.shortname = "bc1contactemail"; 82 arg_ainfo.longname = "collector specific"; 83 arg_ainfo.multiplechar = true; 84 arg_ainfo.defaultstatus = cgiarginfo::weak; 85 arg_ainfo.argdefault = ""; 86 arg_ainfo.savedarginfo = cgiarginfo::must; 87 argsinfo.addarginfo (NULL, arg_ainfo); 88 89 arg_ainfo.shortname = "bc1aboutdesc"; 90 arg_ainfo.longname = "collector specific"; 91 arg_ainfo.multiplechar = true; 92 arg_ainfo.defaultstatus = cgiarginfo::weak; 93 arg_ainfo.argdefault = ""; 94 arg_ainfo.savedarginfo = cgiarginfo::must; 95 argsinfo.addarginfo (NULL, arg_ainfo); 96 97 arg_ainfo.shortname = "bc1clone"; 98 arg_ainfo.longname = "collector specific"; 99 arg_ainfo.multiplechar = false; 100 arg_ainfo.defaultstatus = cgiarginfo::weak; 101 arg_ainfo.argdefault = "0"; 102 arg_ainfo.savedarginfo = cgiarginfo::must; 103 argsinfo.addarginfo (NULL, arg_ainfo); 104 105 arg_ainfo.shortname = "bc1clonecol"; 106 arg_ainfo.longname = "collector specific"; 107 arg_ainfo.multiplechar = true; 108 arg_ainfo.defaultstatus = cgiarginfo::weak; 109 arg_ainfo.argdefault = ""; 110 arg_ainfo.savedarginfo = cgiarginfo::must; 111 argsinfo.addarginfo (NULL, arg_ainfo); 112 113 arg_ainfo.shortname = "bc1inputdir1"; 114 arg_ainfo.longname = "collector specific"; 115 arg_ainfo.multiplechar = true; 116 arg_ainfo.defaultstatus = cgiarginfo::weak; 117 arg_ainfo.argdefault = ""; 118 arg_ainfo.savedarginfo = cgiarginfo::must; 119 argsinfo.addarginfo (NULL, arg_ainfo); 120 121 arg_ainfo.shortname = "bc1inputdir2"; 122 arg_ainfo.longname = "collector specific"; 123 arg_ainfo.multiplechar = true; 124 arg_ainfo.defaultstatus = cgiarginfo::weak; 125 arg_ainfo.argdefault = ""; 126 arg_ainfo.savedarginfo = cgiarginfo::must; 127 argsinfo.addarginfo (NULL, arg_ainfo); 128 129 arg_ainfo.shortname = "bc1inputdir3"; 130 arg_ainfo.longname = "collector specific"; 131 arg_ainfo.multiplechar = true; 132 arg_ainfo.defaultstatus = cgiarginfo::weak; 133 arg_ainfo.argdefault = ""; 134 arg_ainfo.savedarginfo = cgiarginfo::must; 135 argsinfo.addarginfo (NULL, arg_ainfo); 136 137 arg_ainfo.shortname = "bc1inputdir4"; 138 arg_ainfo.longname = "collector specific"; 139 arg_ainfo.multiplechar = true; 140 arg_ainfo.defaultstatus = cgiarginfo::weak; 141 arg_ainfo.argdefault = ""; 142 arg_ainfo.savedarginfo = cgiarginfo::must; 143 argsinfo.addarginfo (NULL, arg_ainfo); 144 154 // only set when cfg file is altered from within 155 // "configure collection" page 145 156 arg_ainfo.shortname = "bc1cfgchanged"; 146 157 arg_ainfo.longname = "collector specific"; … … 186 197 187 198 bool collectoraction::check_cgiargs (cgiargsinfoclass &/*argsinfo*/, cgiargsclass &args, 188 ostream & /*logout*/) {199 ostream &logout) { 189 200 190 201 if (args["cp"] != "intro") { … … 194 205 } 195 206 196 if ((args["pcp"] == "info") && args["bc1dirname"].empty()) { 197 // we've just come from the "collection information" page for the 198 // first time so we'll need to create the collection with mkcol.pl 199 // and set up bc1dirname - we do this part here instead of in do_action 200 // because the bc1dirname argument must be set to its new value before 201 // the compressedoptions macros are set. 202 args["bc1dirname"] = get_directory_name (args["bc1fullname"]); 203 do_mkcol = true; 207 if (args["bc1infochanged"] == "1") { 208 209 if (args["bc1dirname"].empty()) { 210 // we've just come from the "collection information" page for the 211 // first time so we'll need to create the collection with mkcol.pl 212 // and set up bc1dirname - we do this part here instead of in do_action 213 // because the bc1dirname argument must be set to its new value before 214 // the compressedoptions macros are set. 215 args["bc1dirname"] = get_directory_name (args["bc1fullname"]); 216 do_mkcol = true; 217 218 } else { 219 // "collection information" has been changed after collection was made 220 // so we'll need to update the cfg file. 221 update_cfgfile_partial (args, logout); 222 } 204 223 } 205 224 … … 208 227 // page. we need to update the file on disk and catch bc1 arguments up 209 228 // with changes. 210 211 212 } 213 229 update_cfgfile_complete (args, logout); 230 } 231 214 232 return true; 233 } 234 235 // update configuration file on disk to match bc1 arguments 236 void collectoraction::update_cfgfile_partial (cgiargsclass &args, ostream &logout) { 237 238 text_t cfgfile = filename_cat(gsdlhome, "collect", args["bc1dirname"], "etc", "collect.cfg"); 239 char *cfgfilec = cfgfile.getcstr(); 240 241 vector<text_tarray> cfgarray; 242 243 // read in cfg file 244 ifstream cfg_in (cfgfilec); 245 if (cfg_in) { 246 text_tarray cfgline; 247 while (read_cfg_line(cfg_in, cfgline) >= 0) { 248 if (cfgline.size () >= 2) { 249 if (cfgline[0] == "creator") { 250 cfgline[1] = args["bc1contactemail"]; 251 } else if (cfgline[0] == "collectionmeta") { 252 if (cfgline[1] == "collectionname") { 253 cfgline[2] = args["bc1fullname"]; 254 } else if (cfgline[1] == "collectionextra") { 255 cfgline[2] = carriage_replace (args["bc1aboutdesc"], 0); 256 } 257 } 258 } 259 cfgarray.push_back (cfgline); 260 } 261 cfg_in.close(); 262 263 // now write cfg file back out 264 ofstream cfg_out (cfgfilec); 265 if (cfg_out) { 266 // lock the file 267 int fd = GSDL_GET_FILEDESC(cfg_out); 268 int lock_val = 1; 269 GSDL_LOCK_FILE (fd); 270 if (lock_val != 0) { 271 logout << "Error: Couldn't lock file " << cfgfilec << "\n"; 272 cfg_out.close(); 273 274 } else { 275 276 vector<text_tarray>::const_iterator this_line = cfgarray.begin(); 277 vector<text_tarray>::const_iterator end_line = cfgarray.end(); 278 while (this_line != end_line) { 279 write_cfg_line (cfg_out, *this_line); 280 this_line ++; 281 } 282 GSDL_UNLOCK_FILE (fd); 283 cfg_out.close(); 284 } 285 286 } else { 287 logout << "collectoraction::update_cfgfile_partial: unable to open " 288 << cfgfilec << " for output\n"; 289 } 290 291 } else { 292 logout << "collectoraction::update_cfgfile_partial: unable to open " 293 << cfgfilec << " for input\n"; 294 } 295 delete cfgfilec; 296 } 297 298 // replace configuration file on disk with that in the bc1cfgfile argument and 299 // catch other bc1 arguments up with those the new cfgfile contains 300 void collectoraction::update_cfgfile_complete (cgiargsclass &args, ostream &logout) { 301 302 text_t cfgfile = filename_cat(gsdlhome, "collect", args["bc1dirname"], "etc", "collect.cfg"); 303 char *cfgfilec = cfgfile.getcstr(); 304 ofstream cfg_out (cfgfilec); 305 306 if (cfg_out) { 307 // lock the file 308 int fd = GSDL_GET_FILEDESC(cfg_out); 309 int lock_val = 1; 310 GSDL_LOCK_FILE (fd); 311 if (lock_val != 0) { 312 logout << "Error: Couldn't lock file " << cfgfilec << "\n"; 313 cfg_out.close(); 314 315 } else { 316 317 outconvertclass text_t2ascii; 318 cfg_out << text_t2ascii << args["bc1cfgfile"]; 319 GSDL_UNLOCK_FILE (fd); 320 cfg_out.close(); 321 322 // now that we've written the file we'll read it back again and 323 // update our bc1 arguments 324 ifstream cfg_in (cfgfilec); 325 if (cfg_in) { 326 text_tarray cfgline; 327 while (read_cfg_line(cfg_in, cfgline) >= 0) { 328 if (cfgline.size () >= 2) { 329 if (cfgline[0] == "creator") { 330 args["bc1contactemail"] = cfgline[1]; 331 } else if (cfgline[0] == "collectionmeta") { 332 if (cfgline[1] == "collectionname") { 333 args["bc1fullname"] = cfgline[2]; 334 } else if (cfgline[1] == "collectionextra") { 335 args["bc1aboutdesc"] = carriage_replace (cfgline[2], 1); 336 } 337 } 338 } 339 } 340 cfg_in.close(); 341 } else { 342 logout << "collectoraction::update_cfgfile_complete: unable to open " 343 << cfgfilec << " for input\n"; 344 } 345 } 346 } else { 347 logout << "collectoraction::update_cfgfile_complete: unable to open " 348 << cfgfilec << " for output\n"; 349 } 350 delete cfgfilec; 215 351 } 216 352 … … 330 466 331 467 // set the _cfgfile_ macro 332 void collectoraction::set_cfgfile (displayclass &disp, const text_t &dirname ) {468 void collectoraction::set_cfgfile (displayclass &disp, const text_t &dirname, ostream &logout) { 333 469 334 470 // read in collect.cfg … … 342 478 #endif 343 479 344 delete cfgfilec;345 346 480 if (cfg_ifs) { 347 481 // read in collect.cfg … … 350 484 cfg_ifs.get(c); 351 485 while (!cfg_ifs.eof ()) { 486 if (c=='\\') cfgtext.push_back('\\'); 352 487 cfgtext.push_back(c); 353 488 cfg_ifs.get(c); … … 357 492 // define it as a macro 358 493 disp.setmacro("cfgfile","collector",cfgtext); 359 } 494 495 } else { 496 logout << "collectoraction::set_cfgfile: couldn't open configuration file (" 497 << cfgfilec << ") for reading\n"; 498 } 499 delete cfgfilec; 360 500 } 361 501 … … 423 563 collectorbar += get_button (collector_page, "grey", "view", false); 424 564 collectorbar += "</tr><tr><td colspan=4></td><td align=center>_icongreyuparrow_</td><td colspan=4></td>\n"; 565 566 } else if (collector_page == "bild") { 567 568 425 569 } 426 570 … … 429 573 430 574 if (collector_page == "srce") set_fullnamemenu (disp, args, protos, logout); 431 if (collector_page == "conf") set_cfgfile (disp, args["bc1dirname"] );575 if (collector_page == "conf") set_cfgfile (disp, args["bc1dirname"], logout); 432 576 } 433 577 … … 458 602 } 459 603 604 if (collector_page == "bild") { 605 // do the work (download, import, build) 606 text_t build_cmd = "perl " + filename_cat (gsdlhome, "bin", "script", "build"); 607 if (!args["bc1inputdir1"].empty()) { 608 build_cmd += " -download \"" + args["bc1inputdir1"] + "\""; 609 } 610 if (!args["bc1inputdir2"].empty()) { 611 build_cmd += " -download \"" + args["bc1inputdir2"] + "\""; 612 } 613 if (!args["bc1inputdir3"].empty()) { 614 build_cmd += " -download \"" + args["bc1inputdir3"] + "\""; 615 } 616 if (!args["bc1inputdir4"].empty()) { 617 build_cmd += " -download \"" + args["bc1inputdir4"] + "\""; 618 } 619 build_cmd.push_back (' '); 620 build_cmd += args["bc1dirname"]; 621 622 #if !defined (__WIN32__) 623 // run in background on unix systems 624 build_cmd += " &"; 625 #endif 626 char *build_cmdc = build_cmd.getcstr(); 627 #if defined (__WIN32__) 628 gsdl_system (build_cmdc, logout); 629 #else 630 system (build_cmdc); 631 #endif 632 delete build_cmdc; 633 } 460 634 461 635 if (error.empty()) { -
trunk/gsdl/src/recpt/collectoraction.h
r1419 r1425 47 47 recptprotolistclass *protos, ostream &logout); 48 48 49 void set_cfgfile (displayclass &disp, const text_t &dirname); 49 void set_cfgfile (displayclass &disp, const text_t &dirname, ostream &logout); 50 51 void update_cfgfile_partial (cgiargsclass &args, ostream &logout); 52 53 void update_cfgfile_complete (cgiargsclass &args, ostream &logout); 50 54 51 55 text_t carriage_replace (const text_t &intext, int sw);
Note:
See TracChangeset
for help on using the changeset viewer.