summaryrefslogtreecommitdiff
path: root/ACE/examples/C++NPv2/AIO_Client_Logging_Daemon.h
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/examples/C++NPv2/AIO_Client_Logging_Daemon.h')
-rw-r--r--ACE/examples/C++NPv2/AIO_Client_Logging_Daemon.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/ACE/examples/C++NPv2/AIO_Client_Logging_Daemon.h b/ACE/examples/C++NPv2/AIO_Client_Logging_Daemon.h
new file mode 100644
index 00000000000..b85feebf9de
--- /dev/null
+++ b/ACE/examples/C++NPv2/AIO_Client_Logging_Daemon.h
@@ -0,0 +1,141 @@
+/*
+** $Id$
+**
+** Copyright 2002 Addison Wesley. All Rights Reserved.
+*/
+
+#ifndef _AIO_CLIENT_LOGGING_DAEMON_H
+#define _AIO_CLIENT_LOGGING_DAEMON_H
+
+#include "ace/Asynch_Connector.h"
+#include "ace/Asynch_IO.h"
+#include "ace/Message_Block.h"
+#include "ace/Null_Mutex.h"
+#include "ace/Proactor.h"
+#include "ace/Singleton.h"
+#include "ace/Synch_Traits.h"
+#include "ace/Task.h"
+
+#include <openssl/ssl.h>
+
+class AIO_CLD_Acceptor;
+
+class AIO_Input_Handler : public ACE_Service_Handler {
+public:
+ AIO_Input_Handler (AIO_CLD_Acceptor *acc = 0)
+ : acceptor_ (acc), mblk_ (0) {}
+
+ virtual ~AIO_Input_Handler ();
+
+ // Called by ACE_Asynch_Acceptor when a client connects.
+ virtual void open (ACE_HANDLE new_handle,
+ ACE_Message_Block &message_block);
+
+protected:
+ enum { LOG_HEADER_SIZE = 8 }; // Length of CDR header
+ AIO_CLD_Acceptor *acceptor_; // Our creator
+ ACE_Message_Block *mblk_; // Block to receive log record
+ ACE_Asynch_Read_Stream reader_; // Async read factory
+
+ // Handle input from logging clients.
+ virtual void handle_read_stream
+ (const ACE_Asynch_Read_Stream::Result &result);
+};
+
+
+class AIO_Output_Handler
+ : public ACE_Task<ACE_NULL_SYNCH>,
+ public ACE_Service_Handler {
+public:
+ AIO_Output_Handler () : can_write_ (0) {}
+
+ virtual ~AIO_Output_Handler ();
+
+ // Entry point into the <AIO_Output_Handler>.
+ virtual int put (ACE_Message_Block *, ACE_Time_Value * = 0);
+
+ // Hook method called when server connection is established.
+ virtual void open (ACE_HANDLE new_handle,
+ ACE_Message_Block &message_block);
+
+ // A trivial implementation that is needed to suppress compile
+ // warnings/errors.
+ virtual int open (void *args)
+ {
+ return ACE_Task<ACE_NULL_SYNCH>::open (args);
+ }
+
+protected:
+ ACE_Asynch_Read_Stream reader_; // Detects connection loss
+ ACE_Asynch_Write_Stream writer_; // Sends to server
+ int can_write_; // Safe to begin send a log record?
+
+ // Initiate the send of a log record
+ void start_write (ACE_Message_Block *mblk = 0);
+
+ // Handle disconnects from the logging server.
+ virtual void handle_read_stream
+ (const ACE_Asynch_Read_Stream::Result &result);
+
+ // Handle completed write to logging server.
+ virtual void handle_write_stream
+ (const ACE_Asynch_Write_Stream::Result &result);
+};
+
+typedef ACE_Unmanaged_Singleton<AIO_Output_Handler, ACE_Null_Mutex>
+ OUTPUT_HANDLER;
+
+
+class AIO_CLD_Connector
+ : public ACE_Asynch_Connector<AIO_Output_Handler> {
+public:
+ enum { INITIAL_RETRY_DELAY = 3, MAX_RETRY_DELAY = 60 };
+
+ // Constructor.
+ AIO_CLD_Connector ()
+ : retry_delay_ (INITIAL_RETRY_DELAY), ssl_ctx_ (0), ssl_ (0)
+ { open (); }
+
+ // Destructor frees the SSL resources.
+ virtual ~AIO_CLD_Connector (void) {
+ SSL_free (ssl_);
+ SSL_CTX_free (ssl_ctx_);
+ proactor ()->cancel_timer (*this);
+ }
+
+ // Hook method to detect failure and validate peer before
+ // opening handler.
+ virtual int validate_connection
+ (const ACE_Asynch_Connect::Result& result,
+ const ACE_INET_Addr &remote, const ACE_INET_Addr& local);
+
+ // Re-establish a connection to the logging server.
+ int reconnect (void) { return connect (remote_addr_); }
+
+protected:
+ // Hook method called on timer expiration - retry connect
+ virtual void handle_time_out
+ (const ACE_Time_Value&, const void *);
+
+ // Template method to create a new handler
+ virtual AIO_Output_Handler *make_handler (void)
+ { return OUTPUT_HANDLER::instance (); }
+
+ // Address at which logging server listens for connections.
+ ACE_INET_Addr remote_addr_;
+
+ // Seconds to wait before trying the next connect
+ int retry_delay_;
+
+ // The SSL "context" data structure.
+ SSL_CTX *ssl_ctx_;
+
+ // The SSL data structure corresponding to authenticated SSL
+ // connections.
+ SSL *ssl_;
+};
+
+typedef ACE_Unmanaged_Singleton<AIO_CLD_Connector, ACE_Null_Mutex>
+ CLD_CONNECTOR;
+
+#endif /* _AIO_CLIENT_LOGGING_DAEMON_H */