summaryrefslogtreecommitdiff
path: root/ace/CLASSIX/CLASSIX_Stream.h
diff options
context:
space:
mode:
Diffstat (limited to 'ace/CLASSIX/CLASSIX_Stream.h')
-rw-r--r--ace/CLASSIX/CLASSIX_Stream.h265
1 files changed, 265 insertions, 0 deletions
diff --git a/ace/CLASSIX/CLASSIX_Stream.h b/ace/CLASSIX/CLASSIX_Stream.h
new file mode 100644
index 00000000000..b9282e4450b
--- /dev/null
+++ b/ace/CLASSIX/CLASSIX_Stream.h
@@ -0,0 +1,265 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// ace
+//
+// = FILENAME
+// CLASSIX_Stream.h
+//
+// = AUTHOR(S)
+// Nokia Telecommunications
+//
+// ============================================================================
+
+#ifndef ACE_CLASSIX_STREAM_H
+#define ACE_CLASSIX_STREAM_H
+
+/* ------------------------------------------------------------------------- */
+#include "ace/CLASSIX/CLASSIX_SAP.h"
+#include "ace/CLASSIX/CLASSIX_Peer_SAP.h"
+#include "ace/CLASSIX/CLASSIX_Port_Default.h"
+
+class ACE_CLASSIX_Stream
+ // = TITLE
+ // Provides the stream interface for CLASSIX IPC communications.
+ //
+ // = DESCRIPTION
+ // This classes provides a stream wrapper over CLASSIX'
+ // IPC. It is designed to be an alternative to Stream type of
+ // communication in the UNIX AF_INET environment.
+ //
+ // To the user, the stream is connection-oriented. The stream
+ // is implemented on top of IPC, it is connectionless and its
+ // reliability is as good as what the raw IPC can offer.
+ //
+ // Since CLASSIX IPC is not intended to go across wide area network,
+ // it can be seen as an
+ // alternative to AF_INET's connection oriented stream, even though
+ // the CLASSIX IPC is connectionless.
+ //
+ // This class contains a local sap, peer sap and data holding
+ // delivery mode information.
+ //
+ // When a stream is created, the peer SAP information must be provided.
+ // The local SAP information may be provided in the constructor or
+ // open(). The local SAP information given in open() overrides the
+ // existing one. If the local SAP address is not given at all, it will
+ // allocate a port and use it as the local SAP.
+ //
+{
+ public:
+ ACE_CLASSIX_Stream(void);
+ // Default constructor, does not setup anything
+ ACE_CLASSIX_Stream(const ACE_CLASSIX_Port_Core&, /* remote port */
+ const ACE_CLASSIX_Port& =
+ *ACE_CLASSIX_DEFAULT_PORT::instance()); /* local address */
+
+ ACE_CLASSIX_Stream(const ACE_CLASSIX_Port&, /* remote port address */
+ const ACE_CLASSIX_Port& =
+ *ACE_CLASSIX_DEFAULT_PORT::instance());/* local address */
+
+ ACE_CLASSIX_Stream(const KnUniqueId&, /* remote port address */
+ const ACE_CLASSIX_Port& =
+ *ACE_CLASSIX_DEFAULT_PORT::instance());/* local address */
+
+ // = IO
+ // Returns -1, if fault has occured during receive. errno contains
+ // the error condition.
+ // Returns no of bytes received/sent, otherwise.
+ //
+ virtual ssize_t send_n (const void *, /* buf */
+ size_t, /* n */
+ int /* flags */);
+ // Sends exactly n bytes (keep trying until n bytes are sent)
+ virtual ssize_t send_n (const void *, /* buf */ size_t /* n */) const;
+ // Sends n bytes(keep trying until n bytes are sent)
+ // Uses the current addressing mode
+ virtual ssize_t send (const void *, /* buf */
+ size_t, /* n */
+ int /* flags */);
+ // Sends n bytes. Same as send_n(buf, n, flag)
+ virtual ssize_t send (const void *, /* buf */
+ size_t /* n */) const;
+ // Sends n bytes. same as send_n(buf, n).
+ virtual ssize_t reply (const void *, /* buf */
+ size_t /* n */) const;
+ // Sends n bytes to the sender of the cureent thread's current message.
+
+ ssize_t ipcRecv (void *, /* buffer */
+ size_t, /* length */
+ int = 0, /* flag: 0 or MSG_PEEK */
+ ACE_Time_Value* = 0) const; /* timeout */
+ // Recv an <n> byte buffer
+ // Wait up to <timeout> amount of time to receive up to <n> bytes
+ // into <buf> from <handle> (uses the <recv> call). If <recv> times
+ // out a -1 is returned with <errno == ETIMEOUT>. If it succeeds the
+ // number of bytes received is returned.
+ // If <timeout> == 0, the caller
+ // will block until action is possible, else will wait until the
+ // relative time specified in *<timeout> elapses).
+ ssize_t ipcRecv_n (void *, /* buffer */
+ size_t, /* length */
+ int = 0, /* flag: 0 or MSG_PEEK */
+ ACE_Time_Value* = 0) const; /* timeout */
+ // Continue until receives n bytes of data or an error has occurred.
+ // Retruns the no of bytes actually received.
+ // If it is less than expected, errno contains error info.
+
+ ssize_t peek(ACE_Time_Value* = 0 /* timeout */) const;
+ // It is the same as recv(0, 0, MSG_PEEK, timeout)
+ // This must be followd by get_data() in order to read the peeked message
+ ssize_t recv(void* /*buf */, int /* len */) const;
+ // Gets data which have been peeked
+ ssize_t recv_n(void* /*buf */, int /* len */) const;
+ // Gets data which have been peeked
+
+ // = ACCESS
+ virtual ACE_HANDLE get_handle (void) const;
+ // virtual void set_handle (ACE_HANDLE);
+ virtual void set_handle(ACE_HANDLE);
+ // set the local port's address according to the supplied handle
+
+ const ACE_CLASSIX_SAP& local_sap(void) const;
+ // Returns read-only local sap
+ const ACE_CLASSIX_Peer_SAP& peer_sap(void) const;
+ // Returns read-only peer sap
+ int get_remote_addr (ACE_Addr & /* dest */) const;
+ // Returns 0, if the remote address has been setup, else -1.
+ // The <dest> parameter is not changed.
+ // This method is here for compatability with SOCK_Stream.
+ // Since the remote addr may be a port or a group and since the
+ // address formats are different between a port and a group, the caller
+ // cannot provide an appropriate buffer for recording the address. The
+ // <dest> parameter is therefore not used.
+
+
+ const ACE_CLASSIX_Port& local_addr(void) const;
+ // Returns local address in <ACE_CLASSIX_Port> format
+
+ int is_selectable(void) const;
+ // Retruns 1, if the local SAP is enabled.
+ int is_writer_closed(void) const;
+ // Retruns 1, if writer side is closed.
+ int is_reader_closed(void) const;
+ // Retruns 1, if reader side is closed.
+
+
+ // = CONTROL
+ int set_peer_sap(const ACE_Addr&);
+ // Returns 0, if successful; returns -1, otherwise
+ // same as set_addr(const ACE_Addr&);
+ int set_peer_sap(const ACE_CLASSIX_Port_Core&);
+ // Returns 0, if successful; returns -1, otherwise
+ // same as void set_addr(const ACE_CLASSIX_Port_Core&);
+ int set_peer_sap (const KnUniqueId&);
+ // Returns 0, if successful; returns -1, otherwise
+ int set_peer_sap (const KnCap&);
+ // Returns 0, if successful; returns -1, otherwise
+
+ virtual int enable(int) const;
+ virtual int disable(int) const;
+ // These two methods do nothing. They are here to maintain the same
+ // interface as other type of Stream class, e.g. ACE_SOCK_Stream
+
+ int selectable(int = ACE_CLASSIX_SAP::DEFAULT_PRIORITY);
+ int unselectable(void);
+ // Enables/Disables the local port to be monitored (by a CLASSIX reactor)
+ // Default = DISABLED
+ virtual void open_writer(void);
+ virtual int close_writer(void);
+ // Closes down the writer
+ // Returns -1, if it fails; returns 0, otherwise
+ // Subclass can overwrite this with sophisticated mechanism, such as
+ // exchange protocol information with the peer.
+ virtual int close_reader(void);
+ // Closes down the writer
+ // Returns -1, if it fails; returns 0, otherwise
+ // Subclass can overwrite this with sophisticated mechanism, such as
+ // exchange protocol information with the peer.
+
+ virtual int open(void);
+ // for local SAP...
+ // Creates a port and uses it as a SAP.
+ // A port can be created if the local_sap is not configured or
+ // it is configured and the local_sap uses the actor's default port.
+ // Returns -1, if it fails; returns 0, otherwise
+ virtual int open(const ACE_Addr&);
+ // for local SAP...
+ // Uses the supplied port information for the local SAP.
+ virtual int close(void);
+ // for local SAP...
+ // Deletes the optional local port and clears the local SAP infomration.
+
+ // = OPTIONS
+ int control(u_int = K_BROADMODE);
+ int control(u_int, /* mode */ int /* site */ );
+ // Interface for CLASSIX' send mode
+
+ // = HELPER
+ void dump (void) const;
+ // Dump the state of an object.
+
+ ACE_ALLOC_HOOK_DECLARE;
+ // Declare the dynamic allocation hooks.
+
+ protected:
+ friend class ACE_CLASSIX_CLD_Connector;
+ friend class ACE_CLASSIX_CO_Connector;
+ friend class ACE_CLASSIX_CO_Acceptor;
+ ACE_CLASSIX_SAP& get_local_sap(void);
+ // Returns local sap
+ ACE_CLASSIX_Peer_SAP& get_peer_sap(void);
+ // Returns peer sap
+ int set_local_port(ACE_CLASSIX_Port_Core*);
+ // Uses the supplied port as the local port and assumes the ownership
+ // of the port. The existing local port, if any, will be deleted.
+ // Returns 0, if it is successful.
+ // Returns -1, otherwise. The setting of the original local port
+ // will be erased.
+
+ void set_target_(void);
+ // set the delivery target structure using the existing peer information
+
+ virtual int set_mode_(u_int = K_BROADMODE); /* theMode */
+ // Sets the addressing mode with the current setting of coTarget
+ virtual int set_mode_(u_int, /* mode */ int /* site */);
+ // Sets the addressing mode as well as the coTarget
+
+ ACE_CLASSIX_SAP local_sap_;
+ int local_sap_closed_;
+ // 0 if it's not closed(default),
+ // 1 if it's closed.
+ ACE_CLASSIX_Port_Core *local_port_;
+ // if non-zero, it will be
+ // deleted on exit.
+
+ ACE_CLASSIX_Peer_SAP peer_sap_;
+ int peer_sap_closed_;
+ // 0 if it's not closed(default),
+ // 1 if it's closed.
+
+ // Mode applied destination address
+ // Can be changed by control()/set_mode_()
+ // Mode is applicable in IPC classes other than the Stream class.
+ // It is here since it is the destination format used by ipcSend.
+
+ // with/without additional site information
+ // int dest_site_;
+ KnIpcDest dest_;
+
+ private:
+ // Disable copy constructor
+ ACE_CLASSIX_Stream(ACE_CLASSIX_Stream const&);
+ ACE_CLASSIX_Stream const& operator=(ACE_CLASSIX_Stream const&);
+};
+
+/* ------------------------------------------------------------------------- */
+
+#if defined (__ACE_INLINE__)
+#include "ace/CLASSIX/CLASSIX_Stream.i"
+#endif /* __ACE_INLINE__ */
+
+#endif /* ACE_CLASSIX_Stream_H */