summaryrefslogtreecommitdiffstats
path: root/tdeioslave/trash
diff options
context:
space:
mode:
Diffstat (limited to 'tdeioslave/trash')
-rw-r--r--tdeioslave/trash/ktrashpropsdlgplugin.cpp13
-rw-r--r--tdeioslave/trash/ktrashpropswidget.cpp58
-rw-r--r--tdeioslave/trash/trash_constant.h7
-rw-r--r--tdeioslave/trash/trashimpl.cpp139
-rw-r--r--tdeioslave/trash/trashimpl.h3
5 files changed, 179 insertions, 41 deletions
diff --git a/tdeioslave/trash/ktrashpropsdlgplugin.cpp b/tdeioslave/trash/ktrashpropsdlgplugin.cpp
index 5147481bc..41c902b24 100644
--- a/tdeioslave/trash/ktrashpropsdlgplugin.cpp
+++ b/tdeioslave/trash/ktrashpropsdlgplugin.cpp
@@ -241,6 +241,13 @@ void KTrashPropsDlgPlugin::applyChanges()
}
writeConfig();
+
+ // Adjust trash size if necessary
+ TrashImpl::TrashDirMap trashDirs = mTrashImpl->trashDirectories();
+ for (TrashImpl::TrashDirMap::ConstIterator it = trashDirs.begin(); it != trashDirs.end(); ++it)
+ {
+ mTrashImpl->resizeTrash(it.key());
+ }
}
void KTrashPropsDlgPlugin::percentSizeChanged( double percent )
@@ -370,7 +377,7 @@ void KTrashPropsDlgPlugin::trashChanged( int value )
mUseTimeLimit->setChecked( entry.useTimeLimit );
mDays->setValue( entry.days );
mUseSizeLimit->setChecked( entry.useSizeLimit );
- if ( mSizeLimitType == SIZE_LIMIT_FIXED )
+ if ( entry.sizeLimitType == SIZE_LIMIT_FIXED )
{
mRbFixedSize->setChecked( true );
}
@@ -414,13 +421,13 @@ void KTrashPropsDlgPlugin::readConfig()
config.setGroup( groups[ i ] );
ConfigEntry entry;
entry.useTimeLimit = config.readBoolEntry( "UseTimeLimit", false );
- entry.days = config.readNumEntry( "Days", 7 );
+ entry.days = config.readNumEntry( "Days", 32000 );
entry.useSizeLimit = config.readBoolEntry( "UseSizeLimit", true );
entry.sizeLimitType = config.readNumEntry( "SizeLimitType", SIZE_LIMIT_PERCENT );
entry.percent = config.readDoubleNumEntry( "Percent", 10 );
entry.fixedSize = config.readDoubleNumEntry( "FixedSize", 500 );
entry.fixedSizeUnit = config.readNumEntry( "FixedSizeUnit", SIZE_ID_MB );
- entry.actionType = config.readNumEntry( "LimitReachedAction", 0 );
+ entry.actionType = config.readNumEntry( "LimitReachedAction", TrashConstant::ACTION_WARNING );
mConfigMap.insert( groups[ i ], entry );
}
}
diff --git a/tdeioslave/trash/ktrashpropswidget.cpp b/tdeioslave/trash/ktrashpropswidget.cpp
index b4f5c5e6f..40e12cb4f 100644
--- a/tdeioslave/trash/ktrashpropswidget.cpp
+++ b/tdeioslave/trash/ktrashpropswidget.cpp
@@ -62,7 +62,6 @@ KTrashPropsWidget::KTrashPropsWidget(TQWidget *parent, const char *name)
inhibitChangedSignal = true;
load();
- trashChanged(0);
}
KTrashPropsWidget::~KTrashPropsWidget()
@@ -90,11 +89,8 @@ void KTrashPropsWidget::setupGui()
mountPoints->setCurrentItem(0);
connect(mountPoints, TQT_SIGNAL(highlighted(int)), TQT_SLOT(trashChanged(int)));
}
- else
- {
- mCurrentTrash = map[0];
- }
+ mCurrentTrash = map[0];
mUseTimeLimit = new TQCheckBox(i18n("Delete files older than:"), this);
wlayout->addMultiCellWidget(mUseTimeLimit, multiTrashRow + 0, multiTrashRow + 0, 0, 1);
mDays = new TQSpinBox(1, 365, 1, this);
@@ -150,28 +146,36 @@ void KTrashPropsWidget::setDirty()
void KTrashPropsWidget::load()
{
- readConfig();
+ inhibitChangedSignal = true;
- mUseTimeLimit->setChecked(mConfigMap[mCurrentTrash].useTimeLimit);
- mUseSizeLimit->setChecked(mConfigMap[mCurrentTrash].useSizeLimit);
- mSizeLimitType = mConfigMap[mCurrentTrash].sizeLimitType;
- if (mSizeLimitType == SIZE_LIMIT_FIXED)
+ readConfig();
+ if (mConfigMap.contains(mCurrentTrash))
{
- mRbFixedSize->setChecked(true);
+ mUseTimeLimit->setChecked(mConfigMap[mCurrentTrash].useTimeLimit);
+ mUseSizeLimit->setChecked(mConfigMap[mCurrentTrash].useSizeLimit);
+ mSizeLimitType = mConfigMap[mCurrentTrash].sizeLimitType;
+ if (mSizeLimitType == SIZE_LIMIT_FIXED)
+ {
+ mRbFixedSize->setChecked(true);
+ }
+ else
+ {
+ mRbPercentSize->setChecked(true);
+ }
+ mDays->setValue(mConfigMap[mCurrentTrash].days);
+ mPercentSize->setValue(mConfigMap[mCurrentTrash].percent);
+ mFixedSize->setValue(mConfigMap[mCurrentTrash].fixedSize);
+ mFixedSizeUnit->setCurrentItem(mConfigMap[mCurrentTrash].fixedSizeUnit);
+ mLimitReachedAction->setCurrentItem(mConfigMap[mCurrentTrash].actionType);
+ percentSizeChanged(mPercentSize->value());
+ fixedSizeChanged(mFixedSize->value());
}
else
{
- mRbPercentSize->setChecked(true);
+ setDefaultValues();
}
- mDays->setValue(mConfigMap[mCurrentTrash].days);
- mPercentSize->setValue(mConfigMap[mCurrentTrash].percent);
- mFixedSize->setValue(mConfigMap[mCurrentTrash].fixedSize);
- mFixedSizeUnit->setCurrentItem(mConfigMap[mCurrentTrash].fixedSizeUnit);
- mLimitReachedAction->setCurrentItem(mConfigMap[mCurrentTrash].actionType);
- percentSizeChanged(mPercentSize->value());
- fixedSizeChanged(mFixedSize->value());
- useTypeChanged();
+ useTypeChanged();
inhibitChangedSignal = false;
}
@@ -199,6 +203,13 @@ void KTrashPropsWidget::save()
}
writeConfig();
+
+ // Adjust trash size if necessary
+ TrashImpl::TrashDirMap trashDirs = mTrashImpl->trashDirectories();
+ for (TrashImpl::TrashDirMap::ConstIterator it = trashDirs.begin(); it != trashDirs.end(); ++it)
+ {
+ mTrashImpl->resizeTrash(it.key());
+ }
}
void KTrashPropsWidget::setDefaultValues()
@@ -214,7 +225,6 @@ void KTrashPropsWidget::setDefaultValues()
{
mRbPercentSize->setChecked(true);
}
-
mDays->setValue(mConfigMap[mCurrentTrash].days);
mPercentSize->setValue(1);
mFixedSize->setValue(500);
@@ -363,7 +373,7 @@ void KTrashPropsWidget::trashChanged(int value)
mUseTimeLimit->setChecked(entry.useTimeLimit);
mDays->setValue(entry.days);
mUseSizeLimit->setChecked(entry.useSizeLimit);
- if (mSizeLimitType == SIZE_LIMIT_FIXED)
+ if (entry.sizeLimitType == SIZE_LIMIT_FIXED)
{
mRbFixedSize->setChecked(true);
}
@@ -419,13 +429,13 @@ void KTrashPropsWidget::readConfig()
config.setGroup(groups[i]);
ConfigEntry entry;
entry.useTimeLimit = config.readBoolEntry("UseTimeLimit", false);
- entry.days = config.readNumEntry("Days", 7);
+ entry.days = config.readNumEntry("Days", 32000);
entry.useSizeLimit = config.readBoolEntry("UseSizeLimit", true);
entry.sizeLimitType = config.readNumEntry("SizeLimitType", SIZE_LIMIT_PERCENT);
entry.percent = config.readDoubleNumEntry("Percent", 10);
entry.fixedSize = config.readDoubleNumEntry("FixedSize", 500);
entry.fixedSizeUnit = config.readNumEntry("FixedSizeUnit", SIZE_ID_MB);
- entry.actionType = config.readNumEntry("LimitReachedAction", 0);
+ entry.actionType = config.readNumEntry("LimitReachedAction", ACTION_WARNING);
mConfigMap.insert(groups[i], entry);
}
}
diff --git a/tdeioslave/trash/trash_constant.h b/tdeioslave/trash/trash_constant.h
index a20dbcc24..1dfad9273 100644
--- a/tdeioslave/trash/trash_constant.h
+++ b/tdeioslave/trash/trash_constant.h
@@ -36,6 +36,13 @@ namespace TrashConstant
SIZE_ID_GB = 3,
SIZE_ID_TB = 4
};
+
+ enum
+ {
+ ACTION_WARNING = 0,
+ ACTION_DELETE_OLDEST = 1,
+ ACTION_DELETE_BIGGEST = 2
+ };
}
#endif
diff --git a/tdeioslave/trash/trashimpl.cpp b/tdeioslave/trash/trashimpl.cpp
index c7f9de72d..c2fc53352 100644
--- a/tdeioslave/trash/trashimpl.cpp
+++ b/tdeioslave/trash/trashimpl.cpp
@@ -19,6 +19,7 @@
#include "trashimpl.h"
#include "discspaceutil.h"
+#include "trash_constant.h"
#include <tdelocale.h>
#include <klargefile.h>
@@ -31,6 +32,7 @@
#include <kstandarddirs.h>
#include <tdeglobalsettings.h>
#include <kmountpoint.h>
+#include <tdemessagebox.h>
#include <tdefileitem.h>
#include <tdeio/chmodjob.h>
@@ -48,8 +50,6 @@
#include <stdlib.h>
#include <errno.h>
-#include "trash_constant.h"
-
TrashImpl::TrashImpl() :
TQObject(),
m_lastErrorCode( 0 ),
@@ -977,10 +977,10 @@ bool TrashImpl::adaptTrashSize( const TQString& origPath, int trashId )
double percent = config.readDoubleNumEntry( "Percent", 10 );
double fixedSize = config.readDoubleNumEntry( "FixedSize", 500 );
int fixedSizeUnit = config.readNumEntry( "FixedSizeUnit", TrashConstant::SIZE_ID_MB );
- int actionType = config.readNumEntry( "LimitReachedAction", 0 );
+ int actionType = config.readNumEntry( "LimitReachedAction", TrashConstant::ACTION_WARNING );
if ( useTimeLimit ) { // delete all files in trash older than X days
- const int maxDays = config.readNumEntry( "Days", 7 );
+ const int maxDays = config.readNumEntry( "Days", 32000 );
const TQDateTime currentDate = TQDateTime::currentDateTime();
const TrashedFileInfoList trashedFiles = list();
@@ -992,9 +992,6 @@ bool TrashImpl::adaptTrashSize( const TQString& origPath, int trashId )
if ( info.deletionDate.daysTo( currentDate ) > maxDays )
del( info.trashId, info.fileId );
}
-
- return true;
-
}
if ( useSizeLimit ) { // check if size limit exceeded
@@ -1018,20 +1015,29 @@ bool TrashImpl::adaptTrashSize( const TQString& origPath, int trashId )
}
trashLimit = (unsigned long)trashLimitTemp;
}
- if ( requiredTrashSpace > trashLimit ) {
- if ( actionType == 0 ) { // warn the user only
+ if ( additionalSize > trashLimit ) {
+ m_lastErrorCode = TDEIO::ERR_SLAVE_DEFINED;
+ m_lastErrorMessage = i18n( "The file '%1' is bigger than the '%2' trash bin size.\n"
+ "It cannot be trashed." ).arg(origPath).arg(util.mountPoint());
+ return false;
+ } else if ( requiredTrashSpace > trashLimit ) {
+ if ( actionType == TrashConstant::ACTION_WARNING ) { // warn the user only
m_lastErrorCode = TDEIO::ERR_SLAVE_DEFINED;
- m_lastErrorMessage = i18n( "The trash has reached its maximum size!\nClean the trash manually." );
+ m_lastErrorMessage = i18n( "There is not enough space left in trash folder '%1'.\n"
+ "The file cannot be trashed. Clean the trash manually and try again.")
+ .arg(util.mountPoint());
return false;
} else {
TQDir dir( trashPath + "/files" );
const TQFileInfoList *infos = 0;
- if ( actionType == 1 ) // delete oldest files first
+ if ( actionType == TrashConstant::ACTION_DELETE_OLDEST ) // delete oldest files first
infos = dir.entryInfoList( TQDir::Files | TQDir::Dirs, TQDir::Time | TQDir::Reversed );
- else if ( actionType == 2 ) // delete biggest files first
+ else if ( actionType == TrashConstant::ACTION_DELETE_BIGGEST ) // delete biggest files first
infos = dir.entryInfoList( TQDir::Files | TQDir::Dirs, TQDir::Size );
- else
- tqWarning( "Should never happen!" );
+ else {
+ tqWarning( "<TrashImpl::adaptTrashSize> Should never happen!" );
+ return false;
+ }
TQFileInfoListIterator it( *infos );
TQFileInfo *info;
@@ -1051,4 +1057,109 @@ bool TrashImpl::adaptTrashSize( const TQString& origPath, int trashId )
return true;
}
+void TrashImpl::resizeTrash(int trashId)
+{
+ TDEConfig config("trashrc");
+ const TQString trashPath = trashDirectoryPath(trashId);
+ config.setGroup(trashPath);
+
+ bool useTimeLimit = config.readBoolEntry("UseTimeLimit", false);
+ bool useSizeLimit = config.readBoolEntry("UseSizeLimit", true);
+ int sizeLimitType = config.readNumEntry("SizeLimitType", TrashConstant::SIZE_LIMIT_PERCENT);
+ double percent = config.readDoubleNumEntry("Percent", 10);
+ double fixedSize = config.readDoubleNumEntry("FixedSize", 500);
+ int fixedSizeUnit = config.readNumEntry("FixedSizeUnit", TrashConstant::SIZE_ID_MB);
+ int actionType = config.readNumEntry("LimitReachedAction", 0);
+
+ if (useTimeLimit)
+ {
+ // delete all files in trash older than X days
+ const int maxDays = config.readNumEntry("Days", 32000);
+ const TQDateTime currentDate = TQDateTime::currentDateTime();
+ const TrashedFileInfoList trashedFiles = list();
+ for (uint i = 0; i < trashedFiles.count(); ++i)
+ {
+ struct TrashedFileInfo info = trashedFiles[ i ];
+ if (info.trashId != trashId)
+ {
+ continue;
+ }
+ if (info.deletionDate.daysTo(currentDate) > maxDays)
+ {
+ del(info.trashId, info.fileId);
+ }
+ }
+ }
+
+ if (useSizeLimit)
+ {
+ // check if size limit exceeded
+ TQString trashPathName = trashPath + "/files/";
+ DiscSpaceUtil util(trashPathName);
+ unsigned long currTrashSize = util.sizeOfPath(trashPathName);
+ unsigned long trashLimit = 0;
+ if (sizeLimitType == TrashConstant::SIZE_LIMIT_PERCENT)
+ {
+ trashLimit = (unsigned long)(1024 * percent * util.size() / 100.0);
+ }
+ else if (sizeLimitType == TrashConstant::SIZE_LIMIT_FIXED)
+ {
+ double trashLimitTemp = fixedSize;
+ while (fixedSizeUnit > TrashConstant::SIZE_ID_B)
+ {
+ trashLimitTemp *= 1024;
+ --fixedSizeUnit;
+ }
+ trashLimit = (unsigned long)trashLimitTemp;
+ }
+ if (currTrashSize > trashLimit)
+ {
+ if (actionType == TrashConstant::ACTION_WARNING)
+ {
+ // warn the user only
+ KMessageBox::error(0, i18n("The current size of trash folder '%1' is bigger than the allowed size.\n"
+ "Clean the trash manually.").arg(util.mountPoint()));
+ return;
+ }
+ else
+ {
+ TQDir dir(trashPath + "/files");
+ const TQFileInfoList *infos = 0;
+ if (actionType == TrashConstant::ACTION_DELETE_OLDEST)
+ {
+ // delete oldest files first
+ infos = dir.entryInfoList(TQDir::Files | TQDir::Dirs, TQDir::Time | TQDir::Reversed);
+ }
+ else if (actionType == TrashConstant::ACTION_DELETE_BIGGEST)
+ {
+ // delete biggest files first
+ infos = dir.entryInfoList(TQDir::Files | TQDir::Dirs, TQDir::Size);
+ }
+ else
+ {
+ tqWarning("<TrashImpl::resizeTrash> Should never happen!");
+ return;
+ }
+
+ TQFileInfoListIterator it(*infos);
+ TQFileInfo *info;
+ bool deleteFurther = true;
+ while (((info = it.current()) != 0) && deleteFurther)
+ {
+ if (info->fileName() != "." && info->fileName() != "..")
+ {
+ del(trashId, info->fileName()); // delete trashed file
+ if ((util.sizeOfPath(trashPathName)) < trashLimit)
+ {
+ // check whether we have enough space now
+ deleteFurther = false;
+ }
+ }
+ ++it;
+ }
+ }
+ }
+ }
+}
+
#include "trashimpl.moc"
diff --git a/tdeioslave/trash/trashimpl.h b/tdeioslave/trash/trashimpl.h
index 6e7af2bad..571bbd353 100644
--- a/tdeioslave/trash/trashimpl.h
+++ b/tdeioslave/trash/trashimpl.h
@@ -95,6 +95,9 @@ public:
/// Move data from the old trash system to the new one
void migrateOldTrash();
+ /// Resize the trash based on the current settings if necessary
+ void resizeTrash(int trashId);
+
/// TDEIO error code
int lastErrorCode() const { return m_lastErrorCode; }
TQString lastErrorMessage() const { return m_lastErrorMessage; }