Remove dynamic exceptions
[anna.git] / source / diameter / helpers / base / functions.cpp
index 487319d..51a0370 100644 (file)
@@ -26,12 +26,16 @@ using namespace anna::diameter::codec;
 using namespace anna::diameter::helpers::base;
 
 // getters
-U32 anna::diameter::helpers::base::functions::getResultCode(const anna::DataBlock & db) throw(anna::RuntimeException) {
+U32 anna::diameter::helpers::base::functions::getResultCode(const anna::DataBlock & db) noexcept(false) {
   if(db.getSize() < Message::HeaderLength)
     throw anna::RuntimeException("Not enough bytes to cover command header length", ANNA_FILE_LOCATION);
 
-  anna::DataBlock avpsDB(db.getData() + Message::HeaderLength, db.getSize() - Message::HeaderLength);
-  const char * resultCodePtr = anna::diameter::codec::functions::findAVP(avpsDB, AVPID__Result_Code);
+  //anna::DataBlock avpsDB(db.getData() + Message::HeaderLength, db.getSize() - Message::HeaderLength);
+  //const char * resultCodePtr = anna::diameter::codec::functions::findAVP(avpsDB, AVPID__Result_Code);
+
+  const char *avpsDB = db.getData() + Message::HeaderLength;
+  int avpsLen = db.getSize() - Message::HeaderLength;
+  const char * resultCodePtr = anna::diameter::codec::functions::findAVP(avpsDB, avpsLen, AVPID__Result_Code);
 
   if(resultCodePtr == NULL)
     throw anna::RuntimeException("Result-Code AVP not found in DataBlock provided", ANNA_FILE_LOCATION);
@@ -50,7 +54,7 @@ U32 anna::diameter::helpers::base::functions::getResultCode(const anna::DataBloc
 
 
 void anna::diameter::helpers::base::functions::decodeSessionId(const std::string &sessionId,
-    std::string &diameterIdentity, U32 &high, U32 &low, std::string &optional) throw(anna::RuntimeException) {
+    std::string &diameterIdentity, U32 &high, U32 &low, std::string &optional) noexcept(false) {
 // RFC 3588:
 //
 //      8.8.  Session-Id AVP
@@ -121,12 +125,16 @@ void anna::diameter::helpers::base::functions::decodeSessionId(const std::string
 
 
 std::string anna::diameter::helpers::base::functions::getSessionId(const anna::DataBlock & db,
-    std::string &diameterIdentity, U32 &high, U32 &low, std::string &optional) throw(anna::RuntimeException) {
+    std::string &diameterIdentity, U32 &high, U32 &low, std::string &optional) noexcept(false) {
   if(db.getSize() < Message::HeaderLength)
     throw anna::RuntimeException("Not enough bytes to cover command header length", ANNA_FILE_LOCATION);
 
-  anna::DataBlock avpsDB(db.getData() + Message::HeaderLength, db.getSize() - Message::HeaderLength);
-  const char * sessionIdPtr = anna::diameter::codec::functions::findAVP(avpsDB, AVPID__Session_Id);
+  //anna::DataBlock avpsDB(db.getData() + Message::HeaderLength, db.getSize() - Message::HeaderLength);
+  //const char * sessionIdPtr = anna::diameter::codec::functions::findAVP(avpsDB, AVPID__Session_Id);
+  const char *avpsDB = db.getData() + Message::HeaderLength;
+  int avpsLen = db.getSize() - Message::HeaderLength;
+  const char * sessionIdPtr = anna::diameter::codec::functions::findAVP(avpsDB, avpsLen, AVPID__Session_Id);
+
 
   if(sessionIdPtr == NULL)
     throw anna::RuntimeException("Session-Id AVP not found in DataBlock provided", ANNA_FILE_LOCATION);
@@ -142,3 +150,25 @@ std::string anna::diameter::helpers::base::functions::getSessionId(const anna::D
   return result;
 }
 
+
+std::string anna::diameter::helpers::base::functions::getOriginHost(const anna::DataBlock & db) noexcept(false) {
+  if(db.getSize() < Message::HeaderLength)
+    throw anna::RuntimeException("Not enough bytes to cover command header length", ANNA_FILE_LOCATION);
+
+  const char *avpsDB = db.getData() + Message::HeaderLength;
+  int avpsLen = db.getSize() - Message::HeaderLength;
+  const char * originHostPtr = anna::diameter::codec::functions::findAVP(avpsDB, avpsLen, AVPID__Origin_Host);
+
+
+  if(originHostPtr == NULL)
+    throw anna::RuntimeException("Origin-Host AVP not found in DataBlock provided", ANNA_FILE_LOCATION);
+
+  // Decoded avp information:
+  AvpId _id;
+  char _flags;
+  int _length;
+  std::string result;
+  anna::diameter::codec::functions::decodeAVP(originHostPtr, _id, _flags, _length, result);
+  return result;
+}
+