Program: bbtk
Module: $RCSfile: bbtkConfigurationFile.cxx,v $
Language: C++
- Date: $Date: 2008/12/12 10:20:48 $
- Version: $Revision: 1.25 $
+ Date: $Date: 2009/01/27 14:22:56 $
+ Version: $Revision: 1.26 $
=========================================================================*/
/* ---------------------------------------------------------------------
ConfigurationFile::ConfigurationFile()
{
- mFile_separator = VALID_FILE_SEPARATOR;
+ mFile_separator = VALID_FILE_SEPARATOR;
// ==> Set system paths
- mBin_path = GetExecutablePath();
-
+ mBin_path = Utilities::GetExecutablePath();
+
#ifdef MACOSX
mInstall_path = mBin_path + "/../../../..";
#else
mInstall_path = mBin_path + "/..";
#endif
-
+
+
// The relative path to the doc folder (=BBTK_DOC_REL_PATH)
- mDoc_rel_path = BBTK_STRINGIFY_SYMBOL(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;
+ // mDoc_path = mInstall_path + "/" + mDoc_rel_path;
+ // Have to create bbtk user's dirs if needed
+
+ // 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();
+
// The relative path to the doc folder (=BBTK_BBS_REL_PATH)
mBbs_rel_path = BBTK_STRINGIFY_SYMBOL(BBTK_BBS_REL_PATH);
// The path to the bbs folder (=mInstall_path+"/"+mBbs_rel_path)
Utilities::replace( mInstall_path,
INVALID_FILE_SEPARATOR,
VALID_FILE_SEPARATOR);
- Utilities::replace( mDoc_rel_path,
- INVALID_FILE_SEPARATOR,
- VALID_FILE_SEPARATOR);
- Utilities::replace( mDoc_path,
- INVALID_FILE_SEPARATOR,
- VALID_FILE_SEPARATOR);
Utilities::replace( mBbs_path,
INVALID_FILE_SEPARATOR,
VALID_FILE_SEPARATOR);
}
//=========================================================================
+ //=========================================================================
+ void ConfigurationFile::InitializeDotBbtkStructure()
+ {
+ mDot_bbtk_path = Utilities::GetUserSettingsDir();
+ mDot_bbtk_is_new = false;
+ 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 =
+ 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,
+ "* Creating [" << filename << "]" << std::endl);
+ // The path to the doc folder (=mInstall_path+"/"+mDoc_rel_path)
+ std::string doc_path = mInstall_path + "/"
+ + BBTK_STRINGIFY_SYMBOL(BBTK_DOC_REL_PATH) + "/";
+ Utilities::MakeValidFileName(doc_path);
+ std::ofstream f;
+ f.open(filename.c_str(), std::ios::out );
+ f << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD "
+ << "HTML 4.01 Transitional//EN\">"
+ << "<html><head><title>Help Contents - bbtk "
+ << GetVersion() << "</title>"
+ << "<meta http-equiv=\"Content-Type\" content=\"text/html; "
+ << "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\" "
+ << "target=\"information\">Examples</a>"
+ << "<H2>Guides</H2>"
+ << "<a href=\""
+ << doc_path
+ << "bbtkUsersGuide/bbtkUsersGuide.html"
+ << "\" target=\"information\">User's Guide</a><br>"
+ << "<a href=\""
+ << doc_path
+ << "bbtkPackageDevelopersGuide/bbtkPackageDevelopersGuide.html"
+ << "\" target=\"information\">Package Developer's Guide</a><br>"
+ << "<a href=\""
+ << doc_path
+ << "doxygen/bbtk/main.html"
+ << "\" target=\"information\">bbtk library doxygen doc</a><br>"
+ << "<H2>Boxes</H2>"
+ << "<a target=\"information\" href=\"bbdoc/index-alpha.html\">"
+ << "Alphabetical list</a><br>"
+ << "<a target=\"information\" href=\"bbdoc/index-package.html\">"
+ << "List by package</a><br>"
+ << "<a target=\"information\" href=\"bbdoc/index-category.html\">"
+ << "List by category</a><br>"
+ << "<a target=\"information\" href=\"bbdoc/index-adaptors.html\">"
+ << "List of adaptors</a><br>"
+ << "</body>"
+ << "</html>";
+ }
+ mTemp_path = Utilities::MakeUserSettingsFullFileName("tmp");
+ Utilities::CreateDirectoryIfNeeded(mTemp_path);
+
+ }
+ //=========================================================================
//=========================================================================
void ConfigurationFile::CreateConfigXML( char *rootDirectory )
fprintf(fp, "<config>\n");
fprintf(fp, " <bbs_path> </bbs_path>\n");
fprintf(fp, " <package_path> </package_path>\n");
- fprintf(fp, " <default_temp_dir> $ </default_temp_dir>\n");
fprintf(fp, "</config>\n");
fclose(fp);
}
- //=========================================================================
- // From http://www.fltk.org/newsgroups.php?gfltk.general+v:22083
- //
- int get_app_path (char *pname, size_t pathsize)
- {
-#ifdef LINUX
- /* Oddly, the readlink(2) man page says no NULL is appended. */
- /* So you have to do it yourself, based on the return value: */
- pathsize --; /* Preserve a space to add the trailing NULL */
- long result = readlink("/proc/self/exe", pname, pathsize);
- if (result > 0)
- {
- pname[result] = 0; /* add the #@!%ing NULL */
-
- if ((access(pname, 0) == 0))
- return 0; /* file exists, return OK */
- /*else name doesn't seem to exist, return FAIL (falls
- through) */
- }
-#endif /* LINUX */
-
-#ifdef WIN32
- long result = GetModuleFileName(NULL, pname, pathsize);
- if (result > 0)
- {
- /* fix up the dir slashes... */
- int len = strlen(pname);
- int idx;
- for (idx = 0; idx < len; idx++)
- {
- if (pname[idx] == '\\') pname[idx] = '/';
- }
-
- for (idx = len-1; idx >=0 ; idx--)
- {
- if (pname[idx] == '/')
- {
- pname[idx+1] = '\0';
- idx = -1;
- }
- }
-
- if ((access(pname, 0) == 0))
- return 0; /* file exists, return OK */
- /*else name doesn't seem to exist, return FAIL (falls
- through) */
- }
-#endif /* WIN32 */
-
-#ifdef SOLARIS
- char *p = getexecname();
- if (p)
- {
- /* According to the Sun manpages, getexecname will
- "normally" return an */
- /* absolute path - BUT might not... AND that IF it is not,
- pre-pending */
- /* getcwd() will "usually" be the correct thing... Urgh!
- */
-
- /* check pathname is absolute (begins with a / ???) */
- if (p[0] == '/') /* assume this means we have an
- absolute path */
- {
- strncpy(pname, p, pathsize);
- if ((access(pname, 0) == 0))
- return 0; /* file exists, return OK */
- }
- else /* if not, prepend getcwd() then check if file
- exists */
- {
- getcwd(pname, pathsize);
- long result = strlen(pname);
- strncat(pname, "/", (pathsize - result));
- result ++;
- strncat(pname, p, (pathsize - result));
-
- if ((access(pname, 0) == 0))
- return 0; /* file exists, return OK */
- /*else name doesn't seem to exist, return FAIL
- (falls through) */
- }
- }
-#endif /* SOLARIS */
-
-#ifdef MACOSX /* assume this is OSX */
- /*
- from http://www.hmug.org/man/3/NSModule.html
-
- extern int _NSGetExecutablePath(char *buf, unsigned long
- *bufsize);
-
- _NSGetExecutablePath copies the path of the executable
- into the buffer and returns 0 if the path was successfully
- copied in the provided buffer. If the buffer is not large
- enough, -1 is returned and the expected buffer size is
- copied in *bufsize. Note that _NSGetExecutablePath will
- return "a path" to the executable not a "real path" to the
- executable. That is the path may be a symbolic link and
- not the real file. And with deep directories the total
- bufsize needed could be more than MAXPATHLEN.
- */
- int status = -1;
- char *given_path = (char*)malloc(MAXPATHLEN * 2);
- if (!given_path) return status;
-
- uint32_t npathsize = MAXPATHLEN * 2;
- long result = _NSGetExecutablePath(given_path, &npathsize);
- if (result == 0)
- { /* OK, we got something - now try and resolve the real path...
- */
- if (realpath(given_path, pname) != NULL)
- {
- if ((access(pname, 0) == 0))
- status = 0; /* file exists, return OK */
- }
- }
- free (given_path);
- return status;
-#endif /* MACOSX */
-
- return -1; /* Path Lookup Failed */
- }
-
-
-
- //=========================================================================
- std::string ConfigurationFile::GetExecutablePath()
- {
- char name[PATH_MAX];
- int err = get_app_path(name, PATH_MAX);
- if (err)
- {
- bbtkError("Could not determine current executable path ?");
- }
-
- // remove the exe name
- char *slash;
- slash = strrchr(name, VALID_FILE_SEPARATOR_CHAR);
- if (slash)
- {
- *slash = 0;
- }
- return name;
- }
-
-/*
- /// \todo : Think to delete it!
- char *buf = (char *)malloc(512);
- if (!buf)
- {
- bbtkError("Could not allocate 512 bytes !");
- }
- char *slash;
-
-#if defined(WIN32)
- GetModuleFileName(NULL, buf, 511);
- slash = strrchr(buf, '\\');
- if (slash)
- {
- *slash = 0;
- }
-#endif
-
-
-#if defined(__GNUC__)
- int res;
- res = readlink("/proc/self/exe", buf, 512);
- if (res == -1)
- {
- free(buf);
-
- }
- buf[res] = 0;
- slash = strrchr(buf, '/');
- if (slash)
- {
- *slash = 0;
- }
-#endif
- std::string ret(buf);
- free(buf);
- return ret;
- }
- //=========================================================================
-*/
//=========================================================================
void ConfigurationFile::InstallPath ()
char configPath[200];
sprintf(configPath, "%s/bbtk_config.xml",rootDirectory);
- // makeDir
- char makeDir[250];
- sprintf( makeDir, "mkdir \"%s\" ", rootDirectory);
-
// configXmlTmp
char configXmlTmp[250];
sprintf(configXmlTmp, "%s/bbtk_config.xml.tmp", bbtk_path);
if (!Utilities::FileExists(configXmlTmp)) // bbtk_config.xml.tmp not found (not installed)
{
- if (!Utilities::FileExists(rootDirectory)) // .bbtk not found
- {
- system(makeDir); // create .bbtk
- }
-
// if "bbtk_path/bbtk_config.xml.tmp" doesn't exist, hard-create a minimum version in .bbtk
CreateConfigXML( rootDirectory );// create .bbtk
}
else
{
sprintf(copyFile,"cp %s %s/bbtk_config.xml ",configXmlTmp,rootDirectory );
- if (!Utilities::FileExists(rootDirectory))
- {
- //std::cout << "makeDir[" << makeDir << "]" << std::endl;
- system(makeDir);
- }
-
if (!Utilities::FileExists(configPath))
{
system(copyFile);
if (!Utilities::FileExists(configXmlTmp)) // bbtk_config.xml.tmp not found
{
- if (!Utilities::FileExists(rootDirectory)) // .bbtk not found
- {
- system(makeDir); // create .bbtk
- }
-
// if "bbtk_path/bbtk_config.xml.tmp" doesn't exist, hard-create a minimum version in .bbtk
CreateConfigXML( rootDirectory );// create .bbtk
return;
}
// default_temp_dir
+ /*
if( BB.nChildNode((XMLCSTR)"default_temp_dir") )
GetTextOrClear(BB.getChildNode((XMLCSTR)"default_temp_dir"),mDefault_temp_dir);
size_t pos = mConfig_xml_full_path.find("bbtk_config.xml");
mDefault_temp_dir = mConfig_xml_full_path.substr (0,pos);
}
+ */
GetHelp(2);
}