/****************************************************************************+ −
**+ −
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).+ −
** All rights reserved.+ −
** Contact: Nokia Corporation (qt-info@nokia.com)+ −
**+ −
** This file is part of the QtXmlPatterns module of the Qt Toolkit.+ −
**+ −
** $QT_BEGIN_LICENSE:LGPL$+ −
** No Commercial Usage+ −
** This file contains pre-release code and may not be distributed.+ −
** You may use this file in accordance with the terms and conditions+ −
** contained in the Technology Preview License Agreement accompanying+ −
** this package.+ −
**+ −
** GNU Lesser General Public License Usage+ −
** Alternatively, this file may be used under the terms of the GNU Lesser+ −
** General Public License version 2.1 as published by the Free Software+ −
** Foundation and appearing in the file LICENSE.LGPL included in the+ −
** packaging of this file. Please review the following information to+ −
** ensure the GNU Lesser General Public License version 2.1 requirements+ −
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.+ −
**+ −
** In addition, as a special exception, Nokia gives you certain additional+ −
** rights. These rights are described in the Nokia Qt LGPL Exception+ −
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.+ −
**+ −
** If you have questions regarding the use of this file, please contact+ −
** Nokia at qt-info@nokia.com.+ −
**+ −
**+ −
**+ −
**+ −
**+ −
**+ −
**+ −
**+ −
** $QT_END_LICENSE$+ −
**+ −
****************************************************************************/+ −
+ −
//+ −
// W A R N I N G+ −
// -------------+ −
//+ −
// This file is not part of the Qt API. It exists purely as an+ −
// implementation detail. This header file may change from version to+ −
// version without notice, or even be removed.+ −
//+ −
// We mean it.+ −
+ −
#ifndef Patternist_AbstractDateTime_H+ −
#define Patternist_AbstractDateTime_H+ −
+ −
#include <QDateTime>+ −
#include <QRegExp>+ −
+ −
#include "qitem_p.h"+ −
+ −
QT_BEGIN_HEADER+ −
+ −
QT_BEGIN_NAMESPACE+ −
+ −
namespace QPatternist+ −
{+ −
/**+ −
* @short Base class for classes implementing values related to time, date or both.+ −
*+ −
* @see <a href="http://www.w3.org/TR/xmlschema-2/#dateTime">XML Schema+ −
* Part 2: Datatypes Second Edition, 3.2.7 dateTime</a>+ −
* @see <a href="http://www.w3.org/TR/xpath-datamodel/#dates-and-times">XQuery+ −
* 1.0 and XPath 2.0 Data Model (XDM), 3.3.2 Dates and Times</a>+ −
* @see <a href="http://www.cl.cam.ac.uk/~mgk25/iso-time.html">A summary of+ −
* the international standard date and time notation, Markus Kuhn</a>+ −
* @see <a href="http://en.wikipedia.org/wiki/Iso_date">ISO 8601,+ −
* From Wikipedia, the free encyclopedia</a>+ −
* @author Frans Englich <frans.englich@nokia.com>+ −
* @ingroup Patternist_xdm+ −
*/+ −
class AbstractDateTime : public AtomicValue+ −
{+ −
public:+ −
typedef QExplicitlySharedDataPointer<AbstractDateTime> Ptr;+ −
+ −
AbstractDateTime(const QDateTime &dateTime);+ −
+ −
enum+ −
{+ −
DefaultYear = 2000,+ −
DefaultMonth = 1,+ −
DefaultDay = 1+ −
};+ −
+ −
/**+ −
* @returns the date time this class represents, as a QDateTime.+ −
*/+ −
inline const QDateTime &toDateTime() const+ −
{+ −
return m_dateTime;+ −
}+ −
+ −
+ −
/**+ −
* @short Acts as a mapping table for AbstractDateTime::create()+ −
* and describes where certain fields in a QRegExp pattern can be found+ −
* for a particular W3C XML Schema date/time type.+ −
*+ −
* @author Frans Englich <frans.englich@nokia.com>+ −
* @ingroup Patternist_xdm+ −
*/+ −
class CaptureTable+ −
{+ −
public:+ −
CaptureTable(const QRegExp &exp,+ −
const qint8 zoneOffsetSignP,+ −
const qint8 zoneOffsetHourP,+ −
const qint8 zoneOffsetMinuteP,+ −
const qint8 zoneOffsetUTCSymbolP,+ −
const qint8 yearP,+ −
const qint8 monthP = -1,+ −
const qint8 dayP = -1,+ −
const qint8 hourP = -1,+ −
const qint8 minutesP = -1,+ −
const qint8 secondsP = -1,+ −
const qint8 msecondsP = -1,+ −
const qint8 yearSignP = -1) : regExp(exp)+ −
, zoneOffsetSign(zoneOffsetSignP)+ −
, zoneOffsetHour(zoneOffsetHourP)+ −
, zoneOffsetMinute(zoneOffsetMinuteP)+ −
, zoneOffsetUTCSymbol(zoneOffsetUTCSymbolP)+ −
, year(yearP)+ −
, month(monthP)+ −
, day(dayP)+ −
, hour(hourP)+ −
, minutes(minutesP)+ −
, seconds(secondsP)+ −
, mseconds(msecondsP)+ −
, yearSign(yearSignP)+ −
{+ −
Q_ASSERT(exp.isValid());+ −
}+ −
+ −
const QRegExp regExp;+ −
const qint8 zoneOffsetSign;+ −
const qint8 zoneOffsetHour;+ −
const qint8 zoneOffsetMinute;+ −
const qint8 zoneOffsetUTCSymbol;+ −
const qint8 year;+ −
const qint8 month;+ −
const qint8 day;+ −
const qint8 hour;+ −
const qint8 minutes;+ −
const qint8 seconds;+ −
const qint8 mseconds;+ −
const qint8 yearSign;+ −
+ −
private:+ −
Q_DISABLE_COPY(CaptureTable)+ −
};+ −
+ −
/**+ −
* @returns m_dateTime's time part converted to string. This is for+ −
* example "12" or "01.023".+ −
*/+ −
QString timeToString() const;+ −
+ −
/**+ −
* @returns m_dateTime's date part converted to string. This is for+ −
* example "2004-05-12" or "-2004-05-12".+ −
*/+ −
QString dateToString() const;+ −
+ −
/**+ −
* Serializes the milli seconds @p msecs into a string representation. For+ −
* example, if @p msecs is 1, ".001" is returned; if @p msecs is 100 then+ −
* is ".1" returned.+ −
*/+ −
static QString serializeMSeconds(const MSecondProperty msecs);+ −
+ −
/**+ −
* A factory function for creating instances that are of the dynamic+ −
* type of this class, that represents @p dt.+ −
*+ −
* The default implementation performs an assert() call. This function+ −
* is not pure virtual because all sub-classes do not use it.+ −
*/+ −
virtual Item fromValue(const QDateTime &dt) const;+ −
+ −
/**+ −
* Determines whether @p dt is a date-time that can be represented,+ −
* and isn't too early or too late. If it is valid, @c true is returned. Otherwise,+ −
* @c false is returned and @p message is set to contain a translated message for+ −
* human consumption, describing the error.+ −
*/+ −
static bool isRangeValid(const QDate &date,+ −
QString &message);+ −
+ −
protected:+ −
+ −
/**+ −
* @returns m_dateTime' zone offset converted to string, as per the+ −
* the W3C XML Schema types. This is for+ −
* example "Z" or "+12.00"(depending on m_dateTime).+ −
*/+ −
QString zoneOffsetToString() const;+ −
+ −
static QDateTime create(AtomicValue::Ptr &errorMessage,+ −
const QString &lexicalSource,+ −
const CaptureTable &captTable);+ −
+ −
/**+ −
* @short Makes the QDateTime::timeSpec() and QDateTime::zoneOffset()+ −
* of @p ot * consistent to @p from.+ −
*/+ −
static void copyTimeSpec(const QDateTime &from,+ −
QDateTime &to);+ −
+ −
const QDateTime m_dateTime;+ −
+ −
private:+ −
enum ZoneOffsetParseResult+ −
{+ −
/**+ −
* syntax or logical error was encountered.+ −
*/+ −
Error,+ −
/**+ −
* It's a valid offset from UTC.+ −
*/+ −
Offset,+ −
+ −
/**+ −
* No zone offset was specified, it's an implementation defined zone offset.+ −
*/+ −
LocalTime,+ −
UTC+ −
};+ −
+ −
/**+ −
* @short Parses the zone offset. All types use zone offsets.+ −
*+ −
* If result is set to Offset, the offset is returned, otherwise+ −
* the return value is undefined.+ −
*+ −
* The offset is in seconds.+ −
*/+ −
static ZOTotal parseZoneOffset(ZoneOffsetParseResult &result,+ −
const QStringList &capts,+ −
const CaptureTable &captTable);+ −
+ −
static inline void setUtcOffset(QDateTime &result,+ −
const ZoneOffsetParseResult zoResult,+ −
const int zoOffset);+ −
};+ −
}+ −
+ −
QT_END_NAMESPACE+ −
+ −
QT_END_HEADER+ −
+ −
#endif+ −