X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=include%2Fanna%2Fdiameter%2Fcodec%2Ffunctions.hpp;h=563b501bd592b2598ce8995cc2ab975ce1d306a7;hb=c9a91acd707f39fb11d9d513d904cb1f6db52386;hp=0b012a3486a81cc9d69087758779de0302fc2cb9;hpb=4e12ac57e93c052f716a6305ad8fc099c45899d1;p=anna.git diff --git a/include/anna/diameter/codec/functions.hpp b/include/anna/diameter/codec/functions.hpp index 0b012a3..563b501 100644 --- a/include/anna/diameter/codec/functions.hpp +++ b/include/anna/diameter/codec/functions.hpp @@ -1,50 +1,24 @@ -// ANNA - Anna is Not 'N' Anymore -// -// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo -// -// https://bitbucket.org/testillano/anna -// -// 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 Google Inc. 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,6 +41,100 @@ 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 */) throw(); + void addAvp(const anna::diameter::AvpId & aid, const char *aname = NULL /* well known in validation */) throw(); + std::string asString() const throw(); + +} parent_t; + + + + struct functions { // getters & helpers @@ -75,64 +143,184 @@ struct functions { static HopByHop getHopByHop(const anna::DataBlock &) throw(anna::RuntimeException); static EndToEnd getEndToEnd(const anna::DataBlock &) throw(anna::RuntimeException); + static bool requestBit(const anna::DataBlock &) throw(anna::RuntimeException); + static bool proxiableBit(const anna::DataBlock &) throw(anna::RuntimeException); + static bool errorBit(const anna::DataBlock &) throw(anna::RuntimeException); + static bool potentiallyReTransmittedMessageBit(const anna::DataBlock &) throw(anna::RuntimeException); + static bool isRequest(const CommandId & cid) throw() { return (cid.second); } - static bool isRequest(const anna::DataBlock &) throw(anna::RuntimeException); + static bool isRequest(const anna::DataBlock & db) throw(anna::RuntimeException) { return requestBit(db); } 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. - */ + * 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 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. - */ + * 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); /** - * 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) throw(anna::RuntimeException); + + // /** + // * 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 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) throw(anna::RuntimeException); + + // /** + // * 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) throw(anna::RuntimeException); // modifiers static void setHopByHop(anna::DataBlock &, HopByHop) throw(anna::RuntimeException); static void setEndToEnd(anna::DataBlock &, EndToEnd) throw(anna::RuntimeException); + static void setPotentiallyReTransmittedMessageBit(const anna::DataBlock & db, bool activate = true) throw(anna::RuntimeException); + + + /** + 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) throw(anna::RuntimeException); + + /** + 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::DocumentFile &xmlDocument, const std::string &xmlString) throw(anna::RuntimeException); };