summaryrefslogtreecommitdiffstats
path: root/libkonq/konq_undo.cc
diff options
context:
space:
mode:
authorMichele Calgaro <[email protected]>2020-12-07 22:58:44 +0900
committerMichele Calgaro <[email protected]>2020-12-07 22:58:44 +0900
commit145abc15d57fb29701a12e8a14dcb9c1fd72e9be (patch)
treefbb4f2f737ec6f4e8a85bea5f2ca2257d20d7e22 /libkonq/konq_undo.cc
parentd95494d97233919fa0b2eebf60759537b793e05b (diff)
downloadtdebase-145abc15d57fb29701a12e8a14dcb9c1fd72e9be.tar.gz
tdebase-145abc15d57fb29701a12e8a14dcb9c1fd72e9be.zip
Renaming of files in preparation for code style tools.
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'libkonq/konq_undo.cc')
-rw-r--r--libkonq/konq_undo.cc667
1 files changed, 0 insertions, 667 deletions
diff --git a/libkonq/konq_undo.cc b/libkonq/konq_undo.cc
deleted file mode 100644
index 51d85587d..000000000
--- a/libkonq/konq_undo.cc
+++ /dev/null
@@ -1,667 +0,0 @@
-/* This file is part of the KDE project
- Copyright (C) 2000 Simon Hausmann <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "konq_undo.h"
-
-#undef Always
-
-#include <tdeio/uiserver_stub.h>
-#include "konq_operations.h"
-
-#include <assert.h>
-
-#include <dcopclient.h>
-#include <dcopref.h>
-
-#include <tdeapplication.h>
-#include <kdatastream.h>
-#include <kdebug.h>
-#include <tdelocale.h>
-#include <tdeglobalsettings.h>
-#include <tdeconfig.h>
-#include <kipc.h>
-
-#include <tdeio/job.h>
-#include <kdirnotify_stub.h>
-
-inline const char *dcopTypeName( const KonqCommand & ) { return "KonqCommand"; }
-inline const char *dcopTypeName( const KonqCommand::Stack & ) { return "KonqCommand::Stack"; }
-
-/**
- * checklist:
- * copy dir -> overwrite -> works
- * move dir -> overwrite -> works
- * copy dir -> rename -> works
- * move dir -> rename -> works
- *
- * copy dir -> works
- * move dir -> works
- *
- * copy files -> works
- * move files -> works (TODO: optimize (change FileCopyJob to use the renamed arg for copyingDone)
- *
- * copy files -> overwrite -> works
- * move files -> overwrite -> works
- *
- * copy files -> rename -> works
- * move files -> rename -> works
- */
-
-class KonqUndoJob : public TDEIO::Job
-{
-public:
- KonqUndoJob() : TDEIO::Job( true ) { KonqUndoManager::incRef(); };
- virtual ~KonqUndoJob() { KonqUndoManager::decRef(); }
-
- virtual void kill( bool q) { KonqUndoManager::self()->stopUndo( true ); TDEIO::Job::kill( q ); }
-};
-
-class KonqCommandRecorder::KonqCommandRecorderPrivate
-{
-public:
- KonqCommandRecorderPrivate()
- {
- }
- ~KonqCommandRecorderPrivate()
- {
- }
-
- KonqCommand m_cmd;
-};
-
-KonqCommandRecorder::KonqCommandRecorder( KonqCommand::Type op, const KURL::List &src, const KURL &dst, TDEIO::Job *job )
- : TQObject( job, "konqcmdrecorder" )
-{
- d = new KonqCommandRecorderPrivate;
- d->m_cmd.m_type = op;
- d->m_cmd.m_valid = true;
- d->m_cmd.m_src = src;
- d->m_cmd.m_dst = dst;
- connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ),
- this, TQT_SLOT( slotResult( TDEIO::Job * ) ) );
-
- if ( op != KonqCommand::MKDIR ) {
- connect( job, TQT_SIGNAL( copyingDone( TDEIO::Job *, const KURL &, const KURL &, bool, bool ) ),
- this, TQT_SLOT( slotCopyingDone( TDEIO::Job *, const KURL &, const KURL &, bool, bool ) ) );
- connect( job, TQT_SIGNAL( copyingLinkDone( TDEIO::Job *, const KURL &, const TQString &, const KURL & ) ),
- this, TQT_SLOT( slotCopyingLinkDone( TDEIO::Job *, const KURL &, const TQString &, const KURL & ) ) );
- }
-
- KonqUndoManager::incRef();
-}
-
-KonqCommandRecorder::~KonqCommandRecorder()
-{
- KonqUndoManager::decRef();
- delete d;
-}
-
-void KonqCommandRecorder::slotResult( TDEIO::Job *job )
-{
- if ( job->error() )
- return;
-
- KonqUndoManager::self()->addCommand( d->m_cmd );
-}
-
-void KonqCommandRecorder::slotCopyingDone( TDEIO::Job *job, const KURL &from, const KURL &to, bool directory, bool renamed )
-{
- KonqBasicOperation op;
- op.m_valid = true;
- op.m_directory = directory;
- op.m_renamed = renamed;
- op.m_src = from;
- op.m_dst = to;
- op.m_link = false;
-
- if ( d->m_cmd.m_type == KonqCommand::TRASH )
- {
- Q_ASSERT( from.isLocalFile() );
- Q_ASSERT( to.protocol() == "trash" );
- TQMap<TQString, TQString> metaData = job->metaData();
- TQMap<TQString, TQString>::ConstIterator it = metaData.find( "trashURL-" + from.path() );
- if ( it != metaData.end() ) {
- // Update URL
- op.m_dst = it.data();
- }
- }
-
- d->m_cmd.m_opStack.prepend( op );
-}
-
-void KonqCommandRecorder::slotCopyingLinkDone( TDEIO::Job *, const KURL &from, const TQString &target, const KURL &to )
-{
- KonqBasicOperation op;
- op.m_valid = true;
- op.m_directory = false;
- op.m_renamed = false;
- op.m_src = from;
- op.m_target = target;
- op.m_dst = to;
- op.m_link = true;
- d->m_cmd.m_opStack.prepend( op );
-}
-
-KonqUndoManager *KonqUndoManager::s_self = 0;
-unsigned long KonqUndoManager::s_refCnt = 0;
-
-class KonqUndoManager::KonqUndoManagerPrivate
-{
-public:
- KonqUndoManagerPrivate()
- {
- m_uiserver = new UIServer_stub( "tdeio_uiserver", "UIServer" );
- m_undoJob = 0;
- }
- ~KonqUndoManagerPrivate()
- {
- delete m_uiserver;
- }
-
- bool m_syncronized;
-
- KonqCommand::Stack m_commands;
-
- KonqCommand m_current;
- TDEIO::Job *m_currentJob;
- UndoState m_undoState;
- TQValueStack<KURL> m_dirStack;
- TQValueStack<KURL> m_dirCleanupStack;
- TQValueStack<KURL> m_fileCleanupStack;
- TQValueList<KURL> m_dirsToUpdate;
-
- bool m_lock;
-
- UIServer_stub *m_uiserver;
- int m_uiserverJobId;
-
- KonqUndoJob *m_undoJob;
-};
-
-KonqUndoManager::KonqUndoManager()
-: DCOPObject( "KonqUndoManager" )
-{
- if ( !kapp->dcopClient()->isAttached() )
- kapp->dcopClient()->attach();
-
- d = new KonqUndoManagerPrivate;
- d->m_syncronized = initializeFromKDesky();
- d->m_lock = false;
- d->m_currentJob = 0;
-}
-
-KonqUndoManager::~KonqUndoManager()
-{
- delete d;
-}
-
-void KonqUndoManager::incRef()
-{
- s_refCnt++;
-}
-
-void KonqUndoManager::decRef()
-{
- s_refCnt--;
- if ( s_refCnt == 0 && s_self )
- {
- delete s_self;
- s_self = 0;
- }
-}
-
-KonqUndoManager *KonqUndoManager::self()
-{
- if ( !s_self )
- {
- if ( s_refCnt == 0 )
- s_refCnt++; // someone forgot to call incRef
- s_self = new KonqUndoManager;
- }
- return s_self;
-}
-
-void KonqUndoManager::addCommand( const KonqCommand &cmd )
-{
- broadcastPush( cmd );
-}
-
-bool KonqUndoManager::undoAvailable() const
-{
- return ( d->m_commands.count() > 0 ) && !d->m_lock;
-}
-
-TQString KonqUndoManager::undoText() const
-{
- if ( d->m_commands.count() == 0 )
- return i18n( "Und&o" );
-
- KonqCommand::Type t = d->m_commands.top().m_type;
- if ( t == KonqCommand::COPY )
- return i18n( "Und&o: Copy" );
- else if ( t == KonqCommand::LINK )
- return i18n( "Und&o: Link" );
- else if ( t == KonqCommand::MOVE )
- return i18n( "Und&o: Move" );
- else if ( t == KonqCommand::TRASH )
- return i18n( "Und&o: Trash" );
- else if ( t == KonqCommand::MKDIR )
- return i18n( "Und&o: Create Folder" );
- else
- assert( false );
- /* NOTREACHED */
- return TQString::null;
-}
-
-void KonqUndoManager::undo()
-{
- KonqCommand cmd = d->m_commands.top();
- assert( cmd.m_valid );
-
- d->m_current = cmd;
-
- TQValueList<KonqBasicOperation>& opStack = d->m_current.m_opStack;
-
- // Let's first ask for confirmation if we need to delete any file (#99898)
- KURL::List fileCleanupStack;
- TQValueList<KonqBasicOperation>::Iterator it = opStack.begin();
- for ( ; it != opStack.end() ; ++it ) {
- if ( !(*it).m_directory && !(*it).m_link && d->m_current.m_type == KonqCommand::COPY ) {
- fileCleanupStack.append( (*it).m_dst );
- }
- }
- if ( !fileCleanupStack.isEmpty() ) {
- // Because undo can happen with an accidental Ctrl-Z, we want to always confirm.
- if ( !KonqOperations::askDeleteConfirmation( fileCleanupStack, KonqOperations::DEL,
- KonqOperations::FORCE_CONFIRMATION,
- 0 /* TODO parent */ ) )
- return;
- }
-
- d->m_dirCleanupStack.clear();
- d->m_dirStack.clear();
- d->m_dirsToUpdate.clear();
-
- d->m_undoState = MOVINGFILES;
-
- broadcastPop();
- broadcastLock();
-
- it = opStack.begin();
- TQValueList<KonqBasicOperation>::Iterator end = opStack.end();
- while ( it != end )
- {
- if ( (*it).m_directory && !(*it).m_renamed )
- {
- d->m_dirStack.push( (*it).m_src );
- d->m_dirCleanupStack.prepend( (*it).m_dst );
- it = d->m_current.m_opStack.remove( it );
- d->m_undoState = MAKINGDIRS;
- kdDebug(1203) << "KonqUndoManager::undo MAKINGDIRS" << endl;
- }
- else if ( (*it).m_link )
- {
- if ( !d->m_fileCleanupStack.contains( (*it).m_dst ) )
- d->m_fileCleanupStack.prepend( (*it).m_dst );
-
- if ( d->m_current.m_type != KonqCommand::MOVE )
- it = d->m_current.m_opStack.remove( it );
- else
- ++it;
- }
- else
- ++it;
- }
-
- /* this shouldn't be necessary at all:
- * 1) the source list may contain files, we don't want to
- * create those as... directories
- * 2) all directories that need creation should already be in the
- * directory stack
- if ( d->m_undoState == MAKINGDIRS )
- {
- KURL::List::ConstIterator it = d->m_current.m_src.begin();
- KURL::List::ConstIterator end = d->m_current.m_src.end();
- for (; it != end; ++it )
- if ( !d->m_dirStack.contains( *it) )
- d->m_dirStack.push( *it );
- }
- */
-
- if ( d->m_current.m_type != KonqCommand::MOVE )
- d->m_dirStack.clear();
-
- d->m_undoJob = new KonqUndoJob;
- d->m_uiserverJobId = d->m_undoJob->progressId();
- undoStep();
-}
-
-void KonqUndoManager::stopUndo( bool step )
-{
- d->m_current.m_opStack.clear();
- d->m_dirCleanupStack.clear();
- d->m_fileCleanupStack.clear();
- d->m_undoState = REMOVINGDIRS;
- d->m_undoJob = 0;
-
- if ( d->m_currentJob )
- d->m_currentJob->kill( true );
-
- d->m_currentJob = 0;
-
- if ( step )
- undoStep();
-}
-
-void KonqUndoManager::slotResult( TDEIO::Job *job )
-{
- d->m_uiserver->jobFinished( d->m_uiserverJobId );
- if ( job->error() )
- {
- job->showErrorDialog( 0L );
- d->m_currentJob = 0;
- stopUndo( false );
- if ( d->m_undoJob )
- {
- delete d->m_undoJob;
- d->m_undoJob = 0;
- }
- }
-
- undoStep();
-}
-
-
-void KonqUndoManager::addDirToUpdate( const KURL& url )
-{
- if ( d->m_dirsToUpdate.find( url ) == d->m_dirsToUpdate.end() )
- d->m_dirsToUpdate.prepend( url );
-}
-
-void KonqUndoManager::undoStep()
-{
- d->m_currentJob = 0;
-
- if ( d->m_undoState == MAKINGDIRS )
- undoMakingDirectories();
-
- if ( d->m_undoState == MOVINGFILES )
- undoMovingFiles();
-
- if ( d->m_undoState == REMOVINGFILES )
- undoRemovingFiles();
-
- if ( d->m_undoState == REMOVINGDIRS )
- undoRemovingDirectories();
-
- if ( d->m_currentJob )
- connect( d->m_currentJob, TQT_SIGNAL( result( TDEIO::Job * ) ),
- this, TQT_SLOT( slotResult( TDEIO::Job * ) ) );
-}
-
-void KonqUndoManager::undoMakingDirectories()
-{
- if ( !d->m_dirStack.isEmpty() ) {
- KURL dir = d->m_dirStack.pop();
- kdDebug(1203) << "KonqUndoManager::undoStep creatingDir " << dir.prettyURL() << endl;
- d->m_currentJob = TDEIO::mkdir( dir );
- d->m_uiserver->creatingDir( d->m_uiserverJobId, dir );
- }
- else
- d->m_undoState = MOVINGFILES;
-}
-
-void KonqUndoManager::undoMovingFiles()
-{
- if ( !d->m_current.m_opStack.isEmpty() )
- {
- KonqBasicOperation op = d->m_current.m_opStack.pop();
-
- assert( op.m_valid );
- if ( op.m_directory )
- {
- if ( op.m_renamed )
- {
- kdDebug(1203) << "KonqUndoManager::undoStep rename " << op.m_dst.prettyURL() << " " << op.m_src.prettyURL() << endl;
- d->m_currentJob = TDEIO::rename( op.m_dst, op.m_src, false );
- d->m_uiserver->moving( d->m_uiserverJobId, op.m_dst, op.m_src );
- }
- else
- assert( 0 ); // this should not happen!
- }
- else if ( op.m_link )
- {
- kdDebug(1203) << "KonqUndoManager::undoStep symlink " << op.m_target << " " << op.m_src.prettyURL() << endl;
- d->m_currentJob = TDEIO::symlink( op.m_target, op.m_src, true, false );
- }
- else if ( d->m_current.m_type == KonqCommand::COPY )
- {
- kdDebug(1203) << "KonqUndoManager::undoStep file_delete " << op.m_dst.prettyURL() << endl;
- d->m_currentJob = TDEIO::file_delete( op.m_dst );
- d->m_uiserver->deleting( d->m_uiserverJobId, op.m_dst );
- }
- else if ( d->m_current.m_type == KonqCommand::MOVE
- || d->m_current.m_type == KonqCommand::TRASH )
- {
- kdDebug(1203) << "KonqUndoManager::undoStep file_move " << op.m_dst.prettyURL() << " " << op.m_src.prettyURL() << endl;
- d->m_currentJob = TDEIO::file_move( op.m_dst, op.m_src, -1, true );
- d->m_uiserver->moving( d->m_uiserverJobId, op.m_dst, op.m_src );
- }
-
- // The above TDEIO jobs are lowlevel, they don't trigger KDirNotify notification
- // So we need to do it ourselves (but schedule it to the end of the undo, to compress them)
- KURL url( op.m_dst );
- url.setPath( url.directory() );
- addDirToUpdate( url );
-
- url = op.m_src;
- url.setPath( url.directory() );
- addDirToUpdate( url );
- }
- else
- d->m_undoState = REMOVINGFILES;
-}
-
-void KonqUndoManager::undoRemovingFiles()
-{
- kdDebug(1203) << "KonqUndoManager::undoStep REMOVINGFILES" << endl;
- if ( !d->m_fileCleanupStack.isEmpty() )
- {
- KURL file = d->m_fileCleanupStack.pop();
- kdDebug(1203) << "KonqUndoManager::undoStep file_delete " << file.prettyURL() << endl;
- d->m_currentJob = TDEIO::file_delete( file );
- d->m_uiserver->deleting( d->m_uiserverJobId, file );
-
- KURL url( file );
- url.setPath( url.directory() );
- addDirToUpdate( url );
- }
- else
- {
- d->m_undoState = REMOVINGDIRS;
-
- if ( d->m_dirCleanupStack.isEmpty() && d->m_current.m_type == KonqCommand::MKDIR )
- d->m_dirCleanupStack << d->m_current.m_dst;
- }
-}
-
-void KonqUndoManager::undoRemovingDirectories()
-{
- if ( !d->m_dirCleanupStack.isEmpty() )
- {
- KURL dir = d->m_dirCleanupStack.pop();
- kdDebug(1203) << "KonqUndoManager::undoStep rmdir " << dir.prettyURL() << endl;
- d->m_currentJob = TDEIO::rmdir( dir );
- d->m_uiserver->deleting( d->m_uiserverJobId, dir );
- addDirToUpdate( dir );
- }
- else
- {
- d->m_current.m_valid = false;
- d->m_currentJob = 0;
- if ( d->m_undoJob )
- {
- kdDebug(1203) << "KonqUndoManager::undoStep deleting undojob" << endl;
- d->m_uiserver->jobFinished( d->m_uiserverJobId );
- delete d->m_undoJob;
- d->m_undoJob = 0;
- }
- KDirNotify_stub allDirNotify( "*", "KDirNotify*" );
- TQValueList<KURL>::ConstIterator it = d->m_dirsToUpdate.begin();
- for( ; it != d->m_dirsToUpdate.end(); ++it ) {
- kdDebug() << "Notifying FilesAdded for " << *it << endl;
- allDirNotify.FilesAdded( *it );
- }
- broadcastUnlock();
- }
-}
-
-void KonqUndoManager::push( const KonqCommand &cmd )
-{
- d->m_commands.push( cmd );
- emit undoAvailable( true );
- emit undoTextChanged( undoText() );
-}
-
-void KonqUndoManager::pop()
-{
- d->m_commands.pop();
- emit undoAvailable( undoAvailable() );
- emit undoTextChanged( undoText() );
-}
-
-void KonqUndoManager::lock()
-{
-// assert( !d->m_lock );
- d->m_lock = true;
- emit undoAvailable( undoAvailable() );
-}
-
-void KonqUndoManager::unlock()
-{
-// assert( d->m_lock );
- d->m_lock = false;
- emit undoAvailable( undoAvailable() );
-}
-
-KonqCommand::Stack KonqUndoManager::get() const
-{
- return d->m_commands;
-}
-
-void KonqUndoManager::broadcastPush( const KonqCommand &cmd )
-{
- if ( !d->m_syncronized )
- {
- push( cmd );
- return;
- }
-
- DCOPRef( "kdesktop", "KonqUndoManager" ).send( "push", cmd );
- DCOPRef( "konqueror*", "KonqUndoManager" ).send( "push", cmd );
-}
-
-void KonqUndoManager::broadcastPop()
-{
- if ( !d->m_syncronized )
- {
- pop();
- return;
- }
- DCOPRef( "kdesktop", "KonqUndoManager" ).send( "pop" );
- DCOPRef( "konqueror*", "KonqUndoManager" ).send( "pop" );
-}
-
-void KonqUndoManager::broadcastLock()
-{
-// assert( !d->m_lock );
-
- if ( !d->m_syncronized )
- {
- lock();
- return;
- }
- DCOPRef( "kdesktop", "KonqUndoManager" ).send( "lock" );
- DCOPRef( "konqueror*", "KonqUndoManager" ).send( "lock" );
-}
-
-void KonqUndoManager::broadcastUnlock()
-{
-// assert( d->m_lock );
-
- if ( !d->m_syncronized )
- {
- unlock();
- return;
- }
- DCOPRef( "kdesktop", "KonqUndoManager" ).send( "unlock" );
- DCOPRef( "konqueror*", "KonqUndoManager" ).send( "unlock" );
-}
-
-bool KonqUndoManager::initializeFromKDesky()
-{
- // ### workaround for dcop problem and upcoming 2.1 release:
- // in case of huge io operations the amount of data sent over
- // dcop (containing undo information broadcasted for global undo
- // to all konqueror instances) can easily exceed the 64kb limit
- // of dcop. In order not to run into trouble we disable global
- // undo for now! (Simon)
- // ### FIXME: post 2.1
- return false;
-
- DCOPClient *client = kapp->dcopClient();
-
- if ( client->appId() == "kdesktop" ) // we are master :)
- return true;
-
- if ( !client->isApplicationRegistered( "kdesktop" ) )
- return false;
-
- d->m_commands = DCOPRef( "kdesktop", "KonqUndoManager" ).call( "get" );
- return true;
-}
-
-TQDataStream &operator<<( TQDataStream &stream, const KonqBasicOperation &op )
-{
- stream << op.m_valid << op.m_directory << op.m_renamed << op.m_link
- << op.m_src << op.m_dst << op.m_target;
- return stream;
-}
-TQDataStream &operator>>( TQDataStream &stream, KonqBasicOperation &op )
-{
- stream >> op.m_valid >> op.m_directory >> op.m_renamed >> op.m_link
- >> op.m_src >> op.m_dst >> op.m_target;
- return stream;
-}
-
-TQDataStream &operator<<( TQDataStream &stream, const KonqCommand &cmd )
-{
- stream << cmd.m_valid << (TQ_INT8)cmd.m_type << cmd.m_opStack << cmd.m_src << cmd.m_dst;
- return stream;
-}
-
-TQDataStream &operator>>( TQDataStream &stream, KonqCommand &cmd )
-{
- TQ_INT8 type;
- stream >> cmd.m_valid >> type >> cmd.m_opStack >> cmd.m_src >> cmd.m_dst;
- cmd.m_type = static_cast<KonqCommand::Type>( type );
- return stream;
-}
-
-#include "konq_undo.moc"