Packets/80221Bundle: fixed message validation
tho [Thu, 19 May 2011 09:31:33 +0000 (09:31 +0000)]
Utils/Console: made SysInfo::dump() public

git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1789 270642c3-0616-0410-b53a-bc976706d245

senf/Packets/80221Bundle/Exceptions.hh [new file with mode: 0644]
senf/Packets/80221Bundle/MIHMessageRegistry.ct
senf/Packets/80221Bundle/MIHMessageRegistry.hh
senf/Packets/80221Bundle/MIHMessageRegistry.ih [new file with mode: 0644]
senf/Packets/80221Bundle/TLVParser.cc
senf/Packets/80221Bundle/TLVParser.hh
senf/Packets/80221Bundle/TLVParser.test.cc
senf/Utils/Console/Server.cc
senf/Utils/Console/SysInfo.hh

diff --git a/senf/Packets/80221Bundle/Exceptions.hh b/senf/Packets/80221Bundle/Exceptions.hh
new file mode 100644 (file)
index 0000000..185c146
--- /dev/null
@@ -0,0 +1,60 @@
+// $Id$
+//
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+//     Thorsten Horstmann <tho@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+#ifndef HH_SENF_Packets_80221Bundle_Exceptions_
+#define HH_SENF_Packets_80221Bundle_Exceptions_ 1
+
+// Custom includes
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+
+namespace senf {
+
+    struct MIHTLVLengthException : public senf::Exception
+    {
+        MIHTLVLengthException()
+          : senf::Exception("MIHTLVLengthException") {}
+    };
+
+    struct InvalidMIHPacketException : public senf::Exception
+    {
+        InvalidMIHPacketException(std::string const & description)
+            : senf::Exception("Invalid MIH message: ") { append(description); }
+    };
+}
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+//#include "Exceptions.cci"
+//#include "Exceptions.ct"
+//#include "Exceptions.cti"
+#endif
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// comment-column: 40
+// End:
index 4acf800..0aa2ba2 100644 (file)
@@ -24,6 +24,7 @@
     \brief MIH Message-Registry non-inline template implementation */
 
 // Custom includes
+#include "Exceptions.hh"
 
 #define prefix_
 //-/////////////////////////////////////////////////////////////////////////////////////////////////
@@ -42,6 +43,16 @@ prefix_ senf::MIHMessageRegistry::RegistrationProxy<MIHPacket>::RegistrationProx
     MIHMessageRegistry::instance().registerMessageType<MIHPacket>();
 }
 
+template <typename MIHPacket>
+prefix_ void senf::detail::MIHMessageRegistryEntry<MIHPacket, true>::validate(senf::Packet message)
+    const
+{
+    if (! message.is<MIHPacket>())
+        throw InvalidMIHPacketException("invalid packet chain");
+    MIHPacket::type::validate(message.as<MIHPacket>());
+}
+
+
 //-/////////////////////////////////////////////////////////////////////////////////////////////////
 #undef prefix_
 
index 4daabb7..268d890 100644 (file)
 #include <senf/Utils/singleton.hh>
 #include <senf/Packets/Packets.hh>
 
-//#include "MIHMessageRegistry.mpp"
+#include "MIHMessageRegistry.ih"
 //-/////////////////////////////////////////////////////////////////////////////////////////////////
-
 namespace senf {
 
-    namespace detail {
-
-        template<class T, typename Signature>
-        struct has_static_validate_member
-        {
-            template<Signature *>
-            struct helper;
-
-            template<class U>
-            static char test(helper<&U::validate> *);
-
-            template<class U>
-            static char (&test(...))[2];
-
-            static const bool value = sizeof(test<T>(0))==1;
-        };
-
-        struct MIHMessageRegistry_EntryBase {
-            virtual ~MIHMessageRegistry_EntryBase() {}
-            virtual void validate(senf::Packet message) const = 0;
-        };
-
-        template <class MIHPacket,
-            bool use_validate_member = has_static_validate_member<typename MIHPacket::type, void(MIHPacket)>::value>
-        struct MIHMessageRegistryEntry : MIHMessageRegistry_EntryBase
-        {
-            virtual void validate(senf::Packet message) const {}
-        };
-
-        template <class MIHPacket>
-        struct MIHMessageRegistryEntry<MIHPacket, true> : MIHMessageRegistry_EntryBase
-        {
-            virtual void validate(senf::Packet message) const {
-                MIHPacket::type::validate(message.as<MIHPacket>());
-            }
-        };
-    }
-
-
     class MIHMessageRegistry
         : public senf::singleton<MIHMessageRegistry>
     {
diff --git a/senf/Packets/80221Bundle/MIHMessageRegistry.ih b/senf/Packets/80221Bundle/MIHMessageRegistry.ih
new file mode 100644 (file)
index 0000000..e785f50
--- /dev/null
@@ -0,0 +1,86 @@
+// $Id$
+//
+// Copyright (C) 2010
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+//     Thorsten Horstmann <tho@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+/** \file
+    \brief MIH Message-Registry internal header */
+
+#ifndef IH_SENF_Packets_80221Bundle_MIHMessageRegistry_
+#define IH_SENF_Packets_80221Bundle_MIHMessageRegistry_ 1
+
+// Custom includes
+
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+namespace senf {
+
+    namespace detail {
+
+        template<class T, typename Signature>
+        struct has_static_validate_member
+        {
+            template<Signature *>
+            struct helper;
+
+            template<class U>
+            static char test(helper<&U::validate> *);
+
+            template<class U>
+            static char (&test(...))[2];
+
+            static const bool value = sizeof(test<T>(0))==1;
+        };
+
+
+        struct MIHMessageRegistry_EntryBase {
+            virtual ~MIHMessageRegistry_EntryBase() {}
+            virtual void validate(senf::Packet message) const = 0;
+        };
+
+
+        template <class MIHPacket,
+            bool use_validate_member = has_static_validate_member<typename MIHPacket::type, void(MIHPacket)>::value>
+        struct MIHMessageRegistryEntry : MIHMessageRegistry_EntryBase
+        {
+            virtual void validate(senf::Packet message) const {}
+        };
+
+        template <class MIHPacket>
+        struct MIHMessageRegistryEntry<MIHPacket, true> : MIHMessageRegistry_EntryBase
+        {
+            virtual void validate(senf::Packet message) const;
+        };
+
+    }
+}
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+#endif
+
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// comment-column: 40
+// End:
index 729b1ec..7e6b8f2 100644 (file)
@@ -29,6 +29,7 @@
 // Custom includes
 #include <senf/Utils/hexdump.hh>
 #include <senf/Utils/Format.hh>
+#include "Exceptions.hh"
 
 #define prefix_
 //-/////////////////////////////////////////////////////////////////////////////////////////////////
index 0fd0a71..0a466c6 100644 (file)
 
 namespace senf {
 
-    struct MIHTLVLengthException : public senf::Exception
-    {
-        MIHTLVLengthException()
-          : senf::Exception("MIHTLVLengthException") {}
-    };
-
-    struct InvalidMIHPacketException : public senf::Exception
-    {
-        InvalidMIHPacketException(std::string const & description)
-            : senf::Exception("Invalid MIH message: ") { append(description); }
-    };
-
-
     class MIHTLVLengthParser
         : public detail::packet::IntParserOps<MIHTLVLengthParser, boost::uint32_t>,
           public PacketParserBase
index 81e7831..4d637d0 100644 (file)
@@ -27,8 +27,9 @@
 //#include "TLVParser.test.ih"
 
 // Custom includes
-#include "TLVParser.hh"
 #include <senf/Packets/DefaultBundle/EthernetPacket.hh>
+#include "TLVParser.hh"
+#include "Exceptions.hh"
 
 #include <senf/Utils/auto_unit_test.hh>
 #include <boost/test/test_tools.hpp>
index e39a44f..6c53f27 100644 (file)
@@ -51,7 +51,7 @@
 namespace {
     senf::console::SysInfo::Proxy addSysInfo (
             "SENF: The Simple and Extensible Network Framework\n"
-            "  © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research\n"
+            "  © 2006-2011 Fraunhofer Institute for Open Communication Systems, Network Research\n"
             "  Contact: senf-dev@lists.berlios.de\n"
             "  Version: " SENF_LIB_VERSION " Revision number: " SENF_REVISION "\n"
             "  Build-type: " BUILD_TYPE ", SenfLog compile time limit: " +
index 75dc01e..d955c1b 100644 (file)
@@ -38,8 +38,11 @@ namespace console {
         : public singleton<SysInfo>
     {
     public:
+        friend class singleton<SysInfo>;
         using singleton<SysInfo>::instance;
+
         void addEntry(std::string const & descr, unsigned pos=-1);
+        void dump(std::ostream & os) const;
 
         struct Proxy {
             Proxy(std::string const & descr, unsigned pos=-1);
@@ -49,9 +52,6 @@ namespace console {
         std::list<std::string> descr_;
 
         SysInfo();
-        void dump(std::ostream & os) const;
-
-        friend class singleton<SysInfo>;
     };
 
 }}