diff options
Diffstat (limited to 'src/svnqt/path.cpp')
-rw-r--r-- | src/svnqt/path.cpp | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/src/svnqt/path.cpp b/src/svnqt/path.cpp new file mode 100644 index 0000000..676c151 --- /dev/null +++ b/src/svnqt/path.cpp @@ -0,0 +1,290 @@ +/* + * Port for usage with qt-framework and development for kdesvn + * (C) 2005-2007 by Rajko Albrecht + * http://kdesvn.alwins-world.de + */ +/* + * ==================================================================== + * Copyright (c) 2002-2005 The RapidSvn Group. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library (in the file LGPL.txt); if not, + * write to the Free Software Foundation, Inc., 51 Franklin St, + * Fifth Floor, Boston, MA 02110-1301 USA + * + * This software consists of voluntary contributions made by many + * individuals. For exact contribution history, see the revision + * history and logs, available at http://rapidsvn.tigris.org/. + * ==================================================================== + */ + + +// subversion api +#include "svn_path.h" + +// apr api +#include "apr_file_io.h" + +// svncpp +#include "svnqt/path.hpp" +#include "svnqt/pool.hpp" +#include "svnqt/url.hpp" +#include "svnqt/svnqt_defines.hpp" +#include "svnqt/revision.hpp" +#include "svnqt/exception.hpp" + +#include <qurl.h> + +namespace svn +{ + Path::Path (const char * path) + { + init(QString::FROMUTF8(path)); + } + + Path::Path (const QString & path) + { + init (path); + } + + Path::Path (const Path & path) + : m_path(path.m_path) + { + } + + void + Path::init (const QString& path) + { + Pool pool; + + if (path.isEmpty()) { + m_path = ""; + } else { + const char * int_path = svn_path_internal_style (path.TOUTF8(), pool.pool () ); + if (Url::isValid(path) ) { + if (!svn_path_is_uri_safe(int_path)) { + int_path = svn_path_uri_encode(int_path,pool); + } + } + m_path = QString::FROMUTF8(int_path); +#if QT_VERSION < 0x040000 + if (Url::isValid(path) && m_path.find("@")!=-1 ) { +#else + if (Url::isValid(path) && m_path.indexOf("@")!=-1 ) { +#endif + /// @todo make sure that "@" is never used as revision paramter + QUrl uri = m_path; + m_path = uri.path(); + m_path.replace("@","%40"); +#if QT_VERSION < 0x040000 + m_path = uri.protocol()+"://"+(uri.hasUser()?uri.user()+(uri.hasPassword()?":"+uri.password():"")+"@":"") + +uri.host()+m_path; +#else + m_path = uri.scheme()+"://"+uri.authority()+m_path; +#endif + if (m_path.endsWith("/")) { + int_path = svn_path_internal_style (path.TOUTF8(), pool.pool () ); + m_path = QString::FROMUTF8(int_path); + } + } + } + } + + bool Path::isUrl()const + { + return Url::isValid(m_path); + } + + const QString & + Path::path () const + { + return m_path; + } + + Path::operator const QString&()const + { + return m_path; + } + + QString Path::prettyPath()const + { + if (!Url::isValid(m_path)) { + return m_path; + } + Pool pool; + const char * int_path = svn_path_uri_decode(m_path.TOUTF8(), pool.pool () ); + QString _p = QString::FROMUTF8(int_path); + _p.replace("%40","@"); + return _p; + } + + const QByteArray + Path::cstr() const + { + return m_path.TOUTF8(); + } + + Path& + Path::operator=(const Path & path) + { + if (this == &path) + return *this; + m_path = path.path(); + return *this; + } + + bool + Path::isset () const + { + return m_path.length () > 0; + } + + void + Path::addComponent (const QString& component) + { + Pool pool; + + if (Url::isValid (m_path)) + { + const char * newPath = + svn_path_url_add_component (m_path.TOUTF8(), component.TOUTF8(), pool); + m_path = QString::FROMUTF8(newPath); + } + else + { + svn_stringbuf_t * pathStringbuf = + svn_stringbuf_create (m_path.TOUTF8(), pool); + + svn_path_add_component (pathStringbuf, + component.TOUTF8()); + + m_path = QString::FROMUTF8(pathStringbuf->data); + } + } + + + void + Path::addComponent (const char* component) + { + addComponent (QString::FROMUTF8(component)); + } + + + void + Path::removeLast() + { + Pool pool; + if (m_path.length()<=1) { + m_path=QString::FROMUTF8(""); + } + svn_stringbuf_t*pathStringbuf= + svn_stringbuf_create (m_path.TOUTF8(), pool); + svn_path_remove_component(pathStringbuf); + m_path = QString::FROMUTF8(pathStringbuf->data); + } + + void + Path::split (QString & dirpath, QString & basename) const + { + Pool pool; + + const char * cdirpath; + const char * cbasename; + + svn_path_split (prettyPath().TOUTF8(), &cdirpath, &cbasename, pool); + dirpath = QString::FROMUTF8(cdirpath); + basename = QString::FROMUTF8(cbasename); + } + + + void + Path::split (QString & dir, QString & filename, QString & ext) const + { + QString basename; + + // first split path into dir and filename+ext + split (dir, basename); + + // next search for last . +#if QT_VERSION < 0x040000 + int pos = basename.findRev(QChar('.')); +#else + int pos = basename.lastIndexOf(QChar('.')); +#endif + + if (pos == -1) + { + filename = basename; + ext = QString::fromLatin1(""); + } + else + { + filename = basename.left(pos); + ext = basename.mid(pos+1); + } + } + + Path + Path::getTempDir () + { + const char * tempdir = 0; + Pool pool; + + if (apr_temp_dir_get (&tempdir, pool) != APR_SUCCESS) + { + tempdir = 0; + } + + return tempdir; + } + + void + Path::parsePeg(const QString&pathorurl,Path&_path,svn::Revision&_peg) + { + const char *truepath = 0; + svn_opt_revision_t pegr; + svn_error_t *error = 0; + QByteArray _buf = pathorurl.TOUTF8(); + + Pool pool; + error = svn_opt_parse_path(&pegr, &truepath,_buf,pool); + if (error != 0) { + throw ClientException (error); + } + qDebug("Path: %s",truepath); + _peg = svn::Revision(&pegr); + _path=Path(truepath); + } + + unsigned int + Path::length () const + { + return m_path.length (); + } + + + QString + Path::native () const + { + Pool pool; + + return QString::FROMUTF8(svn_path_local_style (m_path.TOUTF8(), pool)); + } + +} + +/* ----------------------------------------------------------------- + * local variables: + * eval: (load-file "../../rapidsvn-dev.el") + * end: + */ |