summaryrefslogtreecommitdiff
path: root/ace/UPIPE_Stream.h
blob: 61618371e460233aabd9f65b0ea82c191bf99dc2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* -*- C++ -*- */
// $Id$

// ============================================================================
//
// = LIBRARY
//    ace
//
// = FILENAME
//    UPIPE_Stream.h
//
// = AUTHOR
//    Gerhard Lenzer and Douglas C. Schmidt
//
// ============================================================================

#ifndef ACE_UPIPE_STREAM_H
#define ACE_UPIPE_STREAM_H

#include "ace/Stream.h"

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

#include "ace/Synch.h"
#include "ace/SPIPE.h"
#include "ace/Message_Queue.h"
#include "ace/UPIPE_Addr.h"

#if defined (ACE_HAS_THREADS)

// Use a typedef to make life easier later on.
typedef ACE_Stream<ACE_SYNCH> MT_Stream;

class ACE_Export ACE_UPIPE_Stream : public ACE_SPIPE
{
  // = TITLE
  //     Defines the method that transfer data on a UPIPE.
public:
  friend class ACE_UPIPE_Acceptor;
  friend class ACE_UPIPE_Connector;

  // = Initialization and Termination.

  ACE_UPIPE_Stream (void);

  virtual ~ACE_UPIPE_Stream (void);

  int close (void);
  // Shut down the UPIPE and release resources.

  ACE_HANDLE get_handle (void) const;
  // Return the underlying I/O handle.

  // = Send/recv ACE Message_Blocks.
  int send (ACE_Message_Block *mb_p,
            ACE_Time_Value *timeout  = 0);
  // Send a message through the message queue.  Returns -1 on error,
  // else 0.

  int recv (ACE_Message_Block *&mb_p,
            ACE_Time_Value *timeout  = 0);
  // Recv a message from the message queue.  Returns -1 on error, else
  // 0.

  // = Send/recv char buffers.
  int send (const char *buffer,
            size_t n,
            ACE_Time_Value *timeout = 0);
  // Send a buffer of <n> bytes through the message queue.  Returns -1
  // on error, else number of bytes sent.

  int recv (char *buffer,
            size_t n,
            ACE_Time_Value *timeout = 0);
  // Recv a buffer of upto <n> bytes from the message queue.  Returns
  // -1 on error, else number of bytes read.

  int send_n (const char *buffer,
              size_t n,
              ACE_Time_Value *timeout = 0);
  // Send a buffer of exactly <n> bytes to the message queue.  Returns
  // -1 on error, else number of bytes written (which should == n).

  int recv_n (char *buffer,
              size_t n,
              ACE_Time_Value *timeout = 0);
  // Recv a buffer of exactly <n> bytes from the message queue.
  // Returns -1 on error, else the number of bytes read.

  int control (int cmd, void *val) const;
  // Perform control operations on the UPIPE_Stream.

  int get_remote_addr (ACE_UPIPE_Addr &remote_sap) const;
  // Return the remote address we are connected to.

  void dump (void) const;
  // Dump the state of an object.

  ACE_ALLOC_HOOK_DECLARE;
  // Declare the dynamic allocation hooks.

private:
  ACE_Message_Block *mb_last_;
  // To hold the last ACE_Message_Block read out of the stream. Thus
  // allowing subsequent reads from one ACE_Message_Block

  size_t remaining_;
  // Holds the number of bytes that are still available in mb_last_.

  ACE_UPIPE_Addr remote_addr_;
  // Address of who we are connected to.

  MT_Stream stream_;
  // Stream component used by the <UPIPE_Acceptor> and
  // <UPIPE_Connector> to link together two UPIPE_Streams.

  int reference_count_;
  // Keep track of whether the sender and receiver have both shut
  // down.

#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
  ACE_Thread_Mutex lock_;
  // Ensure that we are thread-safe.
#endif /* ACE_MT_SAFE */
};

#if defined (__ACE_INLINE__)
#include "ace/UPIPE_Stream.i"
#endif /* __ACE_INLINE__ */

#endif /* ACE_HAS_THREADS */
#endif /*ACE_UPIPE_STREAM_H */