// WManager.cc
//
// Implementation of working part
// $Id: WManager.cc,v 1.3 1999/11/14 15:28:36 M Exp $
//
//
// Copyright (C) 1999 M. Tessmer
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
// SYSTEM INCLUDES /////////////////////////////////
#include <string> // standard string class
#include <fstream> // file streams
#include <cstring> // only for 'strtok'
#include <iostream>
#include <pwd.h> // for home directory
#include <unistd.h>
#include <sys/types.h>
// PROJECT INCLUDES ////////////////////////////////
#include "Interface.H" // interface class
#include "WManager.H" // class definition
// LOCAL INCLUDES //////////////////////////////////
#include <FL/fl_message.H> // message window
using namespace std;
// constructor
WManager::WManager()
: _Interface(0), _ConfigurationFilename(0)
{
#if DEBUG == 1
cout << "WManager::WManager()\n";
#endif
}
// destructor
WManager::~WManager()
{
#if DEBUG == 1
cout << "WManager::~WManager()\n";
#endif
delete _Interface;
delete _ConfigurationFilename;
}
// initialization stuff
void
WManager::Init()
{
#if DEBUG == 1
cout << "WManager::Init()\n";
#endif
string configuration_filename = "";
struct passwd* my_passwd;
// find home directory and add '.wmanagerrc'
my_passwd = getpwuid(getuid());
configuration_filename += my_passwd->pw_dir;
configuration_filename += "/.wmanagerrc";
_ConfigurationFilename = new string(configuration_filename.c_str());
_Interface = new Interface();
_Interface->Init();
}
// check commandline for alternative configuration file ('-r filename')
int
WManager::CheckArguments(int argc,
char** argv)
{
#if DEBUG == 1
cout << "WManager::CheckArguments(int, char**)\n";
#endif
int i = 0; // old array index
int n = 0; // new array index
int j = 0; // 1 || 2
char* str = 0;
char** array = 0;
bool flag = false;
//
// pass one: check for no. of arguments and for unity
//
for(i = 0; i<argc; i++) {
if( strcmp(argv[i], "-r") == 0 ) {
if(flag) {
cerr << "Error. Used option -r twice!\n";
exit(-1);
} else {
// we must delete two arguments
cout << "Found -r alone. Must delete two arguments\n";
j = 2;
flag = true;
}
} else {
if(argv[i][0] == '-' && argv[i][1] == 'r') {
if(flag) {
cerr << "Error. Used -r twice!\n";
exit(-1);
} else {
// we must delete only one argument
j = 1;
flag = true;
}
}
} // end if
} // end for
//
// pass two: build up new argv array
//
array = new char*[argc-j];
n = 0;
for(i = 0; i<argc; i++) {
if( strcmp(argv[i], "-r") == 0 ) {
// we must delete two arguments
i++;
*_ConfigurationFilename = "";
*_ConfigurationFilename += argv[i];
} else {
if(argv[i][0] == '-' && argv[i][1] == 'r') {
// we must delete only one argument
*_ConfigurationFilename = "";
*_ConfigurationFilename += _CutString(argv[i], "-r");
} else {
// copy argument to new array
str = new char[strlen(argv[i])+1];
strcpy(str, argv[i]);
array[n] = str;
n++;
}
} // end if
} // end for
argv = array;
return argc-j;
}
// parse configuration file
void
WManager::ParseFile()
{
#if DEBUG == 1
cout << "WManager::ParseFile()\n";
#endif
// file descriptor
ifstream* fd = 0;
fd = new ifstream();
if(fd == 0) {
fl_alert("Cannot open configuration file!\n Exiting for now.");
} else {
// try to open file
fd->open(_ConfigurationFilename->c_str());
if(!fd->is_open()) {
fl_alert("Cannot open file %s", _ConfigurationFilename->c_str());
cout << "-1\n";
exit(-1);
}
} // end if
_ParseConfigurationFile(fd);
delete fd;
}
// enter fltk run loop
void
WManager::Run(int argc, char** argv)
{
#if DEBUG == 1
cout << "WManager::Run()\n";
#endif
_Interface->Run(argc, argv);
}
// PRIVATE SECTION ////////////////////////////////////////////////////////////
// parse configuration file
void
WManager::_ParseConfigurationFile(ifstream* filestream)
{
#if DEBUG == 1
cout << "WManager::_ParseConfigurationFile(ifstream*)\n";
#endif
// because of a lack in iostream you cannot read lines into strings with
// iostream::getline; the use of a char buffer is a workaround
char* dummy = 0;
dummy = new char[200+1]; // workaround
while(!filestream->eof()) {
filestream->getline(dummy, 200); // workaround
if(strcmp(dummy, "") != 0) {
_TokenizeAndAddToBrowser(dummy);
}
} // end while
}
// add token to fltk browser widget
void
WManager::_TokenizeAndAddToBrowser(char* entry)
{
#if DEBUG == 1
cout << "WManager::_TokenizeAndAddToBrowswer(char*)\n";
#endif
string* name = 0;
string* path = 0;
char* ptr = 0;
if(entry[0] != '#') {
name = new string();
*name += strtok(entry, "=");
#if DEBUG == 1
cout << "WManager::_TokenizeAndAddToBrowser: name = <"
<< *name
<< ">\n";
#endif
// path to executable
ptr = strtok(0, "=");
// test for failure
if(ptr != 0) {
path = new string();
*path += ptr;
#if DEBUG == 1
cout << "WManager::_TokenizeAndAddToBrowser: path = <"
<< *path
<< ">\n";
#endif
// add new entry to browser list
_Interface->AddToBrowser(name->c_str(), path->c_str());
// clean up
delete name;
delete path;
} else {
fl_alert("Error near %s while parsing configuration file %s!"
"Try to read on...",
name->c_str(), _ConfigurationFilename);
} // end if
} // end if
}
// cut rest from the beginning of str
char*
WManager::_CutString(char* str, char* rest)
{
int i = 0;
int n = 0;
int length = 0;
int new_length = 0;
char* new_str = 0;
length = strlen(str);
new_length = length - strlen(rest);
if(new_length < 0)
return 0;
new_str = new char[new_length+1];
for(i = strlen(rest), n = 0;
i < length;
i++, n++) {
new_str[n] = str[i];
}
new_str[new_length+1] = 0;
return new_str;
}
syntax highlighted by Code2HTML, v. 0.9.1