X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=include%2Fanna%2Fdiameter%2Fcodec%2FAvp.hpp;h=164234e2d82db55af0e0a9f03c9b7c17ba199ae7;hb=b9cb59210ce2a02d8246f1a9a1acfcfdcd892f3a;hp=6677b340904f18c3ba59b356812cc2b26d1f8df3;hpb=3e258840b15577cb8bda3cdedd0b9b88e16404b3;p=anna.git diff --git a/include/anna/diameter/codec/Avp.hpp b/include/anna/diameter/codec/Avp.hpp index 6677b34..164234e 100644 --- a/include/anna/diameter/codec/Avp.hpp +++ b/include/anna/diameter/codec/Avp.hpp @@ -2,7 +2,7 @@ // // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo // -// https://bitbucket.org/testillano/anna +// 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 @@ -14,7 +14,7 @@ // 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 +// * 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. // @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -205,7 +206,7 @@ class Avp { static Avp * addAvp(avp_container &avps, int &insertionPositionForChilds, AvpId id, Engine *engine) throw(); static bool removeAvp(avp_container &avps, find_container &finds, AvpId id, int ocurrence, Engine *engine) throw(); static void fix(avp_container &avps, find_container &finds, int &insertionPositionForChilds, anna::diameter::stack::const_avprule_iterator ruleBegin, anna::diameter::stack::const_avprule_iterator ruleEnd) throw(); - static bool validLevel(const avp_container &avps, anna::diameter::stack::const_avprule_iterator ruleBegin, anna::diameter::stack::const_avprule_iterator ruleEnd, Engine * engine, const std::string & parentDescription, Message *answer) throw(anna::RuntimeException); // validates mandatory/fixed and cardinality + static bool validLevel(const avp_container &avps, anna::diameter::stack::const_avprule_iterator ruleBegin, anna::diameter::stack::const_avprule_iterator ruleEnd, Engine * engine, const anna::diameter::codec::parent_t & parent, Message *answer) throw(anna::RuntimeException); // validates mandatory/fixed and cardinality static const Avp* getAvp(const avp_container &avps, find_container &finds, AvpId id, int ocurrence, Engine *engine, anna::Exception::Mode::_v emode) throw(anna::RuntimeException); static int countAvp(const avp_container &avps, AvpId id) throw(); static const Avp* firstAvp(const avp_container &avps, AvpId id) throw(); @@ -247,12 +248,12 @@ class Avp { /** Validates an Avp regarding dictionary rules like enumerated range, flags coherence, mandatory and fixed types, cardinality qualifiers, etc. - @param parentDescription Parent description. Internally used for alarms and tracing + @param parent Parent description. Internally used for alarms, tracing and Failed-AVP construction @param answer Answer could be modified with any validation problem during requests validation @return Boolean indicating validation result */ - bool valid(const std::string & parentDescription, Message *answer) const throw(anna::RuntimeException); + bool valid(const anna::diameter::codec::parent_t & parent, Message *answer) const throw(anna::RuntimeException); /** Decodes buffer provided over class content. If an error ocurred, decoding will stop launching exception (fatal error) or a warning trace (perhaps the achieved @@ -260,9 +261,10 @@ class Avp { depending on validation depth (codec::Engine::ValidationDepth). @param db Buffer data block processed + @param parent Parent description. Internally used for alarms, tracing and Failed-AVP construction @param answer Answer built for request decoding/validation */ - void decode(const anna::DataBlock &db, Message *answer) throw(anna::RuntimeException); + void decode(const anna::DataBlock &db, const anna::diameter::codec::parent_t & parent, Message *answer) throw(anna::RuntimeException); ///////////////////////////////////////////// @@ -383,31 +385,16 @@ protected: */ std::string getXMLdata(bool & isHex, const anna::diameter::stack::Format *stackFormat) const throw(); - /** - Interpret xml data in order to dump over the class content. - - \param avpNode Avp root node - */ - void fromXML(const anna::xml::Node* avpNode) throw(anna::RuntimeException); - - - /** - Encodes buffer with the class content. - - * @param buffer Raw data to be encoded - * @param size Size of raw data to be encoded - */ - void code(char* buffer, int &size) const throw(anna::RuntimeException); - /** Decodes Avp data part. @param buffer Avp data part start pointer @param size Avp data part size + @param parent Parent description. Internally used for alarms, tracing and Failed-AVP construction @param answer Answer built for request decoding/validation */ - void decodeDataPart(const char * buffer, int size, Message *answer) throw(anna::RuntimeException); + void decodeDataPart(const char * buffer, int size, const anna::diameter::codec::parent_t & parent, Message *answer) throw(anna::RuntimeException); public: @@ -687,6 +674,37 @@ public: const Unknown * getUnknown() const throw(anna::RuntimeException) { assertFormat("Unknown"); return a_Unknown; } + /** + Decodes buffer provided over class content. If an error ocurred, decoding will stop launching exception (fatal error) or a warning trace (perhaps the achieved + avp is valid against all odds then validation will go on). In case that validation is enabled (codec::Engine::ValidationMode) an exception will be launched + depending on validation depth (codec::Engine::ValidationDepth). + + Useful as serialization procedure with #code + + @param db Buffer data block processed + */ + void decode(const anna::DataBlock &db) throw(anna::RuntimeException); + + + /** + Interpret xml data in order to dump over the class content. + + \param avpNode Avp root node + */ + void fromXML(const anna::xml::Node* avpNode) throw(anna::RuntimeException); + + + /** + Encodes buffer with the class content. This method is internally used to encode diameter messages, but is declared as public, to allow + its use as serialization procedure. Then, it's assumed that this Avp is valid (validation shall be applied as part of a whole diameter + message but nothing will be verified now). + + * @param buffer Raw data to be encoded (shall be externally allocated) + * @param size Size of raw data to be encoded + */ + void code(char* buffer, int &size) const throw(anna::RuntimeException); + + // Helpers /** @@ -702,6 +720,26 @@ public: */ std::string asXMLString() const throw(); + /** + Comparison operator by mean serialization + + @param a1 Instance 1 for Avp class + @param a2 Instance 2 for Avp class + + @return Comparison result + */ + friend bool operator == (const Avp & a1, const Avp & a2) throw() { return (a1.asXMLString() == a2.asXMLString()); } + + /** + Match a regular expression (string pattern) regarding xml string serialization for this avp. + This works same as #Message::isLike + + @param pattern Pattern to match + + \return Returns the match result + */ + bool isLike(const std::string &pattern) const throw(); + /** Counts the number of ocurrences of Avps (first level) with the identifier provided @@ -727,12 +765,10 @@ public: Diameter Relay and redirect agents MUST NOT reject messages with unrecognized AVPs. Default implementation launch alarm and counter indicating the anomaly but don't launch exception (traces at warning level). - Realy and Redirect agents could reimplement this method to avoid oam management (another way is avoid alarm/counter registration on + Relay and Redirect agents could reimplement this method to avoid oam management (another way is avoid alarm/counter registration on these applications). Result-Code DIAMETER_AVP_UNSUPPORTED will be stored for possible answer message. - - @param answer Answer built for request decoding/validation */ - virtual void unknownAvpWithMandatoryBit(Message *answer) const throw(anna::RuntimeException); + virtual void unknownAvpWithMandatoryBit() const throw(anna::RuntimeException); friend class Message;