|
From: <sv...@va...> - 2010-03-11 13:52:49
|
Author: cerion
Date: 2010-03-11 13:52:33 +0000 (Thu, 11 Mar 2010)
New Revision: 489
Log:
reimplemented a bunch of internal tests:
- option tests
- file/dir tests
Modified:
branches/valkyrie_qt4port/mainwindow.cpp
branches/valkyrie_qt4port/objects/memcheck_object.cpp
branches/valkyrie_qt4port/options/vk_option.cpp
branches/valkyrie_qt4port/options/vk_option.h
branches/valkyrie_qt4port/toolview/memcheckview.cpp
branches/valkyrie_qt4port/toolview/memcheckview.h
branches/valkyrie_qt4port/utils/vk_utils.cpp
branches/valkyrie_qt4port/utils/vk_utils.h
Modified: branches/valkyrie_qt4port/mainwindow.cpp
===================================================================
--- branches/valkyrie_qt4port/mainwindow.cpp 2010-03-10 00:44:20 UTC (rev 488)
+++ branches/valkyrie_qt4port/mainwindow.cpp 2010-03-11 13:52:33 UTC (rev 489)
@@ -890,7 +890,7 @@
if ( runState == VkRunState::VALGRIND ) {
int errval = PARSED_OK;
QString bin = vkConfig->rdEntry( "binary", "valkyrie" );
- binaryCheck( &errval, bin );
+ fileCheck( &errval, bin, false, false, true );
if ( errval != PARSED_OK ) {
vkError( this, "Run Tool", "Invalid Binary: Please set a valid binary in Options::Valkyrie." );
Modified: branches/valkyrie_qt4port/objects/memcheck_object.cpp
===================================================================
--- branches/valkyrie_qt4port/objects/memcheck_object.cpp 2010-03-10 00:44:20 UTC (rev 488)
+++ branches/valkyrie_qt4port/objects/memcheck_object.cpp 2010-03-11 13:52:33 UTC (rev 489)
@@ -236,32 +236,32 @@
/* check argval for this option, updating if necessary.
called by parseCmdArgs() and gui option pages -------------------- */
-int Memcheck::checkOptArg( int optid, QString& )//argval )
+int Memcheck::checkOptArg( int optid, QString& argval )
{
vk_assert( optid >= 0 && optid < MEMCHECK::NUM_OPTS );
int errval = PARSED_OK;
-#if 0
- Option* opt = findOption( optid );
+
+ VkOption* opt = getOption( optid );
- switch (( Memcheck::mcOpts )optid ) {
- case PARTIAL:
- case FREELIST:
- case LEAK_RES:
- case SHOW_REACH:
- //case UNDEF_VAL:
- case TRACK_ORI:
- case GCC_296:
- case ALIGNMENT:
+ switch ( (MEMCHECK::mcOptId)optid ) {
+ case MEMCHECK::PARTIAL:
+ case MEMCHECK::FREELIST:
+ case MEMCHECK::LEAK_RES:
+ case MEMCHECK::SHOW_REACH:
+ //case MEMCHECK::UNDEF_VAL:
+ case MEMCHECK::TRACK_ORI:
+ case MEMCHECK::GCC_296:
+ case MEMCHECK::ALIGNMENT:
opt->isValidArg( &errval, argval );
break;
- /* when using xml output from valgrind, this option is preset to
- 'full' by valgrind, so this option should not be used. */
- case LEAK_CHECK:
- /* Note: gui options disabled, so only reaches here from cmdline */
+ // when using xml output from valgrind, this option is preset to
+ // 'full' by valgrind, so this option should not be used.
+ case MEMCHECK::LEAK_CHECK:
+ // Note: gui options disabled, so only reaches here from cmdline
errval = PERROR_BADOPT;
- vkPrintErr( "Option disabled '--%s'", opt->m_longFlag.latin1() );
+ vkPrintErr( "Option disabled '--%s'", qPrintable( opt->longFlag ) );
vkPrintErr( " - Memcheck presets this option to 'full' when generating the required xml output." );
vkPrintErr( " - See valgrind/docs/internals/xml_output.txt." );
break;
@@ -270,8 +270,6 @@
vk_assert_never_reached();
}
-#endif
-
return errval;
}
@@ -474,21 +472,18 @@
QString log_file = vkConfig->value( "valkyrie/view-log" ).toString();
statusMsg( "Parsing '" + log_file + "'" );
- //TODO: file checks
-#if 0
- // check this is a valid file, and has the right perms
+ // check this is a valid file, and has at least read perms
int errval = PARSED_OK;
- QString ret_file = fileCheck( &errval, log_file, true, false );
-
+ QString ret_file = fileCheck( &errval, log_file, true );
+
if ( errval != PARSED_OK ) {
vkError( getToolView(), "File Error", "%s: \n\"%s\"",
parseErrString( errval ),
- escapeEntities( log_file ).latin1() );
+ qPrintable( escapeEntities( log_file ) ) );
return false;
}
log_file = ret_file;
-#endif
// fileSaved true, 'cos we're just parsing an existing file
fileSaved = true;
@@ -498,7 +493,7 @@
qApp->processEvents( QEventLoop::AllEvents, 1000/*max msecs*/ );
// Parse the log
- VgLogReader vgLogFileReader( getToolView()->vgLogPtr() );
+ VgLogReader vgLogFileReader( getToolView()->createVgLog() );
bool success = vgLogFileReader.parse( log_file );
if ( success ) {
@@ -540,7 +535,7 @@
// new vgreader - view may have been recreated, so need up-to-date ptr
vk_assert( vgreader == 0 );
- vgreader = new VgLogReader( getToolView()->vgLogPtr() );
+ vgreader = new VgLogReader( getToolView()->createVgLog() );
// start a new process, listening on exit signal to call processDone().
// - once Vg is done, we can read the remainder of the log in one last go.
Modified: branches/valkyrie_qt4port/options/vk_option.cpp
===================================================================
--- branches/valkyrie_qt4port/options/vk_option.cpp 2010-03-10 00:44:20 UTC (rev 488)
+++ branches/valkyrie_qt4port/options/vk_option.cpp 2010-03-11 13:52:33 UTC (rev 489)
@@ -19,6 +19,7 @@
#include "options/vk_option.h"
#include "utils/vk_config.h"
+#include "utils/vk_utils.h"
/***************************************************************************/
@@ -175,156 +176,292 @@
class VkOption
*/
VkOption::VkOption(
- int optid,
- QString configGrp, QString longFlag, QChar shortFlag,
- QString flagDesc, QString possVals, QVariant dfltValue,
- QString shortHelp, QString longHelp, QString urlAddress,
- VkOPT::ArgType argType, VkOPT::WidgType widgType )
+ int _optid,
+ QString _configGrp, QString _longFlag, QChar _shortFlag,
+ QString _flagDescr, QString _possVals, QVariant _dfltValue,
+ QString _shortHelp, QString _longHelp, QString _urlAddress,
+ VkOPT::ArgType _argType, VkOPT::WidgType _widgType )
{
- this->optid = optid;
- this->configGrp = configGrp;
- this->longFlag = longFlag;
- this->shortFlag = shortFlag;
- this->flagDescr = flagDesc;
- this->possValues = possVals.split( '|', QString::SkipEmptyParts );
- this->dfltValue = dfltValue;
- this->shortHelp = shortHelp;
- this->longHelp = longHelp;
- this->urlAddress = urlAddress;
- this->argType = argType;
- this->widgType = widgType;
+ optid = _optid;
+ configGrp = _configGrp;
+ longFlag = _longFlag;
+ shortFlag = _shortFlag;
+ flagDescr = _flagDescr;
+ possValues = _possVals.split( '|', QString::SkipEmptyParts );
+ dfltValue = _dfltValue;
+ shortHelp = _shortHelp;
+ longHelp = _longHelp;
+ urlAddress = _urlAddress;
+ argType = _argType;
+ widgType = _widgType;
-
- // TODO
-#ifdef VK_DEBUG
-
- /* augment m_longHelp if m_defaultValue not empty */
- if ( m_argType != VkOPTION::NOT_POPT &&
- !m_defaultValue.isEmpty() ) {
- m_longHelp += " [" + m_defaultValue + "]";
+ // augment longHelp if dfltValue not empty
+ if ( argType != VkOPT::NOT_POPT &&
+ !dfltValue.toString().isEmpty() ) {
+ longHelp += " [" + dfltValue.toString() + "]";
}
- /* Assert is valid option ---------------------------------------- */
+ // Assert is valid option ----------------------------------------
if ( 0 ) {
print();
}
- /* we always expect the following fields */
- vk_assert( !m_configGroup.isEmpty() );
- vk_assert( !m_longFlag.isEmpty() );
- vk_assert( !m_longHelp.isEmpty() || !m_shortHelp.isEmpty() );
+ // we always expect the following fields
+ vk_assert( !configGrp.isEmpty() );
+ vk_assert( !longFlag.isEmpty() );
+
+ // no help for internal-config options: short|long help for others
+ if ( argType == VkOPT::NOT_POPT &&
+ widgType == VkOPT::WDG_NONE ) {
+ vk_assert( longHelp.isEmpty() && shortHelp.isEmpty() );
+ } else {
+ vk_assert( !longHelp.isEmpty() || !shortHelp.isEmpty() );
+ }
- /* if ARG_NONE, we don't expect any argument related stuff */
- if ( m_argType == VkOPTION::ARG_NONE ) {
- vk_assert( m_flagDescrip.isEmpty() );
- vk_assert( m_possValues.isEmpty() );
+ // if ARG_NONE, we don't expect any argument related stuff
+ if ( argType == VkOPT::ARG_NONE ) {
+ vk_assert( flagDescr.isEmpty() );
+ vk_assert( possValues.isEmpty() );
}
- /* NOT_POPT options: not for command-line processing */
- if ( m_argType == VkOPTION::NOT_POPT ) {
- /* vk_popt option parsing relies on at least these being non-empty: */
- vk_assert( !m_shortFlag.isNull() || !m_longFlag.isEmpty() );
- /* only short help wanted: used for gui widget text */
- vk_assert( !m_shortHelp.isEmpty() );
- vk_assert( m_longHelp.isEmpty() );
+ // NOT_POPT options: not for command-line processing
+ if ( argType == VkOPT::NOT_POPT ) {
+
+ // vk_popt option parsing relies on at least these being non-empty:
+ vk_assert( !shortFlag.isNull() || !longFlag.isEmpty() );
+
+ // gui-only options
+ if ( widgType != VkOPT::WDG_NONE ) {
+ // only short help wanted: used for gui widget text
+ vk_assert( !shortHelp.isEmpty() );
+ vk_assert( longHelp.isEmpty() );
+ }
+ // else NOT_POPT && WDG_NONE => internal configure options only.
}
- /* ARG_PWR2 options */
- if ( m_argType == VkOPTION::ARG_PWR2 ) {
- /* min|max */
- vk_assert( m_possValues.count() == 2 );
- /* m_defaultValue, m_possValues must all be powers of 2 */
- vk_assert( isPowerOfTwo( m_defaultValue ) );
- vk_assert( isPowerOfTwo( m_possValues[0] ) );
- vk_assert( isPowerOfTwo( m_possValues[1] ) );
- /* min <= default <= max */
+ // ARG_PWR2 options
+ if ( argType == VkOPT::ARG_PWR2 ) {
+ // min|max
+ vk_assert( possValues.count() == 2 );
+ // dfltValue, possValues must all be powers of 2
+ vk_assert( isPowerOfTwo( dfltValue.toString() ) );
+ vk_assert( isPowerOfTwo( possValues[0] ) );
+ vk_assert( isPowerOfTwo( possValues[1] ) );
+ // min <= default <= max
bool ok;
- unsigned long dflt = m_defaultValue.toULong( &ok );
+ unsigned long dflt = dfltValue.toString().toULong( &ok );
vk_assert( ok );
- unsigned long min = m_possValues[0].toULong( &ok );
+ unsigned long min = possValues[0].toULong( &ok );
vk_assert( ok );
- unsigned long max = m_possValues[1].toULong( &ok );
+ unsigned long max = possValues[1].toULong( &ok );
vk_assert( ok );
vk_assert( min <= dflt );
vk_assert( dflt <= max );
}
- /* ARG_UINT options */
- if ( m_argType == VkOPTION::ARG_UINT ) {
- /* except don't test cachegrind's horrible cache options */
- bool dontTest = ( m_configGroup == "cachegrind" &&
- ( m_longFlag == "I1" ||
- m_longFlag == "D1" ||
- m_longFlag == "L2" ) );
+ // ARG_UINT options
+ if ( argType == VkOPT::ARG_UINT ) {
+ // except don't test cachegrind's horrible cache options
+ bool dontTest = ( configGrp == "cachegrind" &&
+ ( longFlag == "I1" ||
+ longFlag == "D1" ||
+ longFlag == "L2" ) );
- if ( !dontTest ) {
- /* min|max */
- vk_assert( m_possValues.count() == 2 );
- /* min <= default <= max */
+ if ( dontTest ) {
+ VK_DEBUG( "Warning: Not performing UInt value test for option: %s",
+ qPrintable( longFlag ) );
+ } else {
+ // min|max
+ vk_assert( possValues.count() == 2 );
+ // min <= default <= max
bool ok;
- unsigned long dflt = m_defaultValue.toULong( &ok );
+ unsigned long dflt = dfltValue.toString().toULong( &ok );
vk_assert( ok );
- unsigned long min = m_possValues[0].toULong( &ok );
+ unsigned long min = possValues[0].toULong( &ok );
vk_assert( ok );
- unsigned long max = m_possValues[1].toULong( &ok );
+ unsigned long max = possValues[1].toULong( &ok );
vk_assert( ok );
vk_assert( min <= dflt );
vk_assert( dflt <= max );
}
}
- /* ARG_BOOL options */
- if ( m_argType == VkOPTION::ARG_BOOL ) {
- /* true|false (in various guises) */
- vk_assert( m_possValues.count() == 2 );
- /* accepted bool forms: */
- QString t = m_possValues[0];
- QString f = m_possValues[1];
+ // ARG_BOOL options
+ if ( argType == VkOPT::ARG_BOOL ) {
+ // true|false (in various guises)
+ vk_assert( possValues.count() == 2 );
+ // accepted bool forms:
+ QString t = possValues[0];
+ QString f = possValues[1];
vk_assert( t == "true" || t == "on" || t == "yes" || t == "1" || t == "T" );
vk_assert( f == "false" || f == "off" || f == "no" || f == "0" || f == "F" );
}
- /* OptWidget relies on bool values being in order <true|false> */
- if ( m_widgType == VkOPTION::WDG_CHECK ||
- m_widgType == VkOPTION::WDG_RADIO ) {
+ // OptWidget relies on bool values being in order <true|false>
+ if ( widgType == VkOPT::WDG_CHECK ||
+ widgType == VkOPT::WDG_RADIO ) {
- vk_assert( m_possValues.count() == 2 );
+ vk_assert( possValues.count() == 2 );
- QString yes = m_possValues[0];
- QString no = m_possValues[1];
+ QString yes = possValues[0];
+ QString no = possValues[1];
vk_assert( yes == "1" || yes == "on" || yes == "yes" || yes == "true" );
- vk_assert( no == "0" || no == "off" || no == "no" || no == "false" );
+ vk_assert( no == "0" || no == "off" || no == "no" || no == "false" );
}
-
-#endif
}
-
-#if 0 // TODO
-/* for debugging */
-void Option::print()
-{
- vkPrint( "m_key = %d", m_key );
- vkPrint( "m_widgType = %d", m_widgType );
- vkPrint( "m_argType = %d", m_argType );
- vkPrint( "m_shortFlag = %c", m_shortFlag.latin1() );
- vkPrint( "m_longFlag = %s", m_longFlag.latin1() );
- vkPrint( "m_flagDescrip = %s", m_flagDescrip.latin1() );
- vkPrint( "m_shortHelp = %s", m_shortHelp.latin1() );
- vkPrint( "m_longHelp = %s", m_longHelp.latin1() );
- vkPrint( "m_urlHelp = %s", m_urlHelp.latin1() );
- vkPrint( "m_defaultValue = %s", m_defaultValue.latin1() );
- vkPrint( "m_configGroup = %s", m_configGroup.latin1() );
- vkPrint( "m_possValues = |%s|", m_possValues.join( "|" ).latin1() );
- vkPrint( " " );
+/*!
+ configuration settings (QSettings) key for persistent storage:
+*/
+QString VkOption::configKey() {
+ return configGrp + "/" + longFlag;
}
-#endif
+/*!
+ update
+*/
void VkOption::updateConfig( QVariant argVal )
{
vkConfig->setValue( configKey(), argVal );
emit valueChanged();
}
+
+
+/*!
+ tests for potential argument update
+*/
+bool VkOption::isValidArg( int* err_val, QString argval )
+{
+ *err_val = PARSED_OK;
+ switch ( argType ) {
+
+ // eg. possValues == { 0, 4 }, ie. min=0, max=4
+ case VkOPT::ARG_UINT: {
+ vk_assert( possValues.count() == 2 );
+ // is this a number?
+ bool ok;
+ unsigned int val = argval.toUInt(&ok);
+ if (!ok)
+ *err_val = PERROR_BADNUMBER;
+ else { // looking good ...
+ unsigned int min = possValues[0].toUInt(&ok);
+ vk_assert(ok);
+ unsigned int max = possValues[1].toUInt(&ok);
+ vk_assert(ok);
+ if ( val < min || val > max ) {
+ *err_val = PERROR_OUTOFRANGE;
+ }
+ }
+ }
+ break;
+
+ // eg. possValues == { 2, 16 }, ie. min=2, max=16
+ case VkOPT::ARG_PWR2: {
+ vk_assert( possValues.count() == 2 );
+ // is this a number?
+ bool ok;
+ unsigned long val = argval.toULong(&ok);
+ if (!ok)
+ *err_val = PERROR_BADNUMBER;
+ else { // looking good ...
+ // is this a power of 2?
+ if ( isPowerOfTwo( argval, err_val ) ) { // looking better ...
+ unsigned long min = possValues[0].toULong();
+ unsigned long max = possValues[1].toULong();
+ if ( val < min || val > max ) {
+ *err_val = PERROR_OUTOFRANGE;
+ }
+ }
+ }
+ } break;
+
+ // possValues == { memcheck, addrcheck, ... }
+ case VkOPT::ARG_STRING: {
+ if ( ! possValues.contains( argval ) ) {
+ *err_val = PERROR_BADARG;
+ }
+ } break;
+
+ // possValues == { yes|true, no|false } or whatever
+ case VkOPT::ARG_BOOL: {
+ vk_assert( possValues.count() == 2 );
+ if ( argval != possValues[0] &&
+ argval != possValues[1] ) {
+ *err_val = PERROR_BADARG;
+ }
+ } break;
+
+ // this option is only ever called from within an options page via
+ // radio buttons etc., so the values can never be typed in. ergo,
+ // don't bother to check.
+ case VkOPT::NOT_POPT:
+ break;
+
+ // this should never happen: only relevant to popt short help options.
+ case VkOPT::ARG_NONE:
+ vk_assert_never_reached();
+ break;
+
+ default:
+ vk_assert_never_reached();
+ break;
+ }
+
+ return ( *err_val == PARSED_OK );
+}
+
+
+// static fn
+bool VkOption::isPowerOfTwo( QString argval, int *err_val/*=0*/ )
+{
+ bool ok;
+ unsigned long val = argval.toULong(&ok);
+
+ if ( !ok ) {
+ if (err_val)
+ *err_val = PERROR_BADNUMBER;
+ return false;
+ }
+
+ switch ( val ) {
+ case 1: case 2: case 4: case 8:
+ case 16: case 32: case 64: case 128:
+ case 256: case 512: case 1024: case 2048:
+ case 4096: case 8192: case 16384: case 32768:
+ case 65536: case 131072: case 262144: case 524288:
+ case 1048576: case 2097152: case 4194304: case 8388608:
+ break;
+ default:
+ if (err_val)
+ *err_val = PERROR_POWER_OF_TWO;
+ return false;
+ }
+
+ if (err_val)
+ *err_val = PARSED_OK;
+ return true;
+}
+
+
+/*!
+ for debugging
+*/
+void VkOption::print()
+{
+ vkPrint( "optid = %d", optid );
+ vkPrint( "widgType = %d", widgType );
+ vkPrint( "argType = %d", argType );
+ vkPrint( "shortFlag = %c", shortFlag.toLatin1() );
+ vkPrint( "longFlag = %s", qPrintable( longFlag ) );
+ vkPrint( "flagDescr = %s", qPrintable( flagDescr ) );
+ vkPrint( "shortHelp = %s", qPrintable( shortHelp ) );
+ vkPrint( "longHelp = %s", qPrintable( longHelp ) );
+ vkPrint( "urlAddress = %s", qPrintable( urlAddress ) );
+ vkPrint( "dfltValue = %s", qPrintable( dfltValue.toString() ) );
+ vkPrint( "configGrp = %s", qPrintable( configGrp ) );
+ vkPrint( "possValues = |%s|", qPrintable( possValues.join( "|" ) ) );
+ vkPrint( " " );
+}
Modified: branches/valkyrie_qt4port/options/vk_option.h
===================================================================
--- branches/valkyrie_qt4port/options/vk_option.h 2010-03-10 00:44:20 UTC (rev 488)
+++ branches/valkyrie_qt4port/options/vk_option.h 2010-03-11 13:52:33 UTC (rev 489)
@@ -93,21 +93,9 @@
#define PERROR_POWER_OF_TWO -31 /* number not a power of two */
#define PERROR_BADVERSION -32 /* bad program version */
-
-#if 0
-// ============================================================
-// helper functions
-QString fileCheck( int* err_val, const QString fpath,
- bool rd_perms, bool wr_perms );
-QString binaryCheck( int* err_val, const QString exe_name );
-QString dirCheck( int* err_val, const QString fpath,
- bool rd_perms, bool wr_perms );
-#endif
-
const char* parseErrString( const int error );
-
// ============================================================
class VkOptionHash
{
@@ -160,7 +148,10 @@
VkOPT::ArgType arg_type,
VkOPT::WidgType w_type
);
-
+
+ bool isValidArg( int* err_val, QString argval );
+ static bool isPowerOfTwo( QString argval, int* err_val=0 );
+
signals:
void valueChanged();
@@ -173,18 +164,20 @@
QString flagDescr; // eg. <file>
QStringList possValues; // eg. low | med | high
QVariant dfltValue; // eg. [low]
+ // - QVariant to support QSettings::setValue()
+ // See this->updateConfig()
QString shortHelp; // txt for OptionsWindow
QString longHelp; // txt for help --> stdout
QString urlAddress; // context help url
VkOPT::ArgType argType; // eg. ARG_UINT
VkOPT::WidgType widgType; // eg. VkOPTION::WDG_LEDIT
- // configuration settings key:
- QString configKey() {
- return configGrp + "/" + longFlag;
- }
+ QString configKey();
void updateConfig( QVariant argVal );
+
+private:
+ void print();
};
#endif // __VK_OPTION_H
Modified: branches/valkyrie_qt4port/toolview/memcheckview.cpp
===================================================================
--- branches/valkyrie_qt4port/toolview/memcheckview.cpp 2010-03-10 00:44:20 UTC (rev 488)
+++ branches/valkyrie_qt4port/toolview/memcheckview.cpp 2010-03-11 13:52:33 UTC (rev 489)
@@ -55,7 +55,7 @@
Constructs a MemcheckView with the given \a parent.
*/
MemcheckView::MemcheckView( QWidget* parent )
- : ToolView( parent, VGTOOL::ID_MEMCHECK )
+ : ToolView( parent, VGTOOL::ID_MEMCHECK ), logview(0)
{
setObjectName( QString::fromUtf8( "MemcheckView" ) );
@@ -78,9 +78,6 @@
// launch editor with src file loaded
connect( treeView, SIGNAL( itemDoubleClicked( QTreeWidgetItem*, int ) ),
this, SLOT( launchEditor( QTreeWidgetItem* ) ) );
-
-
- logview = new VgLogView( treeView );
}
@@ -104,12 +101,12 @@
This should be called by the tool-object just before it intends
to fill the log.
*/
-VgLog* MemcheckView::vgLogPtr()
+VgLog* MemcheckView::createVgLog()
{
if ( logview != 0 ) {
delete logview;
- logview = new VgLogView( treeView );
}
+ logview = new VgLogView( treeView );
return ( VgLog* )logview;
}
Modified: branches/valkyrie_qt4port/toolview/memcheckview.h
===================================================================
--- branches/valkyrie_qt4port/toolview/memcheckview.h 2010-03-10 00:44:20 UTC (rev 488)
+++ branches/valkyrie_qt4port/toolview/memcheckview.h 2010-03-11 13:52:33 UTC (rev 489)
@@ -52,7 +52,7 @@
MemcheckView( QWidget* parent );
~MemcheckView();
- VgLog* vgLogPtr();
+ VgLog* createVgLog();
public slots:
virtual void setState( bool run );
Modified: branches/valkyrie_qt4port/utils/vk_utils.cpp
===================================================================
--- branches/valkyrie_qt4port/utils/vk_utils.cpp 2010-03-10 00:44:20 UTC (rev 488)
+++ branches/valkyrie_qt4port/utils/vk_utils.cpp 2010-03-11 13:52:33 UTC (rev 489)
@@ -18,12 +18,14 @@
****************************************************************************/
#include "vk_utils.h"
+#include "options/vk_option.h"
#include "utils/vk_config.h" // vkname()
#include <cstdlib> // exit, mkstemp, free/malloc, etc
#include <QDateTime>
#include <QFile>
+#include <QFileInfo>
#include <QRegExp>
#include <QString>
@@ -80,7 +82,7 @@
/* prints debug msg -------------------------------------------------- */
void vkDebug( const char* msg, ... )
{
-#ifdef DEBUG
+#ifdef DEBUG_ON
QByteArray ba = vkConfig->vkName.toLatin1();
const char* vkname = vkConfig ? ba.constData() : "";
va_list ap;
@@ -312,3 +314,141 @@
}
+
+
+
+
+//***************************************************************************
+// helper functions
+//***************************************************************************
+
+/*!
+ Local helper function to find file_name: either directly or via $PATH
+ Returns absolute path to file_name.
+*/
+static QString getFileAbsPath( const QString file_name )
+{
+ QString absPath = QString::null;
+
+ if ( QFile::exists( file_name ) ) {
+ // file_name exists: get its absolute path.
+ absPath = QFileInfo( file_name ).absoluteFilePath();
+ }
+ else if ( !file_name.contains('/') ) {
+ // no '/' in file_name -> try $PATH env variable
+ QString env = getenv( "PATH" );
+ QStringList paths = env.split( ':' );
+
+ foreach ( QString candidate, paths ) {
+ candidate += "/" + file_name;
+ if ( QFile::exists( candidate ) ) {
+ // found it! set its absolute path.
+ absPath = QFileInfo( candidate ).absoluteFilePath();
+ break;
+ }
+ }
+ }
+
+ return absPath;
+}
+
+
+/*!
+ Checks file exists and has correct permissions.
+ Returns absolute path to file, if it exists: else QString::null
+*/
+QString fileCheck( int* err_val, const QString fpath,
+ bool check_read/*=false*/,
+ bool check_write/*=false*/,
+ bool check_exe/*=false*/ )
+{
+ *err_val = PARSED_OK;
+ QString absPath = QString::null;
+ QFileInfo fi( fpath );
+
+ // check exists: if so, return absolute path
+ if ( fpath.isEmpty() ) {
+ *err_val = PERROR_BADFILE;
+ goto bye;
+ }
+
+ // try to find fpath: directly or via $PATH
+ absPath = getFileAbsPath( fpath );
+ if ( absPath.isNull() ) {
+ // couldn't find fpath :-(
+ *err_val = PERROR_BADFILE;
+ goto bye;
+ }
+
+ // check this is really a file
+ if ( !fi.isFile() ) {
+ *err_val = PERROR_BADFILE;
+ goto bye;
+ }
+
+ // check for read permissions
+ if ( check_read && !fi.isReadable() ) {
+ *err_val = PERROR_BADFILERD;
+ goto bye;
+ }
+
+ // check for write permissions
+ if ( check_write && !fi.isWritable() ) {
+ *err_val = PERROR_BADFILEWR;
+ goto bye;
+ }
+
+ // check for executable permissions
+ if ( check_exe && !fi.isExecutable() ) {
+ *err_val = PERROR_BADEXEC;
+ goto bye;
+ }
+
+bye:
+ return absPath;
+}
+
+
+/*!
+ Checks dir exists and has correct permissions.
+ Returns absolute path to dir, if it exists: else QString::null
+*/
+QString dirCheck( int* err_val, const QString dir,
+ bool check_read/*=false*/,
+ bool check_write/*=false*/,
+ bool check_exe/*=false*/ )
+{
+ *err_val = PARSED_OK;
+ QString absPath = QString::null;
+ QFileInfo fi( dir );
+
+ // check exists: if so, return absolute path
+ if ( dir.isEmpty() || !fi.exists() || !fi.isDir() ) {
+ *err_val = PERROR_BADDIR;
+ goto bye;
+ }
+
+ // dir exists: set its absolute path
+ absPath = fi.absolutePath();
+
+ // check for read permissions
+ if ( check_read && !fi.isReadable() ) {
+ *err_val = PERROR_BADFILERD;
+ goto bye;
+ }
+
+ // check for write permissions
+ if ( check_write && !fi.isWritable() ) {
+ *err_val = PERROR_BADFILEWR;
+ goto bye;
+ }
+
+ // check for executable permissions
+ if ( check_exe && !fi.isExecutable() ) {
+ *err_val = PERROR_BADEXEC;
+ goto bye;
+ }
+
+bye:
+ return absPath;
+}
Modified: branches/valkyrie_qt4port/utils/vk_utils.h
===================================================================
--- branches/valkyrie_qt4port/utils/vk_utils.h 2010-03-10 00:44:20 UTC (rev 488)
+++ branches/valkyrie_qt4port/utils/vk_utils.h 2010-03-11 13:52:33 UTC (rev 489)
@@ -129,4 +129,18 @@
char* vk_strdup( const char* str );
+
+
+
+// ============================================================
+// helper functions
+QString fileCheck( int* err_val, const QString fpath,
+ bool check_read=false, bool check_write=false,
+ bool check_exe=false );
+
+QString dirCheck( int* err_val, const QString fpath,
+ bool check_read=false, bool check_write=false,
+ bool check_exe=false );
+
+
#endif
|