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