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=770fcc1452fdcff1e49346ca2d161fedc6f0b026;hpb=129af2a9a7c287843be5bd443c5b1ad9b08438a8;p=anna.git diff --git a/include/anna/diameter/codec/functions.hpp b/include/anna/diameter/codec/functions.hpp index 770fcc1..cd6b4bf 100644 --- a/include/anna/diameter/codec/functions.hpp +++ b/include/anna/diameter/codec/functions.hpp @@ -10,10 +10,10 @@ #define anna_diameter_codec_functions_hpp -// Local +// Project #include - #include +#include // STL #include @@ -41,6 +41,79 @@ 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 { @@ -51,9 +124,9 @@ typedef struct parent { 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(); + 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; @@ -63,77 +136,189 @@ typedef struct parent { 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 &) 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 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) throw() { return (cid.second); } - static bool isRequest(const anna::DataBlock & db) throw(anna::RuntimeException) { return requestBit(db); } + 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) throw() { return (!isRequest(cid)); } - static bool isAnswer(const anna::DataBlock & db) throw(anna::RuntimeException) { return (!isRequest(db)); } + static bool isAnswer(const CommandId & cid) { return (!isRequest(cid)); } + static bool isAnswer(const anna::DataBlock & db) noexcept(false) { 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 setPotentiallyReTransmittedMessageBit(const anna::DataBlock & db, bool activate = true) 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); };