+void comm::Engine::manageDrDhServerSession(ServerSession *ss, bool register_or_desregister) throw() {
+
+ // Decode CER (TODO: use raw buffer helpers)
+ std::string destinationRealm, destinationHost;
+ codec::Message codecMsg(getBaseProtocolCodecEngine());
+ try {
+ codecMsg.decode(ss->a_cer);
+ destinationRealm = codecMsg.getAvp(anna::diameter::helpers::base::AVPID__Origin_Realm)->getDiameterIdentity()->getValue();
+ destinationHost = codecMsg.getAvp(anna::diameter::helpers::base::AVPID__Origin_Host)->getDiameterIdentity()->getValue();
+ }
+ catch(anna::RuntimeException &ex) {
+ ex.trace();
+ return;
+ }
+
+ dr_dh_server_sessions_nc_it_t drit = a_dr_dh_server_sessions.find(destinationRealm);
+ if (drit != a_dr_dh_server_sessions.end()) { // found
+ dh_server_sessions_map_t *dhServerSessions = (dh_server_sessions_map_t *)&(drit->second);
+ dh_server_sessions_nc_it_t dhit = dhServerSessions->find(destinationHost);
+ if (dhit != dhServerSessions->end()) { // found
+ server_sessions_vector_t *serverSessions = (server_sessions_vector_t *)&(dhit->second);
+ if (register_or_desregister) { // REGISTER
+ serverSessions->push_back(ss);
+ }
+ else { // DESREGISTER
+ // Sequential search the specific server session:
+ for (server_sessions_nc_it_t ssit = serverSessions->begin(); ssit != serverSessions->end(); ssit++) {
+ if ((*ssit)->getAddress() != ss->getAddress()) continue;
+ if ((*ssit)->getPort() != ss->getPort()) continue;
+ if ((*ssit)->getSocketId() != ss->getSocketId()) continue;
+ serverSessions->erase(ssit); // if it is the last server session removed in DR-DH path, the XML will show this tree empty
+ // (it could be a hint for past registerings):
+ // <Engine.RemoteRealm Name="afNodeHostRealm.com">
+ // <Engine.RemoteRealmHost Name="afNodeHostname.afNodeHostRealm.com"/>
+ // </Engine.RemoteRealm>
+ // <Engine.RemoteRealm Name="ggsnNodeHostRealm.com">
+ // <Engine.RemoteRealmHost Name="ggsnNodeHostname.ggsnNodeHostRealm.com"/>
+ // </Engine.RemoteRealm>
+
+ break;
+ }
+ }
+ }
+ else {
+ if (!register_or_desregister) return; // strange (host not found)
+ server_sessions_vector_t ssVector;
+ ssVector.push_back(ss);
+ (*dhServerSessions)[destinationHost] = ssVector;
+ }
+ }
+ else {
+ if (!register_or_desregister) return; // strange (realm not found)
+ server_sessions_vector_t ssVector;
+ ssVector.push_back(ss);
+ dh_server_sessions_map_t dhServerSessions;
+ dhServerSessions[destinationHost] = ssVector;
+ a_dr_dh_server_sessions[destinationRealm] = dhServerSessions;
+ }
+}
+
+void comm::Engine::readDWA(anna::DataBlock &dwa, const anna::DataBlock & dwr) throw() {
+
+ // Check for base protocol codec engine health:
+ assertBaseProtocolHealth();