// -*- C++ -*- // Module: LOG4CPLUS // File: socketap.h // Created: 5/2003 // Author: Tad E. Smith // // // Copyright 2003-2010 Tad E. Smith // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** @file */ #ifndef DCMTK_LOG4CPLUS_SOCKET_APPENDER_HEADER_ #define DCMTK_LOG4CPLUS_SOCKET_APPENDER_HEADER_ #include "dcmtk/oflog/config.h" #if defined (DCMTK_LOG4CPLUS_HAVE_PRAGMA_ONCE) #pragma once #endif #include "dcmtk/oflog/appender.h" #include "dcmtk/oflog/helpers/socket.h" #include "dcmtk/oflog/thread/syncprim.h" #include "dcmtk/oflog/thread/threads.h" namespace dcmtk { namespace log4cplus { #ifndef UNICODE size_t const DCMTK_LOG4CPLUS_MAX_MESSAGE_SIZE = 8*1024; #else size_t const DCMTK_LOG4CPLUS_MAX_MESSAGE_SIZE = 2*8*1024; #endif /** * Sends {@link spi::InternalLoggingEvent} objects to a remote a log server. * * The SocketAppender has the following properties: * * * *

Properties

*
*
host
*
Remote host name to connect and send events to.
* *
port
*
Port on remote host to send events to.
* *
ServerName
*
Host name of event's origin prepended to each event.
* *
*/ class DCMTK_LOG4CPLUS_EXPORT SocketAppender : public Appender { public: // Ctors SocketAppender(const log4cplus::tstring& host, unsigned short port, const log4cplus::tstring& serverName = tstring()); SocketAppender(const log4cplus::helpers::Properties & properties); // Dtor ~SocketAppender(); // Methods virtual void close(); protected: void openSocket(); void initConnector (); virtual void append(const spi::InternalLoggingEvent& event); // Data log4cplus::helpers::Socket socket; log4cplus::tstring host; unsigned int port; log4cplus::tstring serverName; #if ! defined (DCMTK_LOG4CPLUS_SINGLE_THREADED) class DCMTK_LOG4CPLUS_EXPORT ConnectorThread; friend class ConnectorThread; class DCMTK_LOG4CPLUS_EXPORT ConnectorThread : public thread::AbstractThread { public: ConnectorThread (SocketAppender &); virtual ~ConnectorThread (); virtual void run(); void terminate (); void trigger (); protected: SocketAppender & sa; thread::ManualResetEvent trigger_ev; bool exit_flag; }; volatile bool connected; helpers::SharedObjectPtr connector; #endif private: // Disallow copying of instances of this class SocketAppender(const SocketAppender&); SocketAppender& operator=(const SocketAppender&); }; namespace helpers { DCMTK_LOG4CPLUS_EXPORT void convertToBuffer (SocketBuffer & buffer, const log4cplus::spi::InternalLoggingEvent& event, const log4cplus::tstring& serverName); DCMTK_LOG4CPLUS_EXPORT log4cplus::spi::InternalLoggingEvent readFromBuffer(SocketBuffer& buffer); } // end namespace helpers } // end namespace log4cplus } // end namespace dcmtk #endif // DCMTK_LOG4CPLUS_SOCKET_APPENDER_HEADER_