summaryrefslogtreecommitdiff
path: root/ACE/examples/C++NPv2/Service_Reporter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/examples/C++NPv2/Service_Reporter.cpp')
-rw-r--r--ACE/examples/C++NPv2/Service_Reporter.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/ACE/examples/C++NPv2/Service_Reporter.cpp b/ACE/examples/C++NPv2/Service_Reporter.cpp
new file mode 100644
index 00000000000..ad9cd05d26c
--- /dev/null
+++ b/ACE/examples/C++NPv2/Service_Reporter.cpp
@@ -0,0 +1,125 @@
+/*
+** $Id$
+**
+** Copyright 2002 Addison Wesley. All Rights Reserved.
+*/
+
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+#include "ace/Get_Opt.h"
+#include "ace/INET_Addr.h"
+#include "ace/Log_Msg.h"
+#include "ace/Service_Config.h"
+#include "ace/Service_Repository.h"
+#include "ace/Service_Types.h"
+#include "ace/SOCK_Stream.h"
+#include "Service_Reporter.h"
+
+
+int Service_Reporter::init (int argc, ACE_TCHAR *argv[]) {
+ ACE_INET_Addr local_addr (Service_Reporter::DEFAULT_PORT);
+
+ // Start at argv[0].
+ ACE_Get_Opt get_opt (argc, argv, ACE_TEXT ("p:"), 0);
+ get_opt.long_option (ACE_TEXT ("port"),
+ 'p',
+ ACE_Get_Opt::ARG_REQUIRED);
+
+ for (int c; (c = get_opt ()) != -1; )
+ switch (c) {
+ case 'p':
+ local_addr.set_port_number
+ (ACE_OS::atoi (get_opt.opt_arg ()));
+ }
+
+ acceptor_.open (local_addr);
+ return reactor ()->register_handler
+ (this,
+ ACE_Event_Handler::ACCEPT_MASK);
+}
+
+
+int Service_Reporter::handle_input (ACE_HANDLE) {
+ ACE_SOCK_Stream peer_stream;
+ acceptor_.accept (peer_stream);
+
+ ACE_Service_Repository_Iterator iterator
+ (*ACE_Service_Repository::instance (), 0);
+
+ for (const ACE_Service_Type *st;
+ iterator.next (st) != 0;
+ iterator.advance ()) {
+ iovec iov[3];
+ iov[0].iov_base = const_cast<ACE_TCHAR *> (st->name ());
+ iov[0].iov_len =
+ ACE_OS::strlen (st->name ()) * sizeof (ACE_TCHAR);
+ const ACE_TCHAR *state = st->active () ?
+ ACE_TEXT (" (active) ") : ACE_TEXT (" (paused) ");
+ iov[1].iov_base = const_cast<ACE_TCHAR *> (state);
+ iov[1].iov_len =
+ ACE_OS::strlen (state) * sizeof (ACE_TCHAR);
+ ACE_TCHAR *report = 0; // Ask info() to allocate buffer
+ int len = st->type ()->info (&report, 0);
+ iov[2].iov_base = static_cast<ACE_TCHAR *> (report);
+ iov[2].iov_len = static_cast<size_t> (len);
+ iov[2].iov_len *= sizeof (ACE_TCHAR);
+ peer_stream.sendv_n (iov, 3);
+ ACE::strdelete (report);
+ }
+
+ peer_stream.close ();
+ return 0;
+}
+
+
+int Service_Reporter::info (ACE_TCHAR **bufferp,
+ size_t length) const {
+ ACE_INET_Addr local_addr;
+ acceptor_.get_local_addr (local_addr);
+
+ ACE_TCHAR buf[BUFSIZ];
+ ACE_OS::sprintf
+ (buf, ACE_TEXT ("%hu"), local_addr.get_port_number ());
+ ACE_OS::strcat
+ (buf, ACE_TEXT ("/tcp # lists services in daemon\n"));
+ if (*bufferp == 0)
+ *bufferp = ACE::strnew (buf);
+ else
+ ACE_OS::strncpy (*bufferp, buf, length);
+ return ACE_OS::strlen (*bufferp);
+}
+
+
+int Service_Reporter::suspend ()
+{ return reactor ()->suspend_handler (this); }
+
+int Service_Reporter::resume ()
+{ return reactor ()->resume_handler (this); }
+
+
+int Service_Reporter::fini () {
+ reactor ()->remove_handler
+ (this,
+ ACE_Event_Handler::ACCEPT_MASK
+ | ACE_Event_Handler::DONT_CALL);
+ return acceptor_.close ();
+}
+
+// Define the service object make and gobble functions.
+ACE_FACTORY_DEFINE (ACE_Local_Service, Service_Reporter)
+
+// Define the ACE_Static_Svc_Descriptor that conveys the service information
+// to the ACE_Service_Config.
+ACE_STATIC_SVC_DEFINE (
+ Reporter_Descriptor,
+ ACE_TEXT ("Service_Reporter"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (Service_Reporter),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0 // This object is not initially active.
+)
+
+// Define the class that will register this service with ACE_Service_Config
+// at program startup.
+ACE_STATIC_SVC_REQUIRE (Reporter_Descriptor)