diff options
Diffstat (limited to 'examples/C++NPv2/display_logfile.cpp')
-rw-r--r-- | examples/C++NPv2/display_logfile.cpp | 364 |
1 files changed, 0 insertions, 364 deletions
diff --git a/examples/C++NPv2/display_logfile.cpp b/examples/C++NPv2/display_logfile.cpp deleted file mode 100644 index 4796ceccd91..00000000000 --- a/examples/C++NPv2/display_logfile.cpp +++ /dev/null @@ -1,364 +0,0 @@ -/* -** $Id$ -** -** Copyright 2002 Addison Wesley. All Rights Reserved. -*/ - -#include "ace/ACE.h" -#include "ace/CDR_Stream.h" -#include "ace/FILE_Addr.h" -#include "ace/FILE_Connector.h" -#include "ace/FILE_IO.h" -#include "ace/Message_Block.h" -#include "ace/Module.h" -#include "ace/SString.h" -#include "ace/Stream.h" -#include "ace/Task.h" -#include "ace/Thread_Manager.h" -#include "ace/Lock_Adapter_T.h" -#include "ace/OS_NS_string.h" -#include "ace/OS_NS_time.h" - -template <class TASK> -class Logrec_Module : public ACE_Module<ACE_SYNCH> -{ -public: - Logrec_Module (const ACE_TCHAR *name) - : ACE_Module<ACE_SYNCH> - (name, - &task_, // Initialize writer-side task. - 0, // Ignore reader-side task. - 0, - ACE_Module<ACE_SYNCH>::M_DELETE_READER) {} -private: - TASK task_; -}; -#define LOGREC_MODULE(NAME) \ - typedef Logrec_Module<NAME> NAME##_Module - -class Logrec_Reader : public ACE_Task<ACE_SYNCH> -{ -private: - ACE_TString filename_; // Name of logfile. - ACE_FILE_IO logfile_; // File containing log records. - -public: - enum {MB_CLIENT = ACE_Message_Block::MB_USER, - MB_TYPE, MB_PID, MB_TIME, MB_TEXT}; - - Logrec_Reader (const ACE_TString &file): filename_ (file) {} - - virtual int open (void *) { - ACE_FILE_Addr name (filename_.c_str ()); - ACE_FILE_Connector connector; - if (connector.connect (logfile_, name) == -1) - return -1; - return activate (); - } - - virtual int svc () { - const size_t FileReadSize = 8 * 1024; - ACE_Message_Block mblk (FileReadSize); - - for (;; mblk.crunch ()) { - // Read as much as will fit in the message block. - ssize_t bytes_read = logfile_.recv (mblk.wr_ptr (), - mblk.space ()); - if (bytes_read <= 0) - break; - mblk.wr_ptr (static_cast<size_t> (bytes_read)); - - // We have a bunch of data from the log file. The data is - // arranged like so: - // hostname\0 - // CDR-encoded log record - // So, first we scan for the end of the host name, then - // initialize another ACE_Message_Block aligned for CDR - // demarshaling and copy the remainder of the block into it. We - // can't use duplicate() because we need to be sure the data - // pointer is aligned properly for CDR demarshaling. If at any - // point, there's not enough data left in the message block to - // extract what's needed, crunch the block to move all remaining - // data to the beginning and read more from the file. - for (;;) { - size_t name_len = ACE_OS::strnlen - (mblk.rd_ptr (), mblk.length ()); - if (name_len == mblk.length ()) break; - - char *name_p = mblk.rd_ptr (); - ACE_Message_Block *rec, *head, *temp; - ACE_NEW_RETURN - (head, ACE_Message_Block (name_len, MB_CLIENT), 0); - head->copy (name_p, name_len); - mblk.rd_ptr (name_len + 1); // Skip nul also - - size_t need = mblk.length () + ACE_CDR::MAX_ALIGNMENT; - ACE_NEW_RETURN (rec, ACE_Message_Block (need), 0); - ACE_CDR::mb_align (rec); - rec->copy (mblk.rd_ptr (), mblk.length ()); - - // Now rec contains the remaining data we've read so far from - // the file. Create an ACE_InputCDR to start demarshaling the - // log record, header first to find the length, then the data. - // Since the ACE_InputCDR constructor increases the reference count - // on rec, we release it upon return to prevent leaks. - // The cdr 'read' methods return 0 on failure, 1 on success. - ACE_InputCDR cdr (rec); rec->release (); - ACE_CDR::Boolean byte_order; - if (!cdr.read_boolean (byte_order)) { - head->release (); rec->release (); break; - } - cdr.reset_byte_order (byte_order); - - // Now read the length of the record. From there, we'll know - // if rec contains the complete record or not. - ACE_CDR::ULong length; - if (!cdr.read_ulong (length)) { - head->release (); mblk.rd_ptr (name_p); break; - } - if (length > cdr.length ()) { - head->release (); mblk.rd_ptr (name_p); break; - } - - // The complete record is in rec... grab all the fields into - // separate, chained message blocks. - ACE_NEW_RETURN (temp, - ACE_Message_Block (length, MB_TEXT), - 0); - ACE_NEW_RETURN - (temp, - ACE_Message_Block (2 * sizeof (ACE_CDR::Long), - MB_TIME, temp), - 0); - ACE_NEW_RETURN - (temp, - ACE_Message_Block (sizeof (ACE_CDR::Long), - MB_PID, temp), - 0); - ACE_NEW_RETURN - (temp, - ACE_Message_Block (sizeof (ACE_CDR::Long), - MB_TYPE, temp), - 0); - head->cont (temp); - - // Extract the type - ACE_CDR::Long *lp; - lp = reinterpret_cast<ACE_CDR::Long*> (temp->wr_ptr ()); - cdr >> *lp; - temp->wr_ptr (sizeof (ACE_CDR::Long)); - temp = temp->cont (); - - // Extract the pid - lp = reinterpret_cast<ACE_CDR::Long*> (temp->wr_ptr ()); - cdr >> *lp; - temp->wr_ptr (sizeof (ACE_CDR::Long)); - temp = temp->cont (); - - // Extract the timestamp (2 Longs) - lp = reinterpret_cast<ACE_CDR::Long*> (temp->wr_ptr ()); - cdr >> *lp; ++lp; cdr >> *lp; - temp->wr_ptr (2 * sizeof (ACE_CDR::Long)); - temp = temp->cont (); - - // Demarshal the length of the message text, then demarshal - // the text into the block. - ACE_CDR::ULong text_len; - cdr >> text_len; - cdr.read_char_array (temp->wr_ptr (), text_len); - temp->wr_ptr (text_len); - - // Forward the whole lot to the next module. - if (put_next (head) == -1) break; - - // Move the file-content block's read pointer up past whatever - // was just processed. Although the mblk's rd_ptr has not been - // moved, cdr's has. Therefore, use its length() to determine - // how much is left. - mblk.rd_ptr (mblk.length () - cdr.length ()); - } - } - - // Now that the file is done, send a block down the stream to tell - // the other modules to stop. - ACE_Message_Block *stop; - ACE_NEW_RETURN - (stop, ACE_Message_Block (0, ACE_Message_Block::MB_STOP), - 0); - put_next (stop); - return 0; - } -}; - -class Logrec_Reader_Module : public ACE_Module<ACE_SYNCH> -{ -public: - Logrec_Reader_Module (const ACE_TString &filename) - : ACE_Module<ACE_SYNCH> - (ACE_TEXT ("Logrec Reader"), - &task_, // Initialize writer-side. - 0, // Ignore reader-side. - 0, - ACE_Module<ACE_SYNCH>::M_DELETE_READER), - task_ (filename) {} -private: - Logrec_Reader task_; -}; - -class Logrec_Writer : public ACE_Task<ACE_SYNCH> -{ -public: - // Initialization hook method. - virtual int open (void *) { return activate (); } - - virtual int put (ACE_Message_Block *mblk, ACE_Time_Value *to) - { return putq (mblk, to); } - - virtual int svc () { - int stop = 0; - for (ACE_Message_Block *mb; !stop && getq (mb) != -1; ) { - if (mb->msg_type () == ACE_Message_Block::MB_STOP) - stop = 1; - else - ACE::write_n (ACE_STDOUT, mb); - put_next (mb); - } - return 0; - } -}; - -LOGREC_MODULE (Logrec_Writer); - -class Logrec_Formatter : public ACE_Task<ACE_SYNCH> -{ -public: - typedef void (*FORMATTER[5])(ACE_Message_Block *); -private: - static FORMATTER format_; // Array of format static methods. - -public: - virtual int put (ACE_Message_Block *mblk, ACE_Time_Value *) { - if (mblk->msg_type () == Logrec_Reader::MB_CLIENT) - for (ACE_Message_Block *temp = mblk; - temp != 0; - temp = temp->cont ()) { - int mb_type = - temp->msg_type () - ACE_Message_Block::MB_USER; - (*format_[mb_type])(temp); - } - return put_next (mblk); - } - - static void format_client (ACE_Message_Block *) { - return; - } - - static void format_type (ACE_Message_Block *mblk) { - ACE_CDR::Long type = * (ACE_CDR::Long *)mblk->rd_ptr (); - mblk->size (11); // Max size in ASCII of 32-bit word. - mblk->reset (); - mblk->wr_ptr ((size_t) sprintf (mblk->wr_ptr (), "%d", type)); - } - - static void format_pid (ACE_Message_Block *mblk) { - ACE_CDR::Long pid = * (ACE_CDR::Long *)mblk->rd_ptr (); - mblk->size (11); // Max size in ASCII of 32-bit word. - mblk->reset (); - mblk->wr_ptr ((size_t) sprintf (mblk->wr_ptr (), "%d", pid)); - } - - static void format_time (ACE_Message_Block *mblk) { - ACE_CDR::Long secs = * (ACE_CDR::Long *)mblk->rd_ptr (); - mblk->rd_ptr (sizeof (ACE_CDR::Long)); - ACE_CDR::Long usecs = * (ACE_CDR::Long *)mblk->rd_ptr (); - ACE_TCHAR timestamp_t[26]; - char timestamp[26]; // Max size of ctime_r() string. - time_t time_secs (secs); - ACE_OS::ctime_r (&time_secs, timestamp_t, sizeof timestamp_t); - ACE_OS::strcpy (timestamp, ACE_TEXT_ALWAYS_CHAR (timestamp_t)); - mblk->size (26); // Max size of ctime_r() string. - mblk->reset (); - timestamp[19] = '\0'; // NUL-terminate after the time. - timestamp[24] = '\0'; // NUL-terminate after the date. - size_t fmt_len (sprintf (mblk->wr_ptr (), - "%s.%03d %s", - timestamp + 4, - usecs / 1000, - timestamp + 20)); - mblk->wr_ptr (fmt_len); - } - - static void format_data (ACE_Message_Block *) { - return; - } -}; - -Logrec_Formatter::FORMATTER Logrec_Formatter::format_ = { - format_client, format_type, format_pid, format_time, format_data -}; - -LOGREC_MODULE (Logrec_Formatter); - -class Logrec_Separator : public ACE_Task<ACE_SYNCH> -{ -private: - ACE_Lock_Adapter<ACE_SYNCH_MUTEX> lock_strategy_; - -public: - virtual int put (ACE_Message_Block *mblk, - ACE_Time_Value *) { - if (mblk->msg_type () != ACE_Message_Block::MB_STOP) { - ACE_Message_Block *separator; - ACE_NEW_RETURN - (separator, - ACE_Message_Block (ACE_OS::strlen ("|") + 1, - ACE_Message_Block::MB_DATA, - 0, 0, 0, &lock_strategy_), - -1); - separator->copy ("|"); - - ACE_Message_Block *dup = 0; - for (ACE_Message_Block *temp = mblk; temp != 0; ) { - dup = separator->duplicate (); - dup->cont (temp->cont ()); - temp->cont (dup); - temp = dup->cont (); - } - ACE_Message_Block *nl; - ACE_NEW_RETURN (nl, ACE_Message_Block (2), 0); - nl->copy ("\n"); - dup->cont (nl); - separator->release (); - } - return put_next (mblk); - } -}; - -LOGREC_MODULE (Logrec_Separator); - -int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) -{ - if (argc != 2) - ACE_ERROR_RETURN ((LM_ERROR, - "usage: %s logfile\n", argv[0]), - 1); - ACE_TString logfile (argv[1]); - ACE_Stream<ACE_SYNCH> stream; - - if (stream.push - (new Logrec_Writer_Module (ACE_TEXT ("Writer"))) != -1 - && stream.push - (new Logrec_Separator_Module (ACE_TEXT ("Separator"))) != -1 - && stream.push - (new Logrec_Formatter_Module (ACE_TEXT ("Formatter"))) != -1 - && stream.push - (new Logrec_Reader_Module (logfile)) != -1) - return ACE_Thread_Manager::instance ()->wait () == 0 ? 0 : 1; - return 1; -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Lock_Adapter<ACE_Thread_Mutex>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Lock_Adapter<ACE_Thread_Mutex> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |