// -*- C++ -*-

//=============================================================================
/**
 *  @file    Log_Msg_Backend.h
 *
 *  @author Douglas C. Schmidt <d.schmidt@vanderbilt.edu>
 */
//=============================================================================


#ifndef ACE_LOG_MSG_BACKEND_H
#define ACE_LOG_MSG_BACKEND_H
#include /**/ "ace/pre.h"

#include /**/ "ace/ACE_export.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "ace/os_include/sys/os_types.h"

ACE_BEGIN_VERSIONED_NAMESPACE_DECL

class ACE_Log_Record;

/**
 * @class ACE_Log_Msg_Backend
 *
 * @brief Defines the interface for ACE_Log_Msg back end processing.
 *
 * The ACE_Log_Msg class uses ACE_Log_Msg_Backend as the target interface
 * for back end log record procesing. In addition to the classes ACE
 * derives from this (ACE_Log_Msg_NT_Event_Log, ACE_Log_Msg_UNIX_Syslog, and
 * ACE_Log_Msg_IPC) users can derive classes from ACE_Log_Msg_Backend for
 * use as a custom logger back end.
 */
class ACE_Export ACE_Log_Msg_Backend
{
public:
  /// No-op virtual destructor.
  virtual ~ACE_Log_Msg_Backend (void);

  /**
   * Open the back end object. Perform any actions needed to prepare
   * the object for later logging operations.
   *
   * @param logger_key  The character string passed to ACE_Log_Msg::open().
   *                    If the @c LOGGER logging destination is not being
   *                    used, any string can be passed through to the back end.
   *
   * @retval 0 for success.
   * @retval -1 for failure.
   */
  virtual int open (const ACE_TCHAR *logger_key) = 0;

  /**
   * Reset the backend.  If ACE_Log_Msg is reopened during execution, this
   * hook will be called. This method should perform any needed cleanup
   * activity (similar to close()) because this object won't be reopened
   * if the new open call does not specify use of this back end being reset.
   *
   * @retval Currently ignored, but to be safe, return 0 for success;
   *         -1 for failure.
   */
  virtual int reset (void) = 0;

  /// Close the backend completely.
  virtual int close (void) = 0;

  /**
   * Process a log record.
   *
   * @param log_record   The ACE_Log_Record to process.
   *
   * @retval -1 for failure; else it is customarily the number of bytes
   *         processed, but can also be 0 to signify success.
   */
  virtual ssize_t log (ACE_Log_Record &log_record) = 0;
};

ACE_END_VERSIONED_NAMESPACE_DECL

#include /**/ "ace/post.h"
#endif /* ACE_LOG_MSG_BACKEND_H */
