some local definition of strings were changes to constants
[accounts-sso:vitalyrepins-signon.git] / src / signond / signontrace.h
1 /*
2  * This file is part of signon
3  *
4  * Copyright (C) 2009-2010 Nokia Corporation.
5  *
6  * Contact: Aurel Popirtac <ext-aurel.popirtac@nokia.com>
7  * Contact: Alberto Mardegan <alberto.mardegan@nokia.com>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * version 2.1 as published by the Free Software Foundation.
12  *
13  * This library is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21  * 02110-1301 USA
22  */
23 #ifndef SIGNONTRACE_H
24 #define SIGNONTRACE_H
25
26 #include <QCoreApplication>
27 #include <QFile>
28 #include <QDebug>
29 #include <QDateTime>
30
31 #include "signond-common.h"
32
33 namespace SignOn {
34
35     template <typename T = void>
36     class SignonTrace
37     {
38         SignonTrace(const QString &filePath, const quint32 maxFileSize)
39             : m_outputFile(filePath),
40             m_writeStream(&m_outputFile),
41             m_maxFileSize(maxFileSize)
42         {}
43
44     public:
45         ~SignonTrace()
46         {
47             delete m_pInstance;
48             m_pInstance = NULL;
49         }
50
51         static bool initialize(const QString &filePath, const quint32 maxFileSize)
52         {
53             if (m_pInstance)
54                 return true;
55
56             m_pInstance = new SignonTrace<T>(filePath, maxFileSize);
57
58             if (!m_pInstance->m_outputFile.open(QIODevice::Append)) {
59                 TRACE() << "Signon: Failed to initialize file tracing.";
60                 delete m_pInstance;
61                 m_pInstance = NULL;
62                 return false;
63             }
64
65             qInstallMsgHandler(output);
66             return true;
67         }
68
69         static void output(QtMsgType type, const char *msg)
70         {
71             //todo - handle max file size !!!
72
73             const char *msgType;
74             switch (type) {
75                 case QtWarningMsg: msgType = "Warning"; break;
76                 case QtCriticalMsg: msgType = "Critical"; break;
77                 case QtFatalMsg: msgType = "Fatal"; break;
78                 case QtDebugMsg:
79                     /* fall through */
80                 default: msgType = "Debug"; break;
81             }
82
83             if (m_pInstance->m_outputFile.size() >= m_pInstance->m_maxFileSize) {
84                 m_pInstance->m_outputFile.close();
85                 m_pInstance->m_outputFile.remove();
86             }
87
88             if (!m_pInstance->m_outputFile.isOpen())
89                 m_pInstance->m_outputFile.open(QIODevice::Append);
90
91             m_pInstance->m_writeStream << QString(QLatin1String("%1: %2\n"))
92                 . arg(QLatin1String(msgType))
93                 . arg(QLatin1String(msg));
94             m_pInstance->m_outputFile.close();
95          }
96
97     private:
98         static SignonTrace<T> *m_pInstance;
99         QFile m_outputFile;
100         QTextStream m_writeStream;
101         quint32 m_maxFileSize;
102     };
103
104     static void initializeTrace(const QString &fileName, const quint32 maxFileSize) {
105         SignonTrace<>::initialize(QString(QLatin1String("%1/%2")).arg(SIGNOND_TRACE_DIR).arg(fileName), maxFileSize);
106     }
107
108 template <typename T>
109     SignonTrace<T> *SignonTrace<T>::m_pInstance = 0;
110
111 } //namespace SignOn
112
113 #endif // SIGNONTRACE_H