-/*\r
- * Copyright 2001-2006 Internet2\r
- * \r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-/**\r
- * @file DateTime.h\r
- * \r
- * Manipulation of XML date/time data. \r
- */\r
-\r
-#ifndef _XML_DATETIME_H\r
-#define _XML_DATETIME_H\r
-\r
-#include <xmltooling/base.h>\r
-\r
-#if defined (_MSC_VER)\r
- #pragma warning( push )\r
- #pragma warning( disable : 4244 )\r
-#endif\r
-\r
-#include <xercesc/util/XMLDateTime.hpp>\r
-\r
-#if defined (_MSC_VER)\r
- #pragma warning( pop )\r
-#endif\r
-\r
-namespace xmltooling\r
-{\r
- /**\r
- * Class for manipulating XML date/time information.\r
- * \r
- * This is mostly copied from Xerces-C, but they haven't produced a usable date/time\r
- * class, so we had to incorporate a version of it for now. It can't be inherited\r
- * since the fields needed are private.\r
- */\r
- class XMLTOOL_API DateTime\r
- {\r
- public:\r
- /// @cond OFF\r
- DateTime();\r
- DateTime(const XMLCh* const);\r
- DateTime(time_t epoch);\r
- DateTime(const DateTime&);\r
- DateTime& operator=(const DateTime&);\r
- ~DateTime();\r
- \r
- inline void setBuffer(const XMLCh* const);\r
- \r
- const XMLCh* getRawData() const;\r
- const XMLCh* getFormattedString() const;\r
- int getSign() const;\r
- \r
- XMLCh* getDateTimeCanonicalRepresentation() const;\r
- XMLCh* getTimeCanonicalRepresentation() const;\r
- \r
- void parseDateTime();\r
- void parseDate();\r
- void parseTime();\r
- void parseDay();\r
- void parseMonth();\r
- void parseYear();\r
- void parseMonthDay();\r
- void parseYearMonth();\r
- void parseDuration();\r
- \r
- static int compare(const DateTime* const, const DateTime* const);\r
- static int compare(const DateTime* const, const DateTime* const, bool);\r
- static int compareOrder(const DateTime* const, const DateTime* const); \r
- \r
- int getYear() const {return fValue[CentYear];}\r
- int getMonth() const {return fValue[Month];}\r
- int getDay() const {return fValue[Day];}\r
- int getHour() const {return fValue[Hour];}\r
- int getMinute() const {return fValue[Minute];}\r
- int getSecond() const {return fValue[Second];}\r
- time_t getEpoch() const;\r
- \r
- /// @endcond\r
- private:\r
- enum valueIndex {\r
- CentYear = 0,\r
- Month ,\r
- Day ,\r
- Hour ,\r
- Minute ,\r
- Second ,\r
- MiliSecond , //not to be used directly\r
- utc ,\r
- TOTAL_SIZE\r
- };\r
- \r
- enum utcType {\r
- UTC_UNKNOWN = 0,\r
- UTC_STD , // set in parse() or normalize()\r
- UTC_POS , // set in parse()\r
- UTC_NEG // set in parse()\r
- };\r
- \r
- enum timezoneIndex {\r
- hh = 0,\r
- mm ,\r
- TIMEZONE_ARRAYSIZE\r
- };\r
- \r
- static int compareResult(int, int, bool);\r
- static void addDuration(DateTime* pDuration, const DateTime* const pBaseDate, int index);\r
- static int compareResult(const DateTime* const, const DateTime* const, bool, int);\r
- static inline int getRetVal(int, int);\r
- \r
- inline void reset();\r
- //inline void assertBuffer() const;\r
- inline void copy(const DateTime&);\r
- \r
- inline void initParser();\r
- inline bool isNormalized() const;\r
- \r
- void getDate();\r
- void getTime();\r
- void getYearMonth();\r
- void getTimeZone(const int);\r
- void parseTimeZone();\r
- \r
- int findUTCSign(const int start);\r
- int indexOf(const int start, const int end, const XMLCh ch) const;\r
- int parseInt(const int start, const int end) const;\r
- int parseIntYear(const int end) const;\r
- double parseMiliSecond(const int start, const int end) const;\r
- \r
- void validateDateTime() const;\r
- void normalize();\r
- void fillString(XMLCh*& ptr, valueIndex ind, int expLen) const;\r
- int fillYearString(XMLCh*& ptr, valueIndex ind) const;\r
- void searchMiliSeconds(XMLCh*& miliStartPtr, XMLCh*& miliEndPtr) const;\r
- \r
- bool operator==(const DateTime& toCompare) const;\r
- \r
- static const int DATETIMES[][TOTAL_SIZE];\r
- int fValue[TOTAL_SIZE];\r
- int fTimeZone[TIMEZONE_ARRAYSIZE];\r
- int fStart;\r
- int fEnd;\r
- int fBufferMaxLen;\r
- XMLCh* fBuffer;\r
- \r
- double fMiliSecond;\r
- bool fHasTime;\r
- };\r
-\r
- inline void DateTime::setBuffer(const XMLCh* const aString)\r
- {\r
- reset();\r
- fEnd = XMLString::stringLen(aString);\r
- if (fEnd > 0) {\r
- if (fEnd > fBufferMaxLen) {\r
- delete[] fBuffer;\r
- fBufferMaxLen = fEnd + 8;\r
- fBuffer = new XMLCh[fBufferMaxLen+1];\r
- }\r
- memcpy(fBuffer, aString, (fEnd+1) * sizeof(XMLCh));\r
- }\r
- }\r
- \r
- inline void DateTime::reset()\r
- {\r
- for ( int i=0; i < XMLDateTime::TOTAL_SIZE; i++ )\r
- fValue[i] = 0;\r
- \r
- fMiliSecond = 0;\r
- fHasTime = false;\r
- fTimeZone[hh] = fTimeZone[mm] = 0;\r
- fStart = fEnd = 0;\r
- \r
- if (fBuffer)\r
- *fBuffer = 0;\r
- }\r
- \r
- inline void DateTime::copy(const DateTime& rhs)\r
- {\r
- for ( int i = 0; i < XMLDateTime::TOTAL_SIZE; i++ )\r
- fValue[i] = rhs.fValue[i];\r
- \r
- fMiliSecond = rhs.fMiliSecond;\r
- fHasTime = rhs.fHasTime;\r
- fTimeZone[hh] = rhs.fTimeZone[hh];\r
- fTimeZone[mm] = rhs.fTimeZone[mm];\r
- fStart = rhs.fStart;\r
- fEnd = rhs.fEnd;\r
- \r
- if (fEnd > 0) {\r
- if (fEnd > fBufferMaxLen) {\r
- delete[] fBuffer;\r
- fBufferMaxLen = rhs.fBufferMaxLen;\r
- fBuffer = new XMLCh[fBufferMaxLen+1];\r
- }\r
- memcpy(fBuffer, rhs.fBuffer, (fEnd+1) * sizeof(XMLCh));\r
- }\r
- }\r
- \r
- inline void DateTime::initParser()\r
- {\r
- fStart = 0; // to ensure scan from the very first beginning\r
- // in case the pointer is updated accidentally by someone else.\r
- }\r
- \r
- inline bool DateTime::isNormalized() const\r
- {\r
- return (fValue[XMLDateTime::utc] == XMLDateTime::UTC_STD ? true : false);\r
- }\r
- \r
- inline int DateTime::getRetVal(int c1, int c2)\r
- {\r
- if ((c1 == XMLDateTime::LESS_THAN && c2 == XMLDateTime::GREATER_THAN) ||\r
- (c1 == XMLDateTime::GREATER_THAN && c2 == XMLDateTime::LESS_THAN))\r
- return XMLDateTime::INDETERMINATE;\r
- \r
- return (c1 != XMLDateTime::INDETERMINATE) ? c1 : c2;\r
- }\r
-\r
-}\r
-\r
-#endif\r
+/*
+ * Copyright 2001-2006 Internet2
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file DateTime.h
+ *
+ * Manipulation of XML date/time data.
+ */
+
+#ifndef _XML_DATETIME_H
+#define _XML_DATETIME_H
+
+#include <xmltooling/base.h>
+
+#if defined (_MSC_VER)
+ #pragma warning( push )
+ #pragma warning( disable : 4244 )
+#endif
+
+#include <xercesc/util/XMLDateTime.hpp>
+
+#if defined (_MSC_VER)
+ #pragma warning( pop )
+#endif
+
+namespace xmltooling
+{
+ /**
+ * Class for manipulating XML date/time information.
+ *
+ * This is mostly copied from Xerces-C, but they haven't produced a usable date/time
+ * class, so we had to incorporate a version of it for now. It can't be inherited
+ * since the fields needed are private.
+ */
+ class XMLTOOL_API DateTime
+ {
+ public:
+ /// @cond OFF
+ DateTime();
+ DateTime(const XMLCh* const);
+ DateTime(time_t epoch);
+ DateTime(const DateTime&);
+ DateTime& operator=(const DateTime&);
+ ~DateTime();
+
+ inline void setBuffer(const XMLCh* const);
+
+ const XMLCh* getRawData() const;
+ const XMLCh* getFormattedString() const;
+ int getSign() const;
+
+ XMLCh* getDateTimeCanonicalRepresentation() const;
+ XMLCh* getTimeCanonicalRepresentation() const;
+
+ void parseDateTime();
+ void parseDate();
+ void parseTime();
+ void parseDay();
+ void parseMonth();
+ void parseYear();
+ void parseMonthDay();
+ void parseYearMonth();
+ void parseDuration();
+
+ static int compare(const DateTime* const, const DateTime* const);
+ static int compare(const DateTime* const, const DateTime* const, bool);
+ static int compareOrder(const DateTime* const, const DateTime* const);
+
+ int getYear() const {return fValue[CentYear];}
+ int getMonth() const {return fValue[Month];}
+ int getDay() const {return fValue[Day];}
+ int getHour() const {return fValue[Hour];}
+ int getMinute() const {return fValue[Minute];}
+ int getSecond() const {return fValue[Second];}
+ time_t getEpoch() const;
+
+ /// @endcond
+ private:
+ enum valueIndex {
+ CentYear = 0,
+ Month ,
+ Day ,
+ Hour ,
+ Minute ,
+ Second ,
+ MiliSecond , //not to be used directly
+ utc ,
+ TOTAL_SIZE
+ };
+
+ enum utcType {
+ UTC_UNKNOWN = 0,
+ UTC_STD , // set in parse() or normalize()
+ UTC_POS , // set in parse()
+ UTC_NEG // set in parse()
+ };
+
+ enum timezoneIndex {
+ hh = 0,
+ mm ,
+ TIMEZONE_ARRAYSIZE
+ };
+
+ static int compareResult(int, int, bool);
+ static void addDuration(DateTime* pDuration, const DateTime* const pBaseDate, int index);
+ static int compareResult(const DateTime* const, const DateTime* const, bool, int);
+ static inline int getRetVal(int, int);
+
+ inline void reset();
+ //inline void assertBuffer() const;
+ inline void copy(const DateTime&);
+
+ inline void initParser();
+ inline bool isNormalized() const;
+
+ void getDate();
+ void getTime();
+ void getYearMonth();
+ void getTimeZone(const int);
+ void parseTimeZone();
+
+ int findUTCSign(const int start);
+ int indexOf(const int start, const int end, const XMLCh ch) const;
+ int parseInt(const int start, const int end) const;
+ int parseIntYear(const int end) const;
+ double parseMiliSecond(const int start, const int end) const;
+
+ void validateDateTime() const;
+ void normalize();
+ void fillString(XMLCh*& ptr, valueIndex ind, int expLen) const;
+ int fillYearString(XMLCh*& ptr, valueIndex ind) const;
+ void searchMiliSeconds(XMLCh*& miliStartPtr, XMLCh*& miliEndPtr) const;
+
+ bool operator==(const DateTime& toCompare) const;
+
+ static const int DATETIMES[][TOTAL_SIZE];
+ int fValue[TOTAL_SIZE];
+ int fTimeZone[TIMEZONE_ARRAYSIZE];
+ int fStart;
+ int fEnd;
+ int fBufferMaxLen;
+ XMLCh* fBuffer;
+
+ double fMiliSecond;
+ bool fHasTime;
+ };
+
+ inline void DateTime::setBuffer(const XMLCh* const aString)
+ {
+ reset();
+ fEnd = XMLString::stringLen(aString);
+ if (fEnd > 0) {
+ if (fEnd > fBufferMaxLen) {
+ delete[] fBuffer;
+ fBufferMaxLen = fEnd + 8;
+ fBuffer = new XMLCh[fBufferMaxLen+1];
+ }
+ memcpy(fBuffer, aString, (fEnd+1) * sizeof(XMLCh));
+ }
+ }
+
+ inline void DateTime::reset()
+ {
+ for ( int i=0; i < XMLDateTime::TOTAL_SIZE; i++ )
+ fValue[i] = 0;
+
+ fMiliSecond = 0;
+ fHasTime = false;
+ fTimeZone[hh] = fTimeZone[mm] = 0;
+ fStart = fEnd = 0;
+
+ if (fBuffer)
+ *fBuffer = 0;
+ }
+
+ inline void DateTime::copy(const DateTime& rhs)
+ {
+ for ( int i = 0; i < XMLDateTime::TOTAL_SIZE; i++ )
+ fValue[i] = rhs.fValue[i];
+
+ fMiliSecond = rhs.fMiliSecond;
+ fHasTime = rhs.fHasTime;
+ fTimeZone[hh] = rhs.fTimeZone[hh];
+ fTimeZone[mm] = rhs.fTimeZone[mm];
+ fStart = rhs.fStart;
+ fEnd = rhs.fEnd;
+
+ if (fEnd > 0) {
+ if (fEnd > fBufferMaxLen) {
+ delete[] fBuffer;
+ fBufferMaxLen = rhs.fBufferMaxLen;
+ fBuffer = new XMLCh[fBufferMaxLen+1];
+ }
+ memcpy(fBuffer, rhs.fBuffer, (fEnd+1) * sizeof(XMLCh));
+ }
+ }
+
+ inline void DateTime::initParser()
+ {
+ fStart = 0; // to ensure scan from the very first beginning
+ // in case the pointer is updated accidentally by someone else.
+ }
+
+ inline bool DateTime::isNormalized() const
+ {
+ return (fValue[XMLDateTime::utc] == XMLDateTime::UTC_STD ? true : false);
+ }
+
+ inline int DateTime::getRetVal(int c1, int c2)
+ {
+ if ((c1 == XMLDateTime::LESS_THAN && c2 == XMLDateTime::GREATER_THAN) ||
+ (c1 == XMLDateTime::GREATER_THAN && c2 == XMLDateTime::LESS_THAN))
+ return XMLDateTime::INDETERMINATE;
+
+ return (c1 != XMLDateTime::INDETERMINATE) ? c1 : c2;
+ }
+
+}
+
+#endif