main.cpp 3.97 KB
Newer Older
Claudio Valerio's avatar
Claudio Valerio committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
Claudio Valerio's avatar
Claudio Valerio committed
15 16 17 18 19 20 21 22 23
#include <QtGui>
#include <QTextCodec>

#include "frameworks/UBPlatformUtils.h"
#include "frameworks/UBFileSystemUtils.h"

#include "UBApplication.h"
#include "UBSettings.h"

24 25
/* Uncomment this for memory leaks detection */
/*
26 27 28 29 30 31 32
#if defined(WIN32) && defined(_DEBUG)
     #define _CRTDBG_MAP_ALLOC
     #include <stdlib.h>
     #include <crtdbg.h>
     #define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__ )
     #define new DEBUG_NEW
#endif
33
*/
34

Claudio Valerio's avatar
Claudio Valerio committed
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
void ub_message_output(QtMsgType type, const char *msg) {
	// We must temporarily remove the handler to avoid the infinite recursion of
	// ub_message_output -> qt_message_output -> ub_message_output -> qt_message_output ...
	QtMsgHandler previousHandler = qInstallMsgHandler(0);

#if defined(QT_NO_DEBUG)
	// Suppress qDebug output in release builds
	if (type != QtDebugMsg)
	{
		qt_message_output(type, msg);
	}

#else
	// Default output in debug builds
	qt_message_output(type, msg);
#endif

	if (UBApplication::app() && UBApplication::app()->isVerbose()) {
		QString logFileNamePath = UBSettings::uniboardDataDirectory()
				+ "/log/uniboard.log";
		QFile logFile(logFileNamePath);

		if (logFile.exists() && logFile.size() > 10000000)
			logFile.remove();

		if (logFile.open(QIODevice::Append | QIODevice::Text)) {
			QTextStream out(&logFile);
			out << QDateTime::currentDateTime().toString(Qt::ISODate)
					<< "      " << msg << "\n";
			logFile.close();
		}
	}

	qInstallMsgHandler(previousHandler);
}

71 72
int main(int argc, char *argv[]) 
{
73 74 75 76

// Uncomment next section to have memory leaks information 
// tracing in VC++ debug mode under Windows
/*
77 78 79
#if defined(_MSC_VER) && defined(_DEBUG)
    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
80
*/
81

Claudio Valerio's avatar
Claudio Valerio committed
82 83 84 85 86 87 88 89 90
	Q_INIT_RESOURCE(sankore);

	qInstallMsgHandler(ub_message_output);

#if defined(Q_WS_X11)
	qDebug() << "Setting GraphicsSystem to raster";
	QApplication::setGraphicsSystem("raster");
#endif

91
        UBApplication app("Sankore", argc, argv);
92 93 94 95 96 97 98 99 100 101
	
	//BUGFIX:
	//when importing a sankore file that contains a non standard character
	//the codecForLocale or the codecForCString is used to convert the file path
	//into a const char*. This is why in french windows setup the codec name shouldn't be 
	//set to UTF-8. For example, setting UTF-8, will convert "Hati" into "Ha-ti.

	QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    //QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
Claudio Valerio's avatar
Claudio Valerio committed
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135

	QStringList args = app.arguments();

	QString dumpPath = UBSettings::uniboardDataDirectory() + "/log";
	QDir logDir(dumpPath);
	if (!logDir.exists())
		logDir.mkdir(dumpPath);

	QString fileToOpen;

	if (args.size() > 1) {
		// On Windows/Linux first argument is the file that has been double clicked.
		// On Mac OSX we use FileOpen QEvent to manage opening file in current instance. So we will never
		// have file to open as a parameter on OSX.

		QFile f(args[1]);

		if (f.exists()) {
			fileToOpen += args[1];

			if (app.sendMessage(UBSettings::appPingMessage, 20000)) {
				app.sendMessage(fileToOpen, 1000000);
				return 0;
			}
		}
	}

	app.initialize(false);

	QObject::connect(&app, SIGNAL(messageReceived(const QString&)), &app,
			SLOT(handleOpenMessage(const QString&)));

	int result = app.exec(fileToOpen);

136 137
	app.cleanup();

Claudio Valerio's avatar
Claudio Valerio committed
138 139
	qDebug() << "application is quitting";

140 141
	

Claudio Valerio's avatar
Claudio Valerio committed
142 143 144
	return result;

}