summaryrefslogtreecommitdiff
path: root/trunk/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.h
blob: a5c26d990a2cc6bca81d130b57ff0b1cb5c50ef2 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
// -*- C++ -*-

//=============================================================================
/**
 *  @file   Endpoint_Strategy.h
 *
 *  $Id$
 *
 *  @author Sumedh Mungee <sumedh@cs.wustl.edu>
 */
//=============================================================================


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

#include "orbsvcs/AV/AVStreams_i.h"
#include "ace/os_include/os_netdb.h"

// This is to remove "inherits via dominance" warnings from MSVC.
// MSVC is being a little too paranoid.
#if defined (_MSC_VER)
# pragma warning(push)
# pragma warning (disable : 4250)
#endif /* _MSC_VER */

ACE_BEGIN_VERSIONED_NAMESPACE_DECL
class ACE_Process_Options;
ACE_END_VERSIONED_NAMESPACE_DECL

TAO_BEGIN_VERSIONED_NAMESPACE_DECL

/**
 * @class TAO_AV_Endpoint_Strategy
 *
 * Base class to define various endpoint strategies
 * used by the MMDevice to create the Endpoint and Vdev
 */
class TAO_AV_Export TAO_AV_Endpoint_Strategy
{

public:
  /// Constructor
  TAO_AV_Endpoint_Strategy (void);

  /// Destructor
  virtual ~TAO_AV_Endpoint_Strategy (void);

  /// Called by the MMDevice, when it needs to create an A type endpoint
  virtual int create_A (AVStreams::StreamEndPoint_A_ptr &stream_endpoint,
                        AVStreams::VDev_ptr &vdev);

  /// Called by the MMDevice, when it needs to create an B type endpoint
  virtual int create_B (AVStreams::StreamEndPoint_B_ptr &stream_endpoint,
                        AVStreams::VDev_ptr &vdev);

protected:
  /// The "A" stream endpoint
  AVStreams::StreamEndPoint_A_var stream_endpoint_a_;

  /// The "B" stream endpoint
  AVStreams::StreamEndPoint_B_var stream_endpoint_b_;

  /// The vdev
  AVStreams::VDev_var vdev_;

};

// ----------------------------------------------------------------------
/**
 * @class TAO_AV_Endpoint_Process_Strategy
 * @brief Process-based strategy for creating endpoints.
 *        Abstract base class.
 */
class TAO_AV_Export TAO_AV_Endpoint_Process_Strategy
  : public TAO_AV_Endpoint_Strategy
{

public:
  /// Constructor. The process_options contain the name and arguments
  /// for the process to be created
  TAO_AV_Endpoint_Process_Strategy (ACE_Process_Options *process_options);

  /// Destructor.
  virtual ~TAO_AV_Endpoint_Process_Strategy (void);

  /// creates a new child process, and waits on a semaphore
  /// until the child process has finished creating the endpoints
  virtual int activate (void);

protected:
  /// Bind to the naming service
  virtual int bind_to_naming_service (void);

  /**
   * Get the object reference for the newly created stream
   * endpoint (which will be in the child process)
   * Subclasses will define the functionality for this
   */
  virtual int get_stream_endpoint (void) = 0;

  /// Get the Vdev object reference for the newly created
  /// endpoint
  virtual int get_vdev (void);

  /// Naming context
  CosNaming::NamingContext_var naming_context_;

  /// Name and arguments for the process to be created
  ACE_Process_Options *process_options_;

  /// name of this host used for resolving unique names.
  char host_[MAXHOSTNAMELEN];

  /// My child's process id.
  pid_t pid_;
};


// ----------------------------------------------------------------------

/**
 * @class TAO_AV_Endpoint_Process_Strategy_A
 * @brief Process-based strategy to create "A" type endpoints
 */
class TAO_AV_Export TAO_AV_Endpoint_Process_Strategy_A
  : public TAO_AV_Endpoint_Process_Strategy
{

public:
  /// Constructor
  TAO_AV_Endpoint_Process_Strategy_A (ACE_Process_Options *process_options);

  /// Destructor.
  virtual ~TAO_AV_Endpoint_Process_Strategy_A (void);

protected:
  /// Creates an "A" type stream endpoint, and a vdev
  virtual int create_A (AVStreams::StreamEndPoint_A_ptr &stream_endpoint,
                        AVStreams::VDev_ptr &vdev);

  /// Gets the "A" type stream endpoint from the child process
  virtual int get_stream_endpoint (void);

};

// ----------------------------------------------------------------------

/**
 * @class TAO_AV_Endpoint_Process_Strategy_B
 * @brief Process-based strategy to create "B" type endpoints
 */
class TAO_AV_Export TAO_AV_Endpoint_Process_Strategy_B
  : public TAO_AV_Endpoint_Process_Strategy
{

public:
  /// Constructor
  TAO_AV_Endpoint_Process_Strategy_B (ACE_Process_Options *process_options);

  /// Destructor.
  virtual ~TAO_AV_Endpoint_Process_Strategy_B (void);

protected:
  /// Creates a "B" type stream endpoint, and a vdev
  virtual int create_B (AVStreams::StreamEndPoint_B_ptr &stream_endpoint,
                        AVStreams::VDev_ptr &vdev);


  /// Gets the object reference of the "B" type streamendpoint.
  virtual int get_stream_endpoint (void);

};

TAO_END_VERSIONED_NAMESPACE_DECL

// Include the templates here.
#include "orbsvcs/AV/Endpoint_Strategy_T.h"

#if defined(_MSC_VER)
#pragma warning(pop)
#endif /* _MSC_VER */

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