merge github
[apps/navigation.git] / app / main.cpp
1 /*\r
2  * Copyright (C) 2016 The Qt Company Ltd.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *        http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 #define USE_QTAGLEXTRAS                 0\r
18 #define USE_QLIBWINDOWMANAGER   1\r
19 \r
20 #if     USE_QTAGLEXTRAS\r
21 #include <QtAGLExtras/AGLApplication>\r
22 #elif USE_QLIBWINDOWMANAGER\r
23 #include <qlibwindowmanager.h>\r
24 #include <qlibhomescreen.h>\r
25 #include <string>\r
26 #endif\r
27 #include <QtCore/QDebug>\r
28 #include <QtCore/QCommandLineParser>\r
29 #include <QtCore/QUrlQuery>\r
30 #include <QtCore/QSettings>\r
31 #include <QtGui/QGuiApplication>\r
32 #include <QtQml/QQmlApplicationEngine>\r
33 #include <QtQml/QQmlContext>\r
34 #include <QtQuickControls2/QQuickStyle>\r
35 #include <QQuickWindow>\r
36 #include <QtDBus/QDBusConnection>\r
37 #include "markermodel.h"\r
38 #include "dbus_server.h"\r
39 #include "guidance_module.h"\r
40 #include "file_operation.h"\r
41 \r
42 int main(int argc, char *argv[])\r
43 {\r
44         \r
45     // for dbusIF\r
46     QString pathBase = "org.agl.";\r
47     QString objBase = "/org/agl/";\r
48     QString     serverName = "naviapi";\r
49 \r
50     if (!QDBusConnection::sessionBus().isConnected()) {\r
51         qWarning("Cannot connect to the D-Bus session bus.\n"\r
52                  "Please check your system settings and try again.\n");\r
53         return 1;\r
54     }\r
55         \r
56 #if     USE_QTAGLEXTRAS\r
57         AGLApplication app(argc, argv);\r
58         app.setApplicationName("navigation");\r
59         app.setupApplicationRole("navigation");\r
60         app.load(QUrl(QStringLiteral("qrc:/navigation.qml")));\r
61         \r
62 #elif USE_QLIBWINDOWMANAGER\r
63         QGuiApplication app(argc, argv);\r
64         QString myname = QString("navigation");\r
65         int port = 1700;\r
66         QString token = "hello";\r
67         QCoreApplication::setOrganizationDomain("LinuxFoundation");\r
68         QCoreApplication::setOrganizationName("AutomotiveGradeLinux");\r
69         QCoreApplication::setApplicationName(myname);\r
70         QCoreApplication::setApplicationVersion("0.1.0");\r
71         QCommandLineParser parser;\r
72         parser.addPositionalArgument("port", app.translate("main", "port for binding"));\r
73         parser.addPositionalArgument("secret", app.translate("main", "secret for binding"));\r
74         parser.addHelpOption();\r
75         parser.addVersionOption();\r
76         parser.process(app);\r
77         QStringList positionalArguments = parser.positionalArguments();\r
78         if (positionalArguments.length() == 2) {\r
79                 port = positionalArguments.takeFirst().toInt();\r
80                 token = positionalArguments.takeFirst();\r
81     }\r
82         fprintf(stderr, "[navigation]app_name: %s, port: %d, token: %s.\n",\r
83                                         myname.toStdString().c_str(),\r
84                                         port,\r
85                                         token.toStdString().c_str());\r
86         // QLibWM\r
87         QLibWindowmanager* qwmHandler = new QLibWindowmanager();\r
88         int res;\r
89         if((res = qwmHandler->init(port,token)) != 0){\r
90                 fprintf(stderr, "[navigation]init qlibwm err(%d)\n", res);\r
91                 return -1;\r
92         }\r
93         if((res = qwmHandler->requestSurface(myname)) != 0) {\r
94                 fprintf(stderr, "[navigation]request surface err(%d)\n", res);\r
95                 return -1;\r
96         }\r
97     qwmHandler->set_event_handler(QLibWindowmanager::Event_SyncDraw, [qwmHandler, myname](json_object *object) {\r
98                 qwmHandler->endDraw(myname);\r
99         });\r
100     qwmHandler->set_event_handler(QLibWindowmanager::Event_Visible, [qwmHandler, myname](json_object *object) {\r
101         ;\r
102     });\r
103     qwmHandler->set_event_handler(QLibWindowmanager::Event_Invisible, [qwmHandler, myname](json_object *object) {\r
104         ;\r
105     });\r
106         // QLibHS\r
107         QLibHomeScreen* qhsHandler = new QLibHomeScreen();\r
108         qhsHandler->init(port, token.toStdString().c_str());\r
109         qhsHandler->set_event_handler(QLibHomeScreen::Event_TapShortcut, [qwmHandler, myname](json_object *object){\r
110                 json_object *appnameJ = nullptr;\r
111                 if(json_object_object_get_ex(object, "application_name", &appnameJ))\r
112                 {\r
113                         const char *appname = json_object_get_string(appnameJ);\r
114                         if(QString::compare(myname, appname, Qt::CaseInsensitive) == 0)\r
115                         {\r
116                                 qDebug("Surface %s got tapShortcut\n", appname);\r
117                                 json_object *para, *area;\r
118                                 json_object_object_get_ex(object, "parameter", &para);\r
119                                 json_object_object_get_ex(para, "area", &area);\r
120                                 const char *displayArea = json_object_get_string(area);\r
121                                 qDebug("Surface %s got tapShortcut area\n", displayArea);\r
122                                 qwmHandler->activateWindow(myname, QString(QLatin1String(displayArea)));\r
123                         }\r
124                 }\r
125         });\r
126         // Load qml\r
127         QQmlApplicationEngine engine;\r
128 \r
129     MarkerModel model;\r
130         engine.rootContext()->setContextProperty("markerModel", &model);\r
131 \r
132     Guidance_Module guidance;\r
133         engine.rootContext()->setContextProperty("guidanceModule", &guidance);\r
134 \r
135     File_Operation file;\r
136     engine.rootContext()->setContextProperty("fileOperation", &file);\r
137 \r
138         engine.load(QUrl(QStringLiteral("qrc:/navigation.qml")));\r
139         QObject *root = engine.rootObjects().first();\r
140         QQuickWindow *window = qobject_cast<QQuickWindow *>(root);\r
141         QObject::connect(window, SIGNAL(frameSwapped()), qwmHandler, SLOT(slotActivateSurface()));\r
142     QObject *map = engine.rootObjects().first()->findChild<QObject*>("map");\r
143     DBus_Server dbus(pathBase,objBase,serverName,map);\r
144 \r
145 #else   // for only libwindowmanager\r
146         QGuiApplication app(argc, argv);\r
147     app.setApplicationName("navigation");\r
148 \r
149         // Load qml\r
150         QQmlApplicationEngine engine;\r
151 \r
152     MarkerModel model;\r
153     engine.rootContext()->setContextProperty("markerModel", &model);\r
154 \r
155     Guidance_Module guidance;\r
156     engine.rootContext()->setContextProperty("guidanceModule", &guidance);\r
157 \r
158     File_Operation file;\r
159     engine.rootContext()->setContextProperty("fileOperation", &file);\r
160 \r
161     engine.load(QUrl(QStringLiteral("qrc:/navigation.qml")));\r
162     QObject *map = engine.rootObjects().first()->findChild<QObject*>("map");\r
163     DBus_Server dbus(pathBase,objBase,serverName,map);\r
164 \r
165 #endif\r
166         \r
167         return app.exec();\r
168 }\r
169 \r