📄 headers.cxx
字号:
#if defined(HAVE_CONFIG_H)
#include "resip/stack/config.hxx"
#endif
#include "rutil/Data.hxx"
#include "resip/stack/Headers.hxx"
#include "resip/stack/Symbols.hxx"
#include "resip/stack/SipMessage.hxx"
// GPERF generated external routines
#include "resip/stack/HeaderHash.hxx"
#include <iostream>
using namespace std;
//int strcasecmp(const char*, const char*);
//int strncasecmp(const char*, const char*, int len);
using namespace resip;
Data Headers::HeaderNames[MAX_HEADERS+1];
bool Headers::CommaTokenizing[] = {false};
bool Headers::CommaEncoding[] = {false};
bool Headers::Multi[]={false};
HeaderBase* HeaderBase::theHeaderInstances[] = {0};
bool
Headers::isCommaTokenizing(Type type)
{
return CommaTokenizing[type+1];
}
bool
Headers::isCommaEncoding(Type type)
{
return CommaEncoding[type+1];
}
const Data&
Headers::getHeaderName(int type)
{
return HeaderNames[type+1];
}
bool
Headers::isMulti(Type type)
{
return Multi[type+1];
}
#define defineHeader(_enum, _name, _type, _reference) \
Headers::Type \
H_##_enum::getTypeNum() const {return Headers::_enum;} \
\
void H_##_enum::merge(SipMessage& target, const SipMessage& embedded) \
{ \
if (embedded.exists(*this)) \
{ \
target.header(*this) = embedded.header(*this); \
} \
} \
\
H_##_enum::H_##_enum() \
{ \
Headers::CommaTokenizing[Headers::_enum+1] = bool(Type::commaHandling & ParserCategory::CommasAllowedOutputMulti); \
Headers::CommaEncoding[Headers::_enum+1] = bool(Type::commaHandling & 2); \
Headers::HeaderNames[Headers::_enum+1] = _name; \
Headers::Multi[Headers::_enum+1] = false; \
HeaderBase::theHeaderInstances[Headers::_enum+1] = this; \
} \
\
_type& \
H_##_enum::knownReturn(ParserContainerBase* container) \
{ \
return dynamic_cast<ParserContainer<_type>*>(container)->front(); \
} \
\
ParserContainerBase* \
H_##_enum::makeContainer(HeaderFieldValueList* hfvs) const \
{ \
return new ParserContainer<_type>(hfvs,Headers::_enum); \
} \
\
H_##_enum resip::h_##_enum
#define defineMultiHeader(_enum, _name, _type, _reference) \
Headers::Type \
H_##_enum##s::getTypeNum() const {return Headers::_enum;} \
\
void H_##_enum##s::merge(SipMessage& target, const SipMessage& embedded) \
{ \
if (embedded.exists(*this)) \
{ \
target.header(*this).append(embedded.header(*this)); \
} \
} \
\
H_##_enum##s::H_##_enum##s() \
{ \
Headers::CommaTokenizing[Headers::_enum+1] = bool(Type::value_type::commaHandling & ParserCategory::CommasAllowedOutputMulti); \
Headers::CommaEncoding[Headers::_enum+1] = bool(Type::value_type::commaHandling & 2); \
Headers::HeaderNames[Headers::_enum+1] = _name; \
Headers::Multi[Headers::_enum+1] = true; \
HeaderBase::theHeaderInstances[Headers::_enum+1] = this; \
} \
\
ParserContainer<_type>& \
H_##_enum##s::knownReturn(ParserContainerBase* container) \
{ \
return *dynamic_cast<ParserContainer<_type>*>(container); \
} \
\
ParserContainerBase* \
H_##_enum##s::makeContainer(HeaderFieldValueList* hfvs) const \
{ \
return new ParserContainer<_type>(hfvs,Headers::_enum); \
} \
\
H_##_enum##s resip::h_##_enum##s
//====================
// Token
//====================
defineHeader(ContentDisposition, "Content-Disposition", Token, "RFC 3261");
defineHeader(ContentEncoding, "Content-Encoding", Token, "RFC 3261");
defineHeader(ContentTransferEncoding, "Content-Transfer-Encoding", StringCategory, "RFC ?"); // !dlb! defineMultiHeader
defineHeader(MIMEVersion, "MIME-Version", Token, "RFC 3261");
defineHeader(Priority, "Priority", Token, "RFC 3261");
defineHeader(Event, "Event", Token, "RFC 3265");
defineHeader(SubscriptionState, "Subscription-State", Token, "RFC 3265");
defineHeader(SIPETag, "SIP-ETag", Token, "RFC 3903");
defineHeader(SIPIfMatch, "SIP-If-Match", Token, "RFC 3903");
defineHeader(ContentId, "Content-ID", Token, "RFC 2045");
defineHeader(Identity, "Identity", StringCategory, "draft-sip-identity-03");
defineMultiHeader(AllowEvents, "Allow-Events", Token, "RFC 3265");
// explicitly declare to avoid h_AllowEventss, ugh
H_AllowEventss resip::h_AllowEvents;
defineMultiHeader(AcceptEncoding, "Accept-Encoding", Token, "RFC 3261");
defineMultiHeader(AcceptLanguage, "Accept-Language", Token, "RFC 3261");
defineMultiHeader(Allow, "Allow", Token, "RFC 3261");
defineMultiHeader(ContentLanguage, "Content-Language", Token, "RFC 3261");
defineMultiHeader(ProxyRequire, "Proxy-Require", Token, "RFC 3261");
defineMultiHeader(Require, "Require", Token, "RFC 3261");
defineMultiHeader(Supported, "Supported", Token, "RFC 3261");
defineMultiHeader(Unsupported, "Unsupported", Token, "RFC 3261");
defineMultiHeader(SecurityClient, "Security-Client", Token, "RFC 3329");
defineMultiHeader(SecurityServer, "Security-Server", Token, "RFC 3329");
defineMultiHeader(SecurityVerify, "Security-Verify", Token, "RFC 3329");
// explicitly declare to avoid h_SecurityVerifys, ugh
H_SecurityVerifys resip::h_SecurityVerifies;
defineMultiHeader(RequestDisposition, "Request-Disposition", Token, "RFC 3841");
defineMultiHeader(Reason, "Reason", Token, "RFC 3326");
defineMultiHeader(Privacy, "Privacy", Token, "RFC 3323");
// explicitly declare to avoid h_Privacys
H_Privacys resip::h_Privacies;
defineMultiHeader(PMediaAuthorization, "P-Media-Authorization", Token, "RFC 3313");
defineHeader(ReferSub, "Refer-Sub", Token, "draft-ietf-sip-refer-with-norefersub-03");
defineHeader(AnswerMode, "Answer-Mode", Token, "draft-ietf-answermode-01");
defineHeader(PrivAnswerMode, "Priv-Answer-Mode", Token, "draft-ietf-answermode-01");
//====================
// Mime
//====================
typedef ParserContainer<Mime> Mimes;
defineMultiHeader(Accept, "Accept", Mime, "RFC 3261");
defineHeader(ContentType, "Content-Type", Mime, "RFC 3261");
//====================
// GenericUris:
//====================
defineHeader(IdentityInfo, "Identity-Info", GenericUri, "draft-sip-identity-03");
typedef ParserContainer<GenericUri> GenericUris;
defineMultiHeader(CallInfo, "Call-Info", GenericUri, "RFC 3261");
defineMultiHeader(AlertInfo, "Alert-Info", GenericUri, "RFC 3261");
defineMultiHeader(ErrorInfo, "Error-Info", GenericUri, "RFC 3261");
//====================
// NameAddr:
//====================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -