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.
251 lines
7.2 KiB
251 lines
7.2 KiB
/***************************************************************************
|
|
* *
|
|
* 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; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
/*
|
|
Author: Christian Hubinger <chubinger@irrsinnig.org>, (C) 2001-2008
|
|
*/
|
|
#include "kmfundoengine.h"
|
|
|
|
|
|
// KDE includes
|
|
#include <kdebug.h>
|
|
#include <tdelocale.h>
|
|
|
|
// Project includes
|
|
|
|
#include "kmftransaction.h"
|
|
#include "kmferror.h"
|
|
#include "kmyfirewallinterface.h"
|
|
#include "kmfappstate.h"
|
|
|
|
namespace KMF {
|
|
|
|
//########## KMFUndoEngine ##############
|
|
//#### static stuff
|
|
KMFUndoEngine* KMFUndoEngine::m_instance = 0;
|
|
KMFUndoEngine* KMFUndoEngine::instance() {
|
|
if ( ! m_instance ) {
|
|
m_instance = new KMFUndoEngine( 0 , "KMFUndoEngine" );
|
|
}
|
|
|
|
return m_instance;
|
|
}
|
|
//##### end static stuff
|
|
|
|
KMFUndoEngine::KMFUndoEngine( TQObject* parent, const char* name ) : TQObject( parent, name ) {
|
|
MAX_UNDO = 10;
|
|
m_in_transaction = false;
|
|
is_saved = true;
|
|
// m_transactionName = "";
|
|
m_app = 0;
|
|
}
|
|
|
|
KMFUndoEngine::~KMFUndoEngine() {}
|
|
|
|
void KMFUndoEngine::setMaxUndo ( uint num ) {
|
|
MAX_UNDO = num;
|
|
}
|
|
|
|
// void KMFUndoEngine::setPreserveObjectUuid( bool onOff ) {
|
|
// // m_preserveObjectUuid = onOff;
|
|
// }
|
|
|
|
bool KMFUndoEngine::inTransaction() {
|
|
return m_in_transaction;
|
|
};
|
|
|
|
void KMFUndoEngine::setKMFInterface( KMyFirewallInterface *app ) {
|
|
m_app = app;
|
|
}
|
|
|
|
TQValueList< KMFTransaction* >& KMFUndoEngine::undoTransactions() {
|
|
return m_undo_transactionObjects;
|
|
}
|
|
|
|
TQValueList< KMFTransaction* >& KMFUndoEngine::redoTransactions() {
|
|
return m_redo_transactionObjects;
|
|
}
|
|
|
|
KMFTransaction * KMFUndoEngine::findTransction( const TQUuid& uuid ) {
|
|
TQValueList< KMFTransaction* >::iterator it;
|
|
for ( it = m_undo_transactionObjects.begin(); it != m_undo_transactionObjects.end(); ++it ) {
|
|
if ( (*it)->uuid() == uuid ) {
|
|
return *it;
|
|
}
|
|
}
|
|
for ( it = m_redo_transactionObjects.begin(); it != m_redo_transactionObjects.end(); ++it ) {
|
|
if ( (*it)->uuid() == uuid ) {
|
|
return *it;
|
|
}
|
|
}
|
|
kdDebug() << "Not TRansaction found by uuid: " << uuid.toString() << endl;
|
|
return 0;
|
|
}
|
|
|
|
void KMFUndoEngine::saved() {
|
|
kdDebug() << "void KMFUndoEngine::startTransaction()" << endl;
|
|
is_saved = true;
|
|
}
|
|
|
|
bool KMFUndoEngine::isSaved() {
|
|
// kdDebug() << "void KMFUndoEngine::isSaved() -> " << is_saved << endl;
|
|
return is_saved;
|
|
}
|
|
|
|
void KMFUndoEngine::log( const TQString& msg, int kmfErrorType = KMFError::NORMAL, NetfilterObject* obj = 0 ) {
|
|
TQString m = msg;
|
|
TQString s = "";
|
|
if ( obj ) {
|
|
m.prepend( i18n("<i>%1:</i> ").arg( obj->name() ) );
|
|
}
|
|
s.append( KMFError::getAsString( kmfErrorType, m ) );
|
|
emit sigLog( *( new TQString(s) ) );
|
|
}
|
|
|
|
void KMFUndoEngine::changed ( const TQUuid& id ) {
|
|
NetfilterObject* obj = NetfilterObject::findObject ( id );
|
|
if ( ! obj ) {
|
|
log( i18n("Change non exiting object id: %1.").arg( id ), KMFError::FATAL );
|
|
return;
|
|
}
|
|
is_saved = false;
|
|
if ( m_app && KMFAppState::upAndRunning() ) {
|
|
m_app->updateCaption();
|
|
}
|
|
if ( ! m_in_transaction ) {
|
|
// log( i18n("Change object: %1 without transaction.").arg( obj->name() ), KMFError::WARNING );
|
|
return;
|
|
}
|
|
|
|
NetfilterObject *highestAffected = NetfilterObject::findObject( m_currentTransaction->objectUuid() );
|
|
if ( ! highestAffected || obj != highestAffected && ! obj->isChildOf( highestAffected->uuid() ) ) {
|
|
log( i18n("Change object: %1 outside of declared highestAffectedObject: %2 in transaction: %3.").arg( obj->name() ).arg( highestAffected->name() ).arg( m_currentTransaction->name() ), KMFError::WARNING );
|
|
}
|
|
}
|
|
|
|
void KMFUndoEngine::clearStacks() {
|
|
m_undo_transactionObjects.clear();
|
|
m_redo_transactionObjects.clear();
|
|
if ( m_app && KMFAppState::upAndRunning() ) {
|
|
m_app->enableUndo ( false );
|
|
m_app->enableRedo ( false );
|
|
}
|
|
emit sigStackChanged();
|
|
}
|
|
|
|
void KMFUndoEngine::startTransaction ( NetfilterObject* highestAffectedObject, const TQString& name ) {
|
|
kdDebug() << "void KMFUndoEngine::startTransaction( const TQString& " << name << " )" << endl;
|
|
m_in_transaction = true;
|
|
m_currentTransaction = new KMFTransaction( name, highestAffectedObject );
|
|
}
|
|
|
|
void KMFUndoEngine::abortTransaction() {
|
|
kdDebug() << "void KMFUndoEngine::abortTransaction()" << endl;
|
|
if ( ! m_in_transaction ) {
|
|
log( "KMFUndoEngine::abortTransaction() - No active Transaction!", KMFError::NORMAL, 0 );
|
|
return;
|
|
}
|
|
m_in_transaction = false;
|
|
delete m_currentTransaction;
|
|
m_currentTransaction = 0;
|
|
}
|
|
|
|
void KMFUndoEngine::endTransaction() {
|
|
kdDebug() << "void KMFUndoEngine::endTransaction()" << endl;
|
|
if ( ! m_in_transaction || ! m_currentTransaction ) {
|
|
log( "KMFUndoEngine::endTransaction() - No active Transaction!", KMFError::NORMAL, 0 );
|
|
return;
|
|
}
|
|
m_currentTransaction->commit();
|
|
m_undo_transactionObjects.append( m_currentTransaction );
|
|
|
|
while ( m_undo_transactionObjects.count() > KMFUndoEngine::maxUndo() ) {
|
|
m_undo_transactionObjects.pop_front();
|
|
}
|
|
|
|
if ( m_undo_transactionObjects.empty() ) {
|
|
m_app->enableUndo ( false );
|
|
m_app->enableRedo ( false );
|
|
} else {
|
|
m_app->enableUndo ( true );
|
|
}
|
|
|
|
m_in_transaction = false;
|
|
m_currentTransaction = 0;
|
|
emit sigStackChanged();
|
|
return;
|
|
}
|
|
|
|
|
|
TQValueList< NetfilterObject* >& KMFUndoEngine::undo() {
|
|
TQValueList< NetfilterObject* > *affected = new TQValueList< NetfilterObject* >;
|
|
|
|
kdDebug() << "void KMFUndoEngine::undo()" << endl;
|
|
if ( m_undo_transactionObjects.empty() ) {
|
|
kdDebug() << "No undo transactions available" << endl;
|
|
m_app->enableUndo ( false );
|
|
return *affected;
|
|
}
|
|
|
|
KMFTransaction* transaction = m_undo_transactionObjects.back();
|
|
NetfilterObject *obj = transaction->undo();
|
|
if ( obj ) {
|
|
affected->append( obj );
|
|
}
|
|
m_undo_transactionObjects.pop_back();
|
|
m_redo_transactionObjects.append ( transaction );
|
|
|
|
if ( m_redo_transactionObjects.empty() ) {
|
|
m_app->enableRedo ( false );
|
|
} else {
|
|
m_app->enableRedo ( true );
|
|
}
|
|
|
|
if ( m_undo_transactionObjects.empty() ) {
|
|
kdDebug() << "No More undo transactions available" << endl;
|
|
m_app->enableUndo ( false );
|
|
}
|
|
emit sigStackChanged();
|
|
return *affected;
|
|
}
|
|
|
|
|
|
|
|
TQValueList< NetfilterObject* >& KMFUndoEngine::redo() {
|
|
kdDebug() << "void KMFIPTDoc::redo()" << endl;
|
|
TQValueList< NetfilterObject* > *affected = new TQValueList< NetfilterObject* >;
|
|
if ( m_redo_transactionObjects.empty() ) {
|
|
kdDebug() << "No undo transactions available" << endl;
|
|
m_app->enableRedo ( false );
|
|
return *affected;
|
|
}
|
|
|
|
KMFTransaction* transaction = m_redo_transactionObjects.back();
|
|
NetfilterObject *obj = transaction->redo();
|
|
if ( obj ) {
|
|
affected->append( obj );
|
|
}
|
|
|
|
m_redo_transactionObjects.pop_back();
|
|
m_undo_transactionObjects.append ( transaction );
|
|
if ( m_undo_transactionObjects.empty() ) {
|
|
m_app->enableUndo ( false );
|
|
} else {
|
|
m_app->enableUndo ( true );
|
|
}
|
|
|
|
if ( m_redo_transactionObjects.empty() ) {
|
|
kdDebug() << "No More redo transactions available" << endl;
|
|
m_app->enableRedo ( false );
|
|
}
|
|
emit sigStackChanged();
|
|
return *affected;
|
|
}
|
|
|
|
}
|