aboutsummaryrefslogtreecommitdiff
path: root/lib/components/file_eraser.cpp
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-03-30 23:32:28 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-03-30 23:32:28 +0000
commite059d69c2ce61b1ba1ae2e0b9c75eb53bb26f1bb (patch)
tree52afd355bcf306ab0a39034148fb9f07c54c8a38 /lib/components/file_eraser.cpp
parent0c9e75c44d610465017a08874a5e2f585bc554aa (diff)
downloadenigma2-e059d69c2ce61b1ba1ae2e0b9c75eb53bb26f1bb.tar.gz
enigma2-e059d69c2ce61b1ba1ae2e0b9c75eb53bb26f1bb.zip
add background file eraser class for asynchronous file deletion
Diffstat (limited to 'lib/components/file_eraser.cpp')
-rw-r--r--lib/components/file_eraser.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/lib/components/file_eraser.cpp b/lib/components/file_eraser.cpp
new file mode 100644
index 00000000..bc26bf7c
--- /dev/null
+++ b/lib/components/file_eraser.cpp
@@ -0,0 +1,83 @@
+#include <lib/components/file_eraser.h>
+#include <lib/base/eerror.h>
+#include <lib/base/init.h>
+#include <lib/base/init_num.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <errno.h>
+
+eBackgroundFileEraser *eBackgroundFileEraser::instance;
+
+eBackgroundFileEraser::eBackgroundFileEraser()
+ :messages(this,1), stop_thread_timer(this)
+{
+ if (!instance)
+ instance=this;
+ CONNECT(messages.recv_msg, eBackgroundFileEraser::gotMessage);
+ CONNECT(stop_thread_timer.timeout, eBackgroundFileEraser::idle);
+}
+
+void eBackgroundFileEraser::idle()
+{
+ quit(0);
+}
+
+eBackgroundFileEraser::~eBackgroundFileEraser()
+{
+ messages.send(Message::quit);
+ if ( thread_running() )
+ kill();
+ if (instance==this)
+ instance=0;
+}
+
+void eBackgroundFileEraser::thread()
+{
+ nice(5);
+ reset();
+ runLoop();
+ stop_thread_timer.stop();
+}
+
+void eBackgroundFileEraser::erase(const char *filename)
+{
+ if (filename)
+ {
+ char buf[255];
+ snprintf(buf, 255, "%s.$$$", filename);
+ if (rename(filename, buf)<0)
+ ;/*perror("rename file failed !!!");*/
+ else
+ {
+ messages.send(Message(Message::erase, strdup(buf)));
+ if (!thread_running())
+ run();
+ }
+ }
+}
+
+void eBackgroundFileEraser::gotMessage(const Message &msg )
+{
+ switch (msg.type)
+ {
+ case Message::erase:
+ if ( msg.filename )
+ {
+ if ( ::unlink(msg.filename) < 0 )
+ eDebug("remove file %s failed (%m)", msg.filename);
+ else
+ eDebug("file %s erased", msg.filename);
+ free((char*)msg.filename);
+ }
+ stop_thread_timer.start(2000, true); // stop thread in two seconds
+ break;
+ case Message::quit:
+ quit(0);
+ break;
+ default:
+ eDebug("unhandled thread message");
+ }
+}
+
+eAutoInitP0<eBackgroundFileEraser> init_eBackgroundFilEraser(eAutoInitNumbers::configuration+1, "Background File Eraser");