1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
9 #ifndef anna_diameter_comm_Engine_hpp
10 #define anna_diameter_comm_Engine_hpp
18 #include <anna/app/Component.hpp>
19 #include <anna/core/util/Recycler.hpp>
21 #include <anna/diameter.comm/Server.hpp>
22 #include <anna/diameter.comm/ServerSession.hpp>
23 #include <anna/config/defines.hpp>
24 #include <anna/diameter.comm/ClientSession.hpp>
25 #include <anna/diameter.comm/ServerSession.hpp>
31 //------------------------------------------------------------------------------
32 //---------------------------------------------------------------------- #define
33 //------------------------------------------------------------------------------
58 * General manager for connections to several diameter servers and from diameter clients.
60 * Optimizes creation, finding and releasing of established client-sessions to a certain number of
61 * diameter servers through entities.
62 * Optimizes creation, finding and releasing of established server-sessions from a certain number of
63 * diameter clients through local servers.
65 * Implementation example:
69 * class MyEngine : public diameter::comm::Engine {
74 * anna::Recycler<MyEntity> a_entities;
76 * anna::diameter::comm::Entity* allocateEntity () throw () { return a_entities.create (); }
78 * void releaseEntity (anna::diameter::comm::Entity* entity) throw () {
79 * MyEntity* aux = static_cast <MyEntity*> (entity);
80 * a_entities.release (aux);
84 * anna::diameter::comm::LocalServer* allocateLocalServer () throw () { return a_localServers.create (); }
86 * void releaseLocalServer (anna::diameter::comm::LocalServer* localServer) throw () {
87 * MyLocalServer* aux = static_cast <MyLocalServer*> (localServer);
88 * a_localServers.release (aux);
94 class Engine : public anna::app::Component {
98 * Sets the base protocol codec engine used internally
100 * @param baseProtocolCodecEngine This will be used internally during invokation of @readCEA, @readDPA and @readDWA on servers,
101 * and also used during base protocol messages tracing (if debug traces are enabled). You could provide NULL but you must be
102 * sure that neither of the former situations are going to happen or an exception will be thrown. It is recommended to register
103 * a codec engine pointed to a base protocol stack (you can use the files 'avps_ietf.xml' and 'commands_baseProtocol.xml'
104 * located on ANNA suite project under 'source/diameter/stack/setups', or perhaps you can create your own dictionary from
105 * file or directly with the dictionay creation API. Even you can use a greater dictionary (application dictionary), the
106 * only condition is that must contain the resources to build base protocol messages. You could provide this in engine constructor,
107 * but don't forget it.
109 void setBaseProtocolCodecEngine(codec::Engine *baseProtocolCodecEngine) throw() { a_baseProtocolCodecEngine = baseProtocolCodecEngine; }
112 * Gets the base protocol codec engine used internally
114 * @see setBaseProtocolCodecEngine
116 codec::Engine * getBaseProtocolCodecEngine() const throw() { return a_baseProtocolCodecEngine; }
119 Diameter application node realm name (used to be the site domain name).
121 @param name Diameter application node realm name. Used in order to configure the Origin-Realm for outgoing messages.
122 If not configured or empty string provided, host domainname will be set.
124 void setRealm(const std::string & name) throw();
128 Gets the configured diameter application node realm name.
130 @return Diameter application node realm name.
132 const std::string & getRealm() const throw() { return a_realm; }
136 Diameter application host name as solved by #anna::functions::getHostname()
138 @param name Host name. Used in order to configure the Origin-Host for outgoing messages.
139 If not configured or empty string provided, hostname (system name) will be set.
141 void setHost(const std::string & name) throw();
145 Gets the configured diameter application host name.
147 @return Diameter application host name.
149 const std::string & getHost() const throw() { return a_host; }
153 * Propagate auto recovery configuration to entities within engine. Recovery period is configured at
154 * #anna::comm::Communicator::setRecoveryTime. All the client client-sessions created throught #createEntity,
155 * will be created based on the engine auto-recovery value (enable by default). But you could access entities,
156 * servers or client-sessions independently to change this behaviour.
158 * @param autoRecovery Auto recovery indicator. True by default.
160 void raiseAutoRecovery(bool autoRecovery = true) throw(anna::RuntimeException);
163 * Returns automatic bind indicator for client-sessions. By default \em true will be used.
164 * \return Value for automatic connection bind.
166 bool getAutoBind() const throw() { return a_autoBind; }
169 * Sets automatic connection bind indicator for client-sessions. If not asigned, it will be \em true.
170 * \param autoBind Value for automatic connection bind.
172 * In order to change bind timer, first client-session must be created without autobind, modify time
173 * parameter and then invoking bind.
175 void setAutoBind(const bool autoBind) throw() { a_autoBind = autoBind; }
178 Sets the milliseconds wait to achieve a client connection to server by mean connect primitive.
179 This is a general value for born client-sessions over engine. Particular configuration could be done
180 through #ClientSession::setMaxConnectionDelay.
182 \param maxConnectionDelay Milliseconds wait to get connection
184 void setMaxConnectionDelay(const anna::Millisecond & maxConnectionDelay) throw() { a_maxConnectionDelay = maxConnectionDelay; }
187 Gets the milliseconds wait to achieve a client connection to server by mean connect primitive.
188 Returns the global engine value, but it could be overwritten through each client session (#ClientSession::setMaxConnectionDelay).
189 Default value is 'anna::comm::ClientSocket::DefaultMaxConnectionDelay'.
191 \return Milliseconds wait to get connection
193 const anna::Millisecond & getMaxConnectionDelay() throw() { return a_maxConnectionDelay; }
196 * Binds engine entities.
198 * @return Returns true if all client-session were successfully bound
200 bool bind() throw(anna::RuntimeException);
203 * Sets CER and DWR diameter messages to be used over created client-sessions.
204 * Its recommended to set this global configuration although it is possible to configure each client-session separately.
206 * @param cer Capabilities-Exchange-Request message (encoded) for the client-sessions bind.
207 * @param dwr Device-Watchdog-Request message (encoded) for the client-sessions keep-alive.
209 void setCERandDWR(const anna::DataBlock & cer, const anna::DataBlock & dwr) throw(anna::RuntimeException);
213 * Sets the watchdog period (DWR) for client-sessions.
214 * Its recommended to set this global configuration although it is possible to configure each client-session separately.
216 * @param wp Watchdog period.
218 void setWatchdogPeriod(const anna::Millisecond & wp) throw(anna::RuntimeException);
221 * Gets the number of client-sessions per server.
222 * \return numberOfClientSessionsPerServer Number of client-sessions per server.
224 int getNumberOfClientSessionsPerServer() const throw() { return a_numberOfClientSessionsPerServer; }
227 * Sets the number of client-sessions per server.
228 * Its recommended to set this global configuration although it is possible to configure each client-session separately.
229 * \param numberOfClientSessionsPerServer Number of client-sessions per server.
231 void setNumberOfClientSessionsPerServer(int numberOfClientSessionsPerServer) throw() { a_numberOfClientSessionsPerServer = numberOfClientSessionsPerServer; }
235 * Returns client-session instance identified by (address, port, socketId) provided.
237 * \param addr Diameter server address (ip or hostname).
238 * \param port Diameter server port.
239 * @param socketId Diameter server socket id.
240 * \param emode Action when no client-session is found with provided parameters (Throw/Ignore).
242 * \return The client-session instance identified by (address, port, socketId) provided.
244 * \warning If no client-session found, an exception is launched by default.
246 ClientSession* findClientSession(const std::string & addr, int port, int socketId, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) throw(anna::RuntimeException);
250 * Same as #findClientSession, but providing client session key (<address>:<port>|<socket id>)
252 ClientSession* findClientSession(const std::string & key, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) throw(anna::RuntimeException);
256 * Returns server instance identified by pair (address, port) provided.
258 * \param addr Diameter server address (ip or hostname).
259 * \param port Diameter server port.
260 * \param emode Action when no client-session is found with provided parameters (Throw/Ignore).
262 * \return The server instance identified by pair (address, port) provided.
264 * \warning If no server found, an exception is launched by default.
266 Server* findServer(const std::string & addr, int port, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) throw(anna::RuntimeException);
269 * Returns entity instance identified by internal index.
271 * \param socketList Diameter entity servers list.
272 * \param emode Action when no client-session is found with provided parameters (Throw/Ignore).
274 * \return The entity instance identified by id provided.
276 * \warning If no entity found, an exception is launched by default.
278 Entity* findEntity(const socket_v & socketList, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) throw(anna::RuntimeException);
281 * Returns entity instance identified by internal index.
283 * \param addr1 Diameter primary server address (ip or hostname).
284 * \param port1 Diameter primary server port.
285 * \param addr2 Diameter secondary server address (ip or hostname).
286 * \param port2 Diameter secondary server port.
287 * \param emode Action when no client-session is found with provided parameters (Throw/Ignore).
289 * \return The entity instance identified by id provided.
291 * \warning If no entity found, an exception is launched by default.
293 Entity* findEntity(const std::string & addr1, int port1, const std::string & addr2, int port2, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) throw(anna::RuntimeException);
296 * Creates a diameter entity with provided parameters.
298 * Depending on auto-bind configuration, capabilities exchange request will be or won't be performed over the entity client-sessions.
300 * \param socketList Diameter server priority list (priority-ordered) in order to define whole entity.
301 * @param description Optional entity description (empty by default)
303 * \return The entity created or exception when any server (address/port) already exists for another entity.
305 * \warning The entity won't be almost operative until a notification by mean 'ClientSession::eventResponse'
306 * indicates that 'ClassCode::Bind' has been correctly performed for any included client-session.
308 Entity* createEntity(const socket_v & socketList, const std::string & description = "")
309 throw(anna::RuntimeException);
312 * Creates a standard (dual) diameter entity with provided parameters.
314 * Depending on auto-bind configuration, capabilities exchange request will be or won't be performed over the entity client-sessions.
316 * \param addr1 Diameter primary server address (ip or hostname).
317 * \param port1 Diameter primary server port.
318 * \param addr2 Diameter secondary server address (ip or hostname).
319 * \param port2 Diameter secondary server port.
320 * @param description Optional entity description (empty by default)
322 * \return The standard entity created or exception when any server (address/port) already exists for another entity.
324 * \warning The entity won't be almost operative until a notification by mean 'ClientSession::eventResponse'
325 * indicates that 'ClassCode::Bind' has been correctly performed for any included client-session.
327 Entity* createEntity(const std::string & addr1, int port1, const std::string & addr2, int port2, const std::string & description = "")
328 throw(anna::RuntimeException);
332 * Returns local server instance identified by pair (address, port) provided.
334 * @param addr Diameter server socket address (ip or hostname).
335 * @param port Diameter server socket port.
336 * \param emode Action when no local server is found with provided parameters (Throw/Ignore).
338 * \return The local server instance identified by pair (address, port) provided.
340 * \warning If no local server found, an exception is launched by default.
342 LocalServer* findLocalServer(const std::string & addr, int port, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) throw(anna::RuntimeException);
345 * Returns server-session instance identified by INetAddress serialization provided.
347 * @param socketId Hash for Client Socket INetAddress serialization
348 * \param emode Action when no server-session is found with provided parameters (Throw/Ignore).
350 * \return The server-session instance identified by global unique socketId provided.
352 * \warning If no server-session found, an exception is launched by default.
354 ServerSession* findServerSession(int socketId, anna::Exception::Mode::_v emode = anna::Exception::Mode::Throw) throw(anna::RuntimeException);
357 * Creates a diameter local server with provided parameters.
359 * Server socket address could be an IPv4 or hostname. Default port will be standard 3868 for diameter agents,
360 * but any other could be configured. Socket server could be created with any max accepted connections: zero
361 * value means temporarily disabled and negative values assume no limit (shared bind) for incomming connections.
363 * @param addr Diameter server socket address (ip or hostname).
364 * @param port Diameter server socket port (standard 3868 by default).
365 * @param maxConnections Diameter server max sessions allowed (no limit by default).
366 * @param allowedInactivityTime Max inactivity time for server sessions over the local server before being reset.
367 * @param category Optional socket server category (1 by default).
368 * @param description Optional socket server description (empty by default).
370 * \return The local server created or exception when is already created.
372 LocalServer *createLocalServer(const std::string & addr, int port = Session::DefaultPort, int maxConnections = -1, const anna::Millisecond & allowedInactivityTime = ServerSession::DefaultAllowedInactivityTime, int category = 1, const std::string & description = "")
373 throw(anna::RuntimeException);
377 Close all the engine resources (entities and local servers)
378 Optionally all resources may be freed passing true
380 @param destroy Free all engine entity resources
382 void close(bool destroy = false) throw(anna::RuntimeException) { closeEntities(destroy); closeLocalServers(destroy); }
386 Close all the engine entities (close servers, then close client-sessions within them). Depending on client-session configuration
387 ('OnDisconnect' behaviour), pending answers will be wait (graceful) or ignored (immediate-abrupt close).
388 Optionally all entities resources may be freed passing true; in this case, close is immediately performed:
389 @param destroy Free all engine entity resources
391 void closeEntities(bool destroy = false) throw(anna::RuntimeException);
395 * Close entity servers (then, client-sessions included) and optionally free resources including entity itself.
396 * If entity is null, this operation has no effect.
398 * \param entity Diameter entity to be closed.
399 * \param destroy Deletes entity over the engine and all its resources.
401 void closeEntity(Entity* entity, bool destroy = false) throw(anna::RuntimeException);
405 Close all the engine local server sockets including their children server sessions.
406 Optionally all local server resources may be freed passing true.
408 @param destroy Free all engine local servers resources and server sessions within them.
410 void closeLocalServers(bool destroy = false) throw(anna::RuntimeException);
413 * Close local server socket and its children server sessions.
414 * This is useful when detecting service lost. When service is ready to handle traffic, a new server socket would
415 * be created by mean #LocalServer::enable() and new connections could be accepted.
416 * Optionally local server resources may be freed passing true.
418 * \param localServer Local server to be closed.
419 * \param destroy Deletes local server over engine and all its resources (server sessions within it).
421 void closeLocalServer(LocalServer * localServer, bool destroy = false) throw(anna::RuntimeException);
424 Gets the number of requests messages over-the-air for entities.
426 @return OTA messages.
428 int getOTARequestsForEntities() const throw();
431 Gets the number of requests messages over-the-air for local servers.
433 @return OTA messages.
435 int getOTARequestsForLocalServers() const throw();
438 Gets the number of requests messages over-the-air for entities plus local servers.
440 @return OTA messages.
442 int getOTARequests() const throw() { return (getOTARequestsForEntities() + getOTARequestsForLocalServers()); }
445 Returns idle state (no pending answers) for entities.
449 bool idleForEntities() const throw() { return (getOTARequestsForEntities() == 0); }
452 Returns idle state (no pending answers).
456 bool idleForLocalServers() const throw() { return (getOTARequestsForLocalServers() == 0); }
459 Returns idle state (no pending answers for entities or local servers).
463 bool idle() const throw() { return (getOTARequests() == 0); }
466 Sent a message to all the engine entities.
467 It is used, i.e., in Disconnect-Peer-Request procedure over the engine.
469 \param message Message which is being sent.
471 @return Returns true (success) only when broadcast is success over all the engine entities. If any entity fails,
472 then false is returned. Broadcast try to send all over the resources in spite of any fail.
474 bool broadcastEntities(const Message*message) throw(anna::RuntimeException);
475 bool broadcastEntities(const Message& message) throw(anna::RuntimeException) { return broadcastEntities(&message); }
478 Sent a message through all the engine local servers.
479 It is used, i.e., in Disconnect-Peer-Request procedure over the engine.
481 \param message Message which is being sent.
483 @return Returns true (success) only when broadcast is success over all the engine local servers. If any local server fails,
484 then false is returned. Broadcast try to send all over the resources in spite of any fail.
486 bool broadcastLocalServers(const Message*message) throw(anna::RuntimeException);
487 bool broadcastLocalServers(const Message& message) throw(anna::RuntimeException) { return broadcastLocalServers(&message); }
490 * Class string representation
492 * @return String with class content
494 virtual std::string asString(void) const throw();
497 Class XML representation.
498 \param parent XML node over which we will put instance information.
499 \return XML documentcon with class content.
501 virtual anna::xml::Node* asXML(anna::xml::Node* parent) const throw();
505 When there is not bound server session over the engine, this virtual method will be invoked.
506 Applications must decide to do any other tasks at this idle/isolated situation.
507 Default implementation do nothing.
509 virtual void availabilityLostForLocalServers(Engine *) const throw() {;}
512 When there is any bound server session over the engine, this virtual method will be invoked.
513 Applications must decide to do be ready for incoming traffic.
514 Default implementation do nothing.
516 virtual void availabilityRecoveredForLocalServers(Engine *) const throw() {;}
519 When there is not bound entity over the engine, this virtual method will be invoked.
520 Many applications must change communicator status to Unavailable when no engines are available.
521 Default implementation do nothing.
523 virtual void availabilityLostForEntities(Engine *) const throw() {;}
526 When there is any bound entity over the engine, this virtual method will be invoked.
527 Many applications must recover communicator status to Available when any engine are available.
528 Default implementation do nothing.
530 virtual void availabilityRecoveredForEntities(Engine *) const throw() {;}
533 When there is not bound server-session over the local server, this virtual method will be invoked.
534 Default implementation do nothing.
536 virtual void availabilityLost(LocalServer *) const throw() {;}
539 When there is any bound server-session over the local server, this virtual method will be invoked.
540 Default implementation do nothing.
542 virtual void availabilityRecovered(LocalServer *) const throw() {;}
545 When there is not bound server over the entity, this virtual method will be invoked.
546 Default implementation do nothing.
548 virtual void availabilityLost(Entity *) const throw() {;}
551 When there is any bound server over the entity, this virtual method will be invoked.
552 Default implementation do nothing.
554 virtual void availabilityRecovered(Entity *) const throw() {;}
557 When there is not bound client-session over the server, this virtual method will be invoked.
558 Default implementation do nothing.
560 virtual void availabilityLost(Server *) const throw() {;}
563 When there is any bound client-session over the server, this virtual method will be invoked.
564 Default implementation do nothing.
566 virtual void availabilityRecovered(Server *) const throw() {;}
569 When a subyacent client session is going to be bound, this method is invoked before.
570 Default implementation do nothing.
572 virtual void bindingClientSession(const ClientSession *) const throw() {;}
575 * Class user should implement this method in order to define Disconnect-Peer-Answer for last received DPR.
576 * Origin-Host and Origin-Realm are configured at comm::Engine with hostname and FQDN (Fully Qualified Domain Name).
577 * Default implementation imply DPA with DIAMETER_SUCCESS Result-Code, allowing remote disconnection.
578 * Any other implementation is responsible to build a valid DPA diameter message.
579 * DPR/DPA procedure is disabled with empty definition of this method: no DPA will be sent when DPR is received.
581 * @param dpa DPA datablock passed as reference
582 * @param dpr Corresponding DPR received (sequence values must be taken into account in order to build DPA)
584 virtual void readDPA(anna::DataBlock &dpa, const anna::DataBlock & dpr) throw();
587 * Class user should implement this method in order to define Capabilities-Exchange-Answer for received CER over server socket.
588 * Origin-Host and Origin-Realm are configured at comm::Engine with hostname and FQDN (Fully Qualified Domain Name).
589 * Default implementation imply CEA with DIAMETER_SUCCESS Result-Code, and own domain node parameters, but application should
590 * analyze the CER message in order to accept it or not (with apropiate non-success Result-Code).
591 * Any other implementation is responsible to build a valid CEA diameter message:
593 * If one peer sends a CER message to another Peer and receiver does not have support for
595 * 1) any common application then it must return the CEA with Result-Code Avp set to DIAMETER_NO_COMMON_APPLICATION
596 * and should disconnect the transport layer connection (automatically done by diameter::comm module).
597 * 2) no common security mechanism then it must return the CEA with Result-Code Avp set to DIAMETER_NO_COMMON_SECURITY
598 * and should disconnect the transport layer connection (automatically done by diameter::comm module).
599 * 3) if CER is received from any unknown peer then receiver should discard the message, or send the CEA with the
600 * Result-Code Avp set to DIAMETER_UNKNOWN_PEER.
602 * If the local implementation policy permits to receive CER from unknown hosts, a successful CEA MAY be returned,
603 * and the life time of the peer entry in PEER-Table is equal to the lifetime of the transport connection.
604 * If in any case transport connection fails then all the pending transactions destined to the unknown peer can be discarded.
606 * The CER and CEA messages MUST NOT be proxied, redirected or relayed. Since CER/CEA messages can not be proxied, but still
607 * it is possible that proxy will receive a CER message and proxy does not have any peer to handle the application requested
608 * in CER, in this case proxy set the E bit in CEA and set the Result-Code Avp to DIAMETER_UNABLE_TO_DELIVER, sends back to
609 * CER generator peer.
611 * @param cea CEA datablock passed as reference. Empty cea implies to discard CER received.
612 * @param cer Corresponding CER received (sequence values must be taken into account in order to build CEA)
614 virtual void readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) throw();
617 * Class user should implement this method in order to define Device-Watchdog-Answer for received DWR over server socket.
618 * Origin-Host and Origin-Realm are configured at comm::Engine with hostname and FQDN (Fully Qualified Domain Name).
619 * Default implementation imply DWA with DIAMETER_SUCCESS Result-Code, and own domain node parameters.
620 * Any other implementation is responsible to build a valid DWA diameter message.
622 * @param dwa DWA datablock passed as reference
623 * @param dwr Corresponding DWR received (sequence values must be taken into account in order to build DWA)
625 virtual void readDWA(anna::DataBlock &dwa, const anna::DataBlock & dwr) throw();
628 Reset engine statistics.
629 At the moment, only diameter servers processing time is observed.
631 void resetStatistics() throw();
638 @param className Component class name
639 @param baseProtocolCodecEngine This will be used internally during invokation of @readCEA, @readDPA and @readDWA on servers,
640 and also used during base protocol messages tracing (if debug traces are enabled). You could provide NULL but you must be
641 sure that neither of the former situations are going to happen or an exception will be thrown. It is recommended to register
642 a codec engine pointed to a base protocol stack (you can use the files 'avps_ietf.xml' and 'commands_baseProtocol.xml'
643 located on ANNA suite project under 'source/diameter/stack/setups', or perhaps you can create your own dictionary from
644 file or directly with the dictionay creation API. Even you can use a greater dictionary (application dictionary), the
645 only condition is that must contain the resources to build base protocol messages. You could use @setBaseProtocolCodecEngine
646 to set this reference later; don't forget it.
648 Engine(const char *className, codec::Engine *baseProtocolCodecEngine);
651 // INTERNAL CREATORS AND CLOSE METHODS
652 Server *createServer(Entity*, const socket_t&) throw(anna::RuntimeException);
653 void closeServer(Server*, bool) throw(anna::RuntimeException);
654 ClientSession *createClientSession(Server*, int) throw(anna::RuntimeException);
655 void closeClientSession(ClientSession*, bool) throw(anna::RuntimeException);
657 // INTERNAL ALLOCATORS
658 Server* allocateServer() throw();
659 void releaseServer(Server*) throw();
660 ClientSession* allocateClientSession() throw();
661 void releaseClientSession(ClientSession*) throw();
665 Entity allocator method.
667 It is recommended to use anna::Recycler for entities creation/releasing.
671 virtual Entity* allocateEntity() throw() { return NULL; }
675 Invoked to free entities.
678 virtual void releaseEntity(Entity*) throw() {;}
682 Local server allocator method.
684 It is recommended to use anna::Recycler for entities creation/releasing.
688 virtual LocalServer* allocateLocalServer() throw() { return NULL; }
692 Invoked to free local servers.
695 virtual void releaseLocalServer(LocalServer*) throw() {;}
701 // Internal use: tracing and readCEA/DPA/DWA
702 codec::Engine *a_baseProtocolCodecEngine;
707 int a_numberOfClientSessionsPerServer;
710 // ClientSessions messages:
711 anna::DataBlock a_cer;
712 anna::DataBlock a_dwr;
713 anna::Millisecond a_watchdogPeriod;
715 // // ServerSessions messages:
716 // anna::DataBlock a_cea;
717 // anna::DataBlock a_dwa;
719 // Client connectivity
720 anna::Millisecond a_maxConnectionDelay;
724 bool a_availableForEntities; // any of the entities must be bound
725 void availabilityLostForEntities() throw();
726 void availabilityRecoveredForEntities() throw();
727 bool refreshAvailabilityForEntities() throw(); // return true if change
729 bool a_availableForLocalServers; // any of the local servers must be bound
730 void availabilityLostForLocalServers() throw();
731 void availabilityRecoveredForLocalServers() throw();
732 bool refreshAvailabilityForLocalServers() throw(); // return true if change
734 void eraseDeprecatedIdleEntities() throw();
737 void do_initialize() throw() {;}
738 void do_stop() throw();
741 void checkEntityCollision(const socket_v &) throw(anna::RuntimeException);
744 //////////////////////////
745 // CLIENT FUNCTIONALITY //
746 //////////////////////////
748 //typedef int clientSession_key; // exclusiveHash('ADDR:PORT|id')
749 typedef std::string clientSession_key; // 'ADDR:PORT|id'
750 typedef std::map <clientSession_key, ClientSession*> clientSession_container;
751 typedef clientSession_container::value_type clientSession_value_type;
752 typedef clientSession_container::iterator clientSession_iterator;
753 typedef clientSession_container::const_iterator const_clientSession_iterator;
754 clientSession_container a_clientSessions;
755 anna::Recycler<ClientSession> a_clientSessionsRecycler;
756 clientSession_iterator clientSession_find(const clientSession_key&) throw();
757 clientSession_iterator clientSession_begin() throw() { return a_clientSessions.begin(); }
758 clientSession_iterator clientSession_end() throw() { return a_clientSessions.end(); }
759 static ClientSession* clientSession(clientSession_iterator ii) throw() { return ii->second; }
760 const_clientSession_iterator clientSession_begin() const throw() { return a_clientSessions.begin(); }
761 const_clientSession_iterator clientSession_end() const throw() { return a_clientSessions.end(); }
762 static const ClientSession* clientSession(const_clientSession_iterator ii) throw() { return ii->second; }
764 typedef socket_t server_key;
765 server_key getServerKey(const std::string & addr, int port) const throw();
766 typedef std::map <server_key, Server*> server_container;
767 typedef server_container::value_type server_value_type;
768 typedef server_container::iterator server_iterator;
769 typedef server_container::const_iterator const_server_iterator;
770 server_container a_servers;
771 anna::Recycler<Server> a_serversRecycler;
772 server_iterator server_find(const server_key&) throw();
773 server_iterator server_begin() throw() { return a_servers.begin(); }
774 server_iterator server_end() throw() { return a_servers.end(); }
775 static Server* server(server_iterator ii) throw() { return ii->second; }
776 const_server_iterator server_begin() const throw() { return a_servers.begin(); }
777 const_server_iterator server_end() const throw() { return a_servers.end(); }
778 static const Server* server(const_server_iterator ii) throw() { return ii->second; }
780 //typedef int entity_key; // exclusiveHash('IP1:PORT1 IP2:PORT2 IP3:PORT3 ...')
781 typedef std::string entity_key; // 'ADDR1:PORT1 ADDR2:PORT2 ADDR3:PORT3 ...'
782 entity_key getEntityKey(const socket_v &) const throw();
783 entity_key getEntityKey(const std::string & addr1, int port1, const std::string & addr2, int port2) const throw();
784 typedef std::map <entity_key, Entity*> entity_container;
785 typedef entity_container::value_type entity_value_type;
786 typedef entity_container::iterator entity_iterator;
787 typedef entity_container::const_iterator const_entity_iterator;
788 entity_container a_entities;
789 entity_iterator entity_find(const entity_key&) throw();
790 entity_iterator entity_begin() throw() { return a_entities.begin(); }
791 entity_iterator entity_end() throw() { return a_entities.end(); }
792 static Entity* entity(entity_iterator ii) throw() { return ii->second; }
793 const_entity_iterator entity_begin() const throw() { return a_entities.begin(); }
794 const_entity_iterator entity_end() const throw() { return a_entities.end(); }
795 static const Entity* entity(const_entity_iterator ii) throw() { return ii->second; }
798 //////////////////////////
799 // SERVER FUNCTIONALITY //
800 //////////////////////////
803 typedef std::map <socket_t, LocalServer*> localServer_container;
804 typedef localServer_container::value_type localServer_value_type;
805 typedef localServer_container::iterator localServer_iterator;
806 typedef localServer_container::const_iterator const_localServer_iterator;
807 localServer_container a_localServers;
808 localServer_iterator localServer_find(const socket_t&) throw();
809 localServer_iterator localServer_begin() throw() { return a_localServers.begin(); }
810 localServer_iterator localServer_end() throw() { return a_localServers.end(); }
811 static LocalServer* localServer(localServer_iterator ii) throw() { return ii->second; }
812 const_localServer_iterator localServer_begin() const throw() { return a_localServers.begin(); }
813 const_localServer_iterator localServer_end() const throw() { return a_localServers.end(); }
814 static const LocalServer* localServer(const_localServer_iterator ii) throw() { return ii->second; }
816 // Server sessions are managed within LocalServer (not at engine) due to dynamic cration nature
819 friend class Session;
820 friend class ServerSession;
821 friend class ServerSocket;
824 friend class LocalServer;
825 //friend class Message;