📄 datecategory.cxx
字号:
#if defined(HAVE_CONFIG_H)#include "resip/stack/config.hxx"#endif#include <time.h>#include "resip/stack/DateCategory.hxx"#include "resip/stack/Transport.hxx"#include "rutil/Data.hxx"#include "rutil/DnsUtil.hxx"#include "rutil/Logger.hxx"#include "rutil/ParseBuffer.hxx"#include "rutil/Socket.hxx"#include "rutil/WinLeakCheck.hxx"using namespace resip;using namespace std;#define RESIPROCATE_SUBSYSTEM Subsystem::SIP//====================// Date//====================Data resip::DayOfWeekData[] ={ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};Data resip::MonthData[] ={ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};DateCategory::DateCategory() : ParserCategory(), mDayOfWeek(Sun), mDayOfMonth(), mMonth(Jan), mYear(0), mHour(0), mMin(0), mSec(0){ time_t now; time(&now); if (now == ((time_t)-1)) { int e = getErrno(); DebugLog (<< "Failed to get time: " << strerror(e)); Transport::error(e); return; } struct tm gmt;#if defined(WIN32) || defined(__sun) struct tm *gmtp = gmtime(&now); if (gmtp == 0) { int e = getErrno(); DebugLog (<< "Failed to convert to gmt: " << strerror(e)); Transport::error(e); return; } memcpy(&gmt,gmtp,sizeof(gmt));#else if (gmtime_r(&now, &gmt) == 0) { int e = getErrno(); DebugLog (<< "Failed to convert to gmt: " << strerror(e)); Transport::error(e); return; }#endif mDayOfWeek = static_cast<DayOfWeek>(gmt.tm_wday); mDayOfMonth = gmt.tm_mday; mMonth = static_cast<Month>(gmt.tm_mon); mYear = gmt.tm_year + 1900; mHour = gmt.tm_hour; mMin = gmt.tm_min; mSec = gmt.tm_sec; DebugLog (<< "Set date: day=" << mDayOfWeek << " month=" << mMonth << " year=" << mYear << " " << mHour << ":" << mMin << ":" << mSec);}DateCategory::DateCategory(HeaderFieldValue* hfv, Headers::Type type) : ParserCategory(hfv, type), mDayOfWeek(Sun), mDayOfMonth(), mMonth(Jan), mYear(0), mHour(0), mMin(0), mSec(0){}DateCategory::DateCategory(const DateCategory& rhs){ *this = rhs;}DateCategory&DateCategory::operator=(const DateCategory& rhs){ if (this != &rhs) { ParserCategory::operator=(rhs); mDayOfWeek = rhs.mDayOfWeek; mDayOfMonth = rhs.mDayOfMonth; mMonth = rhs.mMonth; mYear = rhs.mYear; mHour = rhs.mHour; mMin = rhs.mMin; mSec = rhs.mSec; } return *this;}/* ANSI-C code produced by gperf version 2.7.2 *//* Command-line: gperf -L ANSI-C -t -k '*' dayofweek.gperf */struct days { char name[32]; DayOfWeek day; };#ifdef __GNUC____inline#else#ifdef __cplusplusinline#endif#endifstatic unsigned intdayofweek_hash (register const char *str, register unsigned int len){ static unsigned char asso_values[] = { 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 13, 13, 13, 13, 13, 13, 5, 13, 13, 13, 13, 13, 2, 0, 13, 13, 7, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 13, 13, 0, 0, 13, 13, 4, 0, 13, 13, 13, 13, 0, 0, 13, 13, 0, 13, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 }; register int hval = len; switch (hval) { default: case 3: hval += asso_values[(unsigned char)str[2]]; case 2: hval += asso_values[(unsigned char)str[1]]; case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval;}#ifdef __GNUC____inline#endifstruct days *in_dayofweek_word_set (register const char *str, register unsigned int len){ static const unsigned int MIN_WORD_LENGTH = 3; static const unsigned int MAX_WORD_LENGTH = 3; static const int MAX_HASH_VALUE = 12; static struct days wordlist[] = { {""}, {""}, {""}, {"Tue", Tue}, {"Fri", Fri}, {"Sun", Sun}, {""}, {"Thu", Thu}, {"Mon", Mon}, {""}, {"Wed", Wed}, {""}, {"Sat", Sat} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = dayofweek_hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0;}DayOfWeekDateCategory::DayOfWeekFromData(const Data& dow){ static const unsigned int MIN_WORD_LENGTH = 3; static const unsigned int MAX_WORD_LENGTH = 3; static const int MAX_HASH_VALUE = 12; register const char *str = dow.data(); register Data::size_type len = dow.size(); static struct days wordlist[] = { {""}, {""}, {""}, {"Tue", Tue}, {"Fri", Fri}, {"Sun", Sun}, {""}, {"Thu", Thu}, {"Mon", Mon}, {""}, {"Wed", Wed}, {""}, {"Sat", Sat} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = dayofweek_hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strncmp (str+1, s+1, len-1)) { return wordlist[key].day; } } } return Sun;}/* ANSI-C code produced by gperf version 2.7.2 *//* Command-line: gperf -L ANSI-C -t -k '*' month.gperf */struct months { char name[32]; Month type; };/* maximum key range = 31, duplicates = 0 */#ifdef __GNUC____inline#else#ifdef __cplusplusinline#endif#endifstatic unsigned intmonth_hash (register const char *str, register unsigned int len){ static unsigned char asso_values[] = { 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 15, 34, 34, 8, 34, 5, 34, 34, 34, 0, 34, 34, 10, 3, 14, 34, 34, 34, 9, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 10, 0, 0, 34, 0, 34, 10, 34, 34, 34, 34, 4, 34, 0, 0, 0, 34, 0, 34, 0, 0, 0, 34, 34, 10, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34 }; register int hval = len; switch (hval) { default: case 3: hval += asso_values[(unsigned char)str[2]]; case 2: hval += asso_values[(unsigned char)str[1]]; case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval;}MonthDateCategory::MonthFromData(const Data& mon){ static const unsigned int MIN_WORD_LENGTH = 3; static const unsigned int MAX_WORD_LENGTH = 3; static const int MAX_HASH_VALUE = 33; register const char *str = mon.data(); register Data::size_type len = mon.size(); static struct months wordlist[] = { {""}, {""}, {""}, {"Jun", Jun}, {""}, {""}, {"Nov", Nov}, {"Jul", Jul}, {"Feb", Feb}, {""}, {""}, {"Dec", Dec}, {"Sep", Sep}, {"Jan", Jan}, {""}, {""}, {""}, {"Oct", Oct}, {"Apr", Apr}, {""}, {""}, {""}, {""}, {"Mar", Mar}, {""}, {""}, {""}, {""}, {"Aug", Aug}, {""}, {""}, {""}, {""}, {"May", May} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = month_hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strncmp (str + 1, s + 1, mon.size()-1)) return wordlist[key].type; } } return Jan;}const DayOfWeek& DateCategory::dayOfWeek() const { checkParsed(); return mDayOfWeek;}int&DateCategory::dayOfMonth() { checkParsed(); return mDayOfMonth;}int DateCategory::dayOfMonth() const { checkParsed(); return mDayOfMonth;}Month& DateCategory::month() { checkParsed(); return mMonth;}MonthDateCategory::month() const{ checkParsed(); return mMonth;}int& DateCategory::year() { checkParsed(); return mYear;}intDateCategory::year() const { checkParsed(); return mYear;}int&DateCategory::hour() { checkParsed(); return mHour;}intDateCategory::hour() const { checkParsed(); return mHour;}int&DateCategory::minute() { checkParsed(); return mMin;}intDateCategory::minute() const { checkParsed(); return mMin;}int&DateCategory::second() { checkParsed(); return mSec;}intDateCategory::second() const { checkParsed(); return mSec;}voidDateCategory::parse(ParseBuffer& pb){ // Mon, 04 Nov 2002 17:34:15 GMT const char* anchor = pb.skipWhitespace(); pb.skipToChar(Symbols::COMMA[0]); Data dayOfWeek; pb.data(dayOfWeek, anchor); mDayOfWeek = DateCategory::DayOfWeekFromData(dayOfWeek); pb.skipChar(Symbols::COMMA[0]); pb.skipWhitespace(); mDayOfMonth = pb.integer(); anchor = pb.skipWhitespace(); pb.skipNonWhitespace(); Data month; pb.data(month, anchor); mMonth = DateCategory::MonthFromData(month); pb.skipWhitespace(); mYear = pb.integer(); pb.skipWhitespace(); mHour = pb.integer(); pb.skipChar(Symbols::COLON[0]); mMin = pb.integer(); pb.skipChar(Symbols::COLON[0]); mSec = pb.integer(); pb.skipWhitespace(); pb.skipChar('G'); pb.skipChar('M'); pb.skipChar('T'); pb.skipWhitespace(); pb.assertEof();}ParserCategory* DateCategory::clone() const{ return new DateCategory(*this);}static void pad2(const int x, std::ostream& str){ if (x < 10) { str << Symbols::ZERO[0]; } str << x;}std::ostream& DateCategory::encodeParsed(std::ostream& str) const{ str << DayOfWeekData[mDayOfWeek] // Mon << Symbols::COMMA[0] << Symbols::SPACE[0]; pad2(mDayOfMonth, str); // 04 str << Symbols::SPACE[0] << MonthData[mMonth] << Symbols::SPACE[0] // Nov << mYear << Symbols::SPACE[0]; // 2002 pad2(mHour, str); str << Symbols::COLON[0]; pad2(mMin, str); str << Symbols::COLON[0]; pad2(mSec, str); str << " GMT"; return str;}/* ==================================================================== * The Vovida Software License, Version 1.0 * * Copyright (c) 2000 Vovida Networks, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The names "VOCAL", "Vovida Open Communication Application Library", * and "Vovida Open Communication Application Library (VOCAL)" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor * may "VOCAL" appear in their name, without prior written * permission of Vovida Networks, Inc. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * ==================================================================== * * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc. For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -