-/*=========================================================================
+/*=========================================================================
Program: bbtk
Module: $RCSfile: bbtkConfigurationFile.cxx,v $
Language: C++
- Date: $Date: 2009/12/08 14:10:36 $
- Version: $Revision: 1.32 $
+ Date: $Date: 2010/10/18 08:33:57 $
+ Version: $Revision: 1.33 $
=========================================================================*/
/* ---------------------------------------------------------------------
* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
*
-* This software is governed by the CeCILL-B license under French law and
-* abiding by the rules of distribution of free software. You can use,
-* modify and/ or redistribute the software under the terms of the CeCILL-B
-* license as circulated by CEA, CNRS and INRIA at the following URL
-* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+* This software is governed by the CeCILL-B license under French law and
+* abiding by the rules of distribution of free software. You can use,
+* modify and/ or redistribute the software under the terms of the CeCILL-B
+* license as circulated by CEA, CNRS and INRIA at the following URL
+* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
* or in the file LICENSE.txt.
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
-* liability.
+* liability.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-B license and that you accept its terms.
-* ------------------------------------------------------------------------ */
+* ------------------------------------------------------------------------ */
/**
*\file
{
mFile_separator = VALID_FILE_SEPARATOR;
-
- // ==> Set system paths
+
+ // ==> Set system paths
mBin_path = Utilities::GetExecutablePath();
-
-
-
-/* EED 23 Mars 2009
+
+
+
+/* EED 23 Mars 2009
#ifdef MACOSX
mInstall_path = mBin_path + "/../../../..";
#else
mInstall_path = mBin_path + "/..";
#endif
-*/
+*/
#ifdef MACOSX
-
- std::string macPath("Contents/MacOS");
+
+ std::string macPath("Contents/MacOS");
int sbp = mBin_path.length();
int smp = macPath.length();
if (mBin_path.compare( sbp-smp, smp, macPath )==0 )
{
mBin_path = mBin_path + "/../../..";
}
-
-
-#endif
+
+
+#endif
mInstall_path = mBin_path + "/..";
-
-
+
+
// The relative path to the doc folder (=BBTK_DOC_REL_PATH)
// mDoc_rel_path = BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH);
// The path to the doc folder (=mInstall_path+"/"+mDoc_rel_path)
// mDoc_path = mInstall_path + "/" + mDoc_rel_path;
- // Have to create bbtk user's dirs if needed
+ // Have to create bbtk user's dirs if needed
- // LG 27/01/09 : doc is now user dependent
+ // LG 27/01/09 : doc is now user dependent
// and located in user's .bbtk dir /doc
// All dirs under .bbtk user's dir are set and created by:
InitializeDotBbtkStructure();
mBbs_rel_path = BBTK_STRINGIFY_SYMBOL(BBTK_BBS_REL_PATH);
// The path to the bbs folder (=mInstall_path+"/"+mBbs_rel_path)
mBbs_path = mInstall_path + "/" + mBbs_rel_path;
-
+
mData_path = mInstall_path + "/" + BBTK_STRINGIFY_SYMBOL(BBTK_DATA_REL_PATH);
-
- Utilities::replace( mBin_path,
+
+ Utilities::replace( mBin_path,
INVALID_FILE_SEPARATOR,
VALID_FILE_SEPARATOR);
Utilities::replace( mInstall_path,
Utilities::replace( mData_path,
INVALID_FILE_SEPARATOR,
VALID_FILE_SEPARATOR);
-
+
bbtkMessage("config",1," ==> bin : '"<<mBin_path<<"'"<<std::endl);
bbtkMessage("config",1," ==> prefix : '"<<mInstall_path<<"'"<<std::endl);
bbtkMessage("config",1," ==> doc : '"<<mDoc_path<<"'"<<std::endl);
-
+
// bbs_paths
// always add "." (current working directory) at the begining
- mBbs_paths.push_back( "." );
- // add system bbs path
+ mBbs_paths.push_back( "." );
+ // add system bbs path
mBbs_paths.push_back(mBbs_path);
- // add toolsbbtk/appli
+ // add toolsbbtk/appli
//EED std::string toolsappli_rel_path(mFile_separator);
std::string toolsappli_rel_path("/");
//EED toolsappli_rel_path += "toolsbbtk" + mFile_separator + "appli";
//
//-----------------------------------------------------------
// LG : REMOVE BUGGY PATH WITH include *:
- //
+ //
// mBbs_paths.push_back(mBbs_path + toolsappli_rel_path);
//-----------------------------------------------------------
int iStrVec,sizeStrVec;
-
+
sizeStrVec = mBbs_paths.size();
for (iStrVec=0;iStrVec<sizeStrVec;iStrVec++){
Utilities::replace( mBbs_paths[iStrVec] , INVALID_FILE_SEPARATOR , VALID_FILE_SEPARATOR);
}
-
-
+
+
// always add "." (current working directory) at the begining
- mPackage_paths.push_back(".");
+ mPackage_paths.push_back(".");
// add system bin path (for build tree / standalone folder install)
mPackage_paths.push_back(mBin_path);
// add system lib path (for install tree)
//EED mPackage_paths.push_back(mInstall_path + mFile_separator + "lib");
mPackage_paths.push_back(mInstall_path + "/lib");
+ mPackage_paths.push_back(mInstall_path + "/lib64");
#ifdef WIN32
// add bin/Debug bin/Release paths (for build/install tree)
//EED mPackage_paths.push_back(mBin_path + mFile_separator + "Debug");
//EED mPackage_paths.push_back(mBin_path + mFile_separator + "Release");
mPackage_paths.push_back(mBin_path + "/Release");
#endif
-
+
sizeStrVec = mPackage_paths.size();
for (iStrVec=0;iStrVec<sizeStrVec;iStrVec++){
Utilities::replace( mPackage_paths[iStrVec] , INVALID_FILE_SEPARATOR , VALID_FILE_SEPARATOR);
}
-
-
-
+
+
+
GetHelp(2);
-
+
// ==> First we look for bbtk_config.xml in "."
char buf[2048];
const char *currentDir = getcwd(buf, 2048);
-
+
if( !currentDir )
{
std::cerr << "Path was too long to fit on 2048 bytes ?!?" << std::endl;
// \todo : what else?
// How abort a constructor and warn the caller function?
- // LG : throw an exception
+ // LG : throw an exception
}
-
+
// std::string configXmlFullPathName = currentDir + mFile_separator + "bbtk_config.xml";
std::string configXmlFullPathName = currentDir ;
configXmlFullPathName += "/bbtk_config.xml";
Utilities::replace( configXmlFullPathName , INVALID_FILE_SEPARATOR , VALID_FILE_SEPARATOR);
-
+
if ( Utilities::FileExists( configXmlFullPathName ))
{
- bbtkMessage("config",1, "ConfigurationFile : [" << configXmlFullPathName <<
- "] found in current directory" << std::endl);
+ bbtkMessage("config",1, "ConfigurationFile : [" << configXmlFullPathName <<
+ "] found in current directory" << std::endl);
//Read(configXmlFullPathName.c_str());
- // traiter le fichier local
+ // traiter le fichier local
}
-
+
// ==> Then we look for bbtk_config.xml in ".bbtk"
- else
+ else
{
configXmlFullPathName = Utilities::MakeUserSettingsFullFileName("bbtk_config.xml");
if (!Utilities::FileExists( configXmlFullPathName ))
- {
+ {
// ==> Nothing found, we create bbtk_config.xml in ".bbtk"
InstallPath ();
}
}
-
+
// In any case, deal with bbtk_config.xml!
Read(configXmlFullPathName.c_str());
}
{
}
//=========================================================================
-
+
//=========================================================================
void ConfigurationFile::InitializeDotBbtkStructure()
{
mDot_bbtk_path = Utilities::GetUserSettingsDir();
mDot_bbtk_is_new = false;
- if (!Utilities::FileExists(mDot_bbtk_path)) mDot_bbtk_is_new = true;
+ if (!Utilities::FileExists(mDot_bbtk_path)) mDot_bbtk_is_new = true;
Utilities::CreateDirectoryIfNeeded(mDot_bbtk_path);
-
+
mDoc_path = Utilities::MakeUserSettingsFullFileName("doc");
Utilities::CreateDirectoryIfNeeded(mDoc_path);
- std::string bbdoc_path =
+ std::string bbdoc_path =
Utilities::MakeUserSettingsFullFileName("doc/bbdoc");
Utilities::CreateDirectoryIfNeeded(bbdoc_path);
-
+
// Create help_contents.html if does not exist
std::string filename = Utilities::MakeUserSettingsFullFileName("doc/help_contents.html");
if (!Utilities::FileExists(filename))
{
- bbtkDebugMessage("config",1,
+ bbtkDebugMessage("config",1,
"* Creating [" << filename << "]" << std::endl);
// The path to the doc folder (=mInstall_path+"/"+mDoc_rel_path)
- std::string doc_path = mInstall_path + "/"
+ std::string doc_path = mInstall_path + "/"
+ BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) + "/";
- Utilities::MakeValidFileName(doc_path);
-
+ Utilities::MakeValidFileName(doc_path);
+
std::ofstream f;
f.open(filename.c_str(), std::ios::out );
<< "charset=iso-8859-1\"></head><H1>Help Contents</H1>"
<< "<a href=\"bbdoc/index-category.html#demo\" "
<< "target=\"information\">Demos</a><br>"
- << "<a href=\"bbdoc/index-category.html#example\" "
+ << "<a href=\"bbdoc/index-category.html#example\" "
<< "target=\"information\">Examples</a>"
<< "<H2>Guides</H2>"
<< "<a href=\""
- << doc_path
+ << doc_path
<< "bbtkUsersGuide/bbtkUsersGuide.pdf"
<< "\" target=\"information\">User's Guide</a><br>"
<< "<a href=\""
fprintf(fp, "</config>\n");
fclose(fp);
}
- //=========================================================================
+ //=========================================================================
+
+
-
-
//=========================================================================
void ConfigurationFile::InstallPath ()
{
-
+
/*--------------------------------------------------
New policy for bbtk_config.xml :
-
+
if bbtk_config.xml found in current directory (user is an aware user!)
use it!
-
+
else if bbtk_config.xml found in HOME/.bbtk (user already worked with it)
use it!
-
+
else if bbtk_config.xml.tmp found in /usr/local/bin or c:\\Program Files\\BBTK\\bin
copy it as .bbtk/bbtk_config.xml
-
+
else (nothing installed)
create a minimum version in HOME/.bbtk
----------------------------------------------------*/
-
-
+
+
// -----------------------------------------------------------------
#if defined(__GNUC__)
-
+
// ------------------ create some usefull strings ----------------
// installed bbtk_path
char bbtk_path[100];
strcpy(bbtk_path, "/usr/local/bin");
-
+
// rootDirectory
char rootDirectory[200];
sprintf( rootDirectory, "%s/.bbtk", getenv("HOME"));
-
+
// configPath
char configPath[200];
sprintf(configPath, "%s/bbtk_config.xml",rootDirectory);
-
+
// configXmlTmp
- char configXmlTmp[250];
+ char configXmlTmp[250];
sprintf(configXmlTmp, "%s/bbtk_config.xml.tmp", bbtk_path);
-
+
// copyFile
char copyFile[250];
-
+
if (!Utilities::FileExists(configXmlTmp)) // bbtk_config.xml.tmp not found (not installed)
- {
+ {
// if "bbtk_path/bbtk_config.xml.tmp" doesn't exist, hard-create a minimum version in .bbtk
CreateConfigXML( rootDirectory );// create .bbtk
}
}
}
return;
-
+
// ------------------------------------------------------------------
#elif defined(WIN32)
-
-
+
+
// installed bbtk_path
char bbtk_path[100];
strcpy(bbtk_path, "\"c:\\Program Files\\BBTK\\bin\"");
char bbtk_path2[100];
strcpy(bbtk_path2, "c:\\Program Files\\BBTK\\bin");
-
+
// rootDirectory
- char rootDirectory[200];
+ char rootDirectory[200];
sprintf(rootDirectory, "%s\\.bbtk",getenv("USERPROFILE"));
// std::cout << "[" << rootDirectory << "]" << std::endl;
-
+
// configPath
char configPath[200];
sprintf(configPath, "%s\\bbtk_config.xml",rootDirectory);
-
+
// makeDir
char makeDir[250];
sprintf( makeDir, "mkdir \"%s\" ", rootDirectory);
-
+
// configXmlTmp
- char configXmlTmp[250];
+ char configXmlTmp[250];
sprintf(configXmlTmp, "%s\\bbtk_config.xml.tmp", bbtk_path2);
-
+
// copyFile
char copyFile[250];
-
+
if (!Utilities::FileExists(configXmlTmp)) // bbtk_config.xml.tmp not found
{
// if "bbtk_path/bbtk_config.xml.tmp" doesn't exist, hard-create a minimum version in .bbtk
CreateConfigXML( rootDirectory );// create .bbtk
return;
- }
-
+ }
+
sprintf(copyFile,"copy %s\\bbtk_config.xml.tmp \"%s\"\\bbtk_config.xml ",bbtk_path,rootDirectory );
-
+
int attribs = GetFileAttributes (rootDirectory);
bbtkMessage("config",1,std::hex << attribs << " " << FILE_ATTRIBUTE_DIRECTORY << std::endl);
if ( attribs != 0xFFFFFFFF)
{
if ( GetFileAttributes( configPath ) == 0xFFFFFFFF)
{
- system(copyFile);
- }
+ system(copyFile);
+ }
}
- }
- else
+ }
+ else
{
system(makeDir);
- system(copyFile);
- }
- return;
- // ------------------------------------------------------------------
+ system(copyFile);
+ }
+ return;
+ // ------------------------------------------------------------------
#else
/// \todo ConfigurationFile::InstallPath() : exit when for not WIN32 and not__GNUC__
- return;
+ return;
#endif
}
//=========================================================================
// Gets the list of directories holding bb scripts, packages, dll, ... from the xml file
// bbtk_config.xml
-
+
void ConfigurationFile::Read(const std::string& filename)
{
-
+
bbtkDebugMessage("config",1,"ConfigurationFile::Read(" <<filename << ")" << std::endl);
-
+
mConfig_xml_full_path = filename;
XMLResults* res = new XMLResults;
XMLNode BB = XMLNode::parseFile((XMLCSTR)filename.c_str(),(XMLCSTR)"config",res);
-
- if ( res->error != eXMLErrorNone )
+
+ if ( res->error != eXMLErrorNone )
{
std::string mess = GetErrorMessage(res,filename);
delete res;
bbtkError(mess);
}
delete res;
-
+
bbtkDebugMessage("config",1,"OK" << std::endl);
-
+
int i,j;
-
+
// Description
- for (i=0,j=0; i<BB.nChildNode((XMLCSTR)"description"); i++)
+ for (i=0,j=0; i<BB.nChildNode((XMLCSTR)"description"); i++)
{
std::string val;
GetTextOrClear(BB.getChildNode((XMLCSTR)"description",&j),val);
mDescription += val;
- }
-
+ }
+
// Url
- if( BB.nChildNode((XMLCSTR)"url") )
+ if( BB.nChildNode((XMLCSTR)"url") )
GetTextOrClear(BB.getChildNode((XMLCSTR)"url"),mUrl);
-
+
// Data_Path
- if( BB.nChildNode((XMLCSTR)"data_path") )
+ if( BB.nChildNode((XMLCSTR)"data_path") )
GetTextOrClear(BB.getChildNode((XMLCSTR)"data_path"),mData_path);
-
+
// install_path
// if( BB.nChildNode((XMLCSTR)"install_path") )
// GetTextOrClear(BB.getChildNode((XMLCSTR)"install_path"),mInstall_path);
-
+
// add user bbs paths
- for (i=0,j=0; i<BB.nChildNode((XMLCSTR)"bbs_path"); i++)
+ for (i=0,j=0; i<BB.nChildNode((XMLCSTR)"bbs_path"); i++)
{
std::string val;
GetTextOrClear(BB.getChildNode((XMLCSTR)"bbs_path",&j),val);
mBbs_paths.push_back(val);
}
-
+
// package_paths
-
+
// add user package path
- for (i=0,j=0; i<BB.nChildNode((XMLCSTR)"package_path"); i++)
+ for (i=0,j=0; i<BB.nChildNode((XMLCSTR)"package_path"); i++)
{
std::string val;
GetTextOrClear(BB.getChildNode((XMLCSTR)"package_path",&j),val);
mPackage_paths.push_back(val);
}
-
+
// default_temp_dir
/*
- if( BB.nChildNode((XMLCSTR)"default_temp_dir") )
+ if( BB.nChildNode((XMLCSTR)"default_temp_dir") )
GetTextOrClear(BB.getChildNode((XMLCSTR)"default_temp_dir"),mDefault_temp_dir);
-
+
if ( mDefault_temp_dir == "$") // no value found in config_xml
{
size_t pos = mConfig_xml_full_path.find("bbtk_config.xml");
- mDefault_temp_dir = mConfig_xml_full_path.substr (0,pos);
- }
+ mDefault_temp_dir = mConfig_xml_full_path.substr (0,pos);
+ }
*/
GetHelp(2);
}
//=========================================================================
-
+
//=========================================================================
bool ConfigurationFile::AddPackagePathsAndWrite( const std::string& path )
{
bbtkDebugMessageInc("config",9,
"ConfigurationFile::AddPackagePathsAndWrite("
<<path<<")"<<std::endl);
-
+
XMLResults* res = new XMLResults;
- XMLNode BB =
+ XMLNode BB =
XMLNode::parseFile((XMLCSTR)Get_config_xml_full_path().c_str(),
(XMLCSTR)"config",res);
-
- if ( res->error != eXMLErrorNone )
+
+ if ( res->error != eXMLErrorNone )
{
std::string mess = GetErrorMessage(res,Get_config_xml_full_path());
delete res;
BBSPATH.addText((XMLCSTR)bbs_path.c_str());
Utilities::replace(bbs_path, INVALID_FILE_SEPARATOR, VALID_FILE_SEPARATOR);
mBbs_paths.push_back(bbs_path);
-
+
#ifdef _WIN32
std::string pack_path = path + "/bin";
#else
XMLError err = BB.writeToFile((XMLCSTR)Get_config_xml_full_path().c_str());
- if ( err != eXMLErrorNone )
+ if ( err != eXMLErrorNone )
{
std::string mess = GetErrorMessage(res,Get_config_xml_full_path());
bbtkDebugMessage("config",1,mess<< std::endl);
{
bbtkDebugMessageInc("config",9,"ConfigurationFile::GetHelp("<<level
<<")"<<std::endl);
-
- const std::string config_xml_full_path = Get_config_xml_full_path();
+
+ const std::string config_xml_full_path = Get_config_xml_full_path();
const std::string description = Get_description();
const std::string url = Get_doc_path();
const std::string data_path = Get_data_path();
- const std::string default_temp_dir = Get_default_temp_dir();
- const std::string file_separator = Get_file_separator();
+ const std::string default_temp_dir = Get_default_temp_dir();
+ const std::string file_separator = Get_file_separator();
const std::vector<std::string>bbs_paths = Get_bbs_paths();
const std::vector<std::string>package_paths = Get_package_paths();
-
- bbtkMessage("help",level, "=============" << std::endl);
+
+ bbtkMessage("help",level, "=============" << std::endl);
bbtkMessage("help",level, "Configuration" << std::endl);
bbtkMessage("help",level, "=============" << std::endl);
- bbtkMessage("help",level, "bbtk_config.xml : [" << config_xml_full_path << "]" << std::endl);
+ bbtkMessage("help",level, "bbtk_config.xml : [" << config_xml_full_path << "]" << std::endl);
bbtkMessage("help",level, "Documentation Path : [" << url << "]" << std::endl);
bbtkMessage("help",level, "Data Path : [" << data_path << "]" << std::endl);
bbtkMessage("help",level, "Temp Directory : [" << default_temp_dir << "]" << std::endl);
bbtkMessage("help",level, "File Separator : [" << file_separator << "]" << std::endl);
std::vector<std::string>::const_iterator i;
-
- bbtkMessage("help",level, "BBS Paths " << std::endl);
+
+ bbtkMessage("help",level, "BBS Paths " << std::endl);
for (i = bbs_paths.begin(); i!=bbs_paths.end(); ++i )
{
bbtkMessage("help",level,"--- ["<<*i<<"]"<<std::endl);
- }
-
- bbtkMessage("help",level, "PACKAGE Paths : " << std::endl);
+ }
+
+ bbtkMessage("help",level, "PACKAGE Paths : " << std::endl);
for (i = package_paths.begin(); i!=package_paths.end(); ++i )
{
bbtkMessage("help",level,"--- ["<<*i<<"]"<<std::endl);