⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radius_parser.h

📁 Diameter协议栈
💻 H
字号:
/* BEGIN_COPYRIGHT                                                        *//*                                                                        *//* Open Diameter: Open-source software for the Diameter and               *//*                Diameter related protocols                              *//*                                                                        *//* Copyright (C) 2002-2004 Open Diameter Project                          *//*                                                                        *//* This library is free software; you can redistribute it and/or modify   *//* it under the terms of the GNU Lesser General Public License as         *//* published by the Free Software Foundation; either version 2.1 of the   *//* License, or (at your option) any later version.                        *//*                                                                        *//* This library is distributed in the hope that it will be useful,        *//* but WITHOUT ANY WARRANTY; without even the implied warranty of         *//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      *//* Lesser General Public License for more details.                        *//*                                                                        *//* You should have received a copy of the GNU Lesser General Public       *//* License along with this library; if not, write to the Free Software    *//* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307    *//* USA.                                                                   *//*                                                                        *//* In addition, when you copy and redistribute some or the entire part of *//* the source code of this software with or without modification, you     *//* MUST include this copyright notice in each copy.                       *//*                                                                        *//* If you make any changes that are appeared to be useful, please send    *//* sources that include the changed part to                               *//* diameter-developers@lists.sourceforge.net so that we can reflect your  *//* changes to one unified version of this software.                       *//*                                                                        *//* END_COPYRIGHT                                                          */#ifndef __RADIUS_PARSER_H__#define __RADIUS_PARSER_H__#include "radius_packet.h"#include "diameter_parser_api.h"template<class SRC, class DEST>class RADIUS_Parser{   public:      virtual void forward(SRC &src, DEST &dest) = 0;      virtual void reverse(SRC &src, DEST &dest) = 0;      virtual ~RADIUS_Parser() { }};class RADIUS_OctetStringParser :    public       RADIUS_Parser<RADIUS_OctetString, AAAMessageBlock>{   public:      void forward(RADIUS_OctetString &attr,                    AAAMessageBlock &buf);      void reverse(RADIUS_OctetString &attr,                    AAAMessageBlock &buf);};typedef RADIUS_OctetStringParser   RADIUS_UTF8StringParser;class RADIUS_IntegerParser :    public RADIUS_Parser<RADIUS_Integer, AAAMessageBlock>{   public:      void forward(RADIUS_Integer &attr,                    AAAMessageBlock &buf);      void reverse(RADIUS_Integer &attr,                    AAAMessageBlock &buf);};typedef RADIUS_IntegerParser RADIUS_TimeParser;typedef RADIUS_IntegerParser RADIUS_InterfaceIdParser;class RADIUS_IpAddressParser :    public RADIUS_Parser<RADIUS_IpAddress, AAAMessageBlock>{   public:      void forward(RADIUS_IpAddress &attr,                    AAAMessageBlock &buf);      void reverse(RADIUS_IpAddress &attr,                    AAAMessageBlock &buf);};typedef RADIUS_IpAddressParser RADIUS_IPv4AddressParser;typedef RADIUS_IpAddressParser RADIUS_IPv6AddressParser;typedef RADIUS_IpAddressParser RADIUS_IPv6PrefixParser;class RADIUS_AttrParser : public RADIUS_Parser<RADIUS_AttrBase*,                                               AAAMessageBlock>{   public:      RADIUS_AttrParser(int tlen = 0) :          m_TotalLength(tlen) {      }      void forward(RADIUS_AttrBase *&attr,                    AAAMessageBlock &buf);      void reverse(RADIUS_AttrBase *&attr,                    AAAMessageBlock &buf);   private:      int m_TotalLength;};class RADIUS_AttrListParser : public RADIUS_Parser<RADIUS_Packet,                                                   AAAMessageBlock>{   public:      void forward(RADIUS_Packet &pkt,                    AAAMessageBlock &buf);      void reverse(RADIUS_Packet &pkt,                    AAAMessageBlock &buf);};class RADIUS_HeaderParser : public RADIUS_Parser<RADIUS_Packet,                                                 AAAMessageBlock>{   public:      void forward(RADIUS_Packet &pkt,                    AAAMessageBlock &buf);      void reverse(RADIUS_Packet &pkt,                    AAAMessageBlock &buf);                      private:      static RADIUS_CODES m_ValidCodes[RADIUS_NUM_VALID_MSG];      bool ValidateCode(RADIUS_Packet &pkt) {      	  for (int i = 0; i < RADIUS_NUM_VALID_MSG; i ++) {      	  	  if (pkt.Code() == m_ValidCodes[i]) {      	  	  	  return true;      	  	  }      	  }      	  return false;      }};class RADIUS_PacketParser : public RADIUS_Parser<RADIUS_Packet,                                                 AAAMessageBlock>{   public:      void forward(RADIUS_Packet &pkt,                    AAAMessageBlock &buf);      void reverse(RADIUS_Packet &pkt,                    AAAMessageBlock &buf);};class RADIUS_DataTypeParserMap{	protected:       class AttrParser :            public RADIUS_Parser<RADIUS_AttrBase*, AAAMessageBlock> {       };       template <class ATTR, class PARSER>       class TypeAllocatorAndParser :           public AttrParser {           public:              void forward(RADIUS_AttrBase *&attr, AAAMessageBlock &buf) {              	 m_Parser.forward((ATTR&)*attr, buf);              }              void reverse(RADIUS_AttrBase *&attr, AAAMessageBlock &buf) {                 attr = new ATTR;                 if (attr) {                     m_Parser.reverse((ATTR&)*attr, buf);                 }                 else {                     throw RADIUS_Exception(RADIUS_ALLOC_ERROR,   	                             "Allocation error in attr forward parsing");                 }              }           protected:              PARSER m_Parser;       };      	public:	  RADIUS_DataTypeParserMap() {	  	 m_ParserMap.insert(std::pair<std::string, AttrParser*>	  	                   (std::string("string"), &m_Utf8Parser));	  	 m_ParserMap.insert(std::pair<std::string, AttrParser*>	  	                   (std::string("integer"), &m_IntParser));	  	 m_ParserMap.insert(std::pair<std::string, AttrParser*>	  	                   (std::string("ipaddr"), &m_IPv4AddrParser));	  	 m_ParserMap.insert(std::pair<std::string, AttrParser*>	  	                   (std::string("date"), &m_TimeParser));	  	 m_ParserMap.insert(std::pair<std::string, AttrParser*>	  	                   (std::string("ifid"), &m_IfIdParser));	  	 m_ParserMap.insert(std::pair<std::string, AttrParser*>	  	                   (std::string("ipv6addr"), &m_IPv6AddrParser));	  	 m_ParserMap.insert(std::pair<std::string, AttrParser*>	  	                   (std::string("ipv6prefix"), &m_IPv6PrefParser));	  	 m_ParserMap.insert(std::pair<std::string, AttrParser*>	  	                   (std::string("octet"), &m_OctetParser));	  };	        void reverse(std::string &type, RADIUS_AttrBase *&attr, AAAMessageBlock &buf) {      	 std::map<std::string, AttrParser*>::iterator i =       	    m_ParserMap.find(type);      	 if (i != m_ParserMap.end()) {      	 	 i->second->reverse(attr, buf);      	 }      }      void forward(std::string &type, RADIUS_AttrBase *&attr, AAAMessageBlock &buf) {      	 std::map<std::string, AttrParser*>::iterator i =       	    m_ParserMap.find(type);      	 if (i != m_ParserMap.end()) {      	 	i->second->forward(attr, buf);      	 }      }	    protected:       std::map<std::string, AttrParser*> m_ParserMap;      	private:       TypeAllocatorAndParser<RADIUS_UTF8String,                               RADIUS_UTF8StringParser>                               m_Utf8Parser;       TypeAllocatorAndParser<RADIUS_OctetString,                               RADIUS_OctetStringParser>                               m_OctetParser;       TypeAllocatorAndParser<RADIUS_Integer,                               RADIUS_IntegerParser>                               m_IntParser;       TypeAllocatorAndParser<RADIUS_Time,                               RADIUS_TimeParser>                               m_TimeParser;       TypeAllocatorAndParser<RADIUS_InterfaceId,                               RADIUS_InterfaceIdParser>                               m_IfIdParser;       TypeAllocatorAndParser<RADIUS_IPv4Address,                               RADIUS_IPv4AddressParser>                               m_IPv4AddrParser;       TypeAllocatorAndParser<RADIUS_IPv6Address,                               RADIUS_IPv6AddressParser>                               m_IPv6AddrParser;       TypeAllocatorAndParser<RADIUS_IPv6Prefix,                               RADIUS_IPv6PrefixParser>                               m_IPv6PrefParser;};typedef ACE_Singleton<RADIUS_DataTypeParserMap,                       ACE_Null_Mutex>                       RADIUS_DataTypeParserMap_S;#define RADIUS_FORWARD_PARSER_MAP(x, y, z)  RADIUS_DataTypeParserMap_S::instance()->forward((x), (y), (z))#define RADIUS_REVERSE_PARSER_MAP(x, y, z)  RADIUS_DataTypeParserMap_S::instance()->reverse((x), (y), (z))class RADIUS_PacketDump{	public:	   static void Dump(RADIUS_Packet &pkt);};#endif // __RADIUS_PARSER_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -