You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdewebdev/quanta/utility/quantanetaccess.cpp

269 lines
8.4 KiB

/***************************************************************************
quantanetaccess.h - description
-------------------
begin : Jun 21 2004
copyright : (C) 2004 by Jens Herden <jhe@kdewebdev.org>
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; version 2 of the License. *
* *
***************************************************************************/
#include <tqstring.h>
#include <tqwidget.h>
#include <tqdir.h>
#include <kio/netaccess.h>
#include <kurl.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <kfileitem.h>
#include <kstringhandler.h>
#include "qextfileinfo.h"
#include "quantanetaccess.h"
#include "project.h"
bool QuantaNetAccess::upload(const TQString& src, const KURL& target, TQWidget* window, bool confirm)
{
bool ok = KIO::NetAccess::upload(src, target, window);
if (ok) {
checkProjectInsert(target, window, confirm);
} else {
if (confirm)
errorMsg(window);
}
return ok;
}
bool QuantaNetAccess::file_copy( const KURL& src, const KURL& target, int permissions,
bool overwrite, bool resume, TQWidget* window, bool confirm)
{
bool ok = KIO::NetAccess::file_copy( src, target, permissions, overwrite, resume, window );
if (ok) {
checkProjectInsert(target, window, confirm);
} else {
if (confirm)
errorMsg(window);
}
return ok;
}
bool QuantaNetAccess::file_move( const KURL& src, const KURL& target, int permissions,
bool overwrite, bool resume, TQWidget* window, bool confirm)
{
// don't ask if move is inside of the project
bool oldConfirm = confirm;
if ( Project::ref()->projectBaseURL().isParentOf(src) &&
Project::ref()->projectBaseURL().isParentOf(target) )
{
confirm = false;
}
if ( !checkProjectRemove(src, window, confirm)) {
return false;
}
bool ok = KIO::NetAccess::file_move( src, target, permissions, overwrite, resume, window );
if (ok) {
checkProjectInsert(target, window, confirm);
} else {
if (oldConfirm)
errorMsg(window);
}
return ok;
}
bool QuantaNetAccess::dircopy( const KURL::List & srcList, const KURL & target, TQWidget* window, bool confirm )
{
bool ok = KIO::NetAccess::dircopy( srcList, target, window );
if (ok) {
KURL url;
for ( KURL::List::ConstIterator it = srcList.begin(); it != srcList.end(); ++it ) {
url = target;
url.adjustPath(+1);
url.setFileName((*it).fileName());
checkProjectInsert(url, window, confirm);
}
} else {
if (confirm)
errorMsg(window);
}
return ok;
}
bool QuantaNetAccess::move( const KURL::List& srcList, const KURL& target, TQWidget* window, bool confirm )
{
KURL targetURL = adjustURL(target);
bool oldConfirm = confirm;
bool moveInsideProject = false;
bool targetInProject = Project::ref()->projectBaseURL().isParentOf(targetURL);
KURL url;
// first we ask about the URLs in the list without actually removing them from the project
for ( KURL::List::ConstIterator it = srcList.begin(); it != srcList.end(); ++it ) {
//don't ask if move is inside of the project
url = adjustURL(*it);
if (targetInProject && Project::ref()->projectBaseURL().isParentOf(url) )
{
confirm = false;
moveInsideProject = true;
}
if ( !checkProjectRemove(*it, window, confirm, false)) {
return false;
confirm = oldConfirm;
}
}
// all URLs are confirmed, we remove them from the project
for ( KURL::List::ConstIterator it = srcList.begin(); it != srcList.end(); ++it ) {
if ( Project::ref()->projectBaseURL().isParentOf(*it) )
Project::ref()->slotRemove(*it);
}
bool ok = KIO::NetAccess::move( srcList, targetURL, window );
if (ok) {
KURL url;
for ( KURL::List::ConstIterator it = srcList.begin(); it != srcList.end(); ++it ) {
url = target;
url.adjustPath(+1);
url.setFileName((*it).fileName());
checkProjectInsert(url, window, confirm);
Project::ref()->urlMoved(*it, url);
}
} else {
if (confirm)
errorMsg(window);
}
return ok;
}
bool QuantaNetAccess::del( const KURL & url, TQWidget* window, bool confirm )
{
if ( !checkProjectDel(url, window, confirm)) {
return false;
}
bool ok = KIO::NetAccess::del( url, window );
if (!ok && confirm)
{
errorMsg(window);
}
return ok;
}
bool QuantaNetAccess::mkdir( const KURL & url, TQWidget* window, int permissions, bool confirm )
{
KURL u = url;
u.adjustPath(-1); //some servers refuse to create directories ending with a slash
bool ok = KIO::NetAccess::mkdir( u, window, permissions );
if (ok) {
checkProjectInsert(url, window, confirm);
} else {
if (confirm)
errorMsg(window);
}
return ok;
}
void QuantaNetAccess::checkProjectInsert(const KURL& target, TQWidget* window, bool confirm)
{
if ( !Project::ref()->hasProject()) return;
KURL saveUrl = adjustURL(target);
KURL baseURL = Project::ref()->projectBaseURL();
if ( baseURL.isParentOf(saveUrl) && !Project::ref()->contains(saveUrl) )
{
if (confirm)
{
TQString nice = QExtFileInfo::toRelative(saveUrl, baseURL).path();
nice = KStringHandler::lsqueeze(nice, 60);
if ( KMessageBox::Yes != KMessageBox::questionYesNo(window, i18n("<qt>Do you want to add <br><b>%1</b><br> to the project?</qt>").arg(nice), i18n("Add to Project"), KStdGuiItem::add(), i18n("Do Not Add"), "AddToProject") )
{
return;
}
}
KFileItem fileItem(KFileItem::Unknown, KFileItem::Unknown, saveUrl);
if ( fileItem.isDir() )
Project::ref()->slotAddDirectory(saveUrl, false);
else
Project::ref()->slotInsertFile(saveUrl);
}
}
bool QuantaNetAccess::checkProjectRemove(const KURL& src, TQWidget* window, bool confirm, bool remove)
{
if ( !Project::ref()->hasProject() ) return true;
KURL url = adjustURL(src);
KURL baseURL = Project::ref()->projectBaseURL();
if ( baseURL.isParentOf(url) && Project::ref()->contains(url) )
{
if (confirm)
{
TQString nice = QExtFileInfo::toRelative(url, baseURL).path();
nice = KStringHandler::lsqueeze(nice, 60);
if ( KMessageBox::Continue != KMessageBox::warningContinueCancel(window, i18n("<qt>Do you really want to remove <br><b>%1</b><br> from the project?</qt>").arg(nice), i18n("Remove From Project"), KStdGuiItem::remove(), "RemoveFromProject") )
{
return false;
}
}
if (remove)
Project::ref()->slotRemove(url);
}
return true;
}
bool QuantaNetAccess::checkProjectDel(const KURL& src, TQWidget* window, bool confirm)
{
KURL url = adjustURL(src);
if ( Project::ref()->hasProject() )
{
if ( Project::ref()->projectBaseURL().isParentOf(url) && Project::ref()->contains(url) )
{
if (confirm)
{
TQString nice = url.prettyURL(0, KURL::StripFileProtocol);
nice = KStringHandler::csqueeze(nice, 60);
if ( KMessageBox::Continue != KMessageBox::warningContinueCancel(window, i18n("<qt>Do you really want to delete <br><b>%1</b><br> and remove it from the project?</qt>").arg(nice), i18n("Delete & Remove From Project"), KStdGuiItem::del(), "DeleteAndRemoveFromProject") )
{
return false;
}
}
Project::ref()->slotRemove(url);
return true;
}
}
// confirm normal delete if wanted
if (confirm) {
TQString nice = url.prettyURL(0, KURL::StripFileProtocol);
nice = KStringHandler::csqueeze(nice, 60);
return (KMessageBox::Continue == KMessageBox::warningContinueCancel(window, i18n("<qt>Do you really want to delete <br><b>%1</b>?</qt>").arg(nice), i18n("Delete File or Folder"), KStdGuiItem::del(), "DeleteFileOrFolder") );
}
return true;
}
KURL QuantaNetAccess::adjustURL(const KURL &url)
{
KURL u = url;
if ( u.isLocalFile() )
{
TQDir dir(u.path());
u.setPath(dir.canonicalPath());
}
return u;
}
void QuantaNetAccess::errorMsg(TQWidget* window)
{
TQString msg = KIO::NetAccess::lastErrorString();
if ( !msg.isEmpty())
KMessageBox::sorry(window, msg);
}