summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/AVStreams/Use_Case/sender.h
blob: 4e1fd59a1786e74cfbfd582a86475943ace74d6b (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
187
188
189
190
191
192
193
194
195
/* -*- C++ -*- */
// $Id$

// ============================================================================
//
// = LIBRARY
//    TAO/orbsvcs/tests/AVStreams/Three_Stage
//
// = FILENAME
//    sender.h
//
// = DESCRIPTION
//    Sender that reads data from a file and sends it
//    at a requested data rate.
//
// = AUTHOR
//    Yamuna Krishnamurthy <yamuna@cs.wustl.edu>
//
// ============================================================================


#ifndef TAO_AV_SENDER_H
#define TAO_AV_SENDER_H

#include "ace/Get_Opt.h"
#include "orbsvcs/Naming/Naming_Utils.h"
#include "orbsvcs/CosNamingC.h"
#include "orbsvcs/AV/AVStreams_i.h"
#include "orbsvcs/AV/Endpoint_Strategy.h"
#include "orbsvcs/AV/Policy.h"
#include "orbsvcs/AV/Protocol_Factory.h"
#include "Connection_Setup_Helper.h"

class Sender_Callback : public TAO_AV_Callback
{
  // = TITLE
  //    Defines a class for the sender application callback.
  //
  // = DESCRIPTION
  //    This class overides the methods of the TAO_AV_Callback so the 
  //    AVStreams can make upcalls to the application.

public:
  int handle_start (void);
  // Method called when the device is ready to start sending data
};

class Sender_StreamEndPoint  : public TAO_Client_StreamEndPoint
{
  // = TITLE
  //    Defines the sender stream endpoint.
  // 
  // = DESCRIPTION
  //    This class overrides the methods of TAO_ClientStreamendpoint 
  //    so the application can perform its processing during post and pre
  //    connection set up.
  
public:
  Sender_StreamEndPoint (void);
  //Contructor

  virtual int get_callback (const char *flowname,
                            TAO_AV_Callback *&callback);
  // Create the application client callback and return its handle to the 
  // AVStreams for further application callbacks

  virtual int set_protocol_object (const char *flowname,
                                   TAO_AV_Protocol_Object *object);
  // Set protocol object corresponding to the transport protocol chosen.

  virtual CORBA::Boolean handle_preconnect (AVStreams::flowSpec &flowspec);
  // Upcall to perform actions before accepting new connections.

  virtual CORBA::Boolean handle_postconnect (AVStreams::flowSpec &flowspec);
  // Upcall to perform actions before accepting new connections.
  
protected:
  Sender_Callback callback_;
  // Reference to the client application callback.
};

typedef TAO_AV_Endpoint_Reactive_Strategy_A <Sender_StreamEndPoint,TAO_VDev,AV_Null_MediaCtrl> ENDPOINT_STRATEGY;


class Sender
{
  // = TITLE
  //    Defines the Client Application
  // 
  // = DESCRIPTION
  //    The actual client program that streams data
  //    to the distributers that are waiting for data.
public:
  Sender (void);
  // Constructor

  int init (int argc, 
	    char **argv,
	    CORBA::Environment&);
  // Method to initialize the various data components.
  
  void set_protocol_object (const char* flowname, TAO_AV_Protocol_Object *protocol_object);
  // Set the protocol object corresponding to the transport protocol chosen.

  void set_endpoint (const char* flowname, TAO_StreamEndPoint* endpoint);
  // Set the flowname and the corresponding endpoint

  StreamEndpoint_Set *get_endpoint_set (void);
  // Return the streamendpoint set

  StreamCtrl_Map *get_streamctrl_map (void);
  // Return the streamctrl map

  Connection_Setup_Helper *helper (void);
  // Return the helper

  int pace_data (CORBA::Environment&);
  // Method to pace and send data from a file.

  FILE *file (void);
  // File handle from which data is read to be sent.

  int frame_rate (void);
  // The requested frame rate for sending each frame of data read from the file.
  
private:
  int parse_args (int argc, char **argv);
  // Method to parse the command line arguments.
  

  ENDPOINT_STRATEGY endpoint_strategy_;
  // The reactive strategy of the client.

  AVStreams::MMDevice_var sender_mmdevice_obj_;
  // The receiver MMDevice that the sender connects to

  TAO_MMDevice* sender_mmdevice_;
  // The sender MMDevice.
  
  TAO_StreamCtrl streamctrl_;
  // Video stream controller

  int count_;
  // Number of frames sent.
  
  int argc_;
  char **argv_;

  ACE_CString filename_;
  // File from which data is read.

  ACE_CString address_;
  // Address of the sender host machine or a multicast address - Default is
  // UDP multicast addess


  FILE *fp_;
  // File handle of the file read from.

  ACE_CString protocol_;
  // Selected protocol - default is UDP

  ACE_CString sender_device_name_;
  // Teh flowname_ of the stream set up between the sender and receiver.

  int frame_rate_;
  // The sepcified data frame rate
  
  ACE_Message_Block mb;
  // Message block into which data is read from a file and then sent.

  Recv_Obj_Ref_Set recv_obj_ref__set_;
  // Sequence of reciver object references obtained fro, the Naming Service

  StreamCtrl_Map streamctrl_map_;
  
  int default_port;
  // Default port

  Recv_Obj_Ref_Set recv_obj_ref_set_;
  // Set of the Receiver object references

  Protocol_Object_Set protocol_object_set_;

  StreamEndpoint_Set endpoint_set_;

  Connection_Setup_Helper helper_;
};

typedef ACE_Singleton<Sender,ACE_Null_Mutex> SENDER;
// Create a singleton instance of the Sender.

#endif /* TAO_AV_FTP_H */