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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
|
//============================================================================
// Name : dds_publisher.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
#include "PortTypeSupportImpl.h"
#include "Writer.h"
#include <dds/DCPS/Service_Participant.h>
#include <dds/DCPS/Marked_Default_Qos.h>
#include <dds/DCPS/PublisherImpl.h>
#include <dds/DCPS/transport/framework/TheTransportFactory.h>
#include <dds/DCPS/transport/simpleTCP/SimpleTcpConfiguration.h>
#ifdef ACE_AS_STATIC_LIBS
#include <dds/DCPS/transport/simpleTCP/SimpleTcp.h>
#include <dds/DCPS/transport/simpleUnreliableDgram/SimpleUnreliableDgram.h>
#include <dds/DCPS/transport/ReliableMulticast/ReliableMulticast.h>
#endif
#include <ace/streams.h>
#include "ace/Get_Opt.h"
using namespace IOTest;
OpenDDS::DCPS::TransportIdType transport_impl_id = 1;
int
parse_args (int argc, char *argv[])
{
ACE_Get_Opt get_opts (argc, argv, "t:");
int c;
while ((c = get_opts ()) != -1)
{
switch (c)
{
case 't':
if (ACE_OS::strcmp (get_opts.opt_arg (), "udp") == 0) {
transport_impl_id = 2;
}
else if (ACE_OS::strcmp (get_opts.opt_arg (), "mcast") == 0) {
transport_impl_id = 3;
}
else if (ACE_OS::strcmp (get_opts.opt_arg (), "reliable_mcast") == 0) {
transport_impl_id = 4;
}
// test with DEFAULT_SIMPLE_TCP_ID.
else if (ACE_OS::strcmp (get_opts.opt_arg (), "default_tcp") == 0) {
transport_impl_id = OpenDDS::DCPS::DEFAULT_SIMPLE_TCP_ID;
}
// test with DEFAULT_SIMPLE_UDP_ID.
else if (ACE_OS::strcmp (get_opts.opt_arg (), "default_udp") == 0) {
transport_impl_id = OpenDDS::DCPS::DEFAULT_SIMPLE_UDP_ID;
}
else if (ACE_OS::strcmp (get_opts.opt_arg (), "default_mcast_pub") == 0) {
transport_impl_id = OpenDDS::DCPS::DEFAULT_SIMPLE_MCAST_PUB_ID;
}
break;
case '?':
default:
ACE_ERROR_RETURN ((LM_ERROR,
"usage: %s "
"-t <tcp/udp/default> "
"\n",
argv [0]),
-1);
}
}
// Indicates sucessful parsing of the command line
return 0;
}
int main(int argc, char** argv) {
try
{
DDS::DomainParticipantFactory_var dpf =
TheParticipantFactoryWithArgs(argc, argv);
cout<<"DomainParticpantFactory ok\n";
DDS::DomainParticipant_var participant =
dpf->create_participant(411,
PARTICIPANT_QOS_DEFAULT,
DDS::DomainParticipantListener::_nil());
if (CORBA::is_nil (participant.in ())) {
cerr << "create_participant failed." << endl;
return 1;
}
cout<<"DomainParticpant ok\n";
if (parse_args (argc, argv) == -1) {
return -1;
}
PortTypeSupport_var pts = new PortTypeSupportImpl();
if (DDS::RETCODE_OK != pts->register_type(participant.in (), "")) {
cerr << "register_type failed." << endl;
exit(1);
}
cout<<"PortTypeSupport registered\n";
CORBA::String_var type_name = pts->get_type_name ();
DDS::TopicQos topic_qos;
participant->get_default_topic_qos(topic_qos);
DDS::Topic_var topic =
participant->create_topic ("IOTest",
type_name.in (),
topic_qos,
DDS::TopicListener::_nil());
if (CORBA::is_nil (topic.in ())) {
cerr << "create_topic failed." << endl;
exit(1);
}
cout<<"Topic created\n";
OpenDDS::DCPS::TransportImpl_rch tcp_impl =
TheTransportFactory->create_transport_impl (transport_impl_id,
::OpenDDS::DCPS::AUTO_CONFIG);
cout<<"Transport ok\n";
DDS::Publisher_var pub =
participant->create_publisher(PUBLISHER_QOS_DEFAULT,
DDS::PublisherListener::_nil());
if (CORBA::is_nil (pub.in ())) {
cerr << "create_publisher failed." << endl;
exit(1);
}
cout<<"Publisher created\n";
// Attach the publisher to the transport.
OpenDDS::DCPS::PublisherImpl* pub_impl =
OpenDDS::DCPS::reference_to_servant<OpenDDS::DCPS::PublisherImpl> (pub.in ());
if (0 == pub_impl) {
cerr << "Failed to obtain publisher servant" << endl;
exit(1);
}
cout<<"Servant obtained\n";
OpenDDS::DCPS::AttachStatus status = pub_impl->attach_transport(tcp_impl.in());
if (status != OpenDDS::DCPS::ATTACH_OK) {
std::string status_str;
switch (status) {
case OpenDDS::DCPS::ATTACH_BAD_TRANSPORT:
status_str = "ATTACH_BAD_TRANSPORT";
break;
case OpenDDS::DCPS::ATTACH_ERROR:
status_str = "ATTACH_ERROR";
break;
case OpenDDS::DCPS::ATTACH_INCOMPATIBLE_QOS:
status_str = "ATTACH_INCOMPATIBLE_QOS";
break;
default:
status_str = "Unknown Status";
break;
}
cerr << "Failed to attach to the transport. Status == "
<< status_str.c_str() << endl;
exit(1);
}
cout<<"Status ok\n";
// Create the datawriter
DDS::DataWriterQos dw_qos;
pub->get_default_datawriter_qos (dw_qos);
DDS::DataWriter_var dw =
pub->create_datawriter(topic.in (),
dw_qos,
DDS::DataWriterListener::_nil());
if (CORBA::is_nil (dw.in ())) {
cerr << "create_datawriter failed." << endl;
exit(1);
}
Writer* writer = new Writer(dw.in());
cout<<"starting Datawriter...\n";
writer->start ();
while ( !writer->is_finished()) {
ACE_Time_Value small(0,250000);
ACE_OS::sleep (small);
}
// Cleanup
writer->end ();
delete writer;
participant->delete_contained_entities();
dpf->delete_participant(participant.in ());
TheTransportFactory->release();
TheServiceParticipant->shutdown ();
}
catch (CORBA::Exception& e)
{
cerr << "PUB: Exception caught in main.cpp:" << endl
<< e << endl;
exit(1);
}
return 0;
}
|