1
2 #include "logger.h"
3
4 #include <KLocale>
5 #include <KStandardDirs>
6 #include <KConfigGroup>
7
8 #include <cstdlib>
9 #include <ctime>
10
11 #include <KGlobal>
12
13
14 #define MAX_LOGS 20
15 #define MAX_LINES 10000
16
17
LoggerItem(int logId,const QString & logIdentifier)18 LoggerItem::LoggerItem( int logId, const QString& logIdentifier )
19 {
20 id = logId;
21 identifier = logIdentifier;
22 file.setFileName( KStandardDirs::locateLocal("data",QString("soundkonverter/log/%1.log").arg(id)) );
23 completed = false;
24 succeeded = false;
25 }
26
~LoggerItem()27 LoggerItem::~LoggerItem()
28 {
29 if( file.isOpen() )
30 file.close();
31
32 if( file.exists() )
33 file.remove();
34 }
35
36
Logger(QObject * parent)37 Logger::Logger( QObject *parent)
38 : QObject( parent )
39 {
40 KSharedConfig::Ptr conf = KGlobal::config();
41 KConfigGroup group;
42 group = conf->group( "General" );
43 writeLogFiles = group.readEntry( "writeLogFiles", false );
44
45 LoggerItem *item = new LoggerItem( 1000, "soundKonverter" );
46 item->completed = true;
47 item->succeeded = true;
48 if( writeLogFiles )
49 {
50 // TODO error handling
51 item->file.open( QIODevice::WriteOnly );
52 item->textStream.setDevice( &(item->file) );
53 }
54
55 processes.insert( item->id, item );
56
57 srand( (unsigned)time(NULL) );
58 }
59
~Logger()60 Logger::~Logger()
61 {
62 qDeleteAll(processes);
63 }
64
registerProcess(const QString & identifier)65 int Logger::registerProcess( const QString& identifier )
66 {
67 LoggerItem *item = new LoggerItem( getNewID(), identifier );
68 if( writeLogFiles )
69 {
70 // TODO error handling
71 item->file.open( QIODevice::WriteOnly );
72 item->textStream.setDevice( &(item->file) );
73 }
74
75 processes.insert( item->id, item );
76
77 log( item->id, i18n("Identifier") + ": " + item->identifier );
78 log( item->id, i18n("Log ID") + ": " + QString::number(item->id) );
79
80 emit updateProcess( item->id );
81
82 return item->id;
83 }
84
log(int id,const QString & data)85 void Logger::log( int id, const QString& data )
86 {
87 if( processes.contains(id) )
88 {
89 LoggerItem* const process = processes.value(id);
90
91 process->data.append( data );
92
93 while( process->data.count() > MAX_LINES )
94 process->data.removeFirst();
95
96 if( writeLogFiles && process->file.isOpen() )
97 {
98 process->textStream << data;
99 process->textStream << "\n";
100 process->textStream.flush();
101 }
102
103 if( id == 1000 )
104 emit updateProcess( id );
105 }
106 }
107
getNewID()108 int Logger::getNewID()
109 {
110 int id;
111
112 do {
113 id = rand();
114 } while( processes.contains(id) );
115
116 return id;
117 }
118
getLog(int id) const119 const LoggerItem* Logger::getLog( int id ) const
120 {
121 return processes.value(id, 0);
122 }
123
getLogs() const124 QList< QPair<int, QString> > Logger::getLogs() const
125 {
126 QList< QPair<int, QString> > logs;
127
128 foreach( LoggerItem* process, processes )
129 {
130 logs << QPair<int, QString>(process->id, process->identifier);
131 }
132
133 return logs;
134 }
135
processCompleted(int id,bool succeeded,bool waitingForAlbumGain)136 void Logger::processCompleted( int id, bool succeeded, bool waitingForAlbumGain )
137 {
138 Q_UNUSED( waitingForAlbumGain )
139
140 if( processes.contains(id) )
141 {
142 LoggerItem* process = processes.value(id);
143
144 process->succeeded = succeeded;
145 process->completed = true;
146 process->time = process->time.currentTime();
147 process->data.append( i18n("Finished logging") );
148 if( process->file.isOpen() )
149 {
150 process->textStream << i18n("Finished logging");
151 process->file.close();
152 }
153 emit updateProcess( id );
154 }
155
156 if( processes.count() > MAX_LOGS )
157 {
158 QTime time = QTime::currentTime();
159
160 int removeId = -1;
161 foreach( const LoggerItem* process, processes.values() )
162 {
163 if( process->time < time && process->completed && process->succeeded && process->id != 1000 )
164 {
165 time = process->time;
166 removeId = process->id;
167 }
168 }
169
170 if( removeId > -1 )
171 {
172 emit removedProcess( removeId );
173 delete processes.value( removeId );
174 processes.remove( removeId );
175 }
176 }
177 }
178
updateWriteSetting(bool _writeLogFiles)179 void Logger::updateWriteSetting( bool _writeLogFiles )
180 {
181 writeLogFiles = _writeLogFiles;
182 }
183