1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 or version 3 as published by the Free
20 ** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21 ** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22 ** following information to ensure the GNU Lesser General Public License
23 ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 **
26 ** As a special exception, The Qt Company gives you certain additional
27 ** rights. These rights are described in The Qt Company LGPL Exception
28 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 **
30 ** GNU General Public License Usage
31 ** Alternatively, this file may be used under the terms of the GNU
32 ** General Public License version 3.0 as published by the Free Software
33 ** Foundation and appearing in the file LICENSE.GPL included in the
34 ** packaging of this file. Please review the following information to
35 ** ensure the GNU General Public License version 3.0 requirements will be
36 ** met: http://www.gnu.org/copyleft/gpl.html.
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include <qcoreevent.h>
43 #include <qdatetime.h>
44 #include <qlibraryinfo.h>
45 #include <qobject.h>
46 #include <qcoreapplication.h>
47
48 #include "stdio.h"
49 #include "stdlib.h"
50
51 QT_BEGIN_NAMESPACE
52
53 #include "qconfig_eval.cpp"
54
55 static const char boilerplate_unsuported[] =
56 "\nQt %1 Evaluation License\n"
57 "Copyright (C) 2015 The Qt Company Ltd.\n"
58 "All rights reserved.\n\n"
59 "This trial version may only be used for evaluation purposes\n"
60 "and will shut down after 120 minutes.\n"
61 "Registered to:\n"
62 " Licensee: %2\n\n"
63 "The evaluation expires in %4 days\n\n"
64 "Contact http://qt.nokia.com/about/contact-us for pricing and purchasing information.\n";
65
66 static const char boilerplate_supported[] =
67 "\nQt %1 Evaluation License\n"
68 "Copyright (C) 2015 The Qt Company Ltd.\n"
69 "All rights reserved.\n\n"
70 "This trial version may only be used for evaluation purposes\n"
71 "Registered to:\n"
72 " Licensee: %2\n\n"
73 "The evaluation expires in %4 days\n\n"
74 "Contact http://qt.nokia.com/about/contact-us for pricing and purchasing information.\n";
75
76 static const char boilerplate_expired[] =
77 "This software is using the trial version of the Qt GUI toolkit.\n"
78 "The trial period has expired. If you need more time to\n"
79 "evaluate Qt, or if you have any questions about Qt, contact us\n"
80 "at: http://qt.nokia.com/about/contact-us.\n\n";
81
82 static const char will_shutdown_1min[] =
83 "\nThe evaluation of Qt will SHUT DOWN in 1 minute.\n"
84 "Contact http://qt.nokia.com/about/contact-us for pricing and purchasing information.\n";
85
86 static const char will_shutdown_now[] =
87 "\nThe evaluation of Qt has now reached its automatic\n"
88 "timeout and will shut down.\n"
89 "Contact http://qt.nokia.com/about/contact-us for pricing and purchasing information.\n";
90
qt_eval_is_supported()91 static int qt_eval_is_supported()
92 {
93 const volatile char *const license_key = qt_eval_key_data + 12;
94
95 // fast fail
96 if (!qt_eval_key_data[0] || !*license_key)
97 return -1;
98
99 // is this an unsupported evaluation?
100 const volatile char *typecode = license_key;
101 int field = 2;
102 for ( ; field && *typecode; ++typecode)
103 if (*typecode == '-')
104 --field;
105
106 if (!field && typecode[1] == '4' && typecode[2] == 'M') {
107 if (typecode[0] == 'Q')
108 return 0;
109 else if (typecode[0] == 'R' || typecode[0] == 'Z')
110 return 1;
111 }
112 return -1;
113 }
114
qt_eval_days_left()115 static int qt_eval_days_left()
116 {
117 if (qt_eval_is_supported() < 0)
118 return -2;
119
120 QDate today = QDate::currentDate();
121 QDate build = QLibraryInfo::buildDate();
122 return qMax(-1, today.daysTo(build) + 30);
123 }
124
qt_eval_string()125 static QString qt_eval_string()
126 {
127 const char *msg;
128 switch (qt_eval_is_supported()) {
129 case 0:
130 msg = boilerplate_unsuported;
131 break;
132 case 1:
133 msg = boilerplate_supported;
134 break;
135 default:
136 return QString();
137 msg = 0;
138 }
139
140 return QString::fromLatin1(msg)
141 .arg(QLatin1String(QT_VERSION_STR))
142 .arg(QLibraryInfo::licensee())
143 .arg(qt_eval_days_left());
144 }
145
146 #define WARN_TIMEOUT 60 * 1000 * 119
147 #define KILL_DELAY 60 * 1000 * 1
148
149 class QCoreFuriCuri : public QObject
150 {
151 public:
152
153 int warn;
154 int kill;
155
QCoreFuriCuri()156 QCoreFuriCuri() : QObject(), warn(-1), kill(-1)
157 {
158 if (!qt_eval_is_supported()) {
159 warn = startTimer(WARN_TIMEOUT);
160 kill = 0;
161 }
162 }
163
timerEvent(QTimerEvent * e)164 void timerEvent(QTimerEvent *e) {
165 if (e->timerId() == warn) {
166 killTimer(warn);
167 fprintf(stderr, "%s\n", will_shutdown_1min);
168 kill = startTimer(KILL_DELAY);
169 } else if (e->timerId() == kill) {
170 fprintf(stderr, "%s\n", will_shutdown_now);
171 QCoreApplication::instance()->quit();
172 }
173 }
174 };
175
176 #if defined(QT_BUILD_CORE_LIB) || defined (QT_BOOTSTRAPPED)
177
qt_core_eval_init(uint type)178 void qt_core_eval_init(uint type)
179 {
180 if (!type)
181 return; // GUI app
182
183 switch (qt_eval_days_left()) {
184 case -2:
185 return;
186
187 case -1:
188 fprintf(stderr, "%s\n", boilerplate_expired);
189 if (type == 0) {
190 // if we're a console app only.
191 exit(0);
192 }
193
194 default:
195 fprintf(stderr, "%s\n", qPrintable(qt_eval_string()));
196 if (type == 0) {
197 Q_UNUSED(new QCoreFuriCuri());
198 }
199 }
200 }
201 #endif
202
203 #ifdef QT_BUILD_GUI_LIB
204
205 QT_BEGIN_INCLUDE_NAMESPACE
206 #include <qdialog.h>
207 #include <qlabel.h>
208 #include <qlayout.h>
209 #include <qmessagebox.h>
210 #include <qpushbutton.h>
211 #include <qtimer.h>
212 #include <qapplication.h>
213 QT_END_INCLUDE_NAMESPACE
214
215
216 static const char * const qtlogo_eval_xpm[] = {
217 /* columns rows colors chars-per-pixel */
218 "46 55 174 2",
219 " c #002E02",
220 ". c #00370D",
221 "X c #003A0E",
222 "o c #003710",
223 "O c #013C13",
224 "+ c #043E1A",
225 "@ c #084F0A",
226 "# c #0B520C",
227 "$ c #054413",
228 "% c #0C4C17",
229 "& c #07421D",
230 "* c #09451D",
231 "= c #0D491E",
232 "- c #125515",
233 "; c #13541A",
234 ": c #17591B",
235 "> c #1B5C1D",
236 ", c #1F611F",
237 "< c #20621E",
238 "1 c #337B1E",
239 "2 c #0B4521",
240 "3 c #0F4923",
241 "4 c #114B24",
242 "5 c #154D2A",
243 "6 c #175323",
244 "7 c #1C5924",
245 "8 c #1C532F",
246 "9 c #1E5432",
247 "0 c #245936",
248 "q c #265938",
249 "w c #295C3B",
250 "e c #246324",
251 "r c #266823",
252 "t c #2A6C24",
253 "y c #276628",
254 "u c #2D7026",
255 "i c #327427",
256 "p c #367927",
257 "a c #37782A",
258 "s c #397C2A",
259 "d c #2E613E",
260 "f c #336C37",
261 "g c #2F6040",
262 "h c #356545",
263 "j c #3C6B4E",
264 "k c #3F6C51",
265 "l c #406E4F",
266 "z c #406D52",
267 "x c #477457",
268 "c c #497557",
269 "v c #4B7857",
270 "b c #517B5E",
271 "n c #3C8423",
272 "m c #3E812C",
273 "M c #53A61D",
274 "N c #41862C",
275 "B c #458A2D",
276 "V c #498F2D",
277 "C c #479324",
278 "Z c #489226",
279 "A c #4D952C",
280 "S c #478B30",
281 "D c #488C30",
282 "F c #4D9232",
283 "G c #509632",
284 "H c #549A33",
285 "J c #589F35",
286 "K c #56A526",
287 "L c #57A821",
288 "P c #5BAA27",
289 "I c #57A32A",
290 "U c #5CA72E",
291 "Y c #5DAB2A",
292 "T c #5CA336",
293 "R c #60AD2E",
294 "E c #63B12D",
295 "W c #65AF35",
296 "Q c #62A53F",
297 "! c #65AE39",
298 "~ c #66B036",
299 "^ c #6AB437",
300 "/ c #67B138",
301 "( c #6AB339",
302 ") c #6DB838",
303 "_ c #70BA3C",
304 "` c #4D8545",
305 "' c #4E8942",
306 "] c #548851",
307 "[ c #6FAF4A",
308 "{ c #6DB243",
309 "} c #71B546",
310 "| c #70B840",
311 " . c #73B648",
312 ".. c #79BA4E",
313 "X. c #7CBB53",
314 "o. c #598266",
315 "O. c #62886D",
316 "+. c #6A8F75",
317 "@. c #6B9173",
318 "#. c #70937A",
319 "$. c #799F79",
320 "%. c #7BAF66",
321 "&. c #81BD5B",
322 "*. c #85BF60",
323 "=. c #85AC7F",
324 "-. c #8DBA7B",
325 ";. c #87C061",
326 ":. c #8AC364",
327 ">. c #8DC46A",
328 ",. c #90C56E",
329 "<. c #93C771",
330 "1. c #96CA73",
331 "2. c #9ACB7C",
332 "3. c #9FD07D",
333 "4. c #779981",
334 "5. c #7F9F89",
335 "6. c #809F88",
336 "7. c #82A18B",
337 "8. c #86A192",
338 "9. c #8DA994",
339 "0. c #8FA998",
340 "q. c #94AF9B",
341 "w. c #97B991",
342 "e. c #97B19E",
343 "r. c #9DB6A3",
344 "t. c #A3BCA7",
345 "y. c #A6BCAB",
346 "u. c #A9BEB1",
347 "i. c #9ECD81",
348 "p. c #A2CF85",
349 "a. c #A5D284",
350 "s. c #A6D189",
351 "d. c #A9D28E",
352 "f. c #ABD491",
353 "g. c #B1D797",
354 "h. c #B1D699",
355 "j. c #B5D89E",
356 "k. c #ADC5AC",
357 "l. c #B1CAAE",
358 "z. c #B9DAA3",
359 "x. c #BDDDA8",
360 "c. c #ADC1B4",
361 "v. c #B2C6B6",
362 "b. c #B5C6BC",
363 "n. c #B6C9BA",
364 "m. c #BCD1BA",
365 "M. c #C6E1B4",
366 "N. c #CDE5BD",
367 "B. c #C2D2C6",
368 "V. c #CADEC2",
369 "C. c #C6D3CC",
370 "Z. c #C8D7CB",
371 "A. c #CEDAD2",
372 "S. c #D2DDD4",
373 "D. c #D3E9C6",
374 "F. c #D7EBC9",
375 "G. c #D9EBCD",
376 "H. c #DEEED4",
377 "J. c #D6E0D9",
378 "K. c #DAE4DC",
379 "L. c #E0EFD7",
380 "P. c #E5F2DD",
381 "I. c #DFE8E0",
382 "U. c #E4EBE5",
383 "Y. c #E9EFEA",
384 "T. c #EDF4EB",
385 "R. c #F0FAE6",
386 "E. c #F1F8EC",
387 "W. c #EDF0F0",
388 "Q. c #F4F7F3",
389 "!. c #F6F9F4",
390 "~. c #F8FAF7",
391 "^. c #FEFEFE",
392 "/. c None",
393 /* pixels */
394 "/././././.c h ' Q / W _ &.p././././././././././././././././././././././././././././././././.",
395 "/././.4 O % Z ~ ~ W ~ W R U R R ( X.>.p././././././././././././././././././././././././././.",
396 "/./.. * = J _ ~ ~ ~ ~ ~ / / / / W W U P P U W .;.2././././././././././././././././././././.",
397 "/.= = & a ) W ~ ~ ~ ~ ~ / W / ~ ~ ~ ^ ( ( ^ ~ R R U P Y ~ .;.2././././././././././././././.",
398 "O.O = = T ^ W ~ ~ ~ ~ ~ ~ W W / W ~ ~ ~ ~ ~ ~ ~ ( ( ( ( ~ W Y Y Y Y W { &.1././././././././.",
399 "0 = * 7 ~ ~ ~ ~ ~ ~ ~ ~ ~ / / W ~ ~ ~ ~ ~ ~ ~ ~ W W W ~ ~ ~ ~ ( ( ( W W R U P U W { X.1.f./.",
400 "= = & e ^ W ~ ~ ~ ~ ~ ~ ~ ~ / / ~ ~ ~ ~ ~ ~ ~ ~ W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ^ ( ( / ~ W R U U Y ",
401 "= = & e ^ W ~ ~ ~ ~ ~ ~ ~ ~ W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W ( W ~ ~ ~ ^ ^ ( ",
402 "= = * e ^ W ~ ~ ~ ~ ~ ~ / W / W ! ( / ~ W ^ ( ( ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W ~ W W ~ ~ ~ ~ ~ ~ ",
403 "= = & e ^ ! ~ ~ ~ ~ ~ ~ W W ^ _ ~ K Y W W R P Y W ( ~ ~ ~ ~ ~ ~ ~ W / ~ ~ ~ ^ W ~ ~ ~ ~ ~ ~ ",
404 "= = & e ^ W ~ ~ ~ ~ ~ ~ W ) W 1 ` w.V.L.H.D.z.,.~ Y ^ ~ ~ ~ ~ ~ W ~ ~ ~ ( ~ W W ~ ~ ~ ~ ~ ~ ",
405 "= = & e ^ W ~ ~ ~ ~ ~ W ) V = 8.~.^.^.^.^.^.^.^.U.<.Y ~ ~ ~ ~ ~ W W ! ~ Y W ^ W ~ ~ ~ ~ ~ ~ ",
406 "= = & e ^ W ~ ~ ~ ~ W ^ B O u.^.~.^.^.^.^.~.~.^.^.^.h.Y ^ ~ ~ ^ F $ k.R.G.1.Y / ~ ~ ~ ~ ~ ~ ",
407 "= = & e ^ ~ ~ ~ / W ( J X 7.^.~.^.^.^.^.^.^.^.^.^.^.^.s.Y / W ) a 2 U.^.^.d.U ( ~ ~ ~ ~ ~ ~ ",
408 "= = & e ^ W / ~ ~ ~ ^ > w ~.^.^.^.^.^.F.%.v c.^.^.^.^.~.X.W ~ ^ > h ^.^.^.d.P ( ~ ~ ~ ~ ~ ~ ",
409 "= = & e ^ W ~ ~ W ^ H o e.^.^.^.^.^.G.Y E n . y.^.^.^.^.M.Y ( ! $ @.^.~.^.f.U ( / ~ ~ W ~ ~ ",
410 "= = & e ^ W ~ W ! ) t 4 U.^.^.^.^.^.>.U ( _ , 9 ~.^.^.^.~...^ A y.^.~.^.s.M W Y ~ ~ ~ ~ ~ ",
411 "= 3 & e ^ W ~ ( ^ ( $ c ^.^.^.^.^.E.) ~ ~ ^ S o n.^.^.^.^.=.- l.v.Y.^.^.^.M.:.:.X.~ ~ ~ ~ ~ ",
412 "= = & e ^ ! W W ( J X 7.^.^.^.^.^.F.Y ( W ^ T X 6.^.^.~.^.c.. J.^.^.^.^.^.^.^.^.P.~ ~ ~ ~ ~ ",
413 "= = & r ^ W / W ) B o v.^.~.^.^.^.M.U / ~ ~ ! $ o.^.^.^.^.K.* S.^.^.^.^.^.^.^.^.P.~ ~ ~ ~ ~ ",
414 "= = & e ^ ! ~ W ) a + S.^.^.^.^.^.z.P ( W ~ ( % z ^.^.^.^.~.f t.U.^.^.^.^.~.^.^.P.~ ~ ~ ~ ~ ",
415 "* = & e ^ W ~ W ) t 3 Y.^.^.^.^.^.f.P ( ~ ~ ^ ; h ^.^.^.^.^.:.@ j ^.^.^.^.h.{ X.&.~ ~ ~ ~ ~ ",
416 "3 = & e ^ W ~ ~ ^ e 8 Q.^.^.^.^.^.s.P ~ ~ W ^ > 0 ~.^.^.^.^.1.# z ^.^.^.^.d.L W R ~ ~ ~ ~ ~ ",
417 "= = & e ^ W ~ ~ ^ > q ~.^.^.^.^.^.p.U ^ ~ W ) e 9 ~.^.^.^.^.3.# k ^.^.^.^.f.Y ( / ~ ~ ~ ~ ~ ",
418 "= = & e ^ W / W ^ > w ~.^.^.^.^.^.i.Y / ~ W ^ e 8 Q.^.^.^.^.a.# z ^.^.^.^.f.Y / ~ ~ ~ ~ ~ ~ ",
419 "= = & e ^ W / W ^ > w ^.^.^.^.^.^.2.Y / ~ ~ ) e 8 Q.^.^.^.^.s.# z ^.^.^.^.d.P ( ~ ~ ~ ~ ~ ~ ",
420 "= = & e ^ W W W ^ > q ^.^.^.^.^.^.p.Y / ~ ~ ^ e 9 Q.^.^.^.^.a.@ z ^.^.^.^.f.U / ~ ~ ~ ~ ~ ~ ",
421 "= = & e ^ W / W ) 7 9 Q.^.^.^.^.^.a.P / ~ W ) , 9 Q.^.^.^.^.3.# z ^.^.~.^.f.P ^ ~ ~ ~ ~ ~ ~ ",
422 "= = & e ^ W / W ) r 5 T.^.^.^.^.^.d.Y / ~ W ) > q ~.^.^.^.^.1.# k ^.^.^.^.f.Y ( ~ ~ ~ ~ ~ ~ ",
423 "= = & e ^ / / W ) i 2 I.^.^.^.^.^.h.P ( ~ W ( > g ^.^.^.^.^.:.# z ^.^.^.^.f.P / ~ ~ ~ ~ ~ ~ ",
424 "= = & e ( W / W ) m O Z.^.^.^.^.^.x.P / ~ ~ ( ; j ^.^.^.^.~.&.- k ^.^.~.^.f.P / ~ ~ ~ ~ ~ ~ ",
425 "= = & e ( W / W ) F o y.^.~.^.^.^.N.U ( ~ ~ W $ b ^.^.^.^.R._ - k ^.^.^.^.f.Y ( ~ ~ ~ ~ ~ ~ ",
426 "= = & e ^ W ~ ~ ^ J X 4.^.^.^.^.^.L.~ ~ W ^ T X #.^.^.^.^.F.~ ; j ^.^.^.^.f.U ( ~ ~ ~ ~ ~ ~ ",
427 "= = & e ^ ~ ~ ~ / ^ % l ^.^.^.^.^.!. .R ^ ^ G . r.^.~.^.^.j.E : j ^.^.^.^.f.P ) ( ~ ~ ~ ~ ~ ",
428 "= = & e ^ W ~ ~ W ) u = U.^.^.^.^.^.1.Y ! ) a & K.^.^.^.^.;.~ : j ^.^.~.^.z.M I I / ~ ~ W ~ ",
429 "= = & e ( W ~ ~ W ( G . q.^.^.^.^.^.D.U ^ ! X o.^.^.^.^.P.~ ^ > g ^.^.^.^.E.-.$.m.X.W ~ ~ ~ ",
430 "= = & e ^ / ~ ~ ^ ! ( > w ~.^.^.^.^.^.h.T > j T.^.^.~.^.a.Y _ i 3 U.^.^.^.^.^.^.^.X.R ~ ~ ~ ",
431 "= = & e ^ / ~ ~ W W ^ H . 9.^.~.^.^.^.^.K.C.~.^.^.^.^.H.W W ^ T . q.^.~.^.^.^.^.^.X.R ~ ~ ~ ",
432 "= = + e ^ W / ~ W W W ) m + B.^.~.^.^.^.^.^.^.^.^.^.E.X.Y ( W ^ B 6 y.^.^.^.E.D.2.( ~ ~ ~ ~ ",
433 "= = * e ^ ! / ! W ^ W W ) a 4 b.^.^.^.^.^.^.^.^.^.P...Y ( ! W ! ^ W Z [ *.X.{ Y U ~ ~ ~ ~ ~ ",
434 "= = & e ( W ~ ~ W / W / W ) A < +.A.~.^.^.^.^.!.p.W R ~ ~ ~ ~ ~ W / ) E U W W / ^ ~ ~ ~ ~ ~ ",
435 "= = & e ^ W ~ ~ / W / / / W ( _ Z X 6.^.^.^.^.E.W ~ ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ",
436 "= = & e ^ ~ ~ ~ W W / W ~ ~ ~ ~ ) ; h ^.^.^.^.^.d.M U ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W ",
437 "= = & e ^ W ~ ~ ^ W W / ~ ~ ~ W ) p + S.^.^.^.^.~.M.f. .W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ .",
438 "= = & e ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W ( T O +.^.~.^.^.^.^.^.&.Y ( ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W ( Y 2.",
439 "= = & e ( W ~ ~ ~ ~ ~ ~ ~ ~ ~ / W ) N + b.^.^.^.^.^.^.&.R ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W /.",
440 "= = & e ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W ^ N 7 r.W.^.^.^.!.X.W ~ ~ W ~ W ~ ~ ~ ~ ~ ~ / ( ( K p./.",
441 "= = & e ( W ~ ~ W ~ ~ ~ ~ ~ ~ ~ ~ ~ W ( W C Q &.:.X.| ~ ~ ~ ~ W ~ / ~ ( / ( ~ W E U P 1././.",
442 "= = + e ^ / / / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W / ) ^ R Y W W ~ ~ ( / ( / W R Y Y U R ( X.,././././.",
443 "= = * e ( / ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W ! ( ( ( W W E U P Y W ( X.,.d./././././././././.",
444 "= = * e ( W ~ ~ ~ ~ W ! ~ W ~ W ~ ( ( / ^ W W U Y P W ( X.,.d./././././././././././././././.",
445 "8 $ * e ( W ~ ~ ~ ! ( ( ( / ( W R Y Y Y R ( X.>.d./././././././././././././././././././././.",
446 "/.d . y ^ / / / ( W Y Y P P W ( X.>.d./././././././././././././././././././././././././././.",
447 "/./.h : ^ R R R W ( X.<.f./././././././././././././././././././././././././././././././././.",
448 "/././.] _ *.3./././././././././././././././././././././././././././././././././././././././."
449 };
450
451 class EvalMessageBox : public QDialog
452 {
453 public:
EvalMessageBox(bool expired)454 EvalMessageBox(bool expired)
455 {
456 setWindowTitle(QLatin1String(" "));
457
458 QString str = qt_eval_string();
459 if (expired) {
460 str = QLatin1String(boilerplate_expired);
461 } else {
462 str = qt_eval_string();
463 }
464 str = str.trimmed();
465
466 QFrame *border = new QFrame(this);
467
468 QLabel *pixmap_label = new QLabel(border);
469 pixmap_label->setPixmap(qtlogo_eval_xpm);
470 pixmap_label->setAlignment(Qt::AlignTop);
471
472 QLabel *text_label = new QLabel(str, border);
473
474 QHBoxLayout *pm_and_text_layout = new QHBoxLayout();
475 pm_and_text_layout->addWidget(pixmap_label);
476 pm_and_text_layout->addWidget(text_label);
477
478 QVBoxLayout *master_layout = new QVBoxLayout(border);
479 master_layout->addLayout(pm_and_text_layout);
480
481 QVBoxLayout *border_layout = new QVBoxLayout(this);
482 border_layout->setMargin(0);
483 border_layout->addWidget(border);
484
485 if (expired) {
486 QPushButton *cmd = new QPushButton(QLatin1String("OK"), border);
487 cmd->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
488 cmd->setDefault(true);
489
490 QHBoxLayout *button_layout = new QHBoxLayout();
491 master_layout->addLayout(button_layout);
492 button_layout->addWidget(cmd);
493
494 connect(cmd, SIGNAL(clicked()), this, SLOT(close()));
495 } else {
496 border->setFrameShape(QFrame::WinPanel);
497 border->setFrameShadow(QFrame::Raised);
498 setParent(parentWidget(), Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
499 QTimer::singleShot(7000, this, SLOT(close()));
500 setAttribute(Qt::WA_DeleteOnClose);
501 }
502
503 setFixedSize(sizeHint());
504 }
505 };
506
507 class QGuiFuriCuri : public QCoreFuriCuri
508 {
509 public:
timerEvent(QTimerEvent * e)510 void timerEvent(QTimerEvent *e) {
511 if (e->timerId() == warn) {
512 killTimer(warn);
513 QMessageBox::information(0, QLatin1String("Automatic Timeout"), QLatin1String(will_shutdown_1min));
514 kill = startTimer(KILL_DELAY);
515 } else if (e->timerId() == kill) {
516 killTimer(kill);
517 QMessageBox::information(0, QLatin1String("Automatic Timeout"), QLatin1String(will_shutdown_now));
518 qApp->quit();
519 }
520 }
521 };
522
523
qt_gui_eval_init(uint)524 void qt_gui_eval_init(uint)
525 {
526 switch (qt_eval_days_left()) {
527 case -2:
528 return;
529
530 case -1: {
531 EvalMessageBox box(true);
532 box.exec();
533 ::exit(0);
534 }
535
536 default: {
537 EvalMessageBox *box = new EvalMessageBox(false);
538 box->show();
539 Q_UNUSED(new QGuiFuriCuri());
540 }
541 }
542 }
543
qt_eval_title_prefix()544 static QString qt_eval_title_prefix()
545 {
546 return QLatin1String("[Qt Evaluation] ");
547 }
548
qt_eval_adapt_window_title(const QString & title)549 QString qt_eval_adapt_window_title(const QString &title)
550 {
551 if (qt_eval_days_left() == -2)
552 return title;
553 return qt_eval_title_prefix() + title;
554 }
555
qt_eval_init_widget(QWidget * w)556 void qt_eval_init_widget(QWidget *w)
557 {
558 if (qt_eval_days_left() == -2)
559 return;
560 if (w->isTopLevel() && w->windowTitle().isEmpty() && w->windowType() != Qt::Desktop ) {
561 w->setWindowTitle(QLatin1String(" "));
562 }
563 }
564 #endif
565
566 QT_END_NAMESPACE
567