bc26bf7c7dcf94e921e75ab18b65314e0e8d5209
[enigma2.git] / lib / components / file_eraser.cpp
1 #include <lib/components/file_eraser.h>
2 #include <lib/base/eerror.h>
3 #include <lib/base/init.h>
4 #include <lib/base/init_num.h>
5 #include <sys/types.h>
6 #include <sys/wait.h>
7 #include <unistd.h>
8 #include <errno.h>
9
10 eBackgroundFileEraser *eBackgroundFileEraser::instance;
11
12 eBackgroundFileEraser::eBackgroundFileEraser()
13         :messages(this,1), stop_thread_timer(this)
14 {
15         if (!instance)
16                 instance=this;
17         CONNECT(messages.recv_msg, eBackgroundFileEraser::gotMessage);
18         CONNECT(stop_thread_timer.timeout, eBackgroundFileEraser::idle);
19 }
20
21 void eBackgroundFileEraser::idle()
22 {
23         quit(0);
24 }
25
26 eBackgroundFileEraser::~eBackgroundFileEraser()
27 {
28         messages.send(Message::quit);
29         if ( thread_running() )
30                 kill();
31         if (instance==this)
32                 instance=0;
33 }
34
35 void eBackgroundFileEraser::thread()
36 {
37         nice(5);
38         reset();
39         runLoop();
40         stop_thread_timer.stop();
41 }
42
43 void eBackgroundFileEraser::erase(const char *filename)
44 {
45         if (filename)
46         {
47                 char buf[255];
48                 snprintf(buf, 255, "%s.$$$", filename);
49                 if (rename(filename, buf)<0)
50                         ;/*perror("rename file failed !!!");*/
51                 else
52                 {
53                         messages.send(Message(Message::erase, strdup(buf)));
54                         if (!thread_running())
55                                 run();
56                 }
57         }
58 }
59
60 void eBackgroundFileEraser::gotMessage(const Message &msg )
61 {
62         switch (msg.type)
63         {
64                 case Message::erase:
65                         if ( msg.filename )
66                         {
67                                 if ( ::unlink(msg.filename) < 0 )
68                                         eDebug("remove file %s failed (%m)", msg.filename);
69                                 else
70                                         eDebug("file %s erased", msg.filename);
71                                 free((char*)msg.filename);
72                         }
73                         stop_thread_timer.start(2000, true); // stop thread in two seconds
74                         break;
75                 case Message::quit:
76                         quit(0);
77                         break;
78                 default:
79                         eDebug("unhandled thread message");
80         }
81 }
82
83 eAutoInitP0<eBackgroundFileEraser> init_eBackgroundFilEraser(eAutoInitNumbers::configuration+1, "Background File Eraser");