From 117c67c86db20fda6b6b2437afe0427d9cdcb7c0 Mon Sep 17 00:00:00 2001 From: Michael Andres Date: Sun, 11 Dec 2005 23:39:29 +0000 Subject: [PATCH] - Pathname,PathInfo - Classes and associated types were moved into namespace zypp:fileststem. - static PathInfo methods operating on files/dirs were moved into namespace zypp:fileststem (now outside class Pathinfo). - classes Pathname,PathInfo are still available in namespace zypp. - removed stringutil.{h,cc} Usefull stuff was moved in to namespace zypp:str (String.h) - added base/IOStream.h std::stream related utilities in namespace zypp:iostr. - getline: Read one line from stream. - forEachLine: Simple lineparser: Call a functor for each line in file. - added base/Fd.h safe handlich of oen()/close() on filedescriptors. - media/* - Fixed MediaException decl. - Fixed MediaAccess::Ptr/consPtr (should be intrusive_ptr as class is derived from ReferenceCounted) - Fixed all code locations which throw, to use ZYPP_THROW --- devel/Example.createCapabilities.cc | 38 +- devel/devel.ma/Main.cc | 44 +- zypp/@DOXYGEN/DOXYGEN.h | 4 + zypp/@DOXYGEN/g_RAII | 0 zypp/@DOXYGEN/g_Resolvable | 45 ++ zypp/@DOXYGEN/g_ResolvableImpl | 0 zypp/@DOXYGEN/g_ResolvableImplIf | 0 zypp/@Review/PathInfo.cc | 775 -------------------- zypp/@Review/PathInfo.h | 491 ------------- zypp/@Review/Pathname.cc | 293 -------- zypp/@Review/Pathname.h | 118 --- zypp/@Review/stringutil.cc | 119 --- zypp/@Review/stringutil.h | 180 ----- zypp/PathInfo.cc | 1379 +++++++++++++++++------------------ zypp/PathInfo.h | 716 ++++++++++-------- zypp/Pathname.cc | 404 +++++----- zypp/Pathname.h | 237 +++--- zypp/Resolvable.h | 8 - zypp/base/Exception.h | 1 + zypp/base/Fd.cc | 61 ++ zypp/base/Fd.h | 83 +++ zypp/base/IOStream.cc | 50 ++ zypp/base/IOStream.h | 83 +++ zypp/base/Makefile.am | 10 +- zypp/base/ReferenceCounted.h | 6 + zypp/base/String.cc | 42 +- zypp/base/String.h | 164 +++++ zypp/base/stringutil.cc | 298 -------- zypp/base/stringutil.h | 326 --------- zypp/media/MediaAccess.cc | 18 +- zypp/media/MediaAccess.h | 14 +- zypp/media/MediaCurl.cc | 77 +- zypp/media/MediaException.h | 10 +- zypp/media/MediaHandler.cc | 85 ++- zypp/media/MediaHandler.h | 34 +- 35 files changed, 2085 insertions(+), 4128 deletions(-) create mode 100644 zypp/@DOXYGEN/g_RAII create mode 100644 zypp/@DOXYGEN/g_Resolvable create mode 100644 zypp/@DOXYGEN/g_ResolvableImpl create mode 100644 zypp/@DOXYGEN/g_ResolvableImplIf delete mode 100644 zypp/@Review/PathInfo.cc delete mode 100644 zypp/@Review/PathInfo.h delete mode 100644 zypp/@Review/Pathname.cc delete mode 100644 zypp/@Review/Pathname.h create mode 100644 zypp/base/Fd.cc create mode 100644 zypp/base/Fd.h create mode 100644 zypp/base/IOStream.cc create mode 100644 zypp/base/IOStream.h delete mode 100644 zypp/base/stringutil.cc delete mode 100644 zypp/base/stringutil.h diff --git a/devel/Example.createCapabilities.cc b/devel/Example.createCapabilities.cc index ad196a5..75a0e5c 100644 --- a/devel/Example.createCapabilities.cc +++ b/devel/Example.createCapabilities.cc @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -48,39 +49,6 @@ ostream & operator<<( ostream & str, const istream & obj ) { } /////////////////////////////////////////////////////////////////// -// Return one line from stream -std::string getline( std::istream & str ) -{ - static const unsigned tmpBuffLen = 1024; - static char tmpBuff[tmpBuffLen]; - string ret; - do { - str.clear(); - str.getline( tmpBuff, tmpBuffLen ); // always writes '\0' terminated - ret += tmpBuff; - } while( str.rdstate() == ios::failbit ); - - return ret; -} - -/////////////////////////////////////////////////////////////////// -// Simple lineparser: Call function do_r for each line. -template - _Function & forEachLine( std::istream & str_r, _Function & do_r ) - { - while ( str_r ) - { - std::string l = getline( str_r ); - if ( ! (str_r.fail() || str_r.bad()) ) - { - // l contains valid data to be consumed. - do_r( l ); - } - } - return do_r; - } - -/////////////////////////////////////////////////////////////////// // Fits forEachLine. A simple 'do' function void collect( const std::string & linre_r ) { @@ -117,7 +85,7 @@ struct ImpatientCollector : public Collector virtual void doConsume( const std::string & line_r ) { if ( _lineNo == 1234 ) - ZYPP_THROW( "takes to long" ); + ZYPP_THROW( Exception, "takes to long" ); } }; /////////////////////////////////////////////////////////////////// @@ -307,7 +275,7 @@ int main( int argc, char * argv[] ) PackageParseCollector datacollect; try { - forEachLine( str, datacollect ); + iostr::forEachLine( str, datacollect ); } catch ( Exception & excpt_r ) { diff --git a/devel/devel.ma/Main.cc b/devel/devel.ma/Main.cc index c8c8254..15f8dc1 100644 --- a/devel/devel.ma/Main.cc +++ b/devel/devel.ma/Main.cc @@ -2,46 +2,15 @@ #include "zypp/base/Logger.h" #include "zypp/base/PtrTypes.h" #include "zypp/base/Exception.h" +#include "zypp/base/Fd.h" +#include "zypp/Pathname.h" using namespace std; using namespace zypp; -class MediaException : public Exception -{ - public: - MediaException( const std::string & msg_r ) - : Exception( msg_r ) - {} -}; - -void ex() -{ - try - { - ZYPP_THROW( Exception, "plain exeption" ); - } - catch ( Exception & excpt ) - { - ZYPP_CAUGHT( excpt ); - } -} - -void mex() -{ - try - { - ZYPP_THROW( MediaException, "media error" ); - } - catch ( MediaException & excpt ) - { - SEC << "CAUGHT MediaException" << endl; - ZYPP_CAUGHT( excpt ); - } - catch ( Exception & excpt ) - { - ZYPP_CAUGHT( excpt ); - } -} +#include +#include +#include /****************************************************************** @@ -56,8 +25,7 @@ int main( int argc, char * argv[] ) { INT << "===[START]==========================================" << endl; - ex(); - mex(); + base::Fd( "packages", O_RDONLY ); INT << "===[END]============================================" << endl; return 0; diff --git a/zypp/@DOXYGEN/DOXYGEN.h b/zypp/@DOXYGEN/DOXYGEN.h index 99a503d..3fcbdb6 100644 --- a/zypp/@DOXYGEN/DOXYGEN.h +++ b/zypp/@DOXYGEN/DOXYGEN.h @@ -28,6 +28,10 @@ * \verbinclude g_EnumerationClass */ //////////////////////////////////////////////////////////////////////////////// +/*! \defgroup g_RAII RAII soloutions + * \verbinclude g_RAII +*/ +//////////////////////////////////////////////////////////////////////////////// /*! \defgroup g_BackenSpecific Backend Specific * \verbinclude g_BackenSpecific */ diff --git a/zypp/@DOXYGEN/g_RAII b/zypp/@DOXYGEN/g_RAII new file mode 100644 index 0000000..e69de29 diff --git a/zypp/@DOXYGEN/g_Resolvable b/zypp/@DOXYGEN/g_Resolvable new file mode 100644 index 0000000..f60dc47 --- /dev/null +++ b/zypp/@DOXYGEN/g_Resolvable @@ -0,0 +1,45 @@ +Resolvables are reference counted objects. They are usually created and +provided by some kind of Source. They are accessed via smart Ptr classes, +which handle the reference counting. + + Resolvable (identification and dependencies) + ^ + ResObject (common data, mostly UI driven: summary descrition...) + ^ + Package, Patch,... (object specific data) + + +The Ptr types are typedefed inside the classes: + + Resolvable::Ptr (--> Resolvable*) + Resolvable::constPtr (--> const Resolvable*) + + ResObject::Ptr, ... accordingly. + +Automatic conversion is the same as with ordinary pointer. + +Available casts are: + + base::static_pointer_cast + base::const_pointer_cast + base::dynamic_pointer_cast + + + +Structure +========= + + base::ReferenceCounted + ^ + ------------------------------------------------------- + + Resolvable <---------+ + ^ backlink + ResObject +-----------ResObjectImplIf + ^ ^ + Package PackageImplIf + + ------------------------------------------------------- + ^ ^ + ResImplConnect --------> MyPackageImplementation + diff --git a/zypp/@DOXYGEN/g_ResolvableImpl b/zypp/@DOXYGEN/g_ResolvableImpl new file mode 100644 index 0000000..e69de29 diff --git a/zypp/@DOXYGEN/g_ResolvableImplIf b/zypp/@DOXYGEN/g_ResolvableImplIf new file mode 100644 index 0000000..e69de29 diff --git a/zypp/@Review/PathInfo.cc b/zypp/@Review/PathInfo.cc deleted file mode 100644 index 372392c..0000000 --- a/zypp/@Review/PathInfo.cc +++ /dev/null @@ -1,775 +0,0 @@ -/*---------------------------------------------------------------------\ -| | -| __ __ ____ _____ ____ | -| \ \ / /_ _/ ___|_ _|___ \ | -| \ V / _` \___ \ | | __) | | -| | | (_| |___) || | / __/ | -| |_|\__,_|____/ |_| |_____| | -| | -| core system | -| (C) SuSE GmbH | -\----------------------------------------------------------------------/ - - File: PathInfo.cc - - Author: Michael Andres - Maintainer: Michael Andres - -/-*/ - -#include -#include -#include - -#include -#include -#include - -#include -#include - -using namespace std; - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::PathInfo -// METHOD TYPE : Constructor -// -// DESCRIPTION : -// -PathInfo::PathInfo( const Pathname & path, Mode initial ) - : path_t( path ) - , mode_e( initial ) - , error_i( -1 ) -{ - operator()(); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::PathInfo -// METHOD TYPE : Constructor -// -// DESCRIPTION : -// -PathInfo::PathInfo( const string & path, Mode initial ) - : path_t( path ) - , mode_e( initial ) - , error_i( -1 ) -{ - operator()(); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::PathInfo -// METHOD TYPE : Constructor -// -// DESCRIPTION : -// -PathInfo::PathInfo( const char * path, Mode initial ) - : path_t( path ) - , mode_e( initial ) - , error_i( -1 ) -{ - operator()(); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::~PathInfo -// METHOD TYPE : Destructor -// -// DESCRIPTION : -// -PathInfo::~PathInfo() -{ -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::operator() -// METHOD TYPE : bool -// -// DESCRIPTION : -// -bool PathInfo::operator()() -{ - if ( path_t.empty() ) { - error_i = -1; - } else { - switch ( mode_e ) { - case STAT: - error_i = ::stat( path_t.asString().c_str(), &statbuf_C ); - break; - case LSTAT: - error_i = ::lstat( path_t.asString().c_str(), &statbuf_C ); - break; - } - if ( error_i == -1 ) - error_i = errno; - } - return !error_i; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::fileType -// METHOD TYPE : PathInfo::file_type -// -PathInfo::file_type PathInfo::fileType() const -{ - if ( isExist() ) - return stat_mode( st_mode() ).fileType(); - return NOT_EXIST; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::userMay -// METHOD TYPE : mode_t -// -// DESCRIPTION : -// -mode_t PathInfo::userMay() const -{ - if ( !isExist() ) - return 0; - if ( owner() == getuid() ) { - return( uperm()/0100 ); - } else if ( group() == getgid() ) { - return( gperm()/010 ); - } - return operm(); -} - -/****************************************************************** -** -** -** FUNCTION NAME : operator<< -** FUNCTION TYPE : ostream & -** -** DESCRIPTION : -*/ -ostream & operator<<( ostream & str, const PathInfo & obj ) -{ - ios::fmtflags state_ii = str.flags(); - - str << obj.asString() << "{"; - if ( !obj.isExist() ) { - str << "does not exist}"; - } else { - str << PathInfo::stat_mode( obj.st_mode() ) << " " << dec << obj.owner() << "/" << obj.group(); - - if ( obj.isFile() ) - str << " size " << obj.size(); - - str << "}"; - } - str.flags( state_ii ); - return str; -} - -/****************************************************************** -** -** -** FUNCTION NAME : operator<< -** FUNCTION TYPE : std::ostream & -** -** DESCRIPTION : -*/ -ostream & operator<<( ostream & str, PathInfo::file_type obj ) -{ - switch ( obj ) { -#define EMUMOUT(T) case PathInfo::T: return str << #T; break - EMUMOUT( NOT_AVAIL ); - EMUMOUT( NOT_EXIST ); - EMUMOUT( T_FILE ); - EMUMOUT( T_DIR ); - EMUMOUT( T_CHARDEV ); - EMUMOUT( T_BLOCKDEV ); - EMUMOUT( T_FIFO ); - EMUMOUT( T_LINK ); - EMUMOUT( T_SOCKET ); -#undef EMUMOUT - } - return str; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::stat_mode::fileType -// METHOD TYPE : PathInfo::file_type -// -PathInfo::file_type PathInfo::stat_mode::fileType() const -{ - if ( isFile() ) - return T_FILE; - if ( isDir() ) - return T_DIR; - if ( isLink() ) - return T_LINK; - if ( isChr() ) - return T_CHARDEV; - if ( isBlk() ) - return T_BLOCKDEV; - if ( isFifo() ) - return T_FIFO; - if ( isSock() ) - return T_SOCKET ; - - return NOT_AVAIL; -} - -/****************************************************************** -** -** -** FUNCTION NAME : operator<< -** FUNCTION TYPE : std::ostream & -** -** DESCRIPTION : -*/ -std::ostream & operator<<( std::ostream & str, const PathInfo::stat_mode & obj ) -{ - ios::fmtflags state_ii = str.flags(); - char t = '?'; - if ( obj.isFile() ) - t = '-'; - else if ( obj.isDir() ) - t = 'd'; - else if ( obj.isLink() ) - t = 'l'; - else if ( obj.isChr() ) - t = 'c'; - else if ( obj.isBlk() ) - t = 'b'; - else if ( obj.isFifo() ) - t = 'p'; - else if ( obj.isSock() ) - t = 's'; - - str << t << " " << setfill( '0' ) << setw( 4 ) << oct << obj.perm(); - str.flags( state_ii ); - return str; -} - -/****************************************************************** -** -** -** FUNCTION NAME : _Log_Result -** FUNCTION TYPE : int -** -** DESCRIPTION : Helper function to log return values. -*/ -inline int _Log_Result( const int res, const char * rclass = "errno" ) -{ - if ( res ) - DBG << " FAILED: " << rclass << " " << res; - DBG << endl; - return res; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::mkdir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::mkdir( const Pathname & path, unsigned mode ) -{ - DBG << "mkdir " << path << ' ' << stringutil::octstring( mode ); - if ( ::mkdir( path.asString().c_str(), mode ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::assert_dir() -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::assert_dir( const Pathname & path, unsigned mode ) -{ - string::size_type pos, lastpos = 0; - string spath = path.asString()+"/"; - int ret = 0; - - if(path.empty()) - return ENOENT; - - // skip ./ - if(path.relative()) - lastpos=2; - // skip / - else - lastpos=1; - -// DBG << "about to create " << spath << endl; - while((pos = spath.find('/',lastpos)) != string::npos ) - { - string dir = spath.substr(0,pos); - ret = ::mkdir(dir.c_str(), mode); - if(ret == -1) - { - // ignore errors about already existing directorys - if(errno == EEXIST) - ret=0; - else - ret=errno; - } -// DBG << "creating directory " << dir << (ret?" failed":" succeeded") << endl; - lastpos = pos+1; - } - return ret; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::rmdir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::rmdir( const Pathname & path ) -{ - DBG << "rmdir " << path; - if ( ::rmdir( path.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::recursive_rmdir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::recursive_rmdir( const Pathname & path ) -{ - DBG << "recursive_rmdir " << path << ' '; - PathInfo p( path ); - - if ( !p.isExist() ) { - return _Log_Result( 0 ); - } - - if ( !p.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - const char *const argv[] = { - "/bin/rm", - "-rf", - "--preserve-root", - "--", - path.asString().c_str(), - NULL - }; - - ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::clean_dir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::clean_dir( const Pathname & path ) -{ - DBG << "clean_dir " << path << ' '; - PathInfo p( path ); - - if ( !p.isExist() ) { - return _Log_Result( 0 ); - } - - if ( !p.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - string cmd( stringutil::form( "cd '%s' && rm -rf --preserve-root -- *", path.asString().c_str() ) ); - ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::copy_dir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::copy_dir( const Pathname & srcpath, const Pathname & destpath ) -{ - DBG << "copy_dir " << srcpath << " -> " << destpath << ' '; - - PathInfo sp( srcpath ); - if ( !sp.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - PathInfo dp( destpath ); - if ( !dp.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - PathInfo tp( destpath + srcpath.basename() ); - if ( tp.isExist() ) { - return _Log_Result( EEXIST ); - } - - - const char *const argv[] = { - "/bin/cp", - "-dR", - "--", - srcpath.asString().c_str(), - destpath.asString().c_str(), - NULL - }; - ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::readdir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::readdir( std::list & retlist, - const Pathname & path, bool dots ) -{ - retlist.clear(); - - DBG << "readdir " << path << ' '; - - DIR * dir = ::opendir( path.asString().c_str() ); - if ( ! dir ) { - return _Log_Result( errno ); - } - - struct dirent *entry; - while ( (entry = ::readdir( dir )) != 0 ) { - - if ( entry->d_name[0] == '.' ) { - if ( !dots ) - continue; - if ( entry->d_name[1] == '\0' - || ( entry->d_name[1] == '.' - && entry->d_name[2] == '\0' ) ) - continue; - } - retlist.push_back( entry->d_name ); - } - - ::closedir( dir ); - - return _Log_Result( 0 ); -} - - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::readdir -// METHOD TYPE : int -// -int PathInfo::readdir( dircontent & retlist, const Pathname & path, - bool dots, Mode statmode ) -{ - retlist.clear(); - - list content; - int res = readdir( content, path, dots ); - - if ( !res ) { - for ( list::const_iterator it = content.begin(); it != content.end(); ++it ) { - PathInfo p( path + *it, statmode ); - retlist.push_back( direntry( *it, p.fileType() ) ); - } - } - - return res; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::unlink -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::unlink( const Pathname & path ) -{ - DBG << "unlink " << path; - if ( ::unlink( path.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::rename -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::rename( const Pathname & oldpath, const Pathname & newpath ) -{ - DBG << "rename " << oldpath << " -> " << newpath; - if ( ::rename( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::copy -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::copy( const Pathname & file, const Pathname & dest ) -{ - DBG << "copy " << file << " -> " << dest << ' '; - - PathInfo sp( file ); - if ( !sp.isFile() ) { - return _Log_Result( EINVAL ); - } - - PathInfo dp( dest ); - if ( dp.isDir() ) { - return _Log_Result( EISDIR ); - } - - const char *const argv[] = { - "/bin/cp", - "--", - file.asString().c_str(), - dest.asString().c_str(), - NULL - }; - ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::symlink -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::symlink( const Pathname & oldpath, const Pathname & newpath ) -{ - DBG << "symlink " << newpath << " -> " << oldpath; - if ( ::symlink( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::hardlink -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::hardlink( const Pathname & oldpath, const Pathname & newpath ) -{ - DBG << "hardlink " << newpath << " -> " << oldpath; - if ( ::link( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::copy_file2dir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::copy_file2dir( const Pathname & file, const Pathname & dest ) -{ - DBG << "copy_file2dir " << file << " -> " << dest << ' '; - - PathInfo sp( file ); - if ( !sp.isFile() ) { - return _Log_Result( EINVAL ); - } - - PathInfo dp( dest ); - if ( !dp.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - const char *const argv[] = { - "/bin/cp", - "--", - file.asString().c_str(), - dest.asString().c_str(), - NULL - }; - ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::md5sum -// METHOD TYPE : std::string -// -std::string PathInfo::md5sum( const Pathname & file ) -{ - if ( ! PathInfo( file ).isFile() ) { - return string(); - } - ifstream istr( file.asString().c_str() ); - if ( ! istr ) { - return string(); - } - return Digest::digest( "MD5", istr ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::sha1sum -// METHOD TYPE : std::string -// -std::string PathInfo::sha1sum( const Pathname & file ) -{ - if ( ! PathInfo( file ).isFile() ) { - return string(); - } - ifstream istr( file.asString().c_str() ); - if ( ! istr ) { - return string(); - } - return Digest::digest( "SHA1", istr ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::erase -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::erase( const Pathname & path ) -{ - int res = 0; - PathInfo p( path, LSTAT ); - if ( p.isExist() ) - { - if ( p.isDir() ) - res = PathInfo::recursive_rmdir( path ); - else - res = PathInfo::unlink( path ); - } - return res; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::chmod -// METHOD TYPE : int -// -int PathInfo::chmod( const Pathname & path, mode_t mode ) -{ - DBG << "chmod " << path << ' ' << stringutil::octstring( mode ); - if ( ::chmod( path.asString().c_str(), mode ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::zipType -// METHOD TYPE : PathInfo::ZIP_TYPE -// -PathInfo::ZIP_TYPE PathInfo::zipType( const Pathname & file ) -{ - ZIP_TYPE ret = ZT_NONE; - - int fd = open( file.asString().c_str(), O_RDONLY ); - - if ( fd != -1 ) { - const int magicSize = 3; - unsigned char magic[magicSize]; - memset( magic, 0, magicSize ); - if ( read( fd, magic, magicSize ) == magicSize ) { - if ( magic[0] == 0037 && magic[1] == 0213 ) { - ret = ZT_GZ; - } else if ( magic[0] == 'B' && magic[1] == 'Z' && magic[2] == 'h' ) { - ret = ZT_BZ2; - } - } - close( fd ); - } - - return ret; -} diff --git a/zypp/@Review/PathInfo.h b/zypp/@Review/PathInfo.h deleted file mode 100644 index c87439a..0000000 --- a/zypp/@Review/PathInfo.h +++ /dev/null @@ -1,491 +0,0 @@ -/*---------------------------------------------------------------------\ -| | -| __ __ ____ _____ ____ | -| \ \ / /_ _/ ___|_ _|___ \ | -| \ V / _` \___ \ | | __) | | -| | | (_| |___) || | / __/ | -| |_|\__,_|____/ |_| |_____| | -| | -| core system | -| (C) SuSE GmbH | -\----------------------------------------------------------------------/ - - File: PathInfo.h - - Author: Michael Andres - Maintainer: Michael Andres - -/-*/ -#ifndef PathInfo_h -#define PathInfo_h - -extern "C" -{ -#include -#include -#include -#include -#include -} - -#include -#include -#include -#include -#include - -#include - -/////////////////////////////////////////////////////////////////// -// -// CLASS NAME : PathInfo -/** - * @short Wrapper class for ::stat/::lstat and other file/directory related operations. - **/ -class PathInfo { - - friend std::ostream & operator<<( std::ostream & str, const PathInfo & obj ); - - public: - - enum Mode { STAT, LSTAT }; - - enum file_type { - NOT_AVAIL = 0x00, // no typeinfo available - NOT_EXIST = 0x01, // file does not exist - T_FILE = 0x02, - T_DIR = 0x04, - T_CHARDEV = 0x08, - T_BLOCKDEV = 0x10, - T_FIFO = 0x20, - T_LINK = 0x40, - T_SOCKET = 0x80 - }; - friend std::ostream & operator<<( std::ostream & str, file_type obj ); - - /** - * Wrapper class for mode_t values as derived from ::stat - **/ - class stat_mode; - - /** - * Simple cache remembering device/inode to detect hardlinks. - **/ - class devino_cache; - - private: - - Pathname path_t; - - struct stat statbuf_C; - Mode mode_e; - int error_i; - - public: - - PathInfo( const Pathname & path = "", Mode initial = STAT ); - PathInfo( const std::string & path, Mode initial = STAT ); - PathInfo( const char * path, Mode initial = STAT ); - virtual ~PathInfo(); - - const Pathname & path() const { return path_t; } - const std::string & asString() const { return path_t.asString(); } - Mode mode() const { return mode_e; } - int error() const { return error_i; } - - void setPath( const Pathname & path ) { if ( path != path_t ) error_i = -1; path_t = path; } - void setMode( Mode mode ) { if ( mode != mode_e ) error_i = -1; mode_e = mode; } - - bool stat ( const Pathname & path ) { setPath( path ); setMode( STAT ); return operator()(); } - bool lstat ( const Pathname & path ) { setPath( path ); setMode( LSTAT ); return operator()(); } - bool operator()( const Pathname & path ) { setPath( path ); return operator()(); } - - bool stat() { setMode( STAT ); return operator()(); } - bool lstat() { setMode( LSTAT ); return operator()(); } - bool operator()(); - - public: - - bool isExist() const { return !error_i; } - - // file type - file_type fileType() const; - - bool isFile() const { return isExist() && S_ISREG( statbuf_C.st_mode ); } - bool isDir () const { return isExist() && S_ISDIR( statbuf_C.st_mode ); } - bool isLink() const { return isExist() && S_ISLNK( statbuf_C.st_mode ); } - bool isChr() const { return isExist() && S_ISCHR( statbuf_C.st_mode ); } - bool isBlk() const { return isExist() && S_ISBLK( statbuf_C.st_mode ); } - bool isFifo() const { return isExist() && S_ISFIFO( statbuf_C.st_mode ); } - bool isSock() const { return isExist() && S_ISSOCK( statbuf_C.st_mode ); } - - nlink_t nlink() const { return isExist() ? statbuf_C.st_nlink : 0; } - - // owner - uid_t owner() const { return isExist() ? statbuf_C.st_uid : 0; } - gid_t group() const { return isExist() ? statbuf_C.st_gid : 0; } - - // permission - bool isRUsr() const { return isExist() && (statbuf_C.st_mode & S_IRUSR); } - bool isWUsr() const { return isExist() && (statbuf_C.st_mode & S_IWUSR); } - bool isXUsr() const { return isExist() && (statbuf_C.st_mode & S_IXUSR); } - - bool isR() const { return isRUsr(); } - bool isW() const { return isWUsr(); } - bool isX() const { return isXUsr(); } - - bool isRGrp() const { return isExist() && (statbuf_C.st_mode & S_IRGRP); } - bool isWGrp() const { return isExist() && (statbuf_C.st_mode & S_IWGRP); } - bool isXGrp() const { return isExist() && (statbuf_C.st_mode & S_IXGRP); } - - bool isROth() const { return isExist() && (statbuf_C.st_mode & S_IROTH); } - bool isWOth() const { return isExist() && (statbuf_C.st_mode & S_IWOTH); } - bool isXOth() const { return isExist() && (statbuf_C.st_mode & S_IXOTH); } - - bool isUid() const { return isExist() && (statbuf_C.st_mode & S_ISUID); } - bool isGid() const { return isExist() && (statbuf_C.st_mode & S_ISGID); } - bool isVtx() const { return isExist() && (statbuf_C.st_mode & S_ISVTX); } - - mode_t uperm() const { return isExist() ? (statbuf_C.st_mode & S_IRWXU) : 0; } - mode_t gperm() const { return isExist() ? (statbuf_C.st_mode & S_IRWXG) : 0; } - mode_t operm() const { return isExist() ? (statbuf_C.st_mode & S_IRWXO) : 0; } - mode_t perm() const { return isExist() ? (statbuf_C.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)) : 0; } - - bool isPerm ( mode_t m ) const { return (m == perm()); } - bool hasPerm( mode_t m ) const { return (m == (m & perm())); } - - mode_t st_mode() const { return isExist() ? statbuf_C.st_mode : 0; } - - // permission according to current uid/gid (returns [0-7]) - mode_t userMay() const; - - bool userMayR() const { return( userMay() & 01 ); } - bool userMayW() const { return( userMay() & 02 ); } - bool userMayX() const { return( userMay() & 04 ); } - - bool userMayRW() const { return( (userMay() & 03) == 03 ); } - bool userMayRX() const { return( (userMay() & 05) == 05 ); } - bool userMayWX() const { return( (userMay() & 06) == 06 ); } - - bool userMayRWX() const { return( userMay() == 07 ); } - - // device - dev_t dev() const { return isExist() ? statbuf_C.st_dev : 0; } - dev_t rdev() const { return isExist() ? statbuf_C.st_rdev : 0; } - ino_t ino() const { return isExist() ? statbuf_C.st_ino : 0; } - - // size - off_t size() const { return isExist() ? statbuf_C.st_size : 0; } - unsigned long blksize() const { return isExist() ? statbuf_C.st_blksize : 0; } - unsigned long blocks() const { return isExist() ? statbuf_C.st_blocks : 0; } - - // time - time_t atime() const { return isExist() ? statbuf_C.st_atime : 0; } /* time of last access */ - time_t mtime() const { return isExist() ? statbuf_C.st_mtime : 0; } /* time of last modification */ - time_t ctime() const { return isExist() ? statbuf_C.st_ctime : 0; } - - public: - - /////////////////////////////////////////////////////////////////// - // convenience stuff - /////////////////////////////////////////////////////////////////// - // static functions as they may or may not invalidate any stat info - // stored by a PathiInfo. - /////////////////////////////////////////////////////////////////// - - /////////////////////////////////////////////////////////////////// - // Directories - /////////////////////////////////////////////////////////////////// - - /** - * Like '::mkdir'. Attempt to create a new directory named path. mode - * specifies the permissions to use. It is modified by the process's - * umask in the usual way. - * - * @return 0 on success, errno on failure - **/ - static int mkdir( const Pathname & path, unsigned mode = 0755 ); - - /** - * Like 'mkdir -p'. No error if directory exists. Make parent directories - * as needed. mode specifies the permissions to use, if directories have to - * be created. It is modified by the process's umask in the usual way. - * - * @return 0 on success, errno on failure - **/ - static int assert_dir( const Pathname & path, unsigned mode = 0755 ); - - /** - * Like '::rmdir'. Delete a directory, which must be empty. - * - * @return 0 on success, errno on failure - **/ - static int rmdir( const Pathname & path ); - - /** - * Like 'rm -r DIR'. Delete a directory, recursively removing its contents. - * - * @return 0 on success, ENOTDIR if path is not a directory, otherwise the - * commands return value. - **/ - static int recursive_rmdir( const Pathname & path ); - - /** - * Like 'rm -r DIR/ *'. Delete directory contents, but keep the directory itself. - * - * @return 0 on success, ENOTDIR if path is not a directory, otherwise the - * commands return value. - **/ - static int clean_dir( const Pathname & path ); - - /** - * Like 'cp -a srcpath destpath'. Copy directory tree. srcpath/destpath must be - * directories. 'basename srcpath' must not exist in destpath. - * - * @return 0 on success, ENOTDIR if srcpath/destpath is not a directory, EEXIST if - * 'basename srcpath' exists in destpath, otherwise the commands return value. - **/ - static int copy_dir( const Pathname & srcpath, const Pathname & destpath ); - - /** - * Return content of directory via retlist. If dots is false - * entries starting with '.' are not reported. "." and ".." - * are never reported. - * - * @return 0 on success, errno on failure. - **/ - static int readdir( std::list & retlist, - const Pathname & path, bool dots = true ); - - struct direntry { - std::string name; - file_type type; - direntry( const std::string & name_r = std::string(), file_type type_r = NOT_AVAIL ) - : name( name_r ) - , type( type_r ) - {} - }; - - typedef std::list dircontent; - - /** - * Return content of directory via retlist. If dots is false - * entries starting with '.' are not reported. "." and ".." - * are never reported. - * - * The type of individual directory entries is determined accoding to - * statmode (i.e. via stat or lstat). - * - * @return 0 on success, errno on failure. - **/ - static int readdir( dircontent & retlist, const Pathname & path, - bool dots = true, Mode statmode = STAT ); - - /////////////////////////////////////////////////////////////////// - // Files - /////////////////////////////////////////////////////////////////// - - /** - * Like '::unlink'. Delete a file (symbolic link, socket, fifo or device). - * - * @return 0 on success, errno on failure - **/ - static int unlink( const Pathname & path ); - - /** - * Like '::rename'. Renames a file, moving it between directories if required. - * - * @return 0 on success, errno on failure - **/ - static int rename( const Pathname & oldpath, const Pathname & newpath ); - - /** - * Like 'cp file dest'. Copy file to destination file. - * - * @return 0 on success, EINVAL if file is not a file, EISDIR if - * destiantion is a directory, otherwise the commands return value. - **/ - static int copy( const Pathname & file, const Pathname & dest ); - - /** - * Like '::symlink'. Creates a symbolic link named newpath which contains - * the string oldpath. If newpath exists it will not be overwritten. - * - * @return 0 on success, errno on failure. - **/ - static int symlink( const Pathname & oldpath, const Pathname & newpath ); - - /** - * Like '::link'. Creates a hard link named newpath to an existing file - * oldpath. If newpath exists it will not be overwritten. - * - * @return 0 on success, errno on failure. - **/ - static int hardlink( const Pathname & oldpath, const Pathname & newpath ); - - /** - * Like 'cp file dest'. Copy file to dest dir. - * - * @return 0 on success, EINVAL if file is not a file, ENOTDIR if dest - * is no directory, otherwise the commands return value. - **/ - static int copy_file2dir( const Pathname & file, const Pathname & dest ); - - /** - * Compute a files md5sum. - * - * @return the files md5sum on success, otherwise an empty string.. - **/ - static std::string md5sum( const Pathname & file ); - - /** - * Compute a files sha1sum. - * - * @return the files sha1sum on success, otherwise an empty string.. - **/ - static std::string sha1sum( const Pathname & file ); - - /////////////////////////////////////////////////////////////////// - // - /////////////////////////////////////////////////////////////////// - - /** - * Erase whatever happens to be located at path (file or directory). - * - * @return 0 on success. - **/ - static int erase( const Pathname & path ); - - /////////////////////////////////////////////////////////////////// - // permissions - /////////////////////////////////////////////////////////////////// - - /** - * Like '::chmod'. The mode of the file given by path is changed. - * - * @return 0 on success, errno on failure - **/ - static int chmod( const Pathname & path, mode_t mode ); - - /////////////////////////////////////////////////////////////////// - // magic - /////////////////////////////////////////////////////////////////// - - /** - * Test whether a file is compressed (gzip/bzip2). - * - * @return ZT_GZ, ZT_BZ2 if file is compressed, otherwise ZT_NONE. - **/ - enum ZIP_TYPE { ZT_NONE, ZT_GZ, ZT_BZ2 }; - - static ZIP_TYPE zipType( const Pathname & file ); -}; - -/////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////// -// -// CLASS NAME : PathInfo::stat_mode -/** - * @short Wrapper class for mode_t values as derived from ::stat - **/ -class PathInfo::stat_mode { - friend std::ostream & operator<<( std::ostream & str, const stat_mode & obj ); - private: - mode_t _mode; - public: - stat_mode( const mode_t & mode_r = 0 ) : _mode( mode_r ) {} - public: - // file type - file_type fileType() const; - - bool isFile() const { return S_ISREG( _mode ); } - bool isDir () const { return S_ISDIR( _mode ); } - bool isLink() const { return S_ISLNK( _mode ); } - bool isChr() const { return S_ISCHR( _mode ); } - bool isBlk() const { return S_ISBLK( _mode ); } - bool isFifo() const { return S_ISFIFO( _mode ); } - bool isSock() const { return S_ISSOCK( _mode ); } - - // permission - bool isRUsr() const { return (_mode & S_IRUSR); } - bool isWUsr() const { return (_mode & S_IWUSR); } - bool isXUsr() const { return (_mode & S_IXUSR); } - - bool isR() const { return isRUsr(); } - bool isW() const { return isWUsr(); } - bool isX() const { return isXUsr(); } - - bool isRGrp() const { return (_mode & S_IRGRP); } - bool isWGrp() const { return (_mode & S_IWGRP); } - bool isXGrp() const { return (_mode & S_IXGRP); } - - bool isROth() const { return (_mode & S_IROTH); } - bool isWOth() const { return (_mode & S_IWOTH); } - bool isXOth() const { return (_mode & S_IXOTH); } - - bool isUid() const { return (_mode & S_ISUID); } - bool isGid() const { return (_mode & S_ISGID); } - bool isVtx() const { return (_mode & S_ISVTX); } - - mode_t uperm() const { return (_mode & S_IRWXU); } - mode_t gperm() const { return (_mode & S_IRWXG); } - mode_t operm() const { return (_mode & S_IRWXO); } - mode_t perm() const { return (_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)); } - - bool isPerm ( mode_t m ) const { return (m == perm()); } - bool hasPerm( mode_t m ) const { return (m == (m & perm())); } - - mode_t st_mode() const { return _mode; } -}; - -/////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////// -// -// CLASS NAME : PathInfo::devino_cache -/** - * @short Simple cache remembering device/inode to detect hardlinks. - *
- *     PathInfo::devino_cache trace;
- *     for ( all files ) {
- *       if ( trace.insert( file.device, file.inode ) ) {
- *         // 1st occurance of file
- *       }
- *         // else: hardlink; already counted this device/inode
- *       }
- *     }
- * 
- **/ -class PathInfo::devino_cache { - - private: - - std::map > _devino; - - public: - /** - * Constructor - **/ - devino_cache() {} - - /** - * Clear cache - **/ - void clear() { _devino.clear(); } - - /** - * Remember dev/ino. Return true if it's inserted the first - * time, false if alredy present in cache (a hardlink to a - * previously remembered file. - **/ - bool insert( const dev_t & dev_r, const ino_t & ino_r ) { - return _devino[dev_r].insert( ino_r ).second; - } -}; - -/////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////// - -#endif // PathInfo_h diff --git a/zypp/@Review/Pathname.cc b/zypp/@Review/Pathname.cc deleted file mode 100644 index 9c02a0f..0000000 --- a/zypp/@Review/Pathname.cc +++ /dev/null @@ -1,293 +0,0 @@ -/*---------------------------------------------------------------------\ -| | -| __ __ ____ _____ ____ | -| \ \ / /_ _/ ___|_ _|___ \ | -| \ V / _` \___ \ | | __) | | -| | | (_| |___) || | / __/ | -| |_|\__,_|____/ |_| |_____| | -| | -| core system | -| (C) SuSE GmbH | -\----------------------------------------------------------------------/ - - File: Pathname.cc - - Author: Michael Andres - Maintainer: Michael Andres - -/-*/ - -#include - -#include - -using namespace std; - -/////////////////////////////////////////////////////////////////// -// -// CLASS NAME : DirStack -// -// DESCRIPTION : -// -class DirStack { - - struct Dir { - - Dir * up; - Dir * dn; - string name; - - Dir( const string & n = "" ) { - name = n; - up = dn = 0; - } - - ~Dir() { - if ( up ) - up->dn = dn; - if ( dn ) - dn->up = up; - } - }; - - Dir * top; - Dir * bot; - - void Pop() { - if ( !top ) - return; - top = top->dn; - if ( top ) - delete top->up; - else { - delete bot; - bot = 0; - } - } - - public: - - DirStack() { top = bot = 0; } - ~DirStack() { - while ( bot ) - Pop(); - } - - void Push( const string & n ) { - if ( n.empty() || n == "." ) { // '.' or '/' only for bot - if ( bot ) - return; - } else if ( n == ".." && top ) { - if ( top->name == "" ) // "/.." ==> "/" - return; - - if ( top->name != "." && top->name != ".." ) { // "somedir/.." ==> "" - Pop(); - return; - } - // "../.." "./.." stays - } - - Dir * d = new Dir( n ); - if ( !top ) - top = bot = d; - else { - top->up = d; - d->dn = top; - d->up = 0; - top = d; - } - } - - string str() { - if ( !bot ) - return ""; - string ret; - for ( Dir * d = bot; d; d = d->up ) { - if ( d != bot ) - ret += "/"; - ret += d->name; - } - if ( ret.empty() ) - return "/"; - return ret; - } -}; - -/////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : Pathname::_assign -// METHOD TYPE : void -// -// DESCRIPTION : -// -void Pathname::_assign( const string & name_tv ) -{ - prfx_i = 0; - name_t = name_tv; - - if ( name_t.empty() ) - return; - - string Tprfx; - DirStack Stack_Ci; - - char * Buf_aci = new char[name_tv.length() + 1]; - char * W_pci = Buf_aci; - const char * R_pci = name_tv.c_str(); - - // check for prefix - if ( name_t.length() >= 2 - && name_t[1] == ':' - && ( 'a' <= name_t[0] && name_t[0] <= 'z' - || 'A' <= name_t[0] && name_t[0] <= 'Z' ) ) { - Tprfx = name_t.substr( 0, 2 ); - prfx_i = 2; - R_pci += 2; - } - - // rel or abs path - if ( *R_pci == '/' || *R_pci == '\\' ) { - Stack_Ci.Push( "" ); - ++R_pci; - } else { - Stack_Ci.Push( "." ); - } - - do { - switch ( *R_pci ) { - case '/': - case '\\': - case '\0': - if ( W_pci != Buf_aci ) { - *W_pci = '\0'; - W_pci = Buf_aci; - Stack_Ci.Push( Buf_aci ); - } - break; - - default: - *W_pci++ = *R_pci; - break; - } - } while( *R_pci++ ); - - delete Buf_aci; - name_t = Tprfx + Stack_Ci.str(); -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : Pathname::dirname -// METHOD TYPE : Pathname -// -// DESCRIPTION : -// -Pathname Pathname::dirname( const Pathname & name_tv ) -{ - if ( name_tv.empty() ) - return ""; - - Pathname ret_t( name_tv ); - string::size_type idx = ret_t.name_t.find_last_of( '/' ); - - if ( idx == string::npos ) { - ret_t.name_t.erase( ret_t.prfx_i ); - ret_t.name_t += "."; - } else if ( idx == ret_t.prfx_i ) { - ret_t.name_t.erase( ret_t.prfx_i ); - ret_t.name_t += "/"; - } else { - ret_t.name_t.erase( idx ); - } - - return ret_t; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : Pathname::basename -// METHOD TYPE : string -// -// DESCRIPTION : -// -string Pathname::basename( const Pathname & name_tv ) -{ - if ( name_tv.empty() ) - return ""; - - string ret_t( name_tv.asString() ); - ret_t.erase( 0, name_tv.prfx_i ); - string::size_type idx = ret_t.find_last_of( '/' ); - if ( idx != string::npos ) { - ret_t.erase( 0, idx+1 ); - } - - return ret_t; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : Pathname::cat -// METHOD TYPE : Pathname -// -// DESCRIPTION : -// -Pathname Pathname::cat( const Pathname & name_tv, const Pathname & add_tv ) -{ - if ( add_tv.empty() ) - return name_tv; - if ( name_tv.empty() ) - return add_tv; - - string ret_ti( add_tv.asString() ); - ret_ti.replace( 0, add_tv.prfx_i, "/" ); - - return name_tv.asString() + ret_ti; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : Pathname::Extend -// METHOD TYPE : Pathname -// -// DESCRIPTION : -// -Pathname Pathname::extend( const Pathname & l, const string & r ) -{ - return l.asString() + r; -} - -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : Pathname::equal -// METHOD TYPE : bool -// -// DESCRIPTION : -// -bool Pathname::equal( const Pathname & l, const Pathname & r ) -{ - return l.asString() == r.asString(); -} - -/****************************************************************** -** -** -** FUNCTION NAME : operator<< -** FUNCTION TYPE : inline std::ostream & -** -** DESCRIPTION : -*/ -ostream & operator<<( ostream & str, const Pathname & obj ) -{ - return str << obj.asString(); -} diff --git a/zypp/@Review/Pathname.h b/zypp/@Review/Pathname.h deleted file mode 100644 index afbb838..0000000 --- a/zypp/@Review/Pathname.h +++ /dev/null @@ -1,118 +0,0 @@ -/*---------------------------------------------------------------------\ -| ____ _ __ __ ___ | -| |__ / \ / / . \ . \ | -| / / \ V /| _/ _/ | -| / /__ | | | | | | | -| /_____||_| |_| |_| | -| | -\---------------------------------------------------------------------*/ -/** \file zypp/base/Pathname.h - * -*/ -#ifndef ZYPP_BASE_PATHNAME_H -#define ZYPP_BASE_PATHNAME_H - -#include -#include - -/////////////////////////////////////////////////////////////////// -namespace zypp -{ ///////////////////////////////////////////////////////////////// - - /////////////////////////////////////////////////////////////////// - // - // CLASS NAME : Pathname - // - /** Pathname. - * \todo Review. Maybe use COW pimpl, ckeck storage. - */ - class Pathname - { - public: - /** */ - Pathname() - : prfx_i( 0 ) - {} - /** */ - Pathname( const Pathname & path_tv ) - : prfx_i( path_tv.prfx_i ) - , name_t( path_tv.name_t ) - {} - /** */ - Pathname( const std::string & name_tv ) - { _assign( name_tv ); } - /** */ - Pathname( const char * name_tv ) - { _assign( name_tv ? name_tv : "" ); } - /** */ - ~Pathname() - {} - - Pathname & operator= ( const Pathname & path_tv ); - Pathname & operator+=( const Pathname & path_tv ); - - const std::string & asString() const { return name_t; } - - bool empty() const { return !name_t.size(); } - bool absolute() const { return !empty() && name_t[prfx_i] == '/'; } - bool relative() const { return !empty() && name_t[prfx_i] != '/'; } - - Pathname dirname() const { return dirname( *this ); } - std::string basename() const { return basename( *this ); } - Pathname absolutename() const { return absolutename( *this ); } - Pathname relativename() const { return relativename( *this ); } - - static Pathname dirname ( const Pathname & name_tv ); - static std::string basename ( const Pathname & name_tv ); - static Pathname absolutename( const Pathname & name_tv ) { return name_tv.relative() ? cat( "/", name_tv ) : name_tv; } - static Pathname relativename( const Pathname & name_tv ) { return name_tv.absolute() ? cat( ".", name_tv ) : name_tv; } - - Pathname cat( const Pathname & r ) const { return cat( *this, r ); } - static Pathname cat( const Pathname & l, const Pathname & r ); - - Pathname extend( const std::string & r ) const { return extend( *this, r ); } - static Pathname extend( const Pathname & l, const std::string & r ); - - bool equal( const Pathname & r ) const { return equal( *this, r ); } - static bool equal( const Pathname & l, const Pathname & r ); - - private: - std::string::size_type prfx_i; - std::string name_t; - void _assign( const std::string & name_tv ); - }; - /////////////////////////////////////////////////////////////////// - - inline bool operator==( const Pathname & l, const Pathname & r ) { - return Pathname::equal( l, r ); - } - - inline bool operator!=( const Pathname & l, const Pathname & r ) { - return !Pathname::equal( l, r ); - } - - inline Pathname operator+( const Pathname & l, const Pathname & r ) { - return Pathname::cat( l, r ); - } - - inline Pathname & Pathname::operator=( const Pathname & path_tv ) { - if ( &path_tv != this ) { - prfx_i = path_tv.prfx_i; - name_t = path_tv.name_t; - } - return *this; - } - - inline Pathname & Pathname::operator+=( const Pathname & path_tv ) { - return( *this = *this + path_tv ); - } - - /////////////////////////////////////////////////////////////////// - - /** \relates Pathname Stream output */ - extern std::ostream & operator<<( std::ostream & str, const Pathname & obj ); - - ///////////////////////////////////////////////////////////////// -} // namespace zypp -/////////////////////////////////////////////////////////////////// -#endif // ZYPP_BASE_PATHNAME_H diff --git a/zypp/@Review/stringutil.cc b/zypp/@Review/stringutil.cc index 6974132..a388040 100644 --- a/zypp/@Review/stringutil.cc +++ b/zypp/@Review/stringutil.cc @@ -176,125 +176,6 @@ string stripFirstWord( string & line, const bool ltrim_first ) return ret; } -/****************************************************************** -** -** -** FUNCTION NAME : ltrim -** FUNCTION TYPE : std::string -** -** DESCRIPTION : -*/ -std::string ltrim( const std::string & s ) -{ - if ( s.empty() ) - return s; - - string::size_type p = s.find_first_not_of( " \t\n" ); - if ( p == string::npos ) - return ""; - - return s.substr( p ); -} - -/****************************************************************** -** -** -** FUNCTION NAME : rtrim -** FUNCTION TYPE : std::string -** -** DESCRIPTION : -*/ -std::string rtrim( const std::string & s ) -{ - if ( s.empty() ) - return s; - - string::size_type p = s.find_last_not_of( " \t\n" ); - if ( p == string::npos ) - return ""; - - return s.substr( 0, p+1 ); -} - -/****************************************************************** -** -** -** FUNCTION NAME : toLower -** FUNCTION TYPE : std::string -** -** DESCRIPTION : -*/ -std::string toLower( const std::string & s ) -{ - if ( s.empty() ) - return s; - - string ret( s ); - for ( string::size_type i = 0; i < ret.length(); ++i ) { - if ( isupper( ret[i] ) ) - ret[i] = static_cast(tolower( ret[i] )); - } - return ret; -} - -/****************************************************************** -** -** -** FUNCTION NAME : toUpper -** FUNCTION TYPE : std::string -** -** DESCRIPTION : -*/ -std::string toUpper( const std::string & s ) -{ - if ( s.empty() ) - return s; - - string ret( s ); - for ( string::size_type i = 0; i < ret.length(); ++i ) { - if ( islower( ret[i] ) ) - ret[i] = static_cast(toupper( ret[i] )); - } - return ret; -} - -/****************************************************************** -** -** -** FUNCTION NAME : dumpOn -** FUNCTION TYPE : std::ostream & -** -** DESCRIPTION : -*/ -std::ostream & dumpOn( std::ostream & str, const std::list & l, const bool numbered ) -{ - unsigned i = 0; - for ( std::list::const_iterator it = l.begin(); it != l.end(); ++it, ++i ) { - if ( numbered ) - str << '[' << i << ']'; - str << *it << endl; - } - return str; -} - -/****************************************************************** -** -** -** FUNCTION NAME : dumpOn -** FUNCTION TYPE : std::ostream & -** -** DESCRIPTION : -*/ -std::ostream & dumpOn( std::ostream & str, const std::vector & l, const bool numbered ) -{ - for ( unsigned i = 0; i < l.size(); ++i ) { - if ( numbered ) - str << '[' << i << ']'; - str << l[i] << endl; - } - return str; -} - /////////////////////////////////////////////////////////////////// } // namespace stringutil /////////////////////////////////////////////////////////////////// diff --git a/zypp/@Review/stringutil.h b/zypp/@Review/stringutil.h index 3c95d35..4f155d0 100644 --- a/zypp/@Review/stringutil.h +++ b/zypp/@Review/stringutil.h @@ -38,174 +38,6 @@ namespace stringutil { ;////////////////////////////////////////////////////////////////// -enum Trim { - NO_TRIM = 0x00, - L_TRIM = 0x01, - R_TRIM = 0x02, - TRIM = (L_TRIM|R_TRIM) -}; - -inline std::string form( const char * format, ... ) - __attribute__ ((format (printf, 1, 2))); - -/** - * Printf style building of strings via format string. - *
- * std::string ex( stringutil::form( "Example number %d", 1 ) );
- * std::cout << ex << stringutil::form( " and number %d.", 2 ) << endl;
- *
- * Will print: Example number 1 and number 2.
- * 
- **/ -inline std::string form( const char * format, ... ) { - char * buf = 0; - std::string val; - - va_list ap; - va_start( ap, format ); - -#if 1 - vasprintf( &buf, format, ap ); - if ( buf ) { - val = buf; - free( buf ); - } -#else - // Don't know wheter we actually nedd two va_lists, one to - // evaluate the buffer size needed, and one to actually fill - // the buffer. Maybe there's a save way to reuse a va_lists. - va_list ap1; - va_start( ap1, format ); - buf = new char[vsnprintf( NULL, 0, format, ap ) + 1]; - vsprintf( buf, format, ap1 ); - val = buf; - delete [] buf; - va_end( ap1 ); -#endif - - va_end( ap ); - return val; -} - -/** - * Print number. Optional second argument sets the minimal string width (' ' padded). - * Negative values will cause the number to be left adjusted within the string. Default - * width is 0. - *
- * numstring(42)           -> "42"
- * numstring(42, 4)        -> "  42"
- * numstring(42,-4)        -> "42  "
- * 
- **/ -inline std::string numstring( char n, int w = 0 ) { return form( "%*hhd", w, n ); } -inline std::string numstring( unsigned char n, int w = 0 ) { return form( "%*hhu", w, n ); } -inline std::string numstring( short n, int w = 0 ) { return form( "%*hd", w, n ); } -inline std::string numstring( unsigned short n, int w = 0 ) { return form( "%*hu", w, n ); } -inline std::string numstring( int n, int w = 0 ) { return form( "%*d", w, n ); } -inline std::string numstring( unsigned n, int w = 0 ) { return form( "%*u", w, n ); } -inline std::string numstring( long n, int w = 0 ) { return form( "%*ld", w, n ); } -inline std::string numstring( unsigned long n, int w = 0 ) { return form( "%*lu", w, n ); } -inline std::string numstring( long long n, int w = 0 ) { return form( "%*lld", w, n ); } -inline std::string numstring( unsigned long long n, int w = 0 ) { return form( "%*llu", w, n ); } - -/** - * Print number as hex value with leading '0x'. Optional second argument sets the minimal - * string width (0 padded). Negative values will cause the number to be left adjusted - * within the string. Default width is 10 (4 for char). - *
- * hexstring(42)           -> "0x0000002a"
- * hexstring(42, 4)        -> "0x2a"
- * hexstring(42,-4)        -> "0x2a"
- * 
- **/ -inline std::string hexstring( char n, int w = 4 ) { return form( "%#0*hhx", w, n ); } -inline std::string hexstring( unsigned char n, int w = 4 ) { return form( "%#0*hhx", w, n ); } -inline std::string hexstring( short n, int w = 10 ){ return form( "%#0*hx", w, n ); } -inline std::string hexstring( unsigned short n, int w = 10 ){ return form( "%#0*hx", w, n ); } -inline std::string hexstring( int n, int w = 10 ){ return form( "%#0*x", w, n ); } -inline std::string hexstring( unsigned n, int w = 10 ){ return form( "%#0*x", w, n ); } -inline std::string hexstring( long n, int w = 10 ){ return form( "%#0*lx", w, n ); } -inline std::string hexstring( unsigned long n, int w = 10 ){ return form( "%#0*lx", w, n ); } -inline std::string hexstring( long long n, int w = 0 ) { return form( "%#0*llx", w, n ); } -inline std::string hexstring( unsigned long long n, int w = 0 ) { return form( "%#0*llx", w, n ); } - -/** - * Print number as octal value with leading '0'. Optional second argument sets the minimal - * string width (0 padded). Negative values will cause the number to be left adjusted - * within the string. Default width is 5 (4 for char). - *
- * octstring(42)           -> "00052"
- * octstring(42, 4)        -> "0052"
- * octstring(42,-4)        -> "052 "
- * 
- **/ -inline std::string octstring( char n, int w = 4 ) { return form( "%#0*hho", w, n ); } -inline std::string octstring( unsigned char n, int w = 4 ) { return form( "%#0*hho", w, n ); } -inline std::string octstring( short n, int w = 5 ) { return form( "%#0*ho", w, n ); } -inline std::string octstring( unsigned short n, int w = 5 ) { return form( "%#0*ho", w, n ); } -inline std::string octstring( int n, int w = 5 ) { return form( "%#0*o", w, n ); } -inline std::string octstring( unsigned n, int w = 5 ) { return form( "%#0*o", w, n ); } -inline std::string octstring( long n, int w = 5 ) { return form( "%#0*lo", w, n ); } -inline std::string octstring( unsigned long n, int w = 5 ) { return form( "%#0*lo", w, n ); } -inline std::string octstring( long long n, int w = 0 ) { return form( "%#0*llo", w, n ); } -inline std::string octstring( unsigned long long n, int w = 0 ) { return form( "%#0*llo", w, n ); } - -/** - * String to integer type determined by template arg: time_t t = strtonum( "42" ); - **/ -template - inline _It strtonum( const std::string & str ); - -template<> - inline short strtonum( const std::string & str ) { return ::strtol ( str.c_str(), NULL, 0 ); } -template<> - inline int strtonum( const std::string & str ) { return ::strtol ( str.c_str(), NULL, 0 ); } -template<> - inline long strtonum( const std::string & str ) { return ::strtol ( str.c_str(), NULL, 0 ); } -template<> - inline long long strtonum( const std::string & str ) { return ::strtoll ( str.c_str(), NULL, 0 ); } - -template<> - inline unsigned short strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); } -template<> - inline unsigned strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); } -template<> - inline unsigned long strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); } -template<> - inline unsigned long long strtonum( const std::string & str ) { return ::strtoull( str.c_str(), NULL, 0 ); } - -/** - * String to integer type detemined function arg: time_t t; strtonum( "42", t ); - **/ -template - inline _It strtonum( const std::string & str, _It & i ) { return i = strtonum<_It>( str ); } - -/** \brief read one line from a stream - * Return one line read from istream. Afterwards the streampos is behind the delimiting '\n' - * (or at EOF). The delimiting '\n' is not returned. - * - * If trim is true, the string returned is trimmed (surrounding whitespaces removed). - *
- * ifstream s( "somefile" );
- *
- * while ( s ) {
- *   string l = getline( s );
- *   if ( !(s.fail() || s.bad()) ) {
- *
- *     // l contains valid data to be consumed.
- *     // In case it makes any difference to you:
- *     if ( s.good() ) {
- *       // A delimiting '\n' was read.
- *     } else {
- *       // s.eof() is set: There's no '\n' at the end of file.
- *       // Note: The line returned may netvertheless be empty if trimed is true.
- *     }
- *   }
- * }
- * 
- **/ -extern std::string getline( std::istream & str, bool trim = false ); - /** \brief read one line from a stream * * like above but with allows to specify trimming direction @@ -311,18 +143,6 @@ inline std::string trim( const std::string & s, const Trim trim_r = TRIM ) { return s; } -/** - * Return string converted to lower/upper case - **/ -extern std::string toLower( const std::string & s ); -extern std::string toUpper( const std::string & s ); - -/** - * Helper for stream output - **/ -extern std::ostream & dumpOn( std::ostream & str, const std::list & l, const bool numbered = false ); -extern std::ostream & dumpOn( std::ostream & str, const std::vector & l, const bool numbered = false ); - /////////////////////////////////////////////////////////////////// } // namespace stringutil /////////////////////////////////////////////////////////////////// diff --git a/zypp/PathInfo.cc b/zypp/PathInfo.cc index c4d1294..6e9df58 100644 --- a/zypp/PathInfo.cc +++ b/zypp/PathInfo.cc @@ -8,8 +8,6 @@ \---------------------------------------------------------------------*/ /** \file zypp/PathInfo.cc * - * \todo replace by Blocxx - * */ #include @@ -17,759 +15,736 @@ #include #include "zypp/base/Logger.h" -#include "zypp/base/stringutil.h" -#include "zypp/ExternalProgram.h" +#include "zypp/base/String.h" +#include "zypp/base/IOStream.h" +#include "zypp/ExternalProgram.h" #include "zypp/PathInfo.h" #include "zypp/Digest.h" -using namespace std; -using namespace zypp::base; - -namespace zypp { +using std::string; /////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::PathInfo -// METHOD TYPE : Constructor -// -// DESCRIPTION : -// -PathInfo::PathInfo( const Pathname & path, Mode initial ) +namespace zypp +{ ///////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + namespace filesystem + { ///////////////////////////////////////////////////////////////// + + /****************************************************************** + ** + ** FUNCTION NAME : operator<< + ** FUNCTION TYPE : std::ostream & + */ + std::ostream & operator<<( std::ostream & str, FileType obj ) + { + switch ( obj ) { +#define EMUMOUT(T) case T: return str << #T; break + EMUMOUT( FT_NOT_AVAIL ); + EMUMOUT( FT_NOT_EXIST ); + EMUMOUT( FT_FILE ); + EMUMOUT( FT_DIR ); + EMUMOUT( FT_CHARDEV ); + EMUMOUT( FT_BLOCKDEV ); + EMUMOUT( FT_FIFO ); + EMUMOUT( FT_LINK ); + EMUMOUT( FT_SOCKET ); +#undef EMUMOUT + } + return str; + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : StatMode::fileType + // METHOD TYPE : FileType + // + FileType StatMode::fileType() const + { + if ( isFile() ) + return FT_FILE; + if ( isDir() ) + return FT_DIR; + if ( isLink() ) + return FT_LINK; + if ( isChr() ) + return FT_CHARDEV; + if ( isBlk() ) + return FT_BLOCKDEV; + if ( isFifo() ) + return FT_FIFO; + if ( isSock() ) + return FT_SOCKET ; + + return FT_NOT_AVAIL; + } + + /****************************************************************** + ** + ** FUNCTION NAME : operator<< + ** FUNCTION TYPE : std::ostream & + */ + std::ostream & operator<<( std::ostream & str, const StatMode & obj ) + { + iostr::IosFmtFlagsSaver autoResoreState( str ); + + char t = '?'; + if ( obj.isFile() ) + t = '-'; + else if ( obj.isDir() ) + t = 'd'; + else if ( obj.isLink() ) + t = 'l'; + else if ( obj.isChr() ) + t = 'c'; + else if ( obj.isBlk() ) + t = 'b'; + else if ( obj.isFifo() ) + t = 'p'; + else if ( obj.isSock() ) + t = 's'; + + str << t << " " << std::setfill( '0' ) << std::setw( 4 ) << std::oct << obj.perm(); + return str; + } + + /////////////////////////////////////////////////////////////////// + // + // Class : PathInfo + // + /////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : PathInfo::PathInfo + // METHOD TYPE : Constructor + // + PathInfo::PathInfo() + : mode_e( STAT ) + , error_i( -1 ) + {} + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : PathInfo::PathInfo + // METHOD TYPE : Constructor + // + PathInfo::PathInfo( const Pathname & path, Mode initial ) : path_t( path ) , mode_e( initial ) , error_i( -1 ) -{ - operator()(); -} + { + operator()(); + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::PathInfo -// METHOD TYPE : Constructor -// -// DESCRIPTION : -// -PathInfo::PathInfo( const string & path, Mode initial ) + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : PathInfo::PathInfo + // METHOD TYPE : Constructor + // + PathInfo::PathInfo( const std::string & path, Mode initial ) : path_t( path ) , mode_e( initial ) , error_i( -1 ) -{ - operator()(); -} + { + operator()(); + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::PathInfo -// METHOD TYPE : Constructor -// -// DESCRIPTION : -// -PathInfo::PathInfo( const char * path, Mode initial ) + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : PathInfo::PathInfo + // METHOD TYPE : Constructor + // + PathInfo::PathInfo( const char * path, Mode initial ) : path_t( path ) , mode_e( initial ) , error_i( -1 ) -{ - operator()(); -} + { + operator()(); + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::~PathInfo -// METHOD TYPE : Destructor -// -// DESCRIPTION : -// -PathInfo::~PathInfo() -{ -} + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : PathInfo::~PathInfo + // METHOD TYPE : Destructor + // + PathInfo::~PathInfo() + { + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::operator() -// METHOD TYPE : bool -// -// DESCRIPTION : -// -bool PathInfo::operator()() -{ - if ( path_t.empty() ) { - error_i = -1; - } else { - switch ( mode_e ) { - case STAT: - error_i = ::stat( path_t.asString().c_str(), &statbuf_C ); - break; - case LSTAT: - error_i = ::lstat( path_t.asString().c_str(), &statbuf_C ); - break; - } - if ( error_i == -1 ) - error_i = errno; - } - return !error_i; -} + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : PathInfo::operator() + // METHOD TYPE : bool + // + bool PathInfo::operator()() + { + if ( path_t.empty() ) { + error_i = -1; + } else { + switch ( mode_e ) { + case STAT: + error_i = ::stat( path_t.asString().c_str(), &statbuf_C ); + break; + case LSTAT: + error_i = ::lstat( path_t.asString().c_str(), &statbuf_C ); + break; + } + if ( error_i == -1 ) + error_i = errno; + } + return !error_i; + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::fileType -// METHOD TYPE : PathInfo::file_type -// -PathInfo::file_type PathInfo::fileType() const -{ - if ( isExist() ) - return stat_mode( st_mode() ).fileType(); - return NOT_EXIST; -} + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : PathInfo::fileType + // METHOD TYPE : File_type + // + FileType PathInfo::fileType() const + { + if ( isExist() ) + return asStatMode().fileType(); + return FT_NOT_EXIST; + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::userMay -// METHOD TYPE : mode_t -// -// DESCRIPTION : -// -mode_t PathInfo::userMay() const -{ - if ( !isExist() ) - return 0; - if ( owner() == getuid() ) { - return( uperm()/0100 ); - } else if ( group() == getgid() ) { - return( gperm()/010 ); - } - return operm(); -} - -/****************************************************************** -** -** -** FUNCTION NAME : operator<< -** FUNCTION TYPE : ostream & -** -** DESCRIPTION : -*/ -ostream & operator<<( ostream & str, const PathInfo & obj ) -{ - ios::fmtflags state_ii = str.flags(); - - str << obj.asString() << "{"; - if ( !obj.isExist() ) { - str << "does not exist}"; - } else { - str << PathInfo::stat_mode( obj.st_mode() ) << " " << dec << obj.owner() << "/" << obj.group(); - - if ( obj.isFile() ) - str << " size " << obj.size(); - - str << "}"; - } - str.flags( state_ii ); - return str; -} - -/****************************************************************** -** -** -** FUNCTION NAME : operator<< -** FUNCTION TYPE : std::ostream & -** -** DESCRIPTION : -*/ -ostream & operator<<( ostream & str, PathInfo::file_type obj ) -{ - switch ( obj ) { -#define EMUMOUT(T) case PathInfo::T: return str << #T; break - EMUMOUT( NOT_AVAIL ); - EMUMOUT( NOT_EXIST ); - EMUMOUT( T_FILE ); - EMUMOUT( T_DIR ); - EMUMOUT( T_CHARDEV ); - EMUMOUT( T_BLOCKDEV ); - EMUMOUT( T_FIFO ); - EMUMOUT( T_LINK ); - EMUMOUT( T_SOCKET ); -#undef EMUMOUT - } - return str; -} + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : PathInfo::userMay + // METHOD TYPE : mode_t + // + mode_t PathInfo::userMay() const + { + if ( !isExist() ) + return 0; + if ( owner() == getuid() ) { + return( uperm()/0100 ); + } else if ( group() == getgid() ) { + return( gperm()/010 ); + } + return operm(); + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::stat_mode::fileType -// METHOD TYPE : PathInfo::file_type -// -PathInfo::file_type PathInfo::stat_mode::fileType() const -{ - if ( isFile() ) - return T_FILE; - if ( isDir() ) - return T_DIR; - if ( isLink() ) - return T_LINK; - if ( isChr() ) - return T_CHARDEV; - if ( isBlk() ) - return T_BLOCKDEV; - if ( isFifo() ) - return T_FIFO; - if ( isSock() ) - return T_SOCKET ; - - return NOT_AVAIL; -} - -/****************************************************************** -** -** -** FUNCTION NAME : operator<< -** FUNCTION TYPE : std::ostream & -** -** DESCRIPTION : -*/ -std::ostream & operator<<( std::ostream & str, const PathInfo::stat_mode & obj ) -{ - ios::fmtflags state_ii = str.flags(); - char t = '?'; - if ( obj.isFile() ) - t = '-'; - else if ( obj.isDir() ) - t = 'd'; - else if ( obj.isLink() ) - t = 'l'; - else if ( obj.isChr() ) - t = 'c'; - else if ( obj.isBlk() ) - t = 'b'; - else if ( obj.isFifo() ) - t = 'p'; - else if ( obj.isSock() ) - t = 's'; - - str << t << " " << setfill( '0' ) << setw( 4 ) << oct << obj.perm(); - str.flags( state_ii ); - return str; -} - -/****************************************************************** -** -** -** FUNCTION NAME : _Log_Result -** FUNCTION TYPE : int -** -** DESCRIPTION : Helper function to log return values. -*/ -inline int _Log_Result( const int res, const char * rclass = "errno" ) -{ - if ( res ) - DBG << " FAILED: " << rclass << " " << res; - DBG << endl; - return res; -} + /****************************************************************** + ** + ** FUNCTION NAME : operator<< + ** FUNCTION TYPE : std::ostream & + */ + std::ostream & operator<<( std::ostream & str, const PathInfo & obj ) + { + iostr::IosFmtFlagsSaver autoResoreState( str ); -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::mkdir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::mkdir( const Pathname & path, unsigned mode ) -{ - DBG << "mkdir " << path << ' ' << stringutil::octstring( mode ); - if ( ::mkdir( path.asString().c_str(), mode ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} + str << obj.asString() << "{"; + if ( !obj.isExist() ) { + str << "does not exist}"; + } else { + str << obj.asStatMode() << " " << std::dec << obj.owner() << "/" << obj.group(); -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::assert_dir() -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::assert_dir( const Pathname & path, unsigned mode ) -{ - string::size_type pos, lastpos = 0; - string spath = path.asString()+"/"; - int ret = 0; - - if(path.empty()) - return ENOENT; - - // skip ./ - if(path.relative()) - lastpos=2; - // skip / - else - lastpos=1; - -// DBG << "about to create " << spath << endl; - while((pos = spath.find('/',lastpos)) != string::npos ) - { - string dir = spath.substr(0,pos); - ret = ::mkdir(dir.c_str(), mode); - if(ret == -1) - { - // ignore errors about already existing directorys - if(errno == EEXIST) - ret=0; - else - ret=errno; - } -// DBG << "creating directory " << dir << (ret?" failed":" succeeded") << endl; - lastpos = pos+1; - } - return ret; -} + if ( obj.isFile() ) + str << " size " << obj.size(); -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::rmdir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::rmdir( const Pathname & path ) -{ - DBG << "rmdir " << path; - if ( ::rmdir( path.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} + str << "}"; + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::recursive_rmdir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::recursive_rmdir( const Pathname & path ) -{ - DBG << "recursive_rmdir " << path << ' '; - PathInfo p( path ); - - if ( !p.isExist() ) { - return _Log_Result( 0 ); - } - - if ( !p.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - const char *const argv[] = { - "/bin/rm", - "-rf", - "--preserve-root", - "--", - path.asString().c_str(), - NULL - }; - - ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} + return str; + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::clean_dir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::clean_dir( const Pathname & path ) -{ - DBG << "clean_dir " << path << ' '; - PathInfo p( path ); - - if ( !p.isExist() ) { - return _Log_Result( 0 ); - } - - if ( !p.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - string cmd( stringutil::form( "cd '%s' && rm -rf --preserve-root -- *", path.asString().c_str() ) ); - ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} + /////////////////////////////////////////////////////////////////// + // + // filesystem utilities + // + /////////////////////////////////////////////////////////////////// + + /****************************************************************** + ** + ** FUNCTION NAME : _Log_Result + ** FUNCTION TYPE : int + ** + ** DESCRIPTION : Helper function to log return values. + */ + inline int _Log_Result( const int res, const char * rclass = "errno" ) + { + if ( res ) + DBG << " FAILED: " << rclass << " " << res; + DBG << std::endl; + return res; + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::copy_dir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::copy_dir( const Pathname & srcpath, const Pathname & destpath ) -{ - DBG << "copy_dir " << srcpath << " -> " << destpath << ' '; - - PathInfo sp( srcpath ); - if ( !sp.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - PathInfo dp( destpath ); - if ( !dp.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - PathInfo tp( destpath + srcpath.basename() ); - if ( tp.isExist() ) { - return _Log_Result( EEXIST ); - } - - - const char *const argv[] = { - "/bin/cp", - "-dR", - "--", - srcpath.asString().c_str(), - destpath.asString().c_str(), - NULL - }; - ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : PathInfo::mkdir + // METHOD TYPE : int + // + int mkdir( const Pathname & path, unsigned mode ) + { + DBG << "mkdir " << path << ' ' << str::octstring( mode ); + if ( ::mkdir( path.asString().c_str(), mode ) == -1 ) { + return _Log_Result( errno ); + } + return _Log_Result( 0 ); + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::readdir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::readdir( std::list & retlist, - const Pathname & path, bool dots ) -{ - retlist.clear(); + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : assert_dir() + // METHOD TYPE : int + // + int assert_dir( const Pathname & path, unsigned mode ) + { + string::size_type pos, lastpos = 0; + string spath = path.asString()+"/"; + int ret = 0; + + if(path.empty()) + return ENOENT; + + // skip ./ + if(path.relative()) + lastpos=2; + // skip / + else + lastpos=1; + + // DBG << "about to create " << spath << endl; + while((pos = spath.find('/',lastpos)) != string::npos ) + { + string dir = spath.substr(0,pos); + ret = ::mkdir(dir.c_str(), mode); + if(ret == -1) + { + // ignore errors about already existing directorys + if(errno == EEXIST) + ret=0; + else + ret=errno; + } + // DBG << "creating directory " << dir << (ret?" failed":" succeeded") << endl; + lastpos = pos+1; + } + return ret; + } - DBG << "readdir " << path << ' '; + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : rmdir + // METHOD TYPE : int + // + int rmdir( const Pathname & path ) + { + DBG << "rmdir " << path; + if ( ::rmdir( path.asString().c_str() ) == -1 ) { + return _Log_Result( errno ); + } + return _Log_Result( 0 ); + } - DIR * dir = ::opendir( path.asString().c_str() ); - if ( ! dir ) { - return _Log_Result( errno ); - } + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : recursive_rmdir + // METHOD TYPE : int + // + int recursive_rmdir( const Pathname & path ) + { + DBG << "recursive_rmdir " << path << ' '; + PathInfo p( path ); - struct dirent *entry; - while ( (entry = ::readdir( dir )) != 0 ) { + if ( !p.isExist() ) { + return _Log_Result( 0 ); + } - if ( entry->d_name[0] == '.' ) { - if ( !dots ) - continue; - if ( entry->d_name[1] == '\0' - || ( entry->d_name[1] == '.' - && entry->d_name[2] == '\0' ) ) - continue; + if ( !p.isDir() ) { + return _Log_Result( ENOTDIR ); + } + + const char *const argv[] = { + "/bin/rm", + "-rf", + "--preserve-root", + "--", + path.asString().c_str(), + NULL + }; + + ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); + for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { + DBG << " " << output; + } + int ret = prog.close(); + return _Log_Result( ret, "returned" ); } - retlist.push_back( entry->d_name ); - } - ::closedir( dir ); + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : clean_dir + // METHOD TYPE : int + // + int clean_dir( const Pathname & path ) + { + DBG << "clean_dir " << path << ' '; + PathInfo p( path ); - return _Log_Result( 0 ); -} + if ( !p.isExist() ) { + return _Log_Result( 0 ); + } + if ( !p.isDir() ) { + return _Log_Result( ENOTDIR ); + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::readdir -// METHOD TYPE : int -// -int PathInfo::readdir( dircontent & retlist, const Pathname & path, - bool dots, Mode statmode ) -{ - retlist.clear(); + string cmd( str::form( "cd '%s' && rm -rf --preserve-root -- *", path.asString().c_str() ) ); + ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout ); + for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { + DBG << " " << output; + } + int ret = prog.close(); + return _Log_Result( ret, "returned" ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : copy_dir + // METHOD TYPE : int + // + int copy_dir( const Pathname & srcpath, const Pathname & destpath ) + { + DBG << "copy_dir " << srcpath << " -> " << destpath << ' '; + + PathInfo sp( srcpath ); + if ( !sp.isDir() ) { + return _Log_Result( ENOTDIR ); + } + + PathInfo dp( destpath ); + if ( !dp.isDir() ) { + return _Log_Result( ENOTDIR ); + } + + PathInfo tp( destpath + srcpath.basename() ); + if ( tp.isExist() ) { + return _Log_Result( EEXIST ); + } - list content; - int res = readdir( content, path, dots ); - if ( !res ) { - for ( list::const_iterator it = content.begin(); it != content.end(); ++it ) { - PathInfo p( path + *it, statmode ); - retlist.push_back( direntry( *it, p.fileType() ) ); + const char *const argv[] = { + "/bin/cp", + "-dR", + "--", + srcpath.asString().c_str(), + destpath.asString().c_str(), + NULL + }; + ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); + for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { + DBG << " " << output; + } + int ret = prog.close(); + return _Log_Result( ret, "returned" ); } - } - return res; -} + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : readdir + // METHOD TYPE : int + // + int readdir( std::list & retlist, + const Pathname & path, bool dots ) + { + retlist.clear(); -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::unlink -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::unlink( const Pathname & path ) -{ - DBG << "unlink " << path; - if ( ::unlink( path.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} + DBG << "readdir " << path << ' '; -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::rename -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::rename( const Pathname & oldpath, const Pathname & newpath ) -{ - DBG << "rename " << oldpath << " -> " << newpath; - if ( ::rename( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} + DIR * dir = ::opendir( path.asString().c_str() ); + if ( ! dir ) { + return _Log_Result( errno ); + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::copy -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::copy( const Pathname & file, const Pathname & dest ) -{ - DBG << "copy " << file << " -> " << dest << ' '; - - PathInfo sp( file ); - if ( !sp.isFile() ) { - return _Log_Result( EINVAL ); - } - - PathInfo dp( dest ); - if ( dp.isDir() ) { - return _Log_Result( EISDIR ); - } - - const char *const argv[] = { - "/bin/cp", - "--", - file.asString().c_str(), - dest.asString().c_str(), - NULL - }; - ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} + struct dirent *entry; + while ( (entry = ::readdir( dir )) != 0 ) { + + if ( entry->d_name[0] == '.' ) { + if ( !dots ) + continue; + if ( entry->d_name[1] == '\0' + || ( entry->d_name[1] == '.' + && entry->d_name[2] == '\0' ) ) + continue; + } + retlist.push_back( entry->d_name ); + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::symlink -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::symlink( const Pathname & oldpath, const Pathname & newpath ) -{ - DBG << "symlink " << newpath << " -> " << oldpath; - if ( ::symlink( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} + ::closedir( dir ); -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::hardlink -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::hardlink( const Pathname & oldpath, const Pathname & newpath ) -{ - DBG << "hardlink " << newpath << " -> " << oldpath; - if ( ::link( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} + return _Log_Result( 0 ); + } -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::copy_file2dir -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::copy_file2dir( const Pathname & file, const Pathname & dest ) -{ - DBG << "copy_file2dir " << file << " -> " << dest << ' '; - - PathInfo sp( file ); - if ( !sp.isFile() ) { - return _Log_Result( EINVAL ); - } - - PathInfo dp( dest ); - if ( !dp.isDir() ) { - return _Log_Result( ENOTDIR ); - } - - const char *const argv[] = { - "/bin/cp", - "--", - file.asString().c_str(), - dest.asString().c_str(), - NULL - }; - ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); - for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { - DBG << " " << output; - } - int ret = prog.close(); - return _Log_Result( ret, "returned" ); -} -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::md5sum -// METHOD TYPE : std::string -// -std::string PathInfo::md5sum( const Pathname & file ) -{ - if ( ! PathInfo( file ).isFile() ) { - return string(); - } - ifstream istr( file.asString().c_str() ); - if ( ! istr ) { - return string(); - } - return Digest::digest( "MD5", istr ); -} + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : readdir + // METHOD TYPE : int + // + int readdir( std::list & retlist, + const Pathname & path, bool dots ) + { + retlist.clear(); -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::sha1sum -// METHOD TYPE : std::string -// -std::string PathInfo::sha1sum( const Pathname & file ) -{ - if ( ! PathInfo( file ).isFile() ) { - return string(); - } - ifstream istr( file.asString().c_str() ); - if ( ! istr ) { - return string(); - } - return Digest::digest( "SHA1", istr ); -} + std::list content; + int res = readdir( content, path, dots ); -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::erase -// METHOD TYPE : int -// -// DESCRIPTION : -// -int PathInfo::erase( const Pathname & path ) -{ - int res = 0; - PathInfo p( path, LSTAT ); - if ( p.isExist() ) - { - if ( p.isDir() ) - res = PathInfo::recursive_rmdir( path ); - else - res = PathInfo::unlink( path ); + if ( !res ) { + for ( std::list::const_iterator it = content.begin(); it != content.end(); ++it ) { + retlist.push_back( path + *it ); + } + } + + return res; } - return res; -} -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::chmod -// METHOD TYPE : int -// -int PathInfo::chmod( const Pathname & path, mode_t mode ) -{ - DBG << "chmod " << path << ' ' << stringutil::octstring( mode ); - if ( ::chmod( path.asString().c_str(), mode ) == -1 ) { - return _Log_Result( errno ); - } - return _Log_Result( 0 ); -} + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : readdir + // METHOD TYPE : int + // + int readdir( DirContent & retlist, const Pathname & path, + bool dots, PathInfo::Mode statmode ) + { + retlist.clear(); -/////////////////////////////////////////////////////////////////// -// -// -// METHOD NAME : PathInfo::zipType -// METHOD TYPE : PathInfo::ZIP_TYPE -// -PathInfo::ZIP_TYPE PathInfo::zipType( const Pathname & file ) -{ - ZIP_TYPE ret = ZT_NONE; - - int fd = open( file.asString().c_str(), O_RDONLY ); - - if ( fd != -1 ) { - const int magicSize = 3; - unsigned char magic[magicSize]; - memset( magic, 0, magicSize ); - if ( read( fd, magic, magicSize ) == magicSize ) { - if ( magic[0] == 0037 && magic[1] == 0213 ) { - ret = ZT_GZ; - } else if ( magic[0] == 'B' && magic[1] == 'Z' && magic[2] == 'h' ) { - ret = ZT_BZ2; - } - } - close( fd ); - } - - return ret; -} + std::list content; + int res = readdir( content, path, dots ); + + if ( !res ) { + for ( std::list::const_iterator it = content.begin(); it != content.end(); ++it ) { + PathInfo p( path + *it, statmode ); + retlist.push_back( DirEntry( *it, p.fileType() ) ); + } + } + + return res; + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : unlink + // METHOD TYPE : int + // + int unlink( const Pathname & path ) + { + DBG << "unlink " << path; + if ( ::unlink( path.asString().c_str() ) == -1 ) { + return _Log_Result( errno ); + } + return _Log_Result( 0 ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : rename + // METHOD TYPE : int + // + int rename( const Pathname & oldpath, const Pathname & newpath ) + { + DBG << "rename " << oldpath << " -> " << newpath; + if ( ::rename( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) { + return _Log_Result( errno ); + } + return _Log_Result( 0 ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : copy + // METHOD TYPE : int + // + int copy( const Pathname & file, const Pathname & dest ) + { + DBG << "copy " << file << " -> " << dest << ' '; + + PathInfo sp( file ); + if ( !sp.isFile() ) { + return _Log_Result( EINVAL ); + } + + PathInfo dp( dest ); + if ( dp.isDir() ) { + return _Log_Result( EISDIR ); + } + + const char *const argv[] = { + "/bin/cp", + "--", + file.asString().c_str(), + dest.asString().c_str(), + NULL + }; + ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); + for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { + DBG << " " << output; + } + int ret = prog.close(); + return _Log_Result( ret, "returned" ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : symlink + // METHOD TYPE : int + // + int symlink( const Pathname & oldpath, const Pathname & newpath ) + { + DBG << "symlink " << newpath << " -> " << oldpath; + if ( ::symlink( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) { + return _Log_Result( errno ); + } + return _Log_Result( 0 ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : hardlink + // METHOD TYPE : int + // + int hardlink( const Pathname & oldpath, const Pathname & newpath ) + { + DBG << "hardlink " << newpath << " -> " << oldpath; + if ( ::link( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) { + return _Log_Result( errno ); + } + return _Log_Result( 0 ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : copy_file2dir + // METHOD TYPE : int + // + int copy_file2dir( const Pathname & file, const Pathname & dest ) + { + DBG << "copy_file2dir " << file << " -> " << dest << ' '; + + PathInfo sp( file ); + if ( !sp.isFile() ) { + return _Log_Result( EINVAL ); + } + + PathInfo dp( dest ); + if ( !dp.isDir() ) { + return _Log_Result( ENOTDIR ); + } + + const char *const argv[] = { + "/bin/cp", + "--", + file.asString().c_str(), + dest.asString().c_str(), + NULL + }; + ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout ); + for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { + DBG << " " << output; + } + int ret = prog.close(); + return _Log_Result( ret, "returned" ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : md5sum + // METHOD TYPE : std::string + // + std::string md5sum( const Pathname & file ) + { + if ( ! PathInfo( file ).isFile() ) { + return string(); + } + std::ifstream istr( file.asString().c_str() ); + if ( ! istr ) { + return string(); + } + return Digest::digest( "MD5", istr ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : sha1sum + // METHOD TYPE : std::string + // + std::string sha1sum( const Pathname & file ) + { + if ( ! PathInfo( file ).isFile() ) { + return string(); + } + std::ifstream istr( file.asString().c_str() ); + if ( ! istr ) { + return string(); + } + return Digest::digest( "SHA1", istr ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : erase + // METHOD TYPE : int + // + int erase( const Pathname & path ) + { + int res = 0; + PathInfo p( path, PathInfo::LSTAT ); + if ( p.isExist() ) + { + if ( p.isDir() ) + res = recursive_rmdir( path ); + else + res = unlink( path ); + } + return res; + } + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : chmod + // METHOD TYPE : int + // + int chmod( const Pathname & path, mode_t mode ) + { + DBG << "chmod " << path << ' ' << str::octstring( mode ); + if ( ::chmod( path.asString().c_str(), mode ) == -1 ) { + return _Log_Result( errno ); + } + return _Log_Result( 0 ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : zipType + // METHOD TYPE : ZIP_TYPE + // + ZIP_TYPE zipType( const Pathname & file ) + { + ZIP_TYPE ret = ZT_NONE; + + int fd = open( file.asString().c_str(), O_RDONLY ); + + if ( fd != -1 ) { + const int magicSize = 3; + unsigned char magic[magicSize]; + memset( magic, 0, magicSize ); + if ( read( fd, magic, magicSize ) == magicSize ) { + if ( magic[0] == 0037 && magic[1] == 0213 ) { + ret = ZT_GZ; + } else if ( magic[0] == 'B' && magic[1] == 'Z' && magic[2] == 'h' ) { + ret = ZT_BZ2; + } + } + close( fd ); + } + + return ret; + } + + ///////////////////////////////////////////////////////////////// + } // namespace filesystem + /////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// } // namespace zypp +/////////////////////////////////////////////////////////////////// diff --git a/zypp/PathInfo.h b/zypp/PathInfo.h index 397b62e..3dbc546 100644 --- a/zypp/PathInfo.h +++ b/zypp/PathInfo.h @@ -8,8 +8,6 @@ \---------------------------------------------------------------------*/ /** \file zypp/PathInfo.h * - * \todo replace by Blocxx - * */ #ifndef ZYPP_PATHINFO_H #define ZYPP_PATHINFO_H @@ -31,169 +29,361 @@ extern "C" #include "zypp/Pathname.h" -namespace zypp { - /////////////////////////////////////////////////////////////////// -// -// CLASS NAME : PathInfo -/** - * @short Wrapper class for ::stat/::lstat and other file/directory related operations. - **/ -class PathInfo { - - friend std::ostream & operator<<( std::ostream & str, const PathInfo & obj ); - - public: - - enum Mode { STAT, LSTAT }; - - enum file_type { - NOT_AVAIL = 0x00, // no typeinfo available - NOT_EXIST = 0x01, // file does not exist - T_FILE = 0x02, - T_DIR = 0x04, - T_CHARDEV = 0x08, - T_BLOCKDEV = 0x10, - T_FIFO = 0x20, - T_LINK = 0x40, - T_SOCKET = 0x80 - }; - friend std::ostream & operator<<( std::ostream & str, file_type obj ); - - /** - * Wrapper class for mode_t values as derived from ::stat - **/ - class stat_mode; - - /** - * Simple cache remembering device/inode to detect hardlinks. - **/ - class devino_cache; - - private: - - Pathname path_t; - - struct stat statbuf_C; - Mode mode_e; - int error_i; - - public: - - PathInfo( const Pathname & path = "", Mode initial = STAT ); - PathInfo( const std::string & path, Mode initial = STAT ); - PathInfo( const char * path, Mode initial = STAT ); - virtual ~PathInfo(); - - const Pathname & path() const { return path_t; } - const std::string & asString() const { return path_t.asString(); } - Mode mode() const { return mode_e; } - int error() const { return error_i; } - - void setPath( const Pathname & path ) { if ( path != path_t ) error_i = -1; path_t = path; } - void setMode( Mode mode ) { if ( mode != mode_e ) error_i = -1; mode_e = mode; } - - bool stat ( const Pathname & path ) { setPath( path ); setMode( STAT ); return operator()(); } - bool lstat ( const Pathname & path ) { setPath( path ); setMode( LSTAT ); return operator()(); } - bool operator()( const Pathname & path ) { setPath( path ); return operator()(); } - - bool stat() { setMode( STAT ); return operator()(); } - bool lstat() { setMode( LSTAT ); return operator()(); } - bool operator()(); - - public: - - bool isExist() const { return !error_i; } - - // file type - file_type fileType() const; - - bool isFile() const { return isExist() && S_ISREG( statbuf_C.st_mode ); } - bool isDir () const { return isExist() && S_ISDIR( statbuf_C.st_mode ); } - bool isLink() const { return isExist() && S_ISLNK( statbuf_C.st_mode ); } - bool isChr() const { return isExist() && S_ISCHR( statbuf_C.st_mode ); } - bool isBlk() const { return isExist() && S_ISBLK( statbuf_C.st_mode ); } - bool isFifo() const { return isExist() && S_ISFIFO( statbuf_C.st_mode ); } - bool isSock() const { return isExist() && S_ISSOCK( statbuf_C.st_mode ); } - - nlink_t nlink() const { return isExist() ? statbuf_C.st_nlink : 0; } - - // owner - uid_t owner() const { return isExist() ? statbuf_C.st_uid : 0; } - gid_t group() const { return isExist() ? statbuf_C.st_gid : 0; } - - // permission - bool isRUsr() const { return isExist() && (statbuf_C.st_mode & S_IRUSR); } - bool isWUsr() const { return isExist() && (statbuf_C.st_mode & S_IWUSR); } - bool isXUsr() const { return isExist() && (statbuf_C.st_mode & S_IXUSR); } - - bool isR() const { return isRUsr(); } - bool isW() const { return isWUsr(); } - bool isX() const { return isXUsr(); } - - bool isRGrp() const { return isExist() && (statbuf_C.st_mode & S_IRGRP); } - bool isWGrp() const { return isExist() && (statbuf_C.st_mode & S_IWGRP); } - bool isXGrp() const { return isExist() && (statbuf_C.st_mode & S_IXGRP); } +namespace zypp +{ ///////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + /** Types and functions for filesystem operations. + * \todo move zypp::filesystem stuff into separate header + * \todo Add tmpfile and tmpdir handling. + * \todo think about using Exceptions in zypp::filesystem + * \todo provide a readdir iterator; at least provide an interface + * using an insert_iterator to be independent from std::container. + */ + namespace filesystem + { ///////////////////////////////////////////////////////////////// - bool isROth() const { return isExist() && (statbuf_C.st_mode & S_IROTH); } - bool isWOth() const { return isExist() && (statbuf_C.st_mode & S_IWOTH); } - bool isXOth() const { return isExist() && (statbuf_C.st_mode & S_IXOTH); } - - bool isUid() const { return isExist() && (statbuf_C.st_mode & S_ISUID); } - bool isGid() const { return isExist() && (statbuf_C.st_mode & S_ISGID); } - bool isVtx() const { return isExist() && (statbuf_C.st_mode & S_ISVTX); } - - mode_t uperm() const { return isExist() ? (statbuf_C.st_mode & S_IRWXU) : 0; } - mode_t gperm() const { return isExist() ? (statbuf_C.st_mode & S_IRWXG) : 0; } - mode_t operm() const { return isExist() ? (statbuf_C.st_mode & S_IRWXO) : 0; } - mode_t perm() const { return isExist() ? (statbuf_C.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)) : 0; } - - bool isPerm ( mode_t m ) const { return (m == perm()); } - bool hasPerm( mode_t m ) const { return (m == (m & perm())); } - - mode_t st_mode() const { return isExist() ? statbuf_C.st_mode : 0; } - - // permission according to current uid/gid (returns [0-7]) - mode_t userMay() const; - - bool userMayR() const { return( userMay() & 01 ); } - bool userMayW() const { return( userMay() & 02 ); } - bool userMayX() const { return( userMay() & 04 ); } - - bool userMayRW() const { return( (userMay() & 03) == 03 ); } - bool userMayRX() const { return( (userMay() & 05) == 05 ); } - bool userMayWX() const { return( (userMay() & 06) == 06 ); } + /////////////////////////////////////////////////////////////////// + /** File type information. + * \todo Think about an \ref g_EnumerationClass + */ + enum FileType + { + FT_NOT_AVAIL = 0x00, // no typeinfo available + FT_NOT_EXIST = 0x01, // file does not exist + FT_FILE = 0x02, + FT_DIR = 0x04, + FT_CHARDEV = 0x08, + FT_BLOCKDEV = 0x10, + FT_FIFO = 0x20, + FT_LINK = 0x40, + FT_SOCKET = 0x80 + }; + /////////////////////////////////////////////////////////////////// - bool userMayRWX() const { return( userMay() == 07 ); } + /** \relates FileType Stram output. */ + extern std::ostream & operator<<( std::ostream & str, FileType obj ); - // device - dev_t dev() const { return isExist() ? statbuf_C.st_dev : 0; } - dev_t rdev() const { return isExist() ? statbuf_C.st_rdev : 0; } - ino_t ino() const { return isExist() ? statbuf_C.st_ino : 0; } + /////////////////////////////////////////////////////////////////// - // size - off_t size() const { return isExist() ? statbuf_C.st_size : 0; } - unsigned long blksize() const { return isExist() ? statbuf_C.st_blksize : 0; } - unsigned long blocks() const { return isExist() ? statbuf_C.st_blocks : 0; } + /////////////////////////////////////////////////////////////////// + // + // CLASS NAME : StatMode + /** + * @short Wrapper class for mode_t values as derived from ::stat + **/ + class StatMode + { + friend std::ostream & operator<<( std::ostream & str, const StatMode & obj ); + + public: + /** Ctor taking mode_t value from ::stat. */ + StatMode( const mode_t & mode_r = 0 ) + : _mode( mode_r ) + {} - // time - time_t atime() const { return isExist() ? statbuf_C.st_atime : 0; } /* time of last access */ - time_t mtime() const { return isExist() ? statbuf_C.st_mtime : 0; } /* time of last modification */ - time_t ctime() const { return isExist() ? statbuf_C.st_ctime : 0; } + public: + + /** \name Query FileType. */ + //@{ + FileType fileType() const; + + bool isFile() const { return S_ISREG( _mode ); } + bool isDir () const { return S_ISDIR( _mode ); } + bool isLink() const { return S_ISLNK( _mode ); } + bool isChr() const { return S_ISCHR( _mode ); } + bool isBlk() const { return S_ISBLK( _mode ); } + bool isFifo() const { return S_ISFIFO( _mode ); } + bool isSock() const { return S_ISSOCK( _mode ); } + //@} + + /** \name Query user permissions. */ + //@{ + bool isRUsr() const { return (_mode & S_IRUSR); } + bool isWUsr() const { return (_mode & S_IWUSR); } + bool isXUsr() const { return (_mode & S_IXUSR); } + + /** Short for isRUsr().*/ + bool isR() const { return isRUsr(); } + /** Short for isWUsr().*/ + bool isW() const { return isWUsr(); } + /** Short for isXUsr().*/ + bool isX() const { return isXUsr(); } + //@} + + /** \name Query group permissions. */ + //@{ + bool isRGrp() const { return (_mode & S_IRGRP); } + bool isWGrp() const { return (_mode & S_IWGRP); } + bool isXGrp() const { return (_mode & S_IXGRP); } + //@} + + /** \name Query others permissions. */ + //@{ + bool isROth() const { return (_mode & S_IROTH); } + bool isWOth() const { return (_mode & S_IWOTH); } + bool isXOth() const { return (_mode & S_IXOTH); } + //@} + + /** \name Query special permissions. */ + //@{ + /** Set UID bit. */ + bool isUid() const { return (_mode & S_ISUID); } + /** Set GID bit. */ + bool isGid() const { return (_mode & S_ISGID); } + /** Sticky bit. */ + bool isVtx() const { return (_mode & S_ISVTX); } + //@} + + /** \name Query permission */ + //@{ + /** Test for equal permission bits. */ + bool isPerm ( mode_t m ) const { return (m == perm()); } + /** Test for set permission bits. */ + bool hasPerm( mode_t m ) const { return (m == (m & perm())); } + //@} + + /** \name Extract permission bits only. */ + //@{ + mode_t uperm() const { return (_mode & S_IRWXU); } + mode_t gperm() const { return (_mode & S_IRWXG); } + mode_t operm() const { return (_mode & S_IRWXO); } + mode_t perm() const { return (_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)); } + //@} + + /** Return the mode_t value. */ + mode_t st_mode() const { return _mode; } + + private: + mode_t _mode; + }; + /////////////////////////////////////////////////////////////////// - public: + /** \relates StatMode Stream output. */ + extern std::ostream & operator<<( std::ostream & str, const StatMode & obj ); /////////////////////////////////////////////////////////////////// - // convenience stuff + /////////////////////////////////////////////////////////////////// - // static functions as they may or may not invalidate any stat info - // stored by a PathiInfo. + // + // CLASS NAME : DevInoCache + /** Simple cache remembering device/inode to detect hardlinks. + * \code + * DevInoCache trace; + * for ( all files ) { + * if ( trace.insert( file.device, file.inode ) ) { + * // 1st occurance of file + * } + * // else: hardlink; already counted this device/inode + * } + * } + * \endcode + **/ + class DevInoCache + { + public: + /** Ctor */ + DevInoCache() {} + + /** Clear cache. */ + void clear() { _devino.clear(); } + + /** Remember dev/ino. + * \Return true if it's inserted the first + * time, false if alredy present in cache + * (a hardlink to a previously remembered file). + **/ + bool insert( const dev_t & dev_r, const ino_t & ino_r ) { + return _devino[dev_r].insert( ino_r ).second; + } + + private: + std::map > _devino; + }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// - // Directories + // + // CLASS NAME : PathInfo + /** Wrapper class for ::stat/::lstat. + * + * \note All attribute quieries test for isExist(), and return \c false or + * \c 0, if stat was not successful. + * + * \note For convenience PathInfo is available as zypp::PathInfo too. + **/ + class PathInfo + { + friend std::ostream & operator<<( std::ostream & str, const PathInfo & obj ); + + public: + /** stat() or lstat() */ + enum Mode { STAT, LSTAT }; + + public: + /** \name Construct from Pathname. + * Default mode is \c STAT. + */ + //@{ + PathInfo(); + explicit + PathInfo( const Pathname & path, Mode initial = STAT ); + explicit + PathInfo( const std::string & path, Mode initial = STAT ); + explicit + PathInfo( const char * path, Mode initial = STAT ); + //@} + + /**Dtor */ + ~PathInfo(); + + /** Return current Pathname. */ + const Pathname & path() const { return path_t; } + /** Return current Pathname as String. */ + const std::string & asString() const { return path_t.asString(); } + /** Return current stat Mode. */ + Mode mode() const { return mode_e; } + /** Return error returned from last stat/lstat call. */ + int error() const { return error_i; } + + /** Set a new Pathname. */ + void setPath( const Pathname & path ) { if ( path != path_t ) error_i = -1; path_t = path; } + /** Set a new Mode . */ + void setMode( Mode mode ) { if ( mode != mode_e ) error_i = -1; mode_e = mode; } + + /** STAT \a path. */ + bool stat ( const Pathname & path ) { setPath( path ); setMode( STAT ); return operator()(); } + /** LSTAT \a path. */ + bool lstat ( const Pathname & path ) { setPath( path ); setMode( LSTAT ); return operator()(); } + /** Restat \a path using current mode. */ + bool operator()( const Pathname & path ) { setPath( path ); return operator()(); } + + /** STAT current path. */ + bool stat() { setMode( STAT ); return operator()(); } + /** LSTAT current path. */ + bool lstat() { setMode( LSTAT ); return operator()(); } + /** Restat current path using current mode. */ + bool operator()(); + + public: + + /** Return whether valid stat info exists. + * That's usg. whether the file exist and you had permission to + * stat it. + */ + bool isExist() const { return !error_i; } + + /** \name Query StatMode attibutes. + * Combines \ref zypp::PathInfo::isExist and \ref zypp::filesystem::StatMode query. + */ + //@{ + FileType fileType() const; + + bool isFile() const { return isExist() && S_ISREG( statbuf_C.st_mode ); } + bool isDir () const { return isExist() && S_ISDIR( statbuf_C.st_mode ); } + bool isLink() const { return isExist() && S_ISLNK( statbuf_C.st_mode ); } + bool isChr() const { return isExist() && S_ISCHR( statbuf_C.st_mode ); } + bool isBlk() const { return isExist() && S_ISBLK( statbuf_C.st_mode ); } + bool isFifo() const { return isExist() && S_ISFIFO( statbuf_C.st_mode ); } + bool isSock() const { return isExist() && S_ISSOCK( statbuf_C.st_mode ); } + + // permission + bool isRUsr() const { return isExist() && (statbuf_C.st_mode & S_IRUSR); } + bool isWUsr() const { return isExist() && (statbuf_C.st_mode & S_IWUSR); } + bool isXUsr() const { return isExist() && (statbuf_C.st_mode & S_IXUSR); } + + bool isR() const { return isRUsr(); } + bool isW() const { return isWUsr(); } + bool isX() const { return isXUsr(); } + + bool isRGrp() const { return isExist() && (statbuf_C.st_mode & S_IRGRP); } + bool isWGrp() const { return isExist() && (statbuf_C.st_mode & S_IWGRP); } + bool isXGrp() const { return isExist() && (statbuf_C.st_mode & S_IXGRP); } + + bool isROth() const { return isExist() && (statbuf_C.st_mode & S_IROTH); } + bool isWOth() const { return isExist() && (statbuf_C.st_mode & S_IWOTH); } + bool isXOth() const { return isExist() && (statbuf_C.st_mode & S_IXOTH); } + + bool isUid() const { return isExist() && (statbuf_C.st_mode & S_ISUID); } + bool isGid() const { return isExist() && (statbuf_C.st_mode & S_ISGID); } + bool isVtx() const { return isExist() && (statbuf_C.st_mode & S_ISVTX); } + + bool isPerm ( mode_t m ) const { return isExist() && (m == perm()); } + bool hasPerm( mode_t m ) const { return isExist() && (m == (m & perm())); } + + mode_t uperm() const { return isExist() ? (statbuf_C.st_mode & S_IRWXU) : 0; } + mode_t gperm() const { return isExist() ? (statbuf_C.st_mode & S_IRWXG) : 0; } + mode_t operm() const { return isExist() ? (statbuf_C.st_mode & S_IRWXO) : 0; } + mode_t perm() const { return isExist() ? (statbuf_C.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)) : 0; } + + mode_t st_mode() const { return isExist() ? statbuf_C.st_mode : 0; } + //@} + + /** Return st_mode() as filesystem::StatMode. */ + StatMode asStatMode() const { return st_mode(); } + + nlink_t nlink() const { return isExist() ? statbuf_C.st_nlink : 0; } + + /** \name Owner and group */ + //@{ + uid_t owner() const { return isExist() ? statbuf_C.st_uid : 0; } + gid_t group() const { return isExist() ? statbuf_C.st_gid : 0; } + //@} + + /** \name Permission according to current uid/gid. */ + //@{ + /** Returns current users permission ([0-7])*/ + mode_t userMay() const; + + bool userMayR() const { return( userMay() & 01 ); } + bool userMayW() const { return( userMay() & 02 ); } + bool userMayX() const { return( userMay() & 04 ); } + + bool userMayRW() const { return( (userMay() & 03) == 03 ); } + bool userMayRX() const { return( (userMay() & 05) == 05 ); } + bool userMayWX() const { return( (userMay() & 06) == 06 ); } + + bool userMayRWX() const { return( userMay() == 07 ); } + //@} + + /** \name Device and inode info. */ + //@{ + dev_t dev() const { return isExist() ? statbuf_C.st_dev : 0; } + dev_t rdev() const { return isExist() ? statbuf_C.st_rdev : 0; } + ino_t ino() const { return isExist() ? statbuf_C.st_ino : 0; } + //@} + + /** \name Size info. */ + //@{ + off_t size() const { return isExist() ? statbuf_C.st_size : 0; } + unsigned long blksize() const { return isExist() ? statbuf_C.st_blksize : 0; } + unsigned long blocks() const { return isExist() ? statbuf_C.st_blocks : 0; } + //@} + + /** \name Time stamps. */ + //@{ + time_t atime() const { return isExist() ? statbuf_C.st_atime : 0; } /* time of last access */ + time_t mtime() const { return isExist() ? statbuf_C.st_mtime : 0; } /* time of last modification */ + time_t ctime() const { return isExist() ? statbuf_C.st_ctime : 0; } + //@} + + private: + Pathname path_t; + struct stat statbuf_C; + Mode mode_e; + int error_i; + }; + /////////////////////////////////////////////////////////////////// + + /** \relates PathInfo Stream output. */ + extern std::ostream & operator<<( std::ostream & str, const PathInfo & obj ); + /////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + /** \name Directory related functions. */ + //@{ /** * Like '::mkdir'. Attempt to create a new directory named path. mode * specifies the permissions to use. It is modified by the process's @@ -201,7 +391,7 @@ class PathInfo { * * @return 0 on success, errno on failure **/ - static int mkdir( const Pathname & path, unsigned mode = 0755 ); + int mkdir( const Pathname & path, unsigned mode = 0755 ); /** * Like 'mkdir -p'. No error if directory exists. Make parent directories @@ -210,14 +400,14 @@ class PathInfo { * * @return 0 on success, errno on failure **/ - static int assert_dir( const Pathname & path, unsigned mode = 0755 ); + int assert_dir( const Pathname & path, unsigned mode = 0755 ); /** * Like '::rmdir'. Delete a directory, which must be empty. * * @return 0 on success, errno on failure **/ - static int rmdir( const Pathname & path ); + int rmdir( const Pathname & path ); /** * Like 'rm -r DIR'. Delete a directory, recursively removing its contents. @@ -225,7 +415,7 @@ class PathInfo { * @return 0 on success, ENOTDIR if path is not a directory, otherwise the * commands return value. **/ - static int recursive_rmdir( const Pathname & path ); + int recursive_rmdir( const Pathname & path ); /** * Like 'rm -r DIR/ *'. Delete directory contents, but keep the directory itself. @@ -233,7 +423,7 @@ class PathInfo { * @return 0 on success, ENOTDIR if path is not a directory, otherwise the * commands return value. **/ - static int clean_dir( const Pathname & path ); + int clean_dir( const Pathname & path ); /** * Like 'cp -a srcpath destpath'. Copy directory tree. srcpath/destpath must be @@ -242,28 +432,50 @@ class PathInfo { * @return 0 on success, ENOTDIR if srcpath/destpath is not a directory, EEXIST if * 'basename srcpath' exists in destpath, otherwise the commands return value. **/ - static int copy_dir( const Pathname & srcpath, const Pathname & destpath ); + int copy_dir( const Pathname & srcpath, const Pathname & destpath ); /** * Return content of directory via retlist. If dots is false * entries starting with '.' are not reported. "." and ".." * are never reported. * + * Returns just the directory entries as string. + * * @return 0 on success, errno on failure. + * + * \todo provide some readdirIterator. **/ - static int readdir( std::list & retlist, - const Pathname & path, bool dots = true ); - struct direntry { + int readdir( std::list & retlist, + const Pathname & path, bool dots = true ); + + /** + * Return content of directory via retlist. If dots is false + * entries starting with '.' are not reported. "." and ".." + * are never reported. + * + * Returns the directory entries prefixed with \a path. + * + * @return 0 on success, errno on failure. + * + * \todo provide some readdirIterator. + **/ + + int readdir( std::list & retlist, + const Pathname & path, bool dots = true ); + + /** Listentry returned by readdir. */ + struct DirEntry { std::string name; - file_type type; - direntry( const std::string & name_r = std::string(), file_type type_r = NOT_AVAIL ) - : name( name_r ) - , type( type_r ) + FileType type; + DirEntry( const std::string & name_r = std::string(), FileType type_r = FT_NOT_AVAIL ) + : name( name_r ) + , type( type_r ) {} }; - typedef std::list dircontent; + /** Returned by readdir. */ + typedef std::list DirContent; /** * Return content of directory via retlist. If dots is false @@ -275,26 +487,26 @@ class PathInfo { * * @return 0 on success, errno on failure. **/ - static int readdir( dircontent & retlist, const Pathname & path, - bool dots = true, Mode statmode = STAT ); + int readdir( DirContent & retlist, const Pathname & path, + bool dots = true, PathInfo::Mode statmode = PathInfo::STAT ); + //@} /////////////////////////////////////////////////////////////////// - // Files - /////////////////////////////////////////////////////////////////// - + /** \name File related functions. */ + //@{ /** * Like '::unlink'. Delete a file (symbolic link, socket, fifo or device). * * @return 0 on success, errno on failure **/ - static int unlink( const Pathname & path ); + int unlink( const Pathname & path ); /** * Like '::rename'. Renames a file, moving it between directories if required. * * @return 0 on success, errno on failure **/ - static int rename( const Pathname & oldpath, const Pathname & newpath ); + int rename( const Pathname & oldpath, const Pathname & newpath ); /** * Like 'cp file dest'. Copy file to destination file. @@ -302,7 +514,7 @@ class PathInfo { * @return 0 on success, EINVAL if file is not a file, EISDIR if * destiantion is a directory, otherwise the commands return value. **/ - static int copy( const Pathname & file, const Pathname & dest ); + int copy( const Pathname & file, const Pathname & dest ); /** * Like '::symlink'. Creates a symbolic link named newpath which contains @@ -310,7 +522,7 @@ class PathInfo { * * @return 0 on success, errno on failure. **/ - static int symlink( const Pathname & oldpath, const Pathname & newpath ); + int symlink( const Pathname & oldpath, const Pathname & newpath ); /** * Like '::link'. Creates a hard link named newpath to an existing file @@ -318,7 +530,7 @@ class PathInfo { * * @return 0 on success, errno on failure. **/ - static int hardlink( const Pathname & oldpath, const Pathname & newpath ); + int hardlink( const Pathname & oldpath, const Pathname & newpath ); /** * Like 'cp file dest'. Copy file to dest dir. @@ -326,48 +538,43 @@ class PathInfo { * @return 0 on success, EINVAL if file is not a file, ENOTDIR if dest * is no directory, otherwise the commands return value. **/ - static int copy_file2dir( const Pathname & file, const Pathname & dest ); + int copy_file2dir( const Pathname & file, const Pathname & dest ); + //@} + /////////////////////////////////////////////////////////////////// + /** \name Digest computaion. + * \todo check cooperation with zypp::Digest + */ + //@{ /** * Compute a files md5sum. * * @return the files md5sum on success, otherwise an empty string.. **/ - static std::string md5sum( const Pathname & file ); + std::string md5sum( const Pathname & file ); /** * Compute a files sha1sum. * * @return the files sha1sum on success, otherwise an empty string.. **/ - static std::string sha1sum( const Pathname & file ); - - /////////////////////////////////////////////////////////////////// - // - /////////////////////////////////////////////////////////////////// - - /** - * Erase whatever happens to be located at path (file or directory). - * - * @return 0 on success. - **/ - static int erase( const Pathname & path ); + std::string sha1sum( const Pathname & file ); + //@} /////////////////////////////////////////////////////////////////// - // permissions - /////////////////////////////////////////////////////////////////// - + /** \name Changing permissions. */ + //@{ /** * Like '::chmod'. The mode of the file given by path is changed. * * @return 0 on success, errno on failure **/ - static int chmod( const Pathname & path, mode_t mode ); + int chmod( const Pathname & path, mode_t mode ); + //@} /////////////////////////////////////////////////////////////////// - // magic - /////////////////////////////////////////////////////////////////// - + /** \name Misc. */ + //@{ /** * Test whether a file is compressed (gzip/bzip2). * @@ -375,115 +582,26 @@ class PathInfo { **/ enum ZIP_TYPE { ZT_NONE, ZT_GZ, ZT_BZ2 }; - static ZIP_TYPE zipType( const Pathname & file ); -}; + ZIP_TYPE zipType( const Pathname & file ); -/////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////// -// -// CLASS NAME : PathInfo::stat_mode -/** - * @short Wrapper class for mode_t values as derived from ::stat - **/ -class PathInfo::stat_mode { - friend std::ostream & operator<<( std::ostream & str, const stat_mode & obj ); - private: - mode_t _mode; - public: - stat_mode( const mode_t & mode_r = 0 ) : _mode( mode_r ) {} - public: - // file type - file_type fileType() const; - - bool isFile() const { return S_ISREG( _mode ); } - bool isDir () const { return S_ISDIR( _mode ); } - bool isLink() const { return S_ISLNK( _mode ); } - bool isChr() const { return S_ISCHR( _mode ); } - bool isBlk() const { return S_ISBLK( _mode ); } - bool isFifo() const { return S_ISFIFO( _mode ); } - bool isSock() const { return S_ISSOCK( _mode ); } - - // permission - bool isRUsr() const { return (_mode & S_IRUSR); } - bool isWUsr() const { return (_mode & S_IWUSR); } - bool isXUsr() const { return (_mode & S_IXUSR); } - - bool isR() const { return isRUsr(); } - bool isW() const { return isWUsr(); } - bool isX() const { return isXUsr(); } - - bool isRGrp() const { return (_mode & S_IRGRP); } - bool isWGrp() const { return (_mode & S_IWGRP); } - bool isXGrp() const { return (_mode & S_IXGRP); } - - bool isROth() const { return (_mode & S_IROTH); } - bool isWOth() const { return (_mode & S_IWOTH); } - bool isXOth() const { return (_mode & S_IXOTH); } - - bool isUid() const { return (_mode & S_ISUID); } - bool isGid() const { return (_mode & S_ISGID); } - bool isVtx() const { return (_mode & S_ISVTX); } - - mode_t uperm() const { return (_mode & S_IRWXU); } - mode_t gperm() const { return (_mode & S_IRWXG); } - mode_t operm() const { return (_mode & S_IRWXO); } - mode_t perm() const { return (_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)); } - - bool isPerm ( mode_t m ) const { return (m == perm()); } - bool hasPerm( mode_t m ) const { return (m == (m & perm())); } - - mode_t st_mode() const { return _mode; } -}; - -/////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////// -// -// CLASS NAME : PathInfo::devino_cache -/** - * @short Simple cache remembering device/inode to detect hardlinks. - *
- *     PathInfo::devino_cache trace;
- *     for ( all files ) {
- *       if ( trace.insert( file.device, file.inode ) ) {
- *         // 1st occurance of file
- *       }
- *         // else: hardlink; already counted this device/inode
- *       }
- *     }
- * 
- **/ -class PathInfo::devino_cache { - - private: - - std::map > _devino; - - public: /** - * Constructor + * Erase whatever happens to be located at path (file or directory). + * + * @return 0 on success. + * + * \todo check cooperation with zypp::TmpFile and zypp::TmpDir **/ - devino_cache() {} + int erase( const Pathname & path ); + //@} - /** - * Clear cache - **/ - void clear() { _devino.clear(); } + ///////////////////////////////////////////////////////////////// + } // namespace filesystem + /////////////////////////////////////////////////////////////////// - /** - * Remember dev/ino. Return true if it's inserted the first - * time, false if alredy present in cache (a hardlink to a - * previously remembered file. - **/ - bool insert( const dev_t & dev_r, const ino_t & ino_r ) { - return _devino[dev_r].insert( ino_r ).second; - } -}; - -/////////////////////////////////////////////////////////////////// + /** Dragged into namespace zypp. */ + using filesystem::PathInfo; -/////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// } // namespace zypp - +/////////////////////////////////////////////////////////////////// #endif // ZYPP_PATHINFO_H diff --git a/zypp/Pathname.cc b/zypp/Pathname.cc index 7958684..0452745 100644 --- a/zypp/Pathname.cc +++ b/zypp/Pathname.cc @@ -16,240 +16,246 @@ using std::string; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////// - namespace + namespace filesystem { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// - // - // CLASS NAME : DirStack - // - /** silly helper to build Pathnames. - */ - class DirStack { + namespace + { ///////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + // + // CLASS NAME : DirStack + // + /** silly helper to build Pathnames. + */ + class DirStack { + + struct Dir { + + Dir * up; + Dir * dn; + string name; + + Dir( const string & n = "" ) { + name = n; + up = dn = 0; + } - struct Dir { + ~Dir() { + if ( up ) + up->dn = dn; + if ( dn ) + dn->up = up; + } + }; - Dir * up; - Dir * dn; - string name; + Dir * top; + Dir * bot; - Dir( const string & n = "" ) { - name = n; - up = dn = 0; + void Pop() { + if ( !top ) + return; + top = top->dn; + if ( top ) + delete top->up; + else { + delete bot; + bot = 0; + } } - ~Dir() { - if ( up ) - up->dn = dn; - if ( dn ) - dn->up = up; - } - }; + public: - Dir * top; - Dir * bot; - - void Pop() { - if ( !top ) - return; - top = top->dn; - if ( top ) - delete top->up; - else { - delete bot; - bot = 0; + DirStack() { top = bot = 0; } + ~DirStack() { + while ( bot ) + Pop(); } - } - - public: - DirStack() { top = bot = 0; } - ~DirStack() { - while ( bot ) - Pop(); - } - - void Push( const string & n ) { - if ( n.empty() || n == "." ) { // '.' or '/' only for bot - if ( bot ) - return; - } else if ( n == ".." && top ) { - if ( top->name == "" ) // "/.." ==> "/" - return; + void Push( const string & n ) { + if ( n.empty() || n == "." ) { // '.' or '/' only for bot + if ( bot ) + return; + } else if ( n == ".." && top ) { + if ( top->name == "" ) // "/.." ==> "/" + return; + + if ( top->name != "." && top->name != ".." ) { // "somedir/.." ==> "" + Pop(); + return; + } + // "../.." "./.." stays + } - if ( top->name != "." && top->name != ".." ) { // "somedir/.." ==> "" - Pop(); - return; + Dir * d = new Dir( n ); + if ( !top ) + top = bot = d; + else { + top->up = d; + d->dn = top; + d->up = 0; + top = d; } - // "../.." "./.." stays } - Dir * d = new Dir( n ); - if ( !top ) - top = bot = d; - else { - top->up = d; - d->dn = top; - d->up = 0; - top = d; + string str() { + if ( !bot ) + return ""; + string ret; + for ( Dir * d = bot; d; d = d->up ) { + if ( d != bot ) + ret += "/"; + ret += d->name; + } + if ( ret.empty() ) + return "/"; + return ret; } + }; + + ///////////////////////////////////////////////////////////////// + } // namespace + /////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : Pathname::_assign + // METHOD TYPE : void + // + void Pathname::_assign( const string & name_tv ) + { + prfx_i = 0; + name_t = name_tv; + + if ( name_t.empty() ) + return; + + string Tprfx; + DirStack Stack_Ci; + + char * Buf_aci = new char[name_tv.length() + 1]; + char * W_pci = Buf_aci; + const char * R_pci = name_tv.c_str(); + + // check for prefix + if ( name_t.length() >= 2 + && name_t[1] == ':' + && ( 'a' <= name_t[0] && name_t[0] <= 'z' + || 'A' <= name_t[0] && name_t[0] <= 'Z' ) ) { + Tprfx = name_t.substr( 0, 2 ); + prfx_i = 2; + R_pci += 2; } - string str() { - if ( !bot ) - return ""; - string ret; - for ( Dir * d = bot; d; d = d->up ) { - if ( d != bot ) - ret += "/"; - ret += d->name; - } - if ( ret.empty() ) - return "/"; - return ret; + // rel or abs path + if ( *R_pci == '/' || *R_pci == '\\' ) { + Stack_Ci.Push( "" ); + ++R_pci; + } else { + Stack_Ci.Push( "." ); } - }; - ///////////////////////////////////////////////////////////////// - } // namespace - /////////////////////////////////////////////////////////////////// + do { + switch ( *R_pci ) { + case '/': + case '\\': + case '\0': + if ( W_pci != Buf_aci ) { + *W_pci = '\0'; + W_pci = Buf_aci; + Stack_Ci.Push( Buf_aci ); + } + break; - /////////////////////////////////////////////////////////////////// - // - // METHOD NAME : Pathname::_assign - // METHOD TYPE : void - // - void Pathname::_assign( const string & name_tv ) - { - prfx_i = 0; - name_t = name_tv; - - if ( name_t.empty() ) - return; - - string Tprfx; - DirStack Stack_Ci; - - char * Buf_aci = new char[name_tv.length() + 1]; - char * W_pci = Buf_aci; - const char * R_pci = name_tv.c_str(); - - // check for prefix - if ( name_t.length() >= 2 - && name_t[1] == ':' - && ( 'a' <= name_t[0] && name_t[0] <= 'z' - || 'A' <= name_t[0] && name_t[0] <= 'Z' ) ) { - Tprfx = name_t.substr( 0, 2 ); - prfx_i = 2; - R_pci += 2; - } + default: + *W_pci++ = *R_pci; + break; + } + } while( *R_pci++ ); - // rel or abs path - if ( *R_pci == '/' || *R_pci == '\\' ) { - Stack_Ci.Push( "" ); - ++R_pci; - } else { - Stack_Ci.Push( "." ); + delete Buf_aci; + name_t = Tprfx + Stack_Ci.str(); } - do { - switch ( *R_pci ) { - case '/': - case '\\': - case '\0': - if ( W_pci != Buf_aci ) { - *W_pci = '\0'; - W_pci = Buf_aci; - Stack_Ci.Push( Buf_aci ); - } - break; - - default: - *W_pci++ = *R_pci; - break; + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : Pathname::dirname + // METHOD TYPE : Pathname + // + Pathname Pathname::dirname( const Pathname & name_tv ) + { + if ( name_tv.empty() ) + return ""; + + Pathname ret_t( name_tv ); + string::size_type idx = ret_t.name_t.find_last_of( '/' ); + + if ( idx == string::npos ) { + ret_t.name_t.erase( ret_t.prfx_i ); + ret_t.name_t += "."; + } else if ( idx == ret_t.prfx_i ) { + ret_t.name_t.erase( ret_t.prfx_i ); + ret_t.name_t += "/"; + } else { + ret_t.name_t.erase( idx ); } - } while( *R_pci++ ); - - delete Buf_aci; - name_t = Tprfx + Stack_Ci.str(); - } - /////////////////////////////////////////////////////////////////// - // - // METHOD NAME : Pathname::dirname - // METHOD TYPE : Pathname - // - Pathname Pathname::dirname( const Pathname & name_tv ) - { - if ( name_tv.empty() ) - return ""; - - Pathname ret_t( name_tv ); - string::size_type idx = ret_t.name_t.find_last_of( '/' ); - - if ( idx == string::npos ) { - ret_t.name_t.erase( ret_t.prfx_i ); - ret_t.name_t += "."; - } else if ( idx == ret_t.prfx_i ) { - ret_t.name_t.erase( ret_t.prfx_i ); - ret_t.name_t += "/"; - } else { - ret_t.name_t.erase( idx ); + return ret_t; } - return ret_t; - } + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : Pathname::basename + // METHOD TYPE : string + // + string Pathname::basename( const Pathname & name_tv ) + { + if ( name_tv.empty() ) + return ""; + + string ret_t( name_tv.asString() ); + ret_t.erase( 0, name_tv.prfx_i ); + string::size_type idx = ret_t.find_last_of( '/' ); + if ( idx != string::npos ) { + ret_t.erase( 0, idx+1 ); + } - /////////////////////////////////////////////////////////////////// - // - // METHOD NAME : Pathname::basename - // METHOD TYPE : string - // - string Pathname::basename( const Pathname & name_tv ) - { - if ( name_tv.empty() ) - return ""; - - string ret_t( name_tv.asString() ); - ret_t.erase( 0, name_tv.prfx_i ); - string::size_type idx = ret_t.find_last_of( '/' ); - if ( idx != string::npos ) { - ret_t.erase( 0, idx+1 ); + return ret_t; } - return ret_t; - } + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : Pathname::cat + // METHOD TYPE : Pathname + // + Pathname Pathname::cat( const Pathname & name_tv, const Pathname & add_tv ) + { + if ( add_tv.empty() ) + return name_tv; + if ( name_tv.empty() ) + return add_tv; - /////////////////////////////////////////////////////////////////// - // - // METHOD NAME : Pathname::cat - // METHOD TYPE : Pathname - // - Pathname Pathname::cat( const Pathname & name_tv, const Pathname & add_tv ) - { - if ( add_tv.empty() ) - return name_tv; - if ( name_tv.empty() ) - return add_tv; - - string ret_ti( add_tv.asString() ); - ret_ti.replace( 0, add_tv.prfx_i, "/" ); - - return name_tv.asString() + ret_ti; - } + string ret_ti( add_tv.asString() ); + ret_ti.replace( 0, add_tv.prfx_i, "/" ); - /////////////////////////////////////////////////////////////////// - // - // METHOD NAME : Pathname::Extend - // METHOD TYPE : Pathname - // - Pathname Pathname::extend( const Pathname & l, const string & r ) - { - return l.asString() + r; - } + return name_tv.asString() + ret_ti; + } + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : Pathname::Extend + // METHOD TYPE : Pathname + // + Pathname Pathname::extend( const Pathname & l, const string & r ) + { + return l.asString() + r; + } + + ///////////////////////////////////////////////////////////////// + } // namespace filesystem + /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// diff --git a/zypp/Pathname.h b/zypp/Pathname.h index 0de0741..d406eb4 100644 --- a/zypp/Pathname.h +++ b/zypp/Pathname.h @@ -18,122 +18,135 @@ /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////// - // - // CLASS NAME : Pathname - // - /** Pathname. - * - * Always stores normalized paths (no inner '.' or '..' components - * and no consecutive '/'es). Concatenation automatically adds - * the path separator '/'. - * - * \todo Add support for handling extensions incl. stripping - * extensions from basename (basename("/path/foo.baa", ".baa") ==> "foo") - * \todo Review. Maybe use COW pimpl, ckeck storage. - */ - class Pathname - { - public: - /** Default ctor: an empty path. */ - Pathname() - : prfx_i( 0 ) - {} - - /** Ctor from string. */ - Pathname( const std::string & name_tv ) - { _assign( name_tv ); } - - /** Ctor from char*. */ - Pathname( const char * name_tv ) - { _assign( name_tv ? name_tv : "" ); } - - /** Assign */ - Pathname & operator=( const Pathname & path_tv ) - { - prfx_i = path_tv.prfx_i; - name_t = path_tv.name_t; - return *this; - } - - /** Concatenate and assing. \see cat */ - Pathname & operator+=( const Pathname & path_tv ) - { return( *this = cat( *this, path_tv ) ); } - - /** String representation. */ - const std::string & asString() const - { return name_t; } - - /** Test for an empty path. */ - bool empty() const { return name_t.empty(); } - /** Test for an absolute path. */ - bool absolute() const { return !empty() && name_t[prfx_i] == '/'; } - /** Test for a relative path. */ - bool relative() const { return !empty() && name_t[prfx_i] != '/'; } - - /** Return all but the last component od this path. */ - Pathname dirname() const { return dirname( *this ); } - static Pathname dirname( const Pathname & name_tv ); - - /** Return the last component of this path. */ - std::string basename() const { return basename( *this ); } - static std::string basename( const Pathname & name_tv ); - - /** Return this path, adding a leading '/' if relative. */ - Pathname absolutename() const { return absolutename( *this ); } - static Pathname absolutename( const Pathname & name_tv ) - { return name_tv.relative() ? cat( "/", name_tv ) : name_tv; } - - /** Return this path, removing a leading '/' if absolute.*/ - Pathname relativename() const { return relativename( *this ); } - static Pathname relativename( const Pathname & name_tv ) - { return name_tv.absolute() ? cat( ".", name_tv ) : name_tv; } - - /** Concatenation of pathnames. - * \code - * "foo" + "baa" ==> "foo/baa" - * "foo/" + "baa" ==> "foo/baa" - * "foo" + "/baa" ==> "foo/baa" - * "foo/" + "/baa" ==> "foo/baa" - * \endcode - */ - Pathname cat( const Pathname & r ) const { return cat( *this, r ); } - static Pathname cat( const Pathname & l, const Pathname & r ); - - /** Append string \a r to the last component of the path. - * \code - * "foo/baa".extend( ".h" ) ==> "foo/baa.h" - * \endcode + namespace filesystem + { ///////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + // + // CLASS NAME : Pathname + // + /** Pathname. + * + * \note For convenience Pathname is available as zypp::Pathname too. + * + * Always stores normalized paths (no inner '.' or '..' components + * and no consecutive '/'es). Concatenation automatically adds + * the path separator '/'. + * + * \todo Add support for handling extensions incl. stripping + * extensions from basename (basename("/path/foo.baa", ".baa") ==> "foo") + * \todo Review. Maybe use COW pimpl, ckeck storage. + * \todo \b EXPLICIT ctors. */ - Pathname extend( const std::string & r ) const { return extend( *this, r ); } - static Pathname extend( const Pathname & l, const std::string & r ); - - private: - std::string::size_type prfx_i; - std::string name_t; - - void _assign( const std::string & name_tv ); - }; - /////////////////////////////////////////////////////////////////// - - /** \relates Pathname */ - inline bool operator==( const Pathname & l, const Pathname & r ) - { return l.asString() == r.asString(); } - - /** \relates Pathname */ - inline bool operator!=( const Pathname & l, const Pathname & r ) - { return l.asString() != r.asString(); } - - /** \relates Pathname Concatenate two Pathname. */ - inline Pathname operator+( const Pathname & l, const Pathname & r ) - { return Pathname::cat( l, r ); } - + class Pathname + { + public: + /** Default ctor: an empty path. */ + Pathname() + : prfx_i( 0 ) + {} + + /** Ctor from string. */ + Pathname( const std::string & name_tv ) + { _assign( name_tv ); } + + /** Ctor from char*. */ + Pathname( const char * name_tv ) + { _assign( name_tv ? name_tv : "" ); } + + /** Assign */ + Pathname & operator=( const Pathname & path_tv ) + { + prfx_i = path_tv.prfx_i; + name_t = path_tv.name_t; + return *this; + } + + /** Concatenate and assing. \see cat */ + Pathname & operator+=( const Pathname & path_tv ) + { return( *this = cat( *this, path_tv ) ); } + + /** String representation. */ + const std::string & asString() const + { return name_t; } + + /** Test for an empty path. */ + bool empty() const { return name_t.empty(); } + /** Test for an absolute path. */ + bool absolute() const { return !empty() && name_t[prfx_i] == '/'; } + /** Test for a relative path. */ + bool relative() const { return !empty() && name_t[prfx_i] != '/'; } + + /** Return all but the last component od this path. */ + Pathname dirname() const { return dirname( *this ); } + static Pathname dirname( const Pathname & name_tv ); + + /** Return the last component of this path. */ + std::string basename() const { return basename( *this ); } + static std::string basename( const Pathname & name_tv ); + + /** Return this path, adding a leading '/' if relative. */ + Pathname absolutename() const { return absolutename( *this ); } + static Pathname absolutename( const Pathname & name_tv ) + { return name_tv.relative() ? cat( "/", name_tv ) : name_tv; } + + /** Return this path, removing a leading '/' if absolute.*/ + Pathname relativename() const { return relativename( *this ); } + static Pathname relativename( const Pathname & name_tv ) + { return name_tv.absolute() ? cat( ".", name_tv ) : name_tv; } + + /** Concatenation of pathnames. + * \code + * "foo" + "baa" ==> "foo/baa" + * "foo/" + "baa" ==> "foo/baa" + * "foo" + "/baa" ==> "foo/baa" + * "foo/" + "/baa" ==> "foo/baa" + * \endcode + */ + Pathname cat( const Pathname & r ) const { return cat( *this, r ); } + static Pathname cat( const Pathname & l, const Pathname & r ); + + /** Append string \a r to the last component of the path. + * \code + * "foo/baa".extend( ".h" ) ==> "foo/baa.h" + * \endcode + */ + Pathname extend( const std::string & r ) const { return extend( *this, r ); } + static Pathname extend( const Pathname & l, const std::string & r ); + + private: + std::string::size_type prfx_i; + std::string name_t; + + void _assign( const std::string & name_tv ); + }; + /////////////////////////////////////////////////////////////////// + + /** \relates Pathname */ + inline bool operator==( const Pathname & l, const Pathname & r ) + { return l.asString() == r.asString(); } + + /** \relates Pathname */ + inline bool operator!=( const Pathname & l, const Pathname & r ) + { return l.asString() != r.asString(); } + + /** \relates Pathname Concatenate two Pathname. */ + inline Pathname operator+( const Pathname & l, const Pathname & r ) + { return Pathname::cat( l, r ); } + + /////////////////////////////////////////////////////////////////// + + /** \relates Pathname Stream output */ + inline std::ostream & operator<<( std::ostream & str, const Pathname & obj ) + { return str << obj.asString(); } + + ///////////////////////////////////////////////////////////////// + } // namespace filesystem /////////////////////////////////////////////////////////////////// - /** \relates Pathname Stream output */ - inline std::ostream & operator<<( std::ostream & str, const Pathname & obj ) - { return str << obj.asString(); } + /** Dragged into namespace zypp. */ + using filesystem::Pathname; ///////////////////////////////////////////////////////////////// } // namespace zypp diff --git a/zypp/Resolvable.h b/zypp/Resolvable.h index 7dc97ef..884ec5b 100644 --- a/zypp/Resolvable.h +++ b/zypp/Resolvable.h @@ -118,14 +118,6 @@ namespace zypp /////////////////////////////////////////////////////////////////// - /** Required by intrusive_ptr to add a reference. */ - inline void intrusive_ptr_add_ref( const Resolvable * ptr_r ) - { base::ReferenceCounted::add_ref( ptr_r ); } - - /** Required by intrusive_ptr to release a reference. */ - inline void intrusive_ptr_release( const Resolvable * ptr_r ) - { base::ReferenceCounted::release( ptr_r ); } - /** \relates Resolvable Stream output via Resolvable::dumpOn */ inline std::ostream & operator<<( std::ostream & str, const Resolvable & obj ) { return obj.dumpOn( str ); } diff --git a/zypp/base/Exception.h b/zypp/base/Exception.h index 151ce89..bd1f597 100644 --- a/zypp/base/Exception.h +++ b/zypp/base/Exception.h @@ -12,6 +12,7 @@ #ifndef ZYPP_BASE_EXCEPTION_H #define ZYPP_BASE_EXCEPTION_H +#include #include #include diff --git a/zypp/base/Fd.cc b/zypp/base/Fd.cc new file mode 100644 index 0000000..38ac3f1 --- /dev/null +++ b/zypp/base/Fd.cc @@ -0,0 +1,61 @@ +/*---------------------------------------------------------------------\ +| ____ _ __ __ ___ | +| |__ / \ / / . \ . \ | +| / / \ V /| _/ _/ | +| / /__ | | | | | | | +| /_____||_| |_| |_| | +| | +\---------------------------------------------------------------------*/ +/** \file zypp/base/Fd1.cc + * +*/ +extern "C" +{ +#include +#include +#include +} + +#include "zypp/base/Exception.h" +#include "zypp/base/Fd.h" + +/////////////////////////////////////////////////////////////////// +namespace zypp +{ ///////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + namespace base + { ///////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : Fd::Fd + // METHOD TYPE : Ctor + // + Fd::Fd( const Pathname & file_r, int open_flags ) + : m_fd( -1 ) + { + m_fd = open( file_r.asString().c_str(), open_flags ); + if ( m_fd == -1 ) + ZYPP_THROW_ERRNO_MSG( Exception, std::string("open ")+file_r.asString() ); + } + + /////////////////////////////////////////////////////////////////// + // + // METHOD NAME : Fd::close + // METHOD TYPE : void + // + void Fd::close() + { + if ( m_fd != -1 ) + { + ::close( m_fd ); + m_fd = -1; + } + } + + ///////////////////////////////////////////////////////////////// + } // namespace base + /////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// +} // namespace zypp +/////////////////////////////////////////////////////////////////// diff --git a/zypp/base/Fd.h b/zypp/base/Fd.h new file mode 100644 index 0000000..b545530 --- /dev/null +++ b/zypp/base/Fd.h @@ -0,0 +1,83 @@ +/*---------------------------------------------------------------------\ +| ____ _ __ __ ___ | +| |__ / \ / / . \ . \ | +| / / \ V /| _/ _/ | +| / /__ | | | | | | | +| /_____||_| |_| |_| | +| | +\---------------------------------------------------------------------*/ +/** \file zypp/base/Fd.h + * +*/ +#ifndef ZYPP_BASE_FD_H +#define ZYPP_BASE_FD_H + +#include "zypp/Pathname.h" + +/////////////////////////////////////////////////////////////////// +namespace zypp +{ ///////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + namespace base + { ///////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////// + // + // CLASS NAME : Fd + // + /** Assert \c close called on open filedescriptor. + * \code + * ... + * scoped_ptr fd; // calls close when going out of scope + * try { + * fd.reset( new Fd( "/some/file" ) ); + * } catch ( ... ) { + * // open failed. + * } + * read( fd->fd(), ... ), + * \endcode + * + * \ingroup g_RAII + * \todo It's dumb. Openflags and more related functions (read/write..) + * could be added. + */ + class Fd + { + public: + /** Ctor opens file. + * \throw EXCEPTION If open fails. + */ + Fd( const Pathname & file_r, int open_flags ); + + /** Dtor closes file. */ + ~Fd() + { close(); } + + /** Explicitly close the file. */ + void close(); + + /** Test for valid filedescriptor. */ + bool isOpen() const + { return m_fd != -1; } + + /** Return the filedescriptor. */ + int fd() const + { return m_fd; } + + private: + /** The filedescriptor. */ + int m_fd; + /** No copy. */ + Fd( const Fd & ); + /** No assign. */ + Fd & operator=( const Fd & ); + }; + /////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////// + } // namespace base + /////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// +} // namespace zypp +/////////////////////////////////////////////////////////////////// +#endif // ZYPP_BASE_FD_H diff --git a/zypp/base/IOStream.cc b/zypp/base/IOStream.cc new file mode 100644 index 0000000..1e5aacb --- /dev/null +++ b/zypp/base/IOStream.cc @@ -0,0 +1,50 @@ +/*---------------------------------------------------------------------\ +| ____ _ __ __ ___ | +| |__ / \ / / . \ . \ | +| / / \ V /| _/ _/ | +| / /__ | | | | | | | +| /_____||_| |_| |_| | +| | +\---------------------------------------------------------------------*/ +/** \file zypp/base/IOStream.cc + * +*/ +#include +//#include "zypp/base/Logger.h" + +#include "zypp/base/IOStream.h" + +using std::endl; + +/////////////////////////////////////////////////////////////////// +namespace zypp +{ ///////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + namespace iostr + { ///////////////////////////////////////////////////////////////// + + /****************************************************************** + ** + ** FUNCTION NAME : getline + ** FUNCTION TYPE : std::string + */ + std::string getline( std::istream & str ) + { + static const unsigned tmpBuffLen = 1024; + static char tmpBuff[tmpBuffLen]; + std::string ret; + do { + str.clear(); + str.getline( tmpBuff, tmpBuffLen ); // always writes '\0' terminated + ret += tmpBuff; + } while( str.rdstate() == std::ios::failbit ); + + return ret; + } + + ///////////////////////////////////////////////////////////////// + } // namespace iostr + /////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// +} // namespace zypp +/////////////////////////////////////////////////////////////////// diff --git a/zypp/base/IOStream.h b/zypp/base/IOStream.h new file mode 100644 index 0000000..d1deb74 --- /dev/null +++ b/zypp/base/IOStream.h @@ -0,0 +1,83 @@ +/*---------------------------------------------------------------------\ +| ____ _ __ __ ___ | +| |__ / \ / / . \ . \ | +| / / \ V /| _/ _/ | +| / /__ | | | | | | | +| /_____||_| |_| |_| | +| | +\---------------------------------------------------------------------*/ +/** \file zypp/base/IOStream.h + * +*/ +#ifndef ZYPP_BASE_IOSTREAM_H +#define ZYPP_BASE_IOSTREAM_H + +#include +#include + +#include "zypp/base/PtrTypes.h" + +/////////////////////////////////////////////////////////////////// +namespace zypp +{ ///////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + /** Iostream related utilities. + */ + namespace iostr + { ///////////////////////////////////////////////////////////////// + + /** Save and restore streams \c width, \c precision + * and \c fmtflags. + */ + typedef boost::io::ios_base_all_saver IosFmtFlagsSaver; + + + /** Read one line from stream. + * + * Reads everything up to the next newline or EOF. newline + * is read but not returned. + * + * \see \ref forEachLine + */ + std::string getline( std::istream & str ); + + + /** Simple lineparser: Call functor \a consume_r for each line. + * + * \param str_r The istream to read from. + * \param consume_r A reference to a function or functor. + * \code + * void consume( const std::string & ) + * { ... } + * + * struct Consume : public std::unary_function + * { + * void operator()( const std::string & line_r ) + * { ... } + * }; + * \endcode + * + * \return A reference to \a consume_r. + */ + template + _Function & forEachLine( std::istream & str_r, _Function & consume_r ) + { + while ( str_r ) + { + std::string l = getline( str_r ); + if ( ! (str_r.fail() || str_r.bad()) ) + { + // l contains valid data to be consumed. + consume_r( l ); + } + } + return consume_r; + } + + ///////////////////////////////////////////////////////////////// + } // namespace iostr + /////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// +} // namespace zypp +/////////////////////////////////////////////////////////////////// +#endif // ZYPP_BASE_IOSTREAM_H diff --git a/zypp/base/Makefile.am b/zypp/base/Makefile.am index 127a2ed..55ca9ee 100644 --- a/zypp/base/Makefile.am +++ b/zypp/base/Makefile.am @@ -7,9 +7,11 @@ SUBDIRS = include_HEADERS = \ Debug.h \ + Fd.h \ KindOf.h \ Logger.h \ Exception.h \ + IOStream.h \ NonCopyable.h \ PtrTypes.h \ ReferenceCounted.h \ @@ -17,8 +19,7 @@ include_HEADERS = \ StringVal.h \ \ \ - ExternalDataSource.h \ - stringutil.h + ExternalDataSource.h noinst_LTLIBRARIES = lib@PACKAGE@_base.la @@ -28,12 +29,13 @@ noinst_LTLIBRARIES = lib@PACKAGE@_base.la lib@PACKAGE@_base_la_SOURCES = \ Logger.cc \ Exception.cc \ + Fd.cc \ + IOStream.cc \ String.cc \ StringVal.cc \ \ \ - ExternalDataSource.cc \ - stringutil.cc + ExternalDataSource.cc lib@PACKAGE@_base_la_LIBADD = -lboost_regex diff --git a/zypp/base/ReferenceCounted.h b/zypp/base/ReferenceCounted.h index 9fe8596..8628781 100644 --- a/zypp/base/ReferenceCounted.h +++ b/zypp/base/ReferenceCounted.h @@ -101,6 +101,12 @@ namespace zypp }; /////////////////////////////////////////////////////////////////// + inline void intrusive_ptr_add_ref( const ReferenceCounted * ptr_r ) + { ReferenceCounted::add_ref( ptr_r ); } + + inline void intrusive_ptr_release( const ReferenceCounted * ptr_r ) + { ReferenceCounted::release( ptr_r ); } + ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// diff --git a/zypp/base/String.cc b/zypp/base/String.cc index 8f7e73f..8f20996 100644 --- a/zypp/base/String.cc +++ b/zypp/base/String.cc @@ -30,14 +30,6 @@ namespace zypp */ std::string form( const char * format, ... ) { - struct SafeBuf - { - char * _buf; - SafeBuf() : _buf( 0 ) {} - ~SafeBuf() { if ( _buf ) free( _buf ); } - std::string asString() const - { return _buf ? std::string(_buf) : std::string(); } - }; SafeBuf safe; va_list ap; @@ -50,7 +42,7 @@ namespace zypp /****************************************************************** ** - ** FUNCTION NAME : toLower + ** FUNCTION NAME : strerror ** FUNCTION TYPE : std::string */ std::string strerror( int errno_r ) @@ -96,6 +88,38 @@ namespace zypp return ret; } + /****************************************************************** + ** + ** FUNCTION NAME : trim + ** FUNCTION TYPE : std::string + */ + std::string trim( const std::string & s, const Trim trim_r ) + { + if ( s.empty() || trim_r == NO_TRIM ) + return s; + + std::string ret( s ); + + if ( trim_r && L_TRIM ) + { + std::string::size_type p = ret.find_first_not_of( " \t\n" ); + if ( p == std::string::npos ) + return std::string(); + + ret = ret.substr( p ); + } + + if ( trim_r && R_TRIM ) + { + std::string::size_type p = ret.find_last_not_of( " \t\n" ); + if ( p == std::string::npos ) + return std::string(); + + ret = ret.substr( 0, p+1 ); + } + + return ret; + } ///////////////////////////////////////////////////////////////// } // namespace str diff --git a/zypp/base/String.h b/zypp/base/String.h index 0c9a2a6..eaf1678 100644 --- a/zypp/base/String.h +++ b/zypp/base/String.h @@ -26,16 +26,39 @@ namespace zypp namespace str { ///////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// /** Printf style construction of std::string. */ std::string form( const char * format, ... ) __attribute__ ((format (printf, 1, 2))); + /////////////////////////////////////////////////////////////////// /** Return string describing the \a error_r code. * Like ::strerror, but the numerical value is included in * the string as well. */ std::string strerror( int errno_r ); + /////////////////////////////////////////////////////////////////// + /** Assert \c free called for allocated char *. + * \code + * ... + * SafeBuf safe; + * vasprintf( &safe._buf, format, ap ); + * return safe.asString(); + * \endcode + * + * \ingroup g_RAII + */ + struct SafeBuf + { + char * _buf; + SafeBuf() : _buf( 0 ) {} + ~SafeBuf() { if ( _buf ) free( _buf ); } + std::string asString() const + { return _buf ? std::string(_buf) : std::string(); } + }; + + /////////////////////////////////////////////////////////////////// /** \defgroup ZYPP_STR_REGEX Regular expressions * * Namespace zypp::str regular expressions \b using the @@ -66,6 +89,124 @@ namespace zypp using boost::wsmatch; //@} + /////////////////////////////////////////////////////////////////// + /** \name String representation of number. + * + * Optional second argument sets the minimal string width (' ' padded). + * Negative values will cause the number to be left adjusted within the string. + * + * Default width is 0. + * \code + * numstring(42) -> "42" + * numstring(42, 4) -> " 42" + * numstring(42,-4) -> "42 " + * \endcode + **/ + //@{ + inline std::string numstring( char n, int w = 0 ) { return form( "%*hhd", w, n ); } + inline std::string numstring( unsigned char n, int w = 0 ) { return form( "%*hhu", w, n ); } + inline std::string numstring( short n, int w = 0 ) { return form( "%*hd", w, n ); } + inline std::string numstring( unsigned short n, int w = 0 ) { return form( "%*hu", w, n ); } + inline std::string numstring( int n, int w = 0 ) { return form( "%*d", w, n ); } + inline std::string numstring( unsigned n, int w = 0 ) { return form( "%*u", w, n ); } + inline std::string numstring( long n, int w = 0 ) { return form( "%*ld", w, n ); } + inline std::string numstring( unsigned long n, int w = 0 ) { return form( "%*lu", w, n ); } + inline std::string numstring( long long n, int w = 0 ) { return form( "%*lld", w, n ); } + inline std::string numstring( unsigned long long n, int w = 0 ) { return form( "%*llu", w, n ); } + //@} + + /////////////////////////////////////////////////////////////////// + /** \name String representation of number as hex value with leading '0x'. + * Optional second argument sets the minimal + * string width (0 padded). Negative values will cause the number to be left adjusted + * within the string. Default width is 10 (4 for char). + *
+     * hexstring(42)           -> "0x0000002a"
+     * hexstring(42, 4)        -> "0x2a"
+     * hexstring(42,-4)        -> "0x2a"
+     * 
+ **/ + //@{ + inline std::string hexstring( char n, int w = 4 ) { return form( "%#0*hhx", w, n ); } + inline std::string hexstring( unsigned char n, int w = 4 ) { return form( "%#0*hhx", w, n ); } + inline std::string hexstring( short n, int w = 10 ){ return form( "%#0*hx", w, n ); } + inline std::string hexstring( unsigned short n, int w = 10 ){ return form( "%#0*hx", w, n ); } + inline std::string hexstring( int n, int w = 10 ){ return form( "%#0*x", w, n ); } + inline std::string hexstring( unsigned n, int w = 10 ){ return form( "%#0*x", w, n ); } + inline std::string hexstring( long n, int w = 10 ){ return form( "%#0*lx", w, n ); } + inline std::string hexstring( unsigned long n, int w = 10 ){ return form( "%#0*lx", w, n ); } + inline std::string hexstring( long long n, int w = 0 ) { return form( "%#0*llx", w, n ); } + inline std::string hexstring( unsigned long long n, int w = 0 ) { return form( "%#0*llx", w, n ); } + //@} + + /////////////////////////////////////////////////////////////////// + /** \name String representation of number as octal value with leading '0'. + * Optional second argument sets the minimal + * string width (0 padded). Negative values will cause the number to be left adjusted + * within the string. Default width is 5 (4 for char). + *
+     * octstring(42)           -> "00052"
+     * octstring(42, 4)        -> "0052"
+     * octstring(42,-4)        -> "052 "
+     * 
+ **/ + //@{ + inline std::string octstring( char n, int w = 4 ) { return form( "%#0*hho", w, n ); } + inline std::string octstring( unsigned char n, int w = 4 ) { return form( "%#0*hho", w, n ); } + inline std::string octstring( short n, int w = 5 ) { return form( "%#0*ho", w, n ); } + inline std::string octstring( unsigned short n, int w = 5 ) { return form( "%#0*ho", w, n ); } + inline std::string octstring( int n, int w = 5 ) { return form( "%#0*o", w, n ); } + inline std::string octstring( unsigned n, int w = 5 ) { return form( "%#0*o", w, n ); } + inline std::string octstring( long n, int w = 5 ) { return form( "%#0*lo", w, n ); } + inline std::string octstring( unsigned long n, int w = 5 ) { return form( "%#0*lo", w, n ); } + inline std::string octstring( long long n, int w = 0 ) { return form( "%#0*llo", w, n ); } + inline std::string octstring( unsigned long long n, int w = 0 ) { return form( "%#0*llo", w, n ); } + //@} + + /////////////////////////////////////////////////////////////////// + /** Parsing numbers from string. + */ + //@{ + /** String to integer type determined by template arg. + * \note Only specializations are defined. + * \code + * time_t t = strtonum( "42" ); + * \endcode + */ + template + inline _It strtonum( const std::string & str ); + + template<> + inline short strtonum( const std::string & str ) { return ::strtol ( str.c_str(), NULL, 0 ); } + template<> + inline int strtonum( const std::string & str ) { return ::strtol ( str.c_str(), NULL, 0 ); } + template<> + inline long strtonum( const std::string & str ) { return ::strtol ( str.c_str(), NULL, 0 ); } + template<> + inline long long strtonum( const std::string & str ) { return ::strtoll ( str.c_str(), NULL, 0 ); } + + template<> + inline unsigned short strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); } + template<> + inline unsigned strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); } + template<> + inline unsigned long strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); } + template<> + inline unsigned long long strtonum( const std::string & str ) { return ::strtoull( str.c_str(), NULL, 0 ); } + + /** String to integer type detemined 2nd function arg \a i. + * \code + * time_t t; strtonum( "42", t ); + * \endcode + */ + template + inline _It strtonum( const std::string & str, _It & i ) + { return i = strtonum<_It>( str ); } + //@} + + /////////////////////////////////////////////////////////////////// + /** \name Case conversion. */ + //@{ /** Return lowercase version of \a s * \todo improve */ @@ -75,6 +216,29 @@ namespace zypp * \todo improve */ std::string toUpper( const std::string & s ); + //@} + + /////////////////////////////////////////////////////////////////// + /** \name Trimming whitepace. + * \todo optimize l/r trim. + */ + //@{ + /** To define how to trim. */ + enum Trim { + NO_TRIM = 0x00, + L_TRIM = 0x01, + R_TRIM = 0x02, + TRIM = (L_TRIM|R_TRIM) + }; + + std::string trim( const std::string & s, const Trim trim_r = TRIM ); + + inline std::string ltrim( const std::string & s ) + { return trim( s, L_TRIM ); } + + inline std::string rtrim( const std::string & s ) + { return trim( s, R_TRIM ); } + //@} ///////////////////////////////////////////////////////////////// } // namespace str diff --git a/zypp/base/stringutil.cc b/zypp/base/stringutil.cc deleted file mode 100644 index e33857e..0000000 --- a/zypp/base/stringutil.cc +++ /dev/null @@ -1,298 +0,0 @@ -/*---------------------------------------------------------------------\ -| ____ _ __ __ ___ | -| |__ / \ / / . \ . \ | -| / / \ V /| _/ _/ | -| / /__ | | | | | | | -| /_____||_| |_| |_| | -| | -\---------------------------------------------------------------------*/ -/** \file zypp/base/stringutil.cc - * - * \todo replace by Blocxx - * -*/ - -#include -#include - -#include "zypp/base/stringutil.h" - -using namespace std; -/////////////////////////////////////////////////////////////////// -namespace zypp { - namespace base { - namespace stringutil { -/////////////////////////////////////////////////////////////////// - - const unsigned tmpBuffLen = 1024; - char tmpBuff[tmpBuffLen]; - - /****************************************************************** - ** - ** - ** FUNCTION NAME : getline - ** FUNCTION TYPE : std::string - ** - ** DESCRIPTION : - */ - static inline std::string _getline( std::istream & str, const Trim trim_r ) - { - string ret; - do { - str.clear(); - str.getline( tmpBuff, tmpBuffLen ); // always writes '\0' terminated - ret += tmpBuff; - } while( str.rdstate() == ios::failbit ); - - return trim( ret, trim_r ); - } - - std::string getline( std::istream & str, const Trim trim_r ) - { - return _getline(str, trim_r); - } - - std::string getline( std::istream & str, bool trim ) - { - return _getline(str, trim?TRIM:NO_TRIM); - } - - /****************************************************************** - ** - ** - ** FUNCTION NAME : split - ** FUNCTION TYPE : unsigned - ** - ** DESCRIPTION : - */ - unsigned split( const std::string line_tv, - std::vector & words_Vtr, - const std::string & sep_tv, - const bool singlesep_bv ) - { - words_Vtr.clear(); - if ( line_tv.empty() ) - return words_Vtr.size(); - - struct sepctrl { - const string & sep_t; - sepctrl( const string & sep_tv ) : sep_t( sep_tv ) {} - // Note that '\0' ist neither Sep nor NonSep - inline bool isSep ( const char c ) const { return( sep_t.find( c ) != string::npos ); } - inline bool isNonSep ( const char c ) const { return( c && !isSep(c) ); } - inline void skipSep ( const char *& p ) const { while ( isSep( *p ) ) ++p; } - inline void skipNonSep( const char *& p ) const { while ( isNonSep( *p ) ) ++p; } - }; - - sepctrl sep_Ci( sep_tv ); - const char * s_pci = line_tv.c_str(); - const char * c_pci = s_pci; - - // Start with c_pci at the beginning of the 1st field to add. - // In singlesep the beginning might be equal to the next sep, - // which makes an empty field before the sep. - if ( !singlesep_bv && sep_Ci.isSep( *c_pci ) ) { - sep_Ci.skipSep( c_pci ); - } - - for ( s_pci = c_pci; *s_pci; s_pci = c_pci ) { - sep_Ci.skipNonSep( c_pci ); - words_Vtr.push_back( string( s_pci, c_pci - s_pci ) ); - if ( *c_pci ) { - if ( singlesep_bv ) { - if ( !*(++c_pci) ) { - // line ends with a sep -> add the empty field behind - words_Vtr.push_back( "" ); - } - } else - sep_Ci.skipSep( c_pci ); - } - } - - return words_Vtr.size(); - } - - /****************************************************************** - ** - ** - ** FUNCTION NAME : join - ** FUNCTION TYPE : std::string - ** - ** DESCRIPTION : - */ - std::string join( const std::vector & words_r, - const std::string & sep_r ) - { - if ( words_r.empty() ) - return ""; - - string ret( words_r[0] ); - - for ( unsigned i = 1; i < words_r.size(); ++i ) { - ret += sep_r + words_r[i]; - } - - return ret; - } - - /****************************************************************** - ** - ** - ** FUNCTION NAME : stripFirstWord - ** FUNCTION TYPE : std::string - ** - ** DESCRIPTION : - */ - string stripFirstWord( string & line, const bool ltrim_first ) - { - if ( ltrim_first ) - line = ltrim( line ); - - if ( line.empty() ) - return line; - - string ret; - string::size_type p = line.find_first_of( " \t" ); - - if ( p == string::npos ) { - // no ws on line - ret = line; - line.erase(); - } else if ( p == 0 ) { - // starts with ws - // ret remains empty - line = ltrim( line ); - } - else { - // strip word and ltim line - ret = line.substr( 0, p ); - line = ltrim( line.erase( 0, p ) ); - } - return ret; - } - - /****************************************************************** - ** - ** - ** FUNCTION NAME : ltrim - ** FUNCTION TYPE : std::string - ** - ** DESCRIPTION : - */ - std::string ltrim( const std::string & s ) - { - if ( s.empty() ) - return s; - - string::size_type p = s.find_first_not_of( " \t\n" ); - if ( p == string::npos ) - return ""; - - return s.substr( p ); - } - - /****************************************************************** - ** - ** - ** FUNCTION NAME : rtrim - ** FUNCTION TYPE : std::string - ** - ** DESCRIPTION : - */ - std::string rtrim( const std::string & s ) - { - if ( s.empty() ) - return s; - - string::size_type p = s.find_last_not_of( " \t\n" ); - if ( p == string::npos ) - return ""; - - return s.substr( 0, p+1 ); - } - - /****************************************************************** - ** - ** - ** FUNCTION NAME : toLower - ** FUNCTION TYPE : std::string - ** - ** DESCRIPTION : - */ - std::string toLower( const std::string & s ) - { - if ( s.empty() ) - return s; - - string ret( s ); - for ( string::size_type i = 0; i < ret.length(); ++i ) { - if ( isupper( ret[i] ) ) - ret[i] = static_cast(tolower( ret[i] )); - } - return ret; - } - - /****************************************************************** - ** - ** - ** FUNCTION NAME : toUpper - ** FUNCTION TYPE : std::string - ** - ** DESCRIPTION : - */ - std::string toUpper( const std::string & s ) - { - if ( s.empty() ) - return s; - - string ret( s ); - for ( string::size_type i = 0; i < ret.length(); ++i ) { - if ( islower( ret[i] ) ) - ret[i] = static_cast(toupper( ret[i] )); - } - return ret; - } - - /****************************************************************** - ** - ** - ** FUNCTION NAME : dumpOn - ** FUNCTION TYPE : std::ostream & - ** - ** DESCRIPTION : - */ - std::ostream & dumpOn( std::ostream & str, const std::list & l, const bool numbered ) - { - unsigned i = 0; - for ( std::list::const_iterator it = l.begin(); it != l.end(); ++it, ++i ) { - if ( numbered ) - str << '[' << i << ']'; - str << *it << endl; - } - return str; - } - - /****************************************************************** - ** - ** - ** FUNCTION NAME : dumpOn - ** FUNCTION TYPE : std::ostream & - ** - ** DESCRIPTION : - */ - std::ostream & dumpOn( std::ostream & str, const std::vector & l, const bool numbered ) - { - for ( unsigned i = 0; i < l.size(); ++i ) { - if ( numbered ) - str << '[' << i << ']'; - str << l[i] << endl; - } - return str; - } - -/////////////////////////////////////////////////////////////////// - } // namespace stringutil -/////////////////////////////////////////////////////////////////// - } // namespace base -} // namespace zypp - diff --git a/zypp/base/stringutil.h b/zypp/base/stringutil.h deleted file mode 100644 index 9f79473..0000000 --- a/zypp/base/stringutil.h +++ /dev/null @@ -1,326 +0,0 @@ -/*---------------------------------------------------------------------\ -| ____ _ __ __ ___ | -| |__ / \ / / . \ . \ | -| / / \ V /| _/ _/ | -| / /__ | | | | | | | -| /_____||_| |_| |_| | -| | -\---------------------------------------------------------------------*/ -/** \file zypp/base/stringutil.h - * - * \todo replace by Blocxx - * -*/ - -#ifndef ZYPP_BASE_STRINGUTIL_H -#define ZYPP_BASE_STRINGUTIL_H - -#include -#include - -#include -#include -#include -#include - -/** - * Utility functions for std::strings. Most of them based on stringutil::form. - **/ -/////////////////////////////////////////////////////////////////// -namespace zypp { - namespace base { - namespace stringutil { -////////////////////////////////////////////////////////////////// - - enum Trim { - NO_TRIM = 0x00, - L_TRIM = 0x01, - R_TRIM = 0x02, - TRIM = (L_TRIM|R_TRIM) - }; - - inline std::string form( const char * format, ... ) - __attribute__ ((format (printf, 1, 2))); - - /** - * Printf style building of strings via format string. - *
-       * std::string ex( stringutil::form( "Example number %d", 1 ) );
-       * std::cout << ex << stringutil::form( " and number %d.", 2 ) << endl;
-       *
-       * Will print: Example number 1 and number 2.
-       * 
- **/ - inline std::string form( const char * format, ... ) { - char * buf = 0; - std::string val; - - va_list ap; - va_start( ap, format ); - - #if 1 - vasprintf( &buf, format, ap ); - if ( buf ) { - val = buf; - free( buf ); - } - #else - // Don't know wheter we actually nedd two va_lists, one to - // evaluate the buffer size needed, and one to actually fill - // the buffer. Maybe there's a save way to reuse a va_lists. - va_list ap1; - va_start( ap1, format ); - buf = new char[vsnprintf( NULL, 0, format, ap ) + 1]; - vsprintf( buf, format, ap1 ); - val = buf; - delete [] buf; - va_end( ap1 ); - #endif - - va_end( ap ); - return val; - } - - /** - * Print number. Optional second argument sets the minimal string width (' ' padded). - * Negative values will cause the number to be left adjusted within the string. Default - * width is 0. - *
-       * numstring(42)           -> "42"
-       * numstring(42, 4)        -> "  42"
-       * numstring(42,-4)        -> "42  "
-       * 
- **/ - inline std::string numstring( char n, int w = 0 ) { return form( "%*hhd", w, n ); } - inline std::string numstring( unsigned char n, int w = 0 ) { return form( "%*hhu", w, n ); } - inline std::string numstring( short n, int w = 0 ) { return form( "%*hd", w, n ); } - inline std::string numstring( unsigned short n, int w = 0 ) { return form( "%*hu", w, n ); } - inline std::string numstring( int n, int w = 0 ) { return form( "%*d", w, n ); } - inline std::string numstring( unsigned n, int w = 0 ) { return form( "%*u", w, n ); } - inline std::string numstring( long n, int w = 0 ) { return form( "%*ld", w, n ); } - inline std::string numstring( unsigned long n, int w = 0 ) { return form( "%*lu", w, n ); } - inline std::string numstring( long long n, int w = 0 ) { return form( "%*lld", w, n ); } - inline std::string numstring( unsigned long long n, int w = 0 ) { return form( "%*llu", w, n ); } - - /** - * Print number as hex value with leading '0x'. Optional second argument sets the minimal - * string width (0 padded). Negative values will cause the number to be left adjusted - * within the string. Default width is 10 (4 for char). - *
-       * hexstring(42)           -> "0x0000002a"
-       * hexstring(42, 4)        -> "0x2a"
-       * hexstring(42,-4)        -> "0x2a"
-       * 
- **/ - inline std::string hexstring( char n, int w = 4 ) { return form( "%#0*hhx", w, n ); } - inline std::string hexstring( unsigned char n, int w = 4 ) { return form( "%#0*hhx", w, n ); } - inline std::string hexstring( short n, int w = 10 ){ return form( "%#0*hx", w, n ); } - inline std::string hexstring( unsigned short n, int w = 10 ){ return form( "%#0*hx", w, n ); } - inline std::string hexstring( int n, int w = 10 ){ return form( "%#0*x", w, n ); } - inline std::string hexstring( unsigned n, int w = 10 ){ return form( "%#0*x", w, n ); } - inline std::string hexstring( long n, int w = 10 ){ return form( "%#0*lx", w, n ); } - inline std::string hexstring( unsigned long n, int w = 10 ){ return form( "%#0*lx", w, n ); } - inline std::string hexstring( long long n, int w = 0 ) { return form( "%#0*llx", w, n ); } - inline std::string hexstring( unsigned long long n, int w = 0 ) { return form( "%#0*llx", w, n ); } - - /** - * Print number as octal value with leading '0'. Optional second argument sets the minimal - * string width (0 padded). Negative values will cause the number to be left adjusted - * within the string. Default width is 5 (4 for char). - *
-       * octstring(42)           -> "00052"
-       * octstring(42, 4)        -> "0052"
-       * octstring(42,-4)        -> "052 "
-       * 
- **/ - inline std::string octstring( char n, int w = 4 ) { return form( "%#0*hho", w, n ); } - inline std::string octstring( unsigned char n, int w = 4 ) { return form( "%#0*hho", w, n ); } - inline std::string octstring( short n, int w = 5 ) { return form( "%#0*ho", w, n ); } - inline std::string octstring( unsigned short n, int w = 5 ) { return form( "%#0*ho", w, n ); } - inline std::string octstring( int n, int w = 5 ) { return form( "%#0*o", w, n ); } - inline std::string octstring( unsigned n, int w = 5 ) { return form( "%#0*o", w, n ); } - inline std::string octstring( long n, int w = 5 ) { return form( "%#0*lo", w, n ); } - inline std::string octstring( unsigned long n, int w = 5 ) { return form( "%#0*lo", w, n ); } - inline std::string octstring( long long n, int w = 0 ) { return form( "%#0*llo", w, n ); } - inline std::string octstring( unsigned long long n, int w = 0 ) { return form( "%#0*llo", w, n ); } - - /** - * String to integer type determined by template arg: time_t t = strtonum( "42" ); - **/ - template - inline _It strtonum( const std::string & str ); - - template<> - inline short strtonum( const std::string & str ) { return ::strtol ( str.c_str(), NULL, 0 ); } - template<> - inline int strtonum( const std::string & str ) { return ::strtol ( str.c_str(), NULL, 0 ); } - template<> - inline long strtonum( const std::string & str ) { return ::strtol ( str.c_str(), NULL, 0 ); } - template<> - inline long long strtonum( const std::string & str ) { return ::strtoll ( str.c_str(), NULL, 0 ); } - - template<> - inline unsigned short strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); } - template<> - inline unsigned strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); } - template<> - inline unsigned long strtonum( const std::string & str ) { return ::strtoul ( str.c_str(), NULL, 0 ); } - template<> - inline unsigned long long strtonum( const std::string & str ) { return ::strtoull( str.c_str(), NULL, 0 ); } - - /** - * String to integer type detemined function arg: time_t t; strtonum( "42", t ); - **/ - template - inline _It strtonum( const std::string & str, _It & i ) { return i = strtonum<_It>( str ); } - - /** \brief read one line from a stream - * Return one line read from istream. Afterwards the streampos is behind the delimiting '\n' - * (or at EOF). The delimiting '\n' is not returned. - * - * If trim is true, the string returned is trimmed (surrounding whitespaces removed). - *
-       * ifstream s( "somefile" );
-       *
-       * while ( s ) {
-       *   string l = getline( s );
-       *   if ( !(s.fail() || s.bad()) ) {
-       *
-       *     // l contains valid data to be consumed.
-       *     // In case it makes any difference to you:
-       *     if ( s.good() ) {
-       *       // A delimiting '\n' was read.
-       *     } else {
-       *       // s.eof() is set: There's no '\n' at the end of file.
-       *       // Note: The line returned may netvertheless be empty if trimed is true.
-       *     }
-       *   }
-       * }
-       * 
- **/ - extern std::string getline( std::istream & str, bool trim = false ); - - /** \brief read one line from a stream - * - * like above but with allows to specify trimming direction - * */ - extern std::string getline( std::istream & str, const Trim trim_r ); - - /** - * Split line into words - * - * singlesep_r = false: Separator is any nonenmpty sequence of characters listed in sep_t. - * Leading trailing separators are ignored. - * - * Example: singlesep_r = false, sep_t = ":" - *
-       * ""        -> words 0
-       * ":"       -> words 0
-       * "a"       -> words 1  |a|
-       * "::a"     -> words 1  |a|
-       * "::a::"   -> words 1  |a|
-       * ":a::b:c:"-> words 3  |a|b|c|
-       * 
- * - * singlesep_r = true: Separator is any single character occuring in sep_t. - * Leading trailing separators are not ignored (i.e will cause an empty word). - * - * Example: singlesep_r = true, sep_t = ":" - *
-       * ""        -> words 0
-       * ":"       -> words 2  |||
-       * "a"       -> words 1  |a|
-       * ":a"      -> words 2  ||a|
-       * "a:"      -> words 2  |a||
-       * ":a:"     -> words 3  ||a||
-       * 
- * - **/ - extern unsigned split( const std::string line_r, - std::vector & words_r, - const std::string & sep_t = " \t", - const bool singlesep_r = false ); - - /** - * Join strinngs in words_r using separator sep_r - **/ - extern std::string join( const std::vector & words_r, - const std::string & sep_r = " " ); - - - /** - * Split string into a list of lines using any<\b> char in sep_r as line - * delimiter. The delimiter is stripped from the line. - * - *
-       * splitToLines( "start\n\nend" ) -> { "start", "", "end" }
-       * 
- **/ - inline std::list splitToLines( const std::string text_r, const std::string & sep_r = "\n" ) - { - std::vector lines; - stringutil::split( text_r, lines, "\n", true ); - std::list ret; - for ( unsigned i = 0; i < lines.size(); ++i ) { - ret.push_back( lines[i] ); - } - return ret; - } - - /** - * Strip the first word (delimited by blank or tab) from value, and return it. - * Adjust value to start with the second word afterwards. - * - * If value starts with blank or tab, the first word is empty and value will be - * ltrimmed afterwards. - * - * If ltrim_first is true, value will be ltrimmed before stripping the first word. Thus - * first word is empty, iff value is empty or contains whitespace only. - * - *
-       * stripFirstWord( "1st" )             ==  "1st" and value truncated to ""
-       * stripFirstWord( "1st word" )        ==  "1st" and value truncated to "word"
-       * stripFirstWord( " 1st word" )       ==  ""    and value truncated to "1st word"
-       * stripFirstWord( " 1st word", true ) ==  "1st" and value truncated to "word"
-       * 
- **/ - extern std::string stripFirstWord( std::string & value, const bool ltrim_first = false ); - - /** - * Return string with leading/trailing/surrounding whitespace removed - **/ - extern std::string ltrim( const std::string & s ); - extern std::string rtrim( const std::string & s ); - inline std::string trim( const std::string & s, const Trim trim_r = TRIM ) { - switch ( trim_r ) { - case L_TRIM: - return ltrim( s ); - case R_TRIM: - return rtrim( s ); - case TRIM: - return ltrim( rtrim( s ) ); - case NO_TRIM: - break; - } - return s; - } - - /** - * Return string converted to lower/upper case - **/ - extern std::string toLower( const std::string & s ); - extern std::string toUpper( const std::string & s ); - - /** - * Helper for stream output - **/ - extern std::ostream & dumpOn( std::ostream & str, const std::list & l, const bool numbered = false ); - extern std::ostream & dumpOn( std::ostream & str, const std::vector & l, const bool numbered = false ); - -/////////////////////////////////////////////////////////////////// - } // namespace stringutil - } // namespace base -} // namespace zypp -/////////////////////////////////////////////////////////////////// - -#endif // ZYPP_BASE_STRINGUTIL_H diff --git a/zypp/media/MediaAccess.cc b/zypp/media/MediaAccess.cc index 5e0db37..eb0675e 100644 --- a/zypp/media/MediaAccess.cc +++ b/zypp/media/MediaAccess.cc @@ -176,7 +176,7 @@ void MediaAccess::attach (bool next) { if ( !_handler ) { INT << "Error::E_not_open" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_open"); + ZYPP_THROW( MediaException, "Error::E_not_open"); } _handler->attach(next); } @@ -214,7 +214,7 @@ void MediaAccess::disconnect() { if ( !_handler ) - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_open"); + ZYPP_THROW( MediaException, "Error::E_not_open"); _handler->disconnect(); } @@ -244,11 +244,11 @@ MediaAccess::provideFile( const Pathname & filename, bool cached, bool checkonly } if(checkonly) - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_error"); + ZYPP_THROW( MediaException, "Error::E_error"); if ( !_handler ) { INT << "Error::E_not_open" << " on provideFile(" << filename << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_open"); + ZYPP_THROW( MediaException, "Error::E_not_open"); } _handler->provideFile( filename ); @@ -272,7 +272,7 @@ MediaAccess::provideDir( const Pathname & dirname ) const { if ( !_handler ) { INT << "Error::E_not_open" << " on provideDir(" << dirname << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_open"); + ZYPP_THROW( MediaException, "Error::E_not_open"); } _handler->provideDir( dirname ); @@ -283,7 +283,7 @@ MediaAccess::provideDirTree( const Pathname & dirname ) const { if ( !_handler ) { INT << "Error::E_not_open" << " on provideDirTree(" << dirname << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_open"); + ZYPP_THROW( MediaException, "Error::E_not_open"); } _handler->provideDirTree( dirname ); @@ -315,7 +315,7 @@ MediaAccess::dirInfo( list & retlist, const Pathname & dirname, bool dot if ( !_handler ) { INT << "Error::E_not_open" << " on dirInfo(" << dirname << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_open"); + ZYPP_THROW( MediaException, "Error::E_not_open"); } _handler->dirInfo( retlist, dirname, dots ); @@ -323,13 +323,13 @@ MediaAccess::dirInfo( list & retlist, const Pathname & dirname, bool dot // Return content of directory on media void -MediaAccess::dirInfo( PathInfo::dircontent & retlist, const Pathname & dirname, bool dots ) const +MediaAccess::dirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { retlist.clear(); if ( !_handler ) { INT << "Error::E_not_open" << " on dirInfo(" << dirname << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_open"); + ZYPP_THROW( MediaException, "Error::E_not_open"); } _handler->dirInfo( retlist, dirname, dots ); diff --git a/zypp/media/MediaAccess.h b/zypp/media/MediaAccess.h index 3440c55..059a6be 100644 --- a/zypp/media/MediaAccess.h +++ b/zypp/media/MediaAccess.h @@ -50,8 +50,8 @@ namespace zypp { class MediaAccess : public base::ReferenceCounted, private base::NonCopyable { public: - typedef shared_ptr Ptr; - typedef shared_ptr constPtr; + typedef intrusive_ptr Ptr; + typedef intrusive_ptr constPtr; private: @@ -264,7 +264,7 @@ namespace zypp { /** * Basically the same as dirInfo above. The content is returned as - * PathInfo::dircontent, which includes name and filetype of each directory + * filesystem::DirContent, which includes name and filetype of each directory * entry. Retrieving the filetype usg. requires an additional ::stat call for * each entry, thus it's more expensive than a simple readdir. * @@ -274,8 +274,8 @@ namespace zypp { * \throws MediaException * **/ - void dirInfo( PathInfo::dircontent & retlist, - const Pathname & dirname, bool dots = true ) const; + void dirInfo( filesystem::DirContent & retlist, + const Pathname & dirname, bool dots = true ) const; /** * Destructor @@ -337,7 +337,7 @@ namespace zypp { , _local_file( "" ) { if ( _file.empty() ) { - throw MediaException(ZYPP_EX_CODELOCATION, "E_bad_filename"); + ZYPP_THROW( MediaException, "E_bad_filename"); } else if ( _media ) { try { _media->provideFile( _file ); @@ -345,7 +345,7 @@ namespace zypp { } catch (const MediaException & excpt_r) { - _media.reset(); + _media = NULL; #warning FIXME rethrow the exception #if 0 ZYPP_RETHROW(excpt_r); diff --git a/zypp/media/MediaCurl.cc b/zypp/media/MediaCurl.cc index b6cb573..e9c30a7 100644 --- a/zypp/media/MediaCurl.cc +++ b/zypp/media/MediaCurl.cc @@ -14,7 +14,6 @@ #include "zypp/base/Logger.h" #include "zypp/ExternalProgram.h" -#include "zypp/base/stringutil.h" //#include #include "zypp/media/MediaCurl.h" @@ -100,15 +99,15 @@ void MediaCurl::setCookieFile( const Pathname &fileName ) void MediaCurl::attachTo (bool next) { if ( next ) - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_supported_by_media"); + ZYPP_THROW( MediaException, "Error::E_not_supported_by_media"); if ( !_url.isValid() ) - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_bad_url"); + ZYPP_THROW( MediaException, "Error::E_bad_url"); _curl = curl_easy_init(); if ( !_curl ) { ERR << "curl easy init failed" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_error"); + ZYPP_THROW( MediaException, "Error::E_error"); } _connected = true; @@ -116,13 +115,13 @@ void MediaCurl::attachTo (bool next) CURLcode ret = curl_easy_setopt( _curl, CURLOPT_ERRORBUFFER, _curlError ); if ( ret != 0 ) { ERR << "Error setting error buffer" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } ret = curl_easy_setopt( _curl, CURLOPT_FAILONERROR, true ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } if ( _url.protocol() == Url::http ) { @@ -131,12 +130,12 @@ void MediaCurl::attachTo (bool next) ret = curl_easy_setopt ( _curl, CURLOPT_FOLLOWLOCATION, true ); if ( ret != 0) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } ret = curl_easy_setopt ( _curl, CURLOPT_MAXREDIRS, 3L ); if ( ret != 0) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } } @@ -147,13 +146,13 @@ void MediaCurl::attachTo (bool next) ret = curl_easy_setopt( _curl, CURLOPT_SSL_VERIFYPEER, 0 ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } ret = curl_easy_setopt( _curl, CURLOPT_SSL_VERIFYHOST, 0 ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } } @@ -184,7 +183,7 @@ void MediaCurl::attachTo (bool next) ret = curl_easy_setopt( _curl, CURLOPT_USERPWD, _userpwd.c_str() ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } } @@ -248,7 +247,7 @@ void MediaCurl::attachTo (bool next) ret = curl_easy_setopt( _curl, CURLOPT_PROXY, _proxy.c_str() ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } /*---------------------------------------------------------------* @@ -282,7 +281,7 @@ void MediaCurl::attachTo (bool next) ret = curl_easy_setopt( _curl, CURLOPT_PROXYUSERPWD, _proxyuserpwd.c_str() ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } } @@ -296,27 +295,27 @@ void MediaCurl::attachTo (bool next) _currentCookieFile.c_str() ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } ret = curl_easy_setopt( _curl, CURLOPT_COOKIEJAR, _currentCookieFile.c_str() ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } ret = curl_easy_setopt( _curl, CURLOPT_PROGRESSFUNCTION, &MediaCurl::progressCallback ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } ret = curl_easy_setopt( _curl, CURLOPT_NOPROGRESS, false ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } } @@ -365,10 +364,10 @@ void MediaCurl::getFileCopy( const Pathname & filename , const Pathname & target DBG << filename.asString() << endl; if(!_url.isValid()) - throw MediaException(ZYPP_EX_CODELOCATION, string("Error::E_bad_url") + " " + _url.asString()); + ZYPP_THROW( MediaException, string("Error::E_bad_url") + " " + _url.asString()); if(_url.host().empty()) - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_no_host_specified"); + ZYPP_THROW( MediaException, "Error::E_no_host_specified"); string path = _url.path(); if ( !path.empty() && path != "/" && *path.rbegin() == '/' && @@ -394,10 +393,10 @@ void MediaCurl::getFileCopy( const Pathname & filename , const Pathname & target DBG << "dest: " << dest << endl; DBG << "destNew: " << destNew << endl; - if( PathInfo::assert_dir( dest.dirname() ) ) + if( assert_dir( dest.dirname() ) ) { DBG << "assert_dir " << dest.dirname() << " failed" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, string("Error::E_system") + string(" ") + dest.dirname().asString()); + ZYPP_THROW( MediaException, string("Error::E_system") + string(" ") + dest.dirname().asString()); } DBG << "URL: " << url.asString().c_str() << endl; @@ -413,20 +412,20 @@ void MediaCurl::getFileCopy( const Pathname & filename , const Pathname & target urlBuffer.c_str() ); if ( ret != 0 ) { ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } FILE *file = fopen( destNew.c_str(), "w" ); if ( !file ) { ERR << "fopen failed for file '" << destNew << "'" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, string("Error::E_write_error") + string(" ") + destNew); + ZYPP_THROW( MediaException, string("Error::E_write_error") + string(" ") + destNew); } ret = curl_easy_setopt( _curl, CURLOPT_WRITEDATA, file ); if ( ret != 0 ) { fclose( file ); ERR << _curlError << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_curl_setopt_failed"); + ZYPP_THROW( MediaException, "Error::E_curl_setopt_failed"); } // Set callback and perform. @@ -447,7 +446,7 @@ void MediaCurl::getFileCopy( const Pathname & filename , const Pathname & target } if ( ret != 0 ) { - PathInfo::unlink( destNew ); + unlink( destNew ); ERR << "curl error: " << ret << ": " << _curlError << endl; std::string err; @@ -480,7 +479,7 @@ void MediaCurl::getFileCopy( const Pathname & filename , const Pathname & target #if 0 report->stop( err ); #endif - throw MediaException(ZYPP_EX_CODELOCATION, err + string(" ") + _curlError); + ZYPP_THROW( MediaException, err + string(" ") + _curlError); } } break; @@ -514,16 +513,16 @@ void MediaCurl::getFileCopy( const Pathname & filename , const Pathname & target #if 0 report->stop( err ); #endif - throw MediaException(ZYPP_EX_CODELOCATION, err + string(" ") + _curlError); + ZYPP_THROW( MediaException, err + string(" ") + _curlError); } - if ( PathInfo::rename( destNew, dest ) != 0 ) { + if ( rename( destNew, dest ) != 0 ) { ERR << "Rename failed" << endl; #warning FIXME reenable change report #if 0 report->stop( Error::E_write_error ); #endif - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_write_error"); + ZYPP_THROW( MediaException, "Error::E_write_error"); } #warning FIXME reenable change report @@ -543,7 +542,7 @@ void MediaCurl::getFileCopy( const Pathname & filename , const Pathname & target // void MediaCurl::getDir( const Pathname & dirname, bool recurse_r ) const { - PathInfo::dircontent content; + filesystem::DirContent content; try { getDirInfo( content, dirname, /*dots*/false ); } @@ -555,21 +554,21 @@ void MediaCurl::getDir( const Pathname & dirname, bool recurse_r ) const #endif } - for ( PathInfo::dircontent::const_iterator it = content.begin(); it != content.end(); ++it ) { + for ( filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it ) { try { Pathname filename = dirname + it->name; int res = 0; switch ( it->type ) { - case PathInfo::NOT_AVAIL: // old directory.yast contains no typeinfo at all - case PathInfo::T_FILE: + case filesystem::FT_NOT_AVAIL: // old directory.yast contains no typeinfo at all + case filesystem::FT_FILE: getFile( filename ); break; - case PathInfo::T_DIR: // newer directory.yast contain at least directory info + case filesystem::FT_DIR: // newer directory.yast contain at least directory info if ( recurse_r ) { getDir( filename, recurse_r ); } else { - res = PathInfo::assert_dir( localPath( filename ) ); + res = assert_dir( localPath( filename ) ); if ( res ) { WAR << "Ignore error (" << res << ") on creating local directory '" << localPath( filename ) << "'" << endl; } @@ -606,7 +605,7 @@ void MediaCurl::getDirInfo( std::list & retlist, } catch (const MediaException & excpt_r) { - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_supported_by_media"); + ZYPP_THROW( MediaException, "Error::E_not_supported_by_media"); } } @@ -618,15 +617,15 @@ void MediaCurl::getDirInfo( std::list & retlist, // // DESCRIPTION : Asserted that media is attached and retlist is empty. // -void MediaCurl::getDirInfo( PathInfo::dircontent & retlist, - const Pathname & dirname, bool dots ) const +void MediaCurl::getDirInfo( filesystem::DirContent & retlist, + const Pathname & dirname, bool dots ) const { try { getDirectoryYast( retlist, dirname, dots ); } catch (const MediaException & excpt_r) { - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_supported_by_media"); + ZYPP_THROW( MediaException, "Error::E_not_supported_by_media"); } } diff --git a/zypp/media/MediaException.h b/zypp/media/MediaException.h index 51a5dd6..ad08dcd 100644 --- a/zypp/media/MediaException.h +++ b/zypp/media/MediaException.h @@ -13,7 +13,6 @@ #define ZYPP_MEDIA_MEDIAEXCEPTION_H #include -#include #include "zypp/base/Exception.h" @@ -29,16 +28,13 @@ namespace zypp **/ class MediaException : public Exception { - typedef exception_detail::CodeLocation CodeLocation; public: - /** Ctor taking CodeLocation and message. - * Use \ref ZYPP_THROW to throw exceptions. - */ - MediaException( const CodeLocation & where_r, const std::string & msg_r ) + /** Ctor taking message. */ + MediaException( const std::string & msg_r ) : Exception( msg_r ) {} }; - + ///////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp diff --git a/zypp/media/MediaHandler.cc b/zypp/media/MediaHandler.cc index 6568aa0..6760d5f 100644 --- a/zypp/media/MediaHandler.cc +++ b/zypp/media/MediaHandler.cc @@ -15,11 +15,10 @@ #include #include "zypp/base/Logger.h" +#include "zypp/base/String.h" #include "zypp/media/MediaHandler.h" -#include "zypp/base/stringutil.h" using namespace std; -using namespace zypp::base; // use directory.yast on every media (not just via ftp/http) #define NONREMOTE_DIRECTORY_YAST 1 @@ -75,8 +74,8 @@ MediaHandler::MediaHandler ( const Url & url_r, Pathname apoint; for ( unsigned i = 1; i < 1000; ++i ) { - adir( Pathname::extend( abase, stringutil::hexstring( i ) ) ); - if ( ! adir.isExist() && PathInfo::mkdir( adir.path() ) == 0 ) { + adir( Pathname::extend( abase, str::hexstring( i ) ) ); + if ( ! adir.isExist() && mkdir( adir.path() ) == 0 ) { apoint = adir.path(); break; } @@ -129,7 +128,7 @@ MediaHandler::~MediaHandler() } if ( _tmp_attachPoint ) { - int res = PathInfo::recursive_rmdir( _attachPoint ); + int res = recursive_rmdir( _attachPoint ); if ( res == 0 ) { MIL << "Deleted default attach point " << _attachPoint << endl; } else { @@ -154,7 +153,7 @@ void MediaHandler::attach( bool next ) if ( _attachPoint.empty() ) { ERR << "Error::E_bad_attachpoint" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_bad_attachpoint"); + ZYPP_THROW( MediaException, "Error::E_bad_attachpoint"); } try { @@ -264,9 +263,9 @@ void MediaHandler::provideFileCopy( Pathname srcFilename, Pathname targetFilename ) const { if ( !_isAttached ) { - INT << "Error::E_not_attached" << " on provideFileCopy(" << srcFilename + INT << "Error::E_not_attached" << " on provideFileCopy(" << srcFilename << "," << targetFilename << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_attached"); + ZYPP_THROW( MediaException, "Error::E_not_attached"); } try { @@ -287,9 +286,9 @@ void MediaHandler::provideFile( Pathname filename ) const { if ( !_isAttached ) { INT << "Error::E_not_attached" << " on provideFile(" << filename << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_attached"); + ZYPP_THROW( MediaException, "Error::E_not_attached"); } - + try { getFile( filename ); // pass to concrete handler } @@ -317,7 +316,7 @@ void MediaHandler::provideDir( Pathname dirname ) const { if ( !_isAttached ) { INT << "Error::E_not_attached" << " on provideDir(" << dirname << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_attached"); + ZYPP_THROW( MediaException, "Error::E_not_attached"); } try { getDir( dirname, /*recursive*/false ); // pass to concrete handler @@ -345,7 +344,7 @@ void MediaHandler::provideDirTree( Pathname dirname ) const { if ( !_isAttached ) { INT << "Error::E_not_attached" << " on provideDirTree(" << dirname << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_attached"); + ZYPP_THROW( MediaException, "Error::E_not_attached"); } try { @@ -379,12 +378,12 @@ void MediaHandler::releasePath( Pathname pathname ) const PathInfo info( localPath( pathname ) ); if ( info.isFile() ) { - PathInfo::unlink( info.path() ); + unlink( info.path() ); } else if ( info.isDir() ) { if ( info.path() != _localRoot ) { - PathInfo::recursive_rmdir( info.path() ); + recursive_rmdir( info.path() ); } else { - PathInfo::clean_dir( info.path() ); + clean_dir( info.path() ); } } } @@ -404,7 +403,7 @@ void MediaHandler::dirInfo( list & retlist, if ( !_isAttached ) { INT << "Error::E_not_attached" << " on dirInfo(" << dirname << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_attached"); + ZYPP_THROW( MediaException, "Error::E_not_attached"); } try { @@ -429,14 +428,14 @@ void MediaHandler::dirInfo( list & retlist, // // DESCRIPTION : // -void MediaHandler::dirInfo( PathInfo::dircontent & retlist, - const Pathname & dirname, bool dots ) const +void MediaHandler::dirInfo( filesystem::DirContent & retlist, + const Pathname & dirname, bool dots ) const { retlist.clear(); if ( !_isAttached ) { INT << "Error::E_not_attached" << " on dirInfo(" << dirname << ")" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_attached"); + ZYPP_THROW( MediaException, "Error::E_not_attached"); } try { @@ -464,7 +463,7 @@ void MediaHandler::getDirectoryYast( std::list & retlist, { retlist.clear(); - PathInfo::dircontent content; + filesystem::DirContent content; try { getDirectoryYast( content, dirname, dots ); } @@ -477,7 +476,7 @@ void MediaHandler::getDirectoryYast( std::list & retlist, } // convert to std::list - for ( PathInfo::dircontent::const_iterator it = content.begin(); it != content.end(); ++it ) { + for ( filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it ) { retlist.push_back( it->name ); } } @@ -488,8 +487,8 @@ void MediaHandler::getDirectoryYast( std::list & retlist, // METHOD NAME : MediaHandler::getDirectoryYast // METHOD TYPE : PMError // -void MediaHandler::getDirectoryYast( PathInfo::dircontent & retlist, - const Pathname & dirname, bool dots ) const +void MediaHandler::getDirectoryYast( filesystem::DirContent & retlist, + const Pathname & dirname, bool dots ) const { retlist.clear(); @@ -512,7 +511,7 @@ void MediaHandler::getDirectoryYast( PathInfo::dircontent & retlist, ifstream dir( localPath( dirFile ).asString().c_str() ); if ( dir.fail() ) { ERR << "Unable to load '" << localPath( dirFile ) << "'" << endl; - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_system"); + ZYPP_THROW( MediaException, "Error::E_system"); } string line; @@ -522,10 +521,10 @@ void MediaHandler::getDirectoryYast( PathInfo::dircontent & retlist, // Newer directory.yast append '/' to directory names // Remaining entries are unspecified, although most probabely files. - PathInfo::file_type type = PathInfo::NOT_AVAIL; + filesystem::FileType type = filesystem::FT_NOT_AVAIL; if ( *line.rbegin() == '/' ) { line.erase( line.end()-1 ); - type = PathInfo::T_DIR; + type = filesystem::FT_DIR; } if ( dots ) { @@ -534,7 +533,7 @@ void MediaHandler::getDirectoryYast( PathInfo::dircontent & retlist, if ( *line.begin() == '.' ) continue; } - retlist.push_back( PathInfo::direntry( line, type ) ); + retlist.push_back( filesystem::DirEntry( line, type ) ); } } @@ -568,9 +567,9 @@ void MediaHandler::getFile( const Pathname & filename ) const } if (info.isExist()) - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_a_file"); + ZYPP_THROW( MediaException, "Error::E_not_a_file"); else - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_file_not_found"); + ZYPP_THROW( MediaException, "Error::E_file_not_found"); } @@ -586,9 +585,9 @@ void MediaHandler::getFileCopy ( const Pathname & srcFilename, const Pathname & ZYPP_RETHROW(excpt_r); #endif } - - if ( PathInfo::copy( localPath( srcFilename ), targetFilename ) != 0 ) { - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_write_error"); + + if ( copy( localPath( srcFilename ), targetFilename ) != 0 ) { + ZYPP_THROW( MediaException, "Error::E_write_error"); } } @@ -611,9 +610,9 @@ void MediaHandler::getDir( const Pathname & dirname, bool recurse_r ) const } if (info.isExist()) - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_a_file"); + ZYPP_THROW( MediaException, "Error::E_not_a_file"); else - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_file_not_found"); + ZYPP_THROW( MediaException, "Error::E_file_not_found"); } /////////////////////////////////////////////////////////////////// @@ -626,11 +625,11 @@ void MediaHandler::getDir( const Pathname & dirname, bool recurse_r ) const // Default implementation of pure virtual. // void MediaHandler::getDirInfo( std::list & retlist, - const Pathname & dirname, bool dots ) const + const Pathname & dirname, bool dots ) const { PathInfo info( localPath( dirname ) ); if( ! info.isDir() ) { - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_a_directory"); + ZYPP_THROW( MediaException, "Error::E_not_a_directory"); } #if NONREMOTE_DIRECTORY_YAST @@ -643,9 +642,9 @@ void MediaHandler::getDirInfo( std::list & retlist, #endif // readdir - int res = PathInfo::readdir( retlist, info.path(), dots ); + int res = readdir( retlist, info.path(), dots ); if ( res ) - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_system"); + ZYPP_THROW( MediaException, "Error::E_system"); #if NONREMOTE_DIRECTORY_YAST } @@ -663,12 +662,12 @@ void MediaHandler::getDirInfo( std::list & retlist, // DESCRIPTION : Asserted that media is attached and retlist is empty. // Default implementation of pure virtual. // -void MediaHandler::getDirInfo( PathInfo::dircontent & retlist, - const Pathname & dirname, bool dots ) const +void MediaHandler::getDirInfo( filesystem::DirContent & retlist, + const Pathname & dirname, bool dots ) const { PathInfo info( localPath( dirname ) ); if( ! info.isDir() ) { - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_not_a_directory"); + ZYPP_THROW( MediaException, "Error::E_not_a_directory"); } #if NONREMOTE_DIRECTORY_YAST @@ -681,9 +680,9 @@ void MediaHandler::getDirInfo( PathInfo::dircontent & retlist, #endif // readdir - int res = PathInfo::readdir( retlist, info.path(), dots ); + int res = readdir( retlist, info.path(), dots ); if ( res ) - throw MediaException(ZYPP_EX_CODELOCATION, "Error::E_system"); + ZYPP_THROW( MediaException, "Error::E_system"); #if NONREMOTE_DIRECTORY_YAST } #endif diff --git a/zypp/media/MediaHandler.h b/zypp/media/MediaHandler.h index 438cee8..b8487da 100644 --- a/zypp/media/MediaHandler.h +++ b/zypp/media/MediaHandler.h @@ -164,7 +164,7 @@ class MediaHandler { virtual void getFile( const Pathname & filename ) const = 0; /** - * Call concrete handler to provide a file under a different place + * Call concrete handler to provide a file under a different place * in the file system (usually not under attach point) as a copy. * Media must be attached before by callee. * @@ -175,7 +175,7 @@ class MediaHandler { * **/ virtual void getFileCopy( const Pathname & srcFilename, const Pathname & targetFilename ) const; - + /** * Call concrete handler to provide directory content (not recursive!) @@ -210,11 +210,11 @@ class MediaHandler { * **/ virtual void getDirInfo( std::list & retlist, - const Pathname & dirname, bool dots = true ) const = 0; + const Pathname & dirname, bool dots = true ) const = 0; /** * Basically the same as getDirInfo above. The content list is returned as - * PathInfo::dircontent, which includes name and filetype of each directory + * filesystem::DirContent, which includes name and filetype of each directory * entry. Retrieving the filetype usg. requires an additional ::stat call for * each entry, thus it's more expensive than a simple readdir. * @@ -223,8 +223,8 @@ class MediaHandler { * \throws MediaException * **/ - virtual void getDirInfo( PathInfo::dircontent & retlist, - const Pathname & dirname, bool dots = true ) const = 0; + virtual void getDirInfo( filesystem::DirContent & retlist, + const Pathname & dirname, bool dots = true ) const = 0; protected: @@ -237,7 +237,7 @@ class MediaHandler { * **/ void getDirectoryYast( std::list & retlist, - const Pathname & dirname, bool dots = true ) const; + const Pathname & dirname, bool dots = true ) const; /** * Retrieve and if available scan dirname/directory.yast. @@ -247,8 +247,8 @@ class MediaHandler { * \throws MediaException * **/ - void getDirectoryYast( PathInfo::dircontent & retlist, - const Pathname & dirname, bool dots = true ) const; + void getDirectoryYast( filesystem::DirContent & retlist, + const Pathname & dirname, bool dots = true ) const; public: @@ -363,9 +363,9 @@ class MediaHandler { * **/ void provideFile( Pathname filename ) const; - + /** - * Call concrete handler to provide a copy of a file under a different place + * Call concrete handler to provide a copy of a file under a different place * in the file system (usually not under attach point) as a copy. * Media must be attached before by callee. * @@ -376,7 +376,7 @@ class MediaHandler { * **/ void provideFileCopy( Pathname srcFilename, Pathname targetFilename) const; - + /** * Use concrete handler to provide directory denoted * by path below 'localRoot' (not recursive!). @@ -447,11 +447,11 @@ class MediaHandler { * **/ void dirInfo( std::list & retlist, - const Pathname & dirname, bool dots = true ) const; + const Pathname & dirname, bool dots = true ) const; /** * Basically the same as dirInfo above. The content is returned as - * PathInfo::dircontent, which includes name and filetype of each directory + * filesystem::DirContent, which includes name and filetype of each directory * entry. Retrieving the filetype usg. requires an additional ::stat call for * each entry, thus it's more expensive than a simple readdir. * @@ -461,8 +461,8 @@ class MediaHandler { * \throws MediaException * **/ - void dirInfo( PathInfo::dircontent & retlist, - const Pathname & dirname, bool dots = true ) const; + void dirInfo( filesystem::DirContent & retlist, + const Pathname & dirname, bool dots = true ) const; }; /////////////////////////////////////////////////////////////////// @@ -475,7 +475,7 @@ class MediaHandler { virtual void getDir( const Pathname & dirname, bool recurse_r ) const; \ virtual void getDirInfo( std::list & retlist, \ const Pathname & dirname, bool dots = true ) const; \ - virtual void getDirInfo( PathInfo::dircontent & retlist, \ + virtual void getDirInfo( filesystem::DirContent & retlist, \ const Pathname & dirname, bool dots = true ) const; } // namespace media -- 2.7.4