00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 #ifndef XML_DATETIME_HPP
00087 #define XML_DATETIME_HPP
00088
00089 #include <xercesc/util/XercesDefs.hpp>
00090 #include <xercesc/util/XMLNumber.hpp>
00091 #include <xercesc/util/XMLString.hpp>
00092 #include <xercesc/util/XMLUniDefs.hpp>
00093 #include <xercesc/util/SchemaDateTimeException.hpp>
00094
00095 XERCES_CPP_NAMESPACE_BEGIN
00096
00097 class XMLDateTime : public XMLNumber
00098 {
00099 public:
00100
00101
00102 enum
00103 {
00104 LESS_THAN = -1,
00105 EQUAL = 0,
00106 GREATER_THAN = 1,
00107 INDETERMINATE = 2
00108 };
00109
00110 enum valueIndex
00111 {
00112 CentYear = 0,
00113 Month ,
00114 Day ,
00115 Hour ,
00116 Minute ,
00117 Second ,
00118 MiliSecond ,
00119 utc ,
00120 TOTAL_SIZE
00121 };
00122
00123 enum utcType
00124 {
00125 UTC_UNKNOWN = 0,
00126 UTC_STD ,
00127 UTC_POS ,
00128 UTC_NEG
00129 };
00130
00131
00132
00133
00134
00135 XMLDateTime();
00136
00137 XMLDateTime(const XMLCh* const);
00138
00139 ~XMLDateTime();
00140
00141 inline void setBuffer(const XMLCh* const);
00142
00143
00144
00145
00146
00147 XMLDateTime(const XMLDateTime&);
00148
00149 XMLDateTime& operator=(const XMLDateTime&);
00150
00151
00152
00153
00154
00155 virtual XMLCh* toString() const;
00156
00157 virtual XMLCh* getRawData() const;
00158
00159 virtual const XMLCh* getFormattedString() const;
00160
00161 virtual int getSign() const;
00162
00163
00164
00165
00166
00167 void parseDateTime();
00168
00169 void parseDate();
00170
00171 void parseTime();
00172
00173 void parseDay();
00174
00175 void parseMonth();
00176
00177 void parseYear();
00178
00179 void parseMonthDay();
00180
00181 void parseYearMonth();
00182
00183 void parseDuration();
00184
00185
00186
00187
00188 static int compare(const XMLDateTime* const
00189 , const XMLDateTime* const);
00190
00191 static int compare(const XMLDateTime* const
00192 , const XMLDateTime* const
00193 , bool );
00194
00195 static int compareOrder(const XMLDateTime* const
00196 , const XMLDateTime* const);
00197
00198 private:
00199
00200
00201
00202
00203
00204 enum timezoneIndex
00205 {
00206 hh = 0,
00207 mm ,
00208 TIMEZONE_ARRAYSIZE
00209 };
00210
00211
00212
00213
00214 static int compareResult(short
00215 , short
00216 , bool);
00217
00218 static void addDuration(XMLDateTime* pDuration
00219 , const XMLDateTime* const pBaseDate
00220 , int index);
00221
00222
00223 static int compareResult(const XMLDateTime* const
00224 , const XMLDateTime* const
00225 , bool
00226 , int);
00227
00228 static inline int getRetVal(int, int);
00229
00230
00231
00232
00233
00234 inline void reset();
00235
00236 inline void assertBuffer() const;
00237
00238 inline void copy(const XMLDateTime&);
00239
00240
00241 inline void initParser();
00242
00243 inline bool isNormalized() const;
00244
00245
00246
00247
00248
00249 void getDate();
00250
00251 void getTime();
00252
00253 void getYearMonth();
00254
00255 void getTimeZone(const int);
00256
00257 void parseTimeZone();
00258
00259
00260
00261
00262
00263 int findUTCSign(const int start);
00264
00265 int indexOf(const int start
00266 , const int end
00267 , const XMLCh ch) const;
00268
00269 int parseInt(const int start
00270 , const int end) const;
00271
00272 int parseIntYear(const int end) const;
00273
00274
00275
00276
00277
00278 void validateDateTime() const;
00279
00280 void normalize();
00281
00282
00283
00284
00285 bool operator==(const XMLDateTime& toCompare) const;
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 int fValue[TOTAL_SIZE];
00306 int fTimeZone[TIMEZONE_ARRAYSIZE];
00307 int fStart;
00308 int fEnd;
00309
00310 XMLCh* fBuffer;
00311
00312 };
00313
00314 inline void XMLDateTime::setBuffer(const XMLCh* const aString)
00315 {
00316 reset();
00317 fBuffer = XMLString::replicate(aString);
00318 fEnd = XMLString::stringLen(fBuffer);
00319
00320 }
00321
00322 inline void XMLDateTime::reset()
00323 {
00324 for ( int i=0; i < TOTAL_SIZE; i++ )
00325 fValue[i] = 0;
00326
00327 fTimeZone[hh] = fTimeZone[mm] = 0;
00328 fStart = fEnd = 0;
00329
00330 if (fBuffer)
00331 {
00332 delete[] fBuffer;
00333 fBuffer = 0;
00334 }
00335
00336 }
00337
00338 inline void XMLDateTime::copy(const XMLDateTime& rhs)
00339 {
00340 for ( int i = 0; i < TOTAL_SIZE; i++ )
00341 fValue[i] = rhs.fValue[i];
00342
00343 fTimeZone[hh] = rhs.fTimeZone[hh];
00344 fTimeZone[mm] = rhs.fTimeZone[mm];
00345 fStart = rhs.fStart;
00346 fEnd = rhs.fEnd;
00347
00348 if (fBuffer)
00349 {
00350 delete[] fBuffer;
00351 fBuffer = 0;
00352 }
00353
00354 if (rhs.fBuffer)
00355 fBuffer = XMLString::replicate(rhs.fBuffer);
00356
00357 }
00358
00359 inline void XMLDateTime::assertBuffer() const
00360 {
00361 if ( ( !fBuffer ) ||
00362 ( fBuffer[0] == chNull ) )
00363 {
00364 ThrowXML(SchemaDateTimeException
00365 , XMLExcepts::DateTime_Assert_Buffer_Fail);
00366 }
00367
00368 }
00369
00370 inline void XMLDateTime::initParser()
00371 {
00372 assertBuffer();
00373 fStart = 0;
00374
00375 }
00376
00377 inline bool XMLDateTime::isNormalized() const
00378 {
00379 return ( fValue[utc] == UTC_STD ? true : false );
00380 }
00381
00382 inline int XMLDateTime::getRetVal(int c1, int c2)
00383 {
00384 if ((c1 == LESS_THAN && c2 == GREATER_THAN) ||
00385 (c1 == GREATER_THAN && c2 == LESS_THAN) )
00386 {
00387 return INDETERMINATE;
00388 }
00389
00390 return ( c1 != INDETERMINATE ) ? c1 : c2;
00391 }
00392
00393 XERCES_CPP_NAMESPACE_END
00394
00395 #endif