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
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 #ifndef XML_DATETIME_HPP
00099 #define XML_DATETIME_HPP
00100
00101 #include <xercesc/util/XMLNumber.hpp>
00102 #include <xercesc/util/PlatformUtils.hpp>
00103 #include <xercesc/util/XMLString.hpp>
00104 #include <xercesc/util/XMLUniDefs.hpp>
00105 #include <xercesc/util/SchemaDateTimeException.hpp>
00106
00107 XERCES_CPP_NAMESPACE_BEGIN
00108
00109 class XMLDateTime : public XMLNumber
00110 {
00111 public:
00112
00113 enum valueIndex
00114 {
00115 CentYear = 0,
00116 Month ,
00117 Day ,
00118 Hour ,
00119 Minute ,
00120 Second ,
00121 MiliSecond ,
00122 utc ,
00123 TOTAL_SIZE
00124 };
00125
00126 enum utcType
00127 {
00128 UTC_UNKNOWN = 0,
00129 UTC_STD ,
00130 UTC_POS ,
00131 UTC_NEG
00132 };
00133
00134
00135
00136
00137
00138 XMLDateTime(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00139 XMLDateTime(const XMLCh* const,
00140 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00141 ~XMLDateTime();
00142
00143 inline void setBuffer(const XMLCh* const);
00144
00145
00146
00147
00148
00149 XMLDateTime(const XMLDateTime&);
00150
00151 XMLDateTime& operator=(const XMLDateTime&);
00152
00153
00154
00155
00156
00162 virtual XMLCh* toString() const;
00163
00164 virtual XMLCh* getRawData() const;
00165
00166 virtual const XMLCh* getFormattedString() const;
00167
00168 virtual int getSign() const;
00169
00170
00171
00172
00173
00174 void parseDateTime();
00175
00176 void parseDate();
00177
00178 void parseTime();
00179
00180 void parseDay();
00181
00182 void parseMonth();
00183
00184 void parseYear();
00185
00186 void parseMonthDay();
00187
00188 void parseYearMonth();
00189
00190 void parseDuration();
00191
00192
00193
00194
00195 static int compare(const XMLDateTime* const
00196 , const XMLDateTime* const);
00197
00198 static int compare(const XMLDateTime* const
00199 , const XMLDateTime* const
00200 , bool );
00201
00202 static int compareOrder(const XMLDateTime* const
00203 , const XMLDateTime* const);
00204
00205 private:
00206
00207
00208
00209
00210
00211 enum timezoneIndex
00212 {
00213 hh = 0,
00214 mm ,
00215 TIMEZONE_ARRAYSIZE
00216 };
00217
00218
00219
00220
00221 static int compareResult(short
00222 , short
00223 , bool);
00224
00225 static void addDuration(XMLDateTime* pDuration
00226 , const XMLDateTime* const pBaseDate
00227 , int index);
00228
00229
00230 static int compareResult(const XMLDateTime* const
00231 , const XMLDateTime* const
00232 , bool
00233 , int);
00234
00235 static inline int getRetVal(int, int);
00236
00237
00238
00239
00240
00241 inline void reset();
00242
00243 inline void assertBuffer() const;
00244
00245 inline void copy(const XMLDateTime&);
00246
00247
00248 inline void initParser();
00249
00250 inline bool isNormalized() const;
00251
00252
00253
00254
00255
00256 void getDate();
00257
00258 void getTime();
00259
00260 void getYearMonth();
00261
00262 void getTimeZone(const int);
00263
00264 void parseTimeZone();
00265
00266
00267
00268
00269
00270 int findUTCSign(const int start);
00271
00272 int indexOf(const int start
00273 , const int end
00274 , const XMLCh ch) const;
00275
00276 int parseInt(const int start
00277 , const int end) const;
00278
00279 int parseIntYear(const int end) const;
00280
00281
00282
00283
00284
00285 void validateDateTime() const;
00286
00287 void normalize();
00288
00289
00290
00291
00292 bool operator==(const XMLDateTime& toCompare) const;
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 int fValue[TOTAL_SIZE];
00313 int fTimeZone[TIMEZONE_ARRAYSIZE];
00314 int fStart;
00315 int fEnd;
00316 XMLCh* fBuffer;
00317 MemoryManager* fMemoryManager;
00318 };
00319
00320 inline void XMLDateTime::setBuffer(const XMLCh* const aString)
00321 {
00322 reset();
00323 fBuffer = XMLString::replicate(aString, fMemoryManager);
00324 fEnd = XMLString::stringLen(fBuffer);
00325 }
00326
00327 inline void XMLDateTime::reset()
00328 {
00329 for ( int i=0; i < TOTAL_SIZE; i++ )
00330 fValue[i] = 0;
00331
00332 fTimeZone[hh] = fTimeZone[mm] = 0;
00333 fStart = fEnd = 0;
00334
00335 if (fBuffer)
00336 {
00337 fMemoryManager->deallocate(fBuffer);
00338 fBuffer = 0;
00339 }
00340
00341 }
00342
00343 inline void XMLDateTime::copy(const XMLDateTime& rhs)
00344 {
00345 for ( int i = 0; i < TOTAL_SIZE; i++ )
00346 fValue[i] = rhs.fValue[i];
00347
00348 fTimeZone[hh] = rhs.fTimeZone[hh];
00349 fTimeZone[mm] = rhs.fTimeZone[mm];
00350 fStart = rhs.fStart;
00351 fEnd = rhs.fEnd;
00352
00353 if (fBuffer)
00354 {
00355 fMemoryManager->deallocate(fBuffer);
00356 fBuffer = 0;
00357 }
00358
00359 if (rhs.fBuffer)
00360 fBuffer = XMLString::replicate(rhs.fBuffer, fMemoryManager);
00361 }
00362
00363 inline void XMLDateTime::assertBuffer() const
00364 {
00365 if ( ( !fBuffer ) ||
00366 ( fBuffer[0] == chNull ) )
00367 {
00368 ThrowXML(SchemaDateTimeException
00369 , XMLExcepts::DateTime_Assert_Buffer_Fail);
00370 }
00371
00372 }
00373
00374 inline void XMLDateTime::initParser()
00375 {
00376 assertBuffer();
00377 fStart = 0;
00378
00379 }
00380
00381 inline bool XMLDateTime::isNormalized() const
00382 {
00383 return ( fValue[utc] == UTC_STD ? true : false );
00384 }
00385
00386 inline int XMLDateTime::getRetVal(int c1, int c2)
00387 {
00388 if ((c1 == LESS_THAN && c2 == GREATER_THAN) ||
00389 (c1 == GREATER_THAN && c2 == LESS_THAN) )
00390 {
00391 return INDETERMINATE;
00392 }
00393
00394 return ( c1 != INDETERMINATE ) ? c1 : c2;
00395 }
00396
00397 XERCES_CPP_NAMESPACE_END
00398
00399 #endif