Fixes: NB#295890 - Facebook "large" avatar needed to be scaled to wallpaper sized
[qtcontacts-tracker:hasselmms-contactsd.git] / src / main.cpp
1 /** This file is part of Contacts daemon
2  **
3  ** Copyright (c) 2010-2011 Nokia Corporation and/or its subsidiary(-ies).
4  **
5  ** Contact:  Nokia Corporation (info@qt.nokia.com)
6  **
7  ** GNU Lesser General Public License Usage
8  ** This file may be used under the terms of the GNU Lesser General Public License
9  ** version 2.1 as published by the Free Software Foundation and appearing in the
10  ** file LICENSE.LGPL included in the packaging of this file.  Please review the
11  ** following information to ensure the GNU Lesser General Public License version
12  ** 2.1 requirements will be met:
13  ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
14  **
15  ** In addition, as a special exception, Nokia gives you certain additional rights.
16  ** These rights are described in the Nokia Qt LGPL Exception version 1.1, included
17  ** in the file LGPL_EXCEPTION.txt in this package.
18  **
19  ** Other Usage
20  ** Alternatively, this file may be used in accordance with the terms and
21  ** conditions contained in a signed written agreement between you and Nokia.
22  **/
23
24 #include <QtCore/QTimer>
25 #include <QtDBus/QDBusConnection>
26 #include <QtGui/QApplication>
27
28 #include <errno.h>
29 #include <signal.h>
30
31 #include "contactsd.h"
32 #include "debug.h"
33
34 using namespace Contactsd;
35
36 static QtMsgHandler defaultMsgHandler = 0;
37 static QtMsgType messageThreshold = QtWarningMsg;
38 static FILE *messageLog = NULL;
39
40 static void customMessageHandler(QtMsgType type, const char *msg)
41 {
42     if (type < messageThreshold) {
43         return; // no debug messages please
44     }
45
46     // Actually qInstallMsgHandler() returned null in main() when
47     // I checked, so defaultMsgHandler should be null - but let's be careful.
48     if (defaultMsgHandler) {
49         defaultMsgHandler(type, msg);
50     } else {
51         fprintf(stderr, "%s\n", msg);
52     }
53
54     if (messageLog) {
55         if (fprintf(messageLog, "%s\n", msg) < 0 || fflush(messageLog) != 0) {
56             const int messageLogError = errno;
57             fclose(messageLog);
58             messageLog = NULL;
59
60             (warning().nospace()
61                     << "An error occured when writing to the log file: "
62                     << strerror(messageLogError) << " (" << messageLogError << "). "
63                     << "The log file is truncated.").space();
64         }
65     }
66 }
67
68 static void usage()
69 {
70     QTextStream(stdout)
71             << "Usage: contactsd [OPTION]...\n"
72             << "\n"
73             << "Options:\n"
74             << "\n"
75             << "  --plugins PLUGINS    Comma separated list of plugins to load\n"
76             << "  --log-console        Enable console logging\n"
77             << "  --log-file FILENAME  Additional write logging information to FILENAME\n"
78             << "  --version            Output version information and exit\n"
79             << "  --help               Display this help and exit\n"
80             << "\n";
81 }
82
83 static void setupUnixSignalHandlers()
84 {
85     struct sigaction sigterm, sigint;
86
87     sigterm.sa_handler = ContactsDaemon::unixSignalHandler;
88     sigemptyset(&sigterm.sa_mask);
89     sigterm.sa_flags |= SA_RESTART;
90
91     if (sigaction(SIGTERM, &sigterm, 0) > 0) {
92         qWarning() << "Could not setup signal handler for SIGTERM";
93         return;
94     }
95
96     sigint.sa_handler = ContactsDaemon::unixSignalHandler;
97     sigemptyset(&sigint.sa_mask);
98     sigint.sa_flags |= SA_RESTART;
99
100     if (sigaction(SIGINT, &sigint, 0) > 0) {
101         qWarning() << "Could not setup signal handler for SIGINT";
102         return;
103     }
104 }
105
106 int main(int argc, char **argv)
107 {
108     setupUnixSignalHandlers();
109
110     QApplication app(argc, argv);
111
112     QStringList plugins;
113     bool logConsole = !qgetenv("CONTACTSD_DEBUG").isEmpty();
114     QString logFileName;
115
116     const QStringList args = app.arguments();
117     int i = 1; // ignore argv[0]
118
119     while (i < args.count()) {
120         QString arg = args.at(i);
121
122         if (arg == "--plugins") {
123             if (++i == args.count()) {
124                 usage();
125                 return -1;
126             }
127
128             QString value = args.at(i);
129             value.replace(" ", ",");
130             plugins << value.split(",", QString::SkipEmptyParts);
131         } else if (arg == "--version") {
132             qDebug() << "contactsd version" << VERSION;
133             return 0;
134         } else if (arg == "--help") {
135             usage();
136             return 0;
137         } else if (arg == "--log-console") {
138             logConsole = true;
139         } else if (arg == "--log-file") {
140             if (++i == args.count()) {
141                 usage();
142                 return -1;
143             }
144
145             logFileName = args.at(i);
146         } else {
147             qWarning() << "Invalid argument" << arg;
148             usage();
149             return -1;
150         }
151         ++i;
152     }
153
154     if (logConsole) {
155         messageThreshold = QtDebugMsg;
156     }
157
158     if (not logFileName.isEmpty()) {
159         messageLog = fopen(qPrintable(logFileName), "w");
160     }
161
162     defaultMsgHandler = qInstallMsgHandler(customMessageHandler);
163
164     enableDebug(logConsole);
165     debug() << "contactsd version" << VERSION << "started";
166
167     ContactsDaemon *daemon = new ContactsDaemon(&app);
168     daemon->loadPlugins(plugins);
169
170     const int rc = app.exec();
171
172     if (messageLog) {
173         fclose (messageLog);
174     }
175
176     return rc;
177 }