X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=include%2Fanna%2Fdiameter%2Fcodec%2Ffunctions.hpp;h=cd6b4bf10515ef3bb6cf06e4c861b0b2fcdce79b;hb=5a6cba5fde2b2f538a7515f8293cc0a8d9589dfa;hp=3b124198f1dd2934bbe96d8ec61872108adc844f;hpb=39033fd99e58e994a5e98c1060dcc79e0d81f9c9;p=anna.git diff --git a/include/anna/diameter/codec/functions.hpp b/include/anna/diameter/codec/functions.hpp index 3b12419..cd6b4bf 100644 --- a/include/anna/diameter/codec/functions.hpp +++ b/include/anna/diameter/codec/functions.hpp @@ -1,50 +1,24 @@ -// ANNA - Anna is Not Nothingness Anymore -// -// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo -// -// http://redmine.teslayout.com/projects/anna-suite -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * 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. -// * Neither the name of the copyright holder nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 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. -// -// Authors: eduardo.ramos.testillano@gmail.com -// cisco.tierra@gmail.com +// ANNA - Anna is Not Nothingness Anymore // +// // +// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo // +// // +// See project site at http://redmine.teslayout.com/projects/anna-suite // +// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE // #ifndef anna_diameter_codec_functions_hpp #define anna_diameter_codec_functions_hpp -// Local +// Project #include - #include +#include // STL #include +#include + //------------------------------------------------------------------------------ //---------------------------------------------------------------------- #define @@ -67,72 +41,284 @@ namespace diameter { namespace codec { +static const char *MessageDTD = "\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +\n\ +"; + + +// Used for alarms, tracing and Failed-AVP construction: +typedef struct parent { + + // Used on decoding: + anna::diameter::CommandId MessageId; + std::string MessageName; + + std::vector AvpsId; + std::vector AvpsName; + + void setMessage(const anna::diameter::CommandId & mid, const char *mname = NULL /* well known in validation */) ; + void addAvp(const anna::diameter::AvpId & aid, const char *aname = NULL /* well known in validation */) ; + std::string asString() const ; + +} parent_t; + + + + struct functions { // getters & helpers - static CommandId getCommandId(const anna::DataBlock &) throw(anna::RuntimeException); - static ApplicationId getApplicationId(const anna::DataBlock &) throw(anna::RuntimeException); - static HopByHop getHopByHop(const anna::DataBlock &) throw(anna::RuntimeException); - static EndToEnd getEndToEnd(const anna::DataBlock &) throw(anna::RuntimeException); + static CommandId getCommandId(const anna::DataBlock &) noexcept(false); + static ApplicationId getApplicationId(const anna::DataBlock &) noexcept(false); + static HopByHop getHopByHop(const anna::DataBlock &) noexcept(false); + static EndToEnd getEndToEnd(const anna::DataBlock &) noexcept(false); + + static bool requestBit(const anna::DataBlock &) noexcept(false); + static bool proxiableBit(const anna::DataBlock &) noexcept(false); + static bool errorBit(const anna::DataBlock &) noexcept(false); + static bool potentiallyReTransmittedMessageBit(const anna::DataBlock &) noexcept(false); + + static bool isRequest(const CommandId & cid) { return (cid.second); } + static bool isRequest(const anna::DataBlock & db) noexcept(false) { return requestBit(db); } + + static bool isAnswer(const CommandId & cid) { return (!isRequest(cid)); } + static bool isAnswer(const anna::DataBlock & db) noexcept(false) { return (!isRequest(db)); } - static bool isRequest(const CommandId & cid) throw() { return (cid.second); } - static bool isRequest(const anna::DataBlock &) throw(anna::RuntimeException); - static bool isAnswer(const CommandId & cid) throw() { return (!isRequest(cid)); } - static bool isAnswer(const anna::DataBlock & db) throw(anna::RuntimeException) { return (!isRequest(db)); } /** - * Decodes a Command Header. This helper cannot check boundaries. start pointer must be a valid command context. - * - * @param start Must be a valid command start (point to the command version byte). - * @param version Diameter version. - * @param length Message length. - * @param flags Command flags. - * @param id Command identification (code, request). - * @param appId Application-ID. - * @param hbh Hop-by-Hop Identifier. - * @param ete End-to-End Identifier. - */ - static void decodeCommandHeader(const char *start, char & version, U24 & length, char & flags, CommandId & id, int & appId, int & hbh, int & ete) throw(anna::RuntimeException); + * Decodes a Command Header. This helper cannot check boundaries. start pointer must be a valid command context. + * + * @param start Must be a valid command start (point to the command version byte). + * @param version Diameter version. + * @param length Message length. + * @param flags Command flags. + * @param id Command identification (code, request). + * @param appId Application-ID. + * @param hbh Hop-by-Hop Identifier. + * @param ete End-to-End Identifier. + */ + static void decodeCommandHeader(const char *start, char & version, U24 & length, char & flags, CommandId & id, int & appId, int & hbh, int & ete) noexcept(false); /** - * Decodes an AVP. This helper cannot check boundaries. start pointer must be a valid avp context. - * - * @param start Must be a valid avp start (point to the 32-bits avp code word). - * @param id Avp identification (code, vendorId). - * @param flags Avp flags byte. - * @param length Avp length (includes code, flags, length itself, vendorId if exists and data length). - * @param data Avp data part. - */ - static void decodeAVP(const char *start, AvpId & id, char & flags, int & length, std::string & data) throw(anna::RuntimeException); + * Decodes an AVP. This helper cannot check boundaries. start pointer must be a valid avp context. + * + * @param start Must be a valid avp start (point to the 32-bits avp code word). + * @param id Avp identification (code, vendorId). + * @param flags Avp flags byte. + * @param length Avp length (includes code, flags, length itself, vendorId if exists and data length). + * @param data Avp data part. + */ + static void decodeAVP(const char *start, AvpId & id, char & flags, int & length, std::string & data) noexcept(false); /** - * Gets the next AVP pointer reference starting from a first-avp datablock. It could be the first avp within - * a command, or within an grouped avp. - * - * @param avpsDB AVPs set as datablock - * @param start Point to start the search. Must be a valid avp start (point to the 32-bits avp code word). - * - * @return Pointer to the next AVP found. NULL if no more. - */ - static const char * nextAVP(const anna::DataBlock & avpsDB, const char *start) throw(anna::RuntimeException); + * Gets the next AVP pointer reference starting from a first-avp data block. It could be the first avp within + * a command, or within an grouped avp. + * + * @param avpsDB AVP data block buffer pointer + * @param avpsLen AVP data block buffer length + * @param start Point to start the search. Must be a valid avp start (point to the 32-bits avp code word). + * + * @return Pointer to the next AVP found. NULL if no more. + */ + static const char * nextAVP(const char *avpsDB, int avpsLen, const char *start) noexcept(false); + + // /** + // * Gets the next AVP pointer reference starting from a first-avp datablock. It could be the first avp within + // * a command, or within an grouped avp. + // * + // * @param avpsDB AVPs set as datablock + // * @param start Point to start the search. Must be a valid avp start (point to the 32-bits avp code word). + // * + // * @return Pointer to the next AVP found. NULL if no more. + // */ + // static const char * nextAVP(const anna::DataBlock & avpsDB, const char *start) noexcept(false); /** - * Gets the next AVP pointer reference within an AVPs set datablock with a certain AVP identification. - * - * @param avpsDB AVPs set as datablock - * @param id Avp identification (code, vendorId). - * @param n Ocurrence number (first avp, second avp, etc.) - * - * @return Pointer to first AVP found with identification provided. NULL if not found. - */ - static const char * findAVP(const anna::DataBlock & avpsDB, const AvpId & id, int n = 1) throw(anna::RuntimeException); + * Gets the next AVP pointer reference within an AVPs set data block with a certain AVP identification. + * + * @param avpsDB AVP data block buffer pointer + * @param avpsLen AVP data block buffer length + * @param id Avp identification (code, vendorId). + * @param n Ocurrence number (first avp, second avp, etc.). 1 by default. + * + * @return Pointer to first AVP found with identification provided. NULL if not found. + */ + static const char *findAVP(const char *avpsDB, int avpsLen, const diameter::AvpId & id, int n = 1) noexcept(false); + + // /** + // * Gets the next AVP pointer reference within an AVPs set datablock with a certain AVP identification. + // * + // * @param avpsDB AVPs set as datablock + // * @param id Avp identification (code, vendorId). + // * @param n Ocurrence number (first avp, second avp, etc.). 1 by default. + // * + // * @return Pointer to first AVP found with identification provided. NULL if not found. + // */ + // static const char * findAVP(const anna::DataBlock & avpsDB, const AvpId & id, int n = 1) noexcept(false); // modifiers - static void setHopByHop(anna::DataBlock &, HopByHop) throw(anna::RuntimeException); - static void setEndToEnd(anna::DataBlock &, EndToEnd) throw(anna::RuntimeException); + static void setHopByHop(anna::DataBlock &, HopByHop) noexcept(false); + static void setEndToEnd(anna::DataBlock &, EndToEnd) noexcept(false); + static void setPotentiallyReTransmittedMessageBit(const anna::DataBlock & db, bool activate = true) noexcept(false); + + + /** + Interpret a xml file in order to create a memory xml document. + The xml file is based on this message DTD: + +
+     
+     
+
+     
+     
+
+     
+     
+     
+ + @param xmlDocument XML document allocated by the user of the function (anna::xml::DocumentMemory xmlDocument) + @param xmlPathFile Complete path file to the xml document which represents the diameter message + @see messageXmlDocumentFromXmlString + + @warning Whatever you will do with the xml document, will be only valid inside the scope of such xml document. + For example, you could load the document to be decoded over a codec Message by mean #Message::fromXML (using + the xml document #getRootNode) during document lifetime. After that, it could be destroyed. + */ + static void messageXmlDocumentFromXmlFile(anna::xml::DocumentFile &xmlDocument, const std::string & xmlPathFile) noexcept(false); + + /** + Interpret xml string representation in order to create a memory xml document. + DTD validation is used in the same way that #messageXmlDocumentFromXmlFile does. + + @param xmlDocument XML document allocated by the user of the function (anna::xml::DocumentMemory xmlDocument) + @param xmlString XML string representation of the diameter message + @see messageXmlDocumentFromXmlFile + + @warning Whatever you will do with the xml document, will be only valid inside the scope of such xml document. + For example, you could load the document to be decoded over a codec Message by mean #Message::fromXML (using + the xml document #getRootNode) during document lifetime. After that, it could be destroyed. + */ + static void messageXmlDocumentFromXmlString(anna::xml::DocumentMemory &xmlDocument, const std::string &xmlString) noexcept(false); };