source: trunk/src/xmlpatterns/data/qabstractdatetime.cpp@ 349

Last change on this file since 349 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 12.8 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the QtXmlPatterns module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include <QStringList>
43
44#include "qbuiltintypes_p.h"
45#include "qitem_p.h"
46#include "qpatternistlocale_p.h"
47#include "qvalidationerror_p.h"
48
49#include "qabstractdatetime_p.h"
50
51QT_BEGIN_NAMESPACE
52
53using namespace QPatternist;
54
55AbstractDateTime::AbstractDateTime(const QDateTime &dateTime) : m_dateTime(dateTime)
56{
57 Q_ASSERT(dateTime.isValid());
58}
59
60#define badData(msg) errorMessage = ValidationError::createError(msg); return QDateTime()
61#define getCapt(sym) ((captTable.sym == -1) ? QString() : capts.at(captTable.sym))
62#define getSafeCapt(sym) ((captTable.sym == -1) ? QString() : capts.value(captTable.sym))
63
64QDateTime AbstractDateTime::create(AtomicValue::Ptr &errorMessage,
65 const QString &lexicalSource,
66 const CaptureTable &captTable)
67{
68 QRegExp myExp(captTable.regExp);
69
70 if(!myExp.exactMatch(lexicalSource))
71 {
72 badData(QString());
73 }
74
75 const QStringList capts(myExp.capturedTexts());
76 const QString yearStr(getCapt(year));
77
78 if(yearStr.size() > 4 && yearStr.at(0) == QLatin1Char('0'))
79 {
80 badData(QtXmlPatterns::tr("Year %1 is invalid because it begins with %2.")
81 .arg(formatData(yearStr)).arg(formatData("0")));
82 }
83
84 /* If the strings are empty, load default values which are
85 * guranteed to pass the validness tests. */
86 const QString monthStr(getCapt(month));
87 const QString dayStr(getCapt(day));
88 YearProperty year = yearStr.isEmpty() ? DefaultYear : yearStr.toInt();
89 if(getCapt(yearSign) == QChar::fromLatin1('-'))
90 year = -year;
91 const MonthProperty month = monthStr.isEmpty() ? DefaultMonth : monthStr.toInt();
92 const MonthProperty day = dayStr.isEmpty() ? DefaultDay : dayStr.toInt();
93
94 if(!QDate::isValid(year, month, day))
95 {
96 /* Try to give an intelligent message. */
97 if(day > 31 || day < 1)
98 {
99 badData(QtXmlPatterns::tr("Day %1 is outside the range %2..%3.")
100 .arg(formatData(QString::number(day)))
101 .arg(formatData("01"))
102 .arg(formatData("31")));
103 }
104 else if(month > 12 || month < -12 || month == 0)
105 {
106 badData(QtXmlPatterns::tr("Month %1 is outside the range %2..%3.")
107 .arg(month)
108 .arg(formatData("01"))
109 .arg(formatData("12")));