doc_path += "bbdoc";
doc_path += bbtk::ConfigurationFile::GetInstance().Get_file_separator();
- I->InterpretLine( "exec freeze");
+ I->InterpretLine( "exec freeze_no_error");
I->InterpretLine( "include *");
I->GetExecuter()->GetFactory()->CreateHtmlIndex(bbtk::Factory::Initials,doc_path + "index-alpha.html");
I->GetExecuter()->GetFactory()->CreateHtmlIndex(bbtk::Factory::Packages,doc_path + "index-package.html");
bbtk::Interpreter::Pointer I = bbtk::Interpreter::New();
I->SetCommandLine(true);
I->SetThrow(false);
- I->InterpretLine( "exec freeze");
+ I->InterpretLine( "exec freeze_no_error");
if (pack != "-a")
{
I->InterpretLine( "include "+pack);
FILES ${IMAGES}
DESTINATION ${BBTK_DATA_INSTALL_PATH}/kernel/icons
)
+
+CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/bbStudioSplashScreen.png
+ ${BBTK_DATA_BUILD_PATH}/kernel/icons/bbStudioSplashScreen.png
+ COPYONLY
+)
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);
}
Program: bbtk
Module: $RCSfile: bbtkConfigurationFile.h,v $
Language: C++
- Date: $Date: 2008/10/17 08:18:13 $
- Version: $Revision: 1.10 $
+ Date: $Date: 2009/01/27 14:22:56 $
+ Version: $Revision: 1.11 $
=========================================================================*/
/* ---------------------------------------------------------------------
~ConfigurationFile();
- private:
- ConfigurationFile();
- void InstallPath ();
-
- public:
void GetHelp(int level) const;
+ /// Returns true iff the directory .bbtk has been created on construction
+ inline bool DotBbtkIsNew() { return mDot_bbtk_is_new; }
+
inline const std::string& Get_description() const
{ return mDescription;}
- // inline const std::string& Get_url() const
- // { return mUrl;}
+
inline const std::string& Get_data_path() const
{ return mData_path;}
inline const std::string& Get_file_separator() const
{ return mFile_separator;}
+ inline const std::string& Get_dot_bbtk_path() const
+ { return mDot_bbtk_path;}
inline const std::string& Get_bin_path() const
{ return mBin_path;}
inline const std::string& Get_install_path() const
{ return mInstall_path;}
inline const std::string& Get_doc_path() const
{ return mDoc_path;}
- inline const std::string& Get_rsc_path() const
- { return mRsc_path;}
-
+
inline const std::string& Get_root_bbs_path() const
{ return mBbs_path;}
inline const std::vector<std::string>& Get_bbs_paths() const
inline const std::string& Get_config_xml_full_path() const
{ return mConfig_xml_full_path;}
inline const std::string& Get_default_temp_dir() const
- { return mDefault_temp_dir;}
+ { return mTemp_path;}
bool AddPackagePathsAndWrite( const std::string& package_root_path );
private:
+ ConfigurationFile();
+ void InstallPath ();
void Read(const std::string& fileName);
- std::string GetExecutablePath();
- void CreateConfigXML( char *rootDirectory );
-
+ void CreateConfigXML( char *rootDirectory );
+ void InitializeDotBbtkStructure();
// Attributes :
private :
std::string mDescription;
/// Set automatically :
/// The path to the executable (usually bbi)
std::string mBin_path;
+ /// The path to the .bbtk user's dir (e.g. /home/username/.bbtk)
+ std::string mDot_bbtk_path;
/// The path to the install prefix (=mBinPath+"/..")
std::string mInstall_path;
- /// The relative path to the doc folder (=BBTK_DOC_REL_PATH)
- std::string mDoc_rel_path;
- /// The path to the doc folder (=mInstall_path+"/"+mDoc_rel_path)
+ /// The path to the doc folder (=mDot_bbtk_path+"/doc")
std::string mDoc_path;
+ /// Temp directory for generated data (=mDot_bbtk_path+"/tmp")
+ std::string mTemp_path;
/// The relative path to the doc folder (=BBTK_BBS_REL_PATH)
std::string mBbs_rel_path;
/// The path to the bbs folder (=mInstall_path+"/"+mBbs_rel_path)
std::string mBbs_path;
- /// The relative path to the rsc folder (=BBTK_RSC_REL_PATH)
- std::string mRsc_rel_path;
- /// The path to the rsc folder (=mInstall_path+"/"+mRsc_rel_path)
- std::string mRsc_path;
/// The path to the bbtk data folder
/// Initialized to mInstall_path+"/"+BBTK_DATA_REL_PATH
/// But can be overriden by value read from bbtk_config.xml
std::vector<std::string> mPackage_paths;
/// If Packages link against extern dlls
std::vector<std::string> mExt_dll_paths;
- /// Temp directory for generated data
- std::string mDefault_temp_dir;
- };
+
+
+ /// Set to true by InitializeDotBbtkStructure() if .bbtk has been newly
+ /// created
+ bool mDot_bbtk_is_new;
+ };
}// namespace bbtk
Program: bbtk
Module: $RCSfile: bbtkExecuter.cxx,v $
Language: C++
- Date: $Date: 2009/01/13 08:45:27 $
- Version: $Revision: 1.26 $
+ Date: $Date: 2009/01/27 14:22:56 $
+ Version: $Revision: 1.27 $
=========================================================================*/
/* ---------------------------------------------------------------------
mRootPackage(),
mRootCBB(),
mNoExecMode(false),
- mDialogMode(NoDialog)
+ mDialogMode(NoDialog),
+ mNoErrorMode(false)
{
bbtkDebugMessageInc("Kernel",9,"Executer::Executer()" <<std::endl);
mFactory = Factory::New();
Program: bbtk
Module: $RCSfile: bbtkInterpreter.cxx,v $
Language: C++
- Date: $Date: 2008/12/15 09:04:47 $
- Version: $Revision: 1.81 $
+ Date: $Date: 2009/01/27 14:22:57 $
+ Version: $Revision: 1.82 $
=========================================================================*/
/* ---------------------------------------------------------------------
//=======================================================================
void Interpreter::CatchInterpreterException( const InterpreterException& e )
{
+ if (GetExecuter()->GetNoErrorMode())
+ {
+ bbtkWarning("ERROR :"<<e.GetErrorMessage()
+ <<" ("<<e.GetScriptFile()<<":"<<e.GetScriptLine()
+ <<" skipped");
+
+ return;
+ }
if (mThrow)
{
if (e.GetErrorMessage()!="break")
//=======================================================================
void Interpreter::CatchBbtkException( const bbtk::Exception& e )
{
+ if (GetExecuter()->GetNoErrorMode())
+ {
+ std::string file("?");
+ int line = 0;
+ if (mFileName.size()) {
+ file = mFileName.back();
+ line = mLine.back();
+ }
+ bbtkWarning("ERROR '"<<e.GetErrorMessage()
+ <<"' ("<<file<<":"<<line<<") skipped");
+
+ return;
+ }
mStatus = Interpreter_ERROR;
if (mThrow)
{
//=======================================================================
void Interpreter::CatchStdException( const std::exception& e )
{
+ if (GetExecuter()->GetNoErrorMode())
+ {
+ std::string file("?");
+ int line = 0;
+ if (mFileName.size()) {
+ file = mFileName.back();
+ line = mLine.back();
+ }
+ bbtkWarning("ERROR '"<<e.what()
+ <<"' ("<<file<<":"<<line<<") skipped");
+
+ return;
+ }
mStatus = Interpreter_ERROR;
if (mThrow)
{
//=======================================================================
void Interpreter::CatchUnknownException()
{
+ if (GetExecuter()->GetNoErrorMode())
+ {
+ std::string file("?");
+ int line = 0;
+ if (mFileName.size()) {
+ file = mFileName.back();
+ line = mLine.back();
+ }
+ bbtkWarning("UNDEFINED ERROR "
+ <<"("<<file<<":"<<line<<") skipped");
+ return;
+ }
mStatus = Interpreter_ERROR;
if (mThrow)
{
mVirtualExecuter->SetNoExecMode(true);
mThrow = false;
}
- else if (words[1]=="freeze_no_error ")
+ else if (words[1]=="freeze_no_error")
{
mVirtualExecuter->SetNoExecMode(true);
mVirtualExecuter->SetNoErrorMode(true);
Program: bbtk
Module: $RCSfile: bbtkUtilities.cxx,v $
Language: C++
- Date: $Date: 2008/12/12 10:20:48 $
- Version: $Revision: 1.10 $
+ Date: $Date: 2009/01/27 14:22:57 $
+ Version: $Revision: 1.11 $
=========================================================================*/
/* ---------------------------------------------------------------------
}
return libname;
}
+ // =======================================================================
+
+ // =======================================================================
+ /// Returns the user settings dir, e.g. /home/username/.bbtk
+ std::string Utilities::GetUserSettingsDir()
+ {
+#if defined(__GNUC__)
+ std::string str_home(getenv("HOME"));
+#elif defined(_WIN32)
+ std::string str_home(getenv("USERPROFILE"));
+#endif
+ std::string fullname = str_home + "/.bbtk";
+ MakeValidFileName(fullname);
+ return fullname;
+ }
+
// =======================================================================
/// Builds the complete path to the file 'name' located
std::string str_home(getenv("USERPROFILE"));
#endif
std::string fullname = str_home + "/.bbtk/" + name;
- Utilities::replace( fullname,
- INVALID_FILE_SEPARATOR ,
- VALID_FILE_SEPARATOR);
+ MakeValidFileName(fullname);
return fullname;
}
+ // =======================================================================
+ // =======================================================================
+ void Utilities::CreateDirectoryIfNeeded( std::string const &dirName)
+ {
+ if (FileExists(dirName)) return;
+ std::string cmd("mkdir \"");
+ cmd += dirName;
+ cmd += "\"";
+ system(cmd.c_str());
+ }
+ // =======================================================================
+
+
+ //========================================================================
+ bool Utilities::IsAtRoot(std::string cwd)
+ {
+ if ( cwd == "/" // hope it gets / (for Linux)
+ || (cwd.size() <= 3 && cwd[1] == ':') ) // hope it gets C: D: (for Windows)
+ return (true);
+ else
+ return(false);
+ }
+ // ======================================================================
- //========================================================================
-
- bool Utilities::IsAtRoot(std::string cwd)
- {
- if ( cwd == "/" // hope it gets / (for Linux)
- || (cwd.size() <= 3 && cwd[1] == ':') ) // hope it gets C: D: (for Windows)
- return (true);
- else
- return(false);
- }
-
- // ======================================================================
+ // ======================================================================
+ bool Utilities::IsDirectory(std::string const &dirName)
+ {
+ struct stat fs;
- bool Utilities::IsDirectory(std::string const &dirName)
- {
- struct stat fs;
-
- if ( stat(dirName.c_str(), &fs) == 0 )
- {
+ if ( stat(dirName.c_str(), &fs) == 0 )
+ {
#if _WIN32
- return ((fs.st_mode & _S_IFDIR) != 0);
+ return ((fs.st_mode & _S_IFDIR) != 0);
#else
- return S_ISDIR(fs.st_mode);
+ return S_ISDIR(fs.st_mode);
#endif
- }
- else
- {
- return false;
- }
- }
-
- // ===================================================================================
-
- void Utilities::SplitAroundFirstDot( const std::string& in,
- std::string& left,
- std::string& right)
- {
- std::string delimiter = ".";
- std::string::size_type pos = in.find_first_of(delimiter);
- if (std::string::npos != pos)
- {
- left = in.substr(0,pos);
- right = in.substr(pos+1,in.size());
-
- }
- else
- {
- left ="";
- right = "";
- bbtkGlobalError("Token '"<<in<<"' : expected 'a.b' format but no dot found");
- }
- }
- //=======================================================================
- void Utilities::SplitString ( const std::string& str,
- const std::string& delimiters,
- std::vector<std::string>& tokens)
- {
- // Skip delimiters at beginning.
- std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
- // Find first delimiter.
- std::string::size_type pos = str.find_first_of(delimiters, lastPos);
-
- while (std::string::npos != pos || std::string::npos != lastPos)
- {
- // Found a token, add it to the vector.
- tokens.push_back(str.substr(lastPos, pos - lastPos));
- // Skip delimiters. Note the "not_of"
- lastPos = str.find_first_not_of(delimiters, pos);
- // Find next delimiter
- pos = str.find_first_of(delimiters, lastPos);
- }
-
- }
- //=======================================================================
-
+ }
+ else
+ {
+ return false;
+ }
+ }
+ // =======================================================================
- // ===================================================================================
+ // =======================================================================
+ void Utilities::SplitAroundFirstDot( const std::string& in,
+ std::string& left,
+ std::string& right)
+ {
+ std::string delimiter = ".";
+ std::string::size_type pos = in.find_first_of(delimiter);
+ if (std::string::npos != pos)
+ {
+ left = in.substr(0,pos);
+ right = in.substr(pos+1,in.size());
+
+ }
+ else
+ {
+ left ="";
+ right = "";
+ bbtkGlobalError("Token '"<<in<<"' : expected 'a.b' format but no dot found");
+ }
+ }
+ //=======================================================================
+
+ //=======================================================================
+ void Utilities::SplitString ( const std::string& str,
+ const std::string& delimiters,
+ std::vector<std::string>& tokens)
+ {
+ // Skip delimiters at beginning.
+ std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
+ // Find first delimiter.
+ std::string::size_type pos = str.find_first_of(delimiters, lastPos);
- std::string Utilities::get_file_name(const std::string& s)
- {
- std::string::size_type slash_position = s.find_last_of("/\\");
- if (slash_position != std::string::npos)
- {
- return s.substr(slash_position+1,std::string::npos);
- }
- else
- {
- return s;
- }
- }
+ while (std::string::npos != pos || std::string::npos != lastPos)
+ {
+ // Found a token, add it to the vector.
+ tokens.push_back(str.substr(lastPos, pos - lastPos));
+ // Skip delimiters. Note the "not_of"
+ lastPos = str.find_first_not_of(delimiters, pos);
+ // Find next delimiter
+ pos = str.find_first_of(delimiters, lastPos);
+ }
- // ===================================================================================
- /**
- * \brief Explore a directory with possibility of recursion
- * return number of files read
- * @param dirpath directory to explore
- * @param recursive whether we want recursion or not
- */
- int Utilities::Explore(std::string const &dirpath, bool recursive, std::vector<std::string> &Filenames)
- {
- int numberOfFiles = 0;
- std::string fileName;
+ }
+ //=======================================================================
+
+
+ // ======================================================================
+ std::string Utilities::get_file_name(const std::string& s)
+ {
+ std::string::size_type slash_position = s.find_last_of("/\\");
+ if (slash_position != std::string::npos)
+ {
+ return s.substr(slash_position+1,std::string::npos);
+ }
+ else
+ {
+ return s;
+ }
+ }
+ //=======================================================================
+
+
+ // ========================================================================
+ /**
+ * \brief Explore a directory with possibility of recursion
+ * return number of files read
+ * @param dirpath directory to explore
+ * @param recursive whether we want recursion or not
+ */
+ int Utilities::Explore(std::string const &dirpath, bool recursive, std::vector<std::string> &Filenames)
+ {
+ int numberOfFiles = 0;
+ std::string fileName;
std::string dirName = dirpath;
return numberOfFiles;
}
-
+ //=======================================================================
+
//=======================================================================
// Replaces substrings "\\n" by a real carriage return "\n"
//=======================================================================
+ //=======================================================================
-bool Utilities::loosematch(std::string stdLine,std::string stdOptions)
-{
- bool result=false;
- std::vector<std::string> tokens;
- SplitString ( stdOptions,"|", tokens);
- int i,size=tokens.size();
- for (i=0; i<size; i++)
- {
+ bool Utilities::loosematch(std::string stdLine,std::string stdOptions)
+ {
+ bool result=false;
+ std::vector<std::string> tokens;
+ SplitString ( stdOptions,"|", tokens);
+ int i,size=tokens.size();
+ for (i=0; i<size; i++)
+ {
#ifdef WIN32
- if ( strcmpi(stdLine.c_str(),tokens[i].c_str())==0)
- {
- result=true;
- }
+ if ( strcmpi(stdLine.c_str(),tokens[i].c_str())==0)
+ {
+ result=true;
+ }
#else
- if ( strcasecmp(stdLine.c_str(),tokens[i].c_str())==0)
- {
- result=true;
- }
+ if ( strcasecmp(stdLine.c_str(),tokens[i].c_str())==0)
+ {
+ result=true;
+ }
#endif
-
+
+ }
+ return result;
+ }
+ //=========================================================================
+
+ //=========================================================================
+ // 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] = '/';
}
- return result;
-}
+
+ 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 Utilities::GetExecutablePath()
+ {
+ char name[PATH_MAX];
+ int err = get_app_path(name, PATH_MAX);
+ if (err)
+ {
+ bbtkGlobalError("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;
+ }
+ //=========================================================================
Program: bbtk
Module: $RCSfile: bbtkUtilities.h,v $
Language: C++
- Date: $Date: 2008/10/22 09:16:16 $
- Version: $Revision: 1.18 $
+ Date: $Date: 2009/01/27 14:22:57 $
+ Version: $Revision: 1.19 $
=========================================================================*/
/* ---------------------------------------------------------------------
/// Holds various usefull methods
struct BBTK_EXPORT Utilities
{
-
+ // ======================================================================
+ static std::string GetExecutablePath();
+
// ======================================================================
// See : http://www.techbytes.ca/techbyte103.html for more O.S.
static bool FileExists(std::string strFilename);
// =====================================================================
-
static std::string ExtractPackageName(const std::string &name,
std::string& path);
-
+
//=====================================================================
static std::string ExtractScriptName(const std::string &name,
std::string& path);
-
+
// ========================================================================
-
static std::string ExpandLibName(const std::string &name, bool verbose);
-
-// ===================================================================================
-
- static std::string MakeLibnameFromPath(std::string path, std::string pkgname);
-
-// ===================================================================================
-
- static std::string MakePkgnameFromPath(std::string path, std::string pkgname, bool addExt);
+
+ // =======================================================================
+ static std::string MakeLibnameFromPath(std::string path, std::string pkgname);
+
+ // =====================================================================
+ static std::string MakePkgnameFromPath(std::string path,
+ std::string pkgname, bool addExt);
//========================================================================
+
// =======================================================================
- /// Builds the complete path to the file 'name' located
- /// in user settings dir, e.g. /home/username/.bbtk/
- static std::string MakeUserSettingsFullFileName(const std::string& name);
+ /// Makes a valid filename with string (replaces invalid file seps
+ /// by valid ones)
+ static inline void MakeValidFileName(std::string& name)
+ {
+ replace( name,
+ INVALID_FILE_SEPARATOR ,
+ VALID_FILE_SEPARATOR);
+ }
+ // =======================================================================
+ /// Returns the user settings dir, e.g. /home/username/.bbtk
+ static std::string GetUserSettingsDir();
+ // =======================================================================
+ /// Builds the complete path to the file 'name' located
+ /// in user settings dir, e.g. /home/username/.bbtk/
+ static std::string MakeUserSettingsFullFileName(const std::string& name);
+
+
static bool IsAtRoot(std::string cwd);
// ======================================================================
static bool IsDirectory(std::string const &dirName);
- // ===================================================================================
+
+ static void CreateDirectoryIfNeeded( std::string const &dirName);
+ // =======================================================================
static void SplitAroundFirstDot( const std::string& in,
- std::string& left,
+ std::string& left,
std::string& right);
- //=======================================================================
+ //======================================================================
static void SplitString ( const std::string& str,
const std::string& delimiters,
std::vector<std::string>& tokens);
- //=======================================================================
+ //====================================================================
- // ===================================================================================
+ // ====================================================================
static std::string get_file_name(const std::string& s) ;
-
- // ===================================================================================
+
+ // ====================================================================
/**
* \brief Explore a directory with possibility of recursion
* return number of files read
* @param recursive whether we want recursion or not
*/
static int Explore(std::string const &dirpath, bool recursive, std::vector<std::string> &Filenames);
-
-
+
+
//=======================================================================
// Replaces substrings "\\n" by a real carriage return "\n"
static void SubsBackslashN ( std::string& s );
Program: bbtk
Module: $RCSfile: bbtkWx.cxx,v $
Language: C++
- Date: $Date: 2008/10/21 13:55:49 $
- Version: $Revision: 1.11 $
+ Date: $Date: 2009/01/27 14:22:57 $
+ Version: $Revision: 1.12 $
=========================================================================*/
/* ---------------------------------------------------------------------
Wx::BusyCursor::BusyCursor()
{
mCursor = 0;
- if (TopWindowExists())
+ if (wxApp::GetInstance()!=0)
{
bbtkDebugMessage("wx",2,
- "Wx::BusyCursor::BusyCursor()"<<std::endl);
- mCursor = new wxBusyCursor;
- //::wxBeginBusyCursor();
+ "Wx::BusyCursor::BusyCursor() : creating new cursor"
+ <<std::endl);
+ mCursor = new wxBusyCursor;
}
}
Wx::BusyCursor::~BusyCursor()
{
- if (mCursor) delete mCursor;
+ if (mCursor)
+ {
+ delete mCursor;
+ bbtkDebugMessage("wx",2,
+ "Wx::BusyCursor::~BusyCursor() : deleting cursor"<<std::endl);
+ }
}
//=========================================================================
Program: bbtk
Module: $RCSfile: bbtkWxGUIScriptingInterface.cxx,v $
Language: C++
- Date: $Date: 2008/12/15 09:04:47 $
- Version: $Revision: 1.32 $
+ Date: $Date: 2009/01/27 14:22:57 $
+ Version: $Revision: 1.33 $
=========================================================================*/
/* ---------------------------------------------------------------------
#include "bbtkUtilities.h"
#include <wx/tipwin.h>
+#include <wx/splash.h>
//#include "icons/cc_run.xpm"
: wxFrame((wxFrame *)parent, -1, _T("bbStudio"),
wxDefaultPosition, wxSize(1200,800) )
{
- // m_mgr = new wxAuiManager(this);
m_mgr.SetManagedWindow(this);
mInterpreter = bbtk::Interpreter::New();
// LoadPerspective();
mBreaked = false;
+
+ wxBitmap bitmap;
+ wxSplashScreen* splash;
+ long style = wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT;
+ if (ConfigurationFile::GetInstance().DotBbtkIsNew())
+ style = wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT;
+ std::string splash_file = ConfigurationFile::GetInstance().Get_data_path();
+ splash_file += "/kernel/icons/bbStudioSplashScreen.png";
+
+ if (bitmap.LoadFile(std2wx(splash_file),wxBITMAP_TYPE_PNG))
+ splash =
+ new wxSplashScreen(bitmap,
+ style,
+ 1000, 0, -1, wxDefaultPosition, wxDefaultSize,
+ wxSIMPLE_BORDER|wxSTAY_ON_TOP);
+
- wxTipWindow* tip = new wxTipWindow(this,
- _T("\n Welcome to bbStudio !\n\n To run a demo or example:\n 1. click on the 'Demos' or 'Examples' link\n 2. select a demo or example\n 3. click on the '[source]' link : the source file is loaded in bbStudio\n 4. click on the 'Run' button (the arrow at the bottom right of the source file) \n"),1000);
- tip->CenterOnParent();
- tip->Show();
+ if (ConfigurationFile::GetInstance().DotBbtkIsNew())
+ {
+
+ DoRegeneratePackageDoc("-a");
+ DoRegenerateBoxesLists();
+
+ /*
+ wxTipWindow* tip = new wxTipWindow(this,
+ _T("\n Welcome to bbStudio !\n\n To run a demo or example:\n 1. click on the 'Demos' or 'Examples' link\n 2. select a demo or example\n 3. click on the '[source]' link : the source file is loaded in bbStudio\n 4. click on the 'Run' button (the arrow at the bottom right of the source file) \n"),1000);
+ tip->CenterOnParent();
+ tip->Show();
+ */
+ if (splash) splash->Destroy();
+ }
+
}
//================================================================
void WxGUIScriptingInterface::DoRegeneratePackageDoc( const std::string& pack )
{
- std::string command;
+ std::string mess("Regenerating doc for package '");
+ if (pack!="-a")
+ mess += pack + "'";
+ else
+ mess = "Regenerating doc for all packages";
+ mess += " ... please wait";
+
+ SetStatusText( std2wx(mess) );
+
+ BBTK_BUSY_CURSOR;
+
+ std::string command;
#if defined(WIN32)
- command = "\"";
+ command = "\"";
#endif
- command += ConfigurationFile::GetInstance().Get_bin_path();
+ command += ConfigurationFile::GetInstance().Get_bin_path();
command += ConfigurationFile::GetInstance().Get_file_separator();
command += "bbRegeneratePackageDoc";
#if defined(WIN32)
if ( ! system ( command.c_str() ) )
{
- wxMessageBox(_T("Done !"),_T("Regenerate package '")+std2wx(pack)+_T("' doc"),
+ SetStatusText( _T("Done !"));
+ /*
+ wxMessageBox(_T("Done !"),_T("Regenerate package '")
+ +std2wx(pack)+_T("' doc"),
wxOK | wxICON_INFORMATION);
+ */
}
else
{
+ SetStatusText( _T("Done !"));
wxString err(_T("An error occured while running '"));
err += bbtk::std2wx(command) + _T("'");
wxMessageBox(err,_T("Regenerate package doc"),wxOK | wxICON_ERROR);
}
+
+
+
}
//================================================================
+ //================================================================
void WxGUIScriptingInterface::DoRegenerateBoxesLists()
{
+ SetStatusText( _T("Regenerating boxes lists ... please wait") );
+ BBTK_BUSY_CURSOR ;
+
std::string command;
#if defined(WIN32)
command = "\"";
command += " -q";
bbtkMessage("debug",1,"Executing system command '"<<command<<"'"<<std::endl);
- if ( ! system ( command.c_str() ) )
- {
- wxMessageBox(_T("Done !"),_T("Regenerate boxes lists"),
- wxOK | wxICON_INFORMATION);
- }
- else
- {
- wxString err(_T("An error occured while running '"));
- err += bbtk::std2wx(command) + _T("'");
- wxMessageBox(err,_T("Regenerate boxes lists"),wxOK | wxICON_ERROR);
- }
+
+
+ if ( ! system ( command.c_str() ) )
+ {
+ SetStatusText( _T("Done !"));
+ /*
+ wxMessageBox(_T("Done !"),_T("Regenerate boxes lists"),
+ wxOK | wxICON_INFORMATION);
+ */
+ }
+ else
+ {
+ SetStatusText( _T("Done !"));
+ wxString err(_T("An error occured while running '"));
+ err += bbtk::std2wx(command) + _T("'");
+ wxMessageBox(err,_T("Regenerate boxes lists"),wxOK | wxICON_ERROR);
+ }
}
+ //================================================================
+
//================================================================
void WxGUIScriptingInterface::OnMenuRegenerateBoxesLists(wxCommandEvent& WXUNUSED(event))